@simai-studio/view 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE.md +183 -0
  2. package/README.md +75 -2
  3. package/dist/package-receipt.json +971 -0
  4. package/dist/set.json +141 -0
  5. package/dist/smart/rule.js +278 -0
  6. package/dist/smart/rule.js.gz +0 -0
  7. package/dist/smart/view/aliases.json +129 -0
  8. package/dist/smart/view/aliases.json.gz +0 -0
  9. package/dist/smart/view/component.json +1620 -0
  10. package/dist/smart/view/component.json.gz +0 -0
  11. package/dist/smart/view/css/view.css +208 -0
  12. package/dist/smart/view/css/view.css.gz +0 -0
  13. package/dist/smart/view/css/view.min.css +2 -0
  14. package/dist/smart/view/css/view.min.css.gz +0 -0
  15. package/dist/smart/view/examples.json +668 -0
  16. package/dist/smart/view/examples.json.gz +0 -0
  17. package/dist/smart/view/js/view.js +3938 -0
  18. package/dist/smart/view/js/view.js.gz +0 -0
  19. package/dist/smart/view/js/view.min.js +1 -0
  20. package/dist/smart/view/js/view.min.js.gz +0 -0
  21. package/dist/smart/view/lang/en.json +61 -0
  22. package/dist/smart/view/lang/en.json.gz +0 -0
  23. package/dist/smart/view/lang/ru.json +61 -0
  24. package/dist/smart/view/lang/ru.json.gz +0 -0
  25. package/dist/smart/view/probe.json +165 -0
  26. package/dist/smart/view/probe.json.gz +0 -0
  27. package/dist/smart/view/smart.manifest.json +1570 -0
  28. package/dist/smart/view/smart.manifest.json.gz +0 -0
  29. package/dist/smart/view/static/default/embedded.html +96 -0
  30. package/dist/smart/view/static/default/embedded.html.gz +0 -0
  31. package/dist/smart/view/static/default/open-record.html +247 -0
  32. package/dist/smart/view/static/default/open-record.html.gz +0 -0
  33. package/dist/smart/view/static/default/reference.html +247 -0
  34. package/dist/smart/view/static/default/reference.html.gz +0 -0
  35. package/dist/smart/view/static/sheets.json +282 -0
  36. package/dist/smart/view/static/sheets.json.gz +0 -0
  37. package/dist/smart/view-properties/aliases.json +174 -0
  38. package/dist/smart/view-properties/aliases.json.gz +0 -0
  39. package/dist/smart/view-properties/component.json +1898 -0
  40. package/dist/smart/view-properties/component.json.gz +0 -0
  41. package/dist/smart/view-properties/css/view-properties.css +1153 -0
  42. package/dist/smart/view-properties/css/view-properties.css.gz +0 -0
  43. package/dist/smart/view-properties/css/view-properties.min.css +2 -0
  44. package/dist/smart/view-properties/css/view-properties.min.css.gz +0 -0
  45. package/dist/smart/view-properties/examples.json +841 -0
  46. package/dist/smart/view-properties/examples.json.gz +0 -0
  47. package/dist/smart/view-properties/js/view-properties.js +10416 -0
  48. package/dist/smart/view-properties/js/view-properties.js.gz +0 -0
  49. package/dist/smart/view-properties/js/view-properties.min.js +1421 -0
  50. package/dist/smart/view-properties/js/view-properties.min.js.gz +0 -0
  51. package/dist/smart/view-properties/lang/en.json +96 -0
  52. package/dist/smart/view-properties/lang/en.json.gz +0 -0
  53. package/dist/smart/view-properties/lang/ru.json +96 -0
  54. package/dist/smart/view-properties/lang/ru.json.gz +0 -0
  55. package/dist/smart/view-properties/probe.json +188 -0
  56. package/dist/smart/view-properties/probe.json.gz +0 -0
  57. package/dist/smart/view-properties/skeleton.html +13 -0
  58. package/dist/smart/view-properties/skeleton.html.gz +0 -0
  59. package/dist/smart/view-properties/smart.manifest.json +1590 -0
  60. package/dist/smart/view-properties/smart.manifest.json.gz +0 -0
  61. package/dist/smart/view-properties/static/default/full.html +2 -0
  62. package/dist/smart/view-properties/static/default/full.html.gz +0 -0
  63. package/dist/smart/view-properties/static/default/panel-closed.html +4 -0
  64. package/dist/smart/view-properties/static/default/panel-closed.html.gz +0 -0
  65. package/dist/smart/view-properties/static/default/panel.html +4 -0
  66. package/dist/smart/view-properties/static/default/panel.html.gz +0 -0
  67. package/dist/smart/view-properties/static/default/reference.html +2 -0
  68. package/dist/smart/view-properties/static/default/reference.html.gz +0 -0
  69. package/dist/smart/view-properties/static/sheets.json +426 -0
  70. package/dist/smart/view-properties/static/sheets.json.gz +0 -0
  71. package/dist/smart/view-properties/template/default.css +989 -0
  72. package/dist/smart/view-properties/template/default.css.gz +0 -0
  73. package/dist/smart/view-properties/template/default.js +1660 -0
  74. package/dist/smart/view-properties/template/default.js.gz +0 -0
  75. package/dist/smart/view-table/aliases.json +448 -0
  76. package/dist/smart/view-table/aliases.json.gz +0 -0
  77. package/dist/smart/view-table/component.json +2738 -0
  78. package/dist/smart/view-table/component.json.gz +0 -0
  79. package/dist/smart/view-table/css/view-table.css +3658 -0
  80. package/dist/smart/view-table/css/view-table.css.gz +0 -0
  81. package/dist/smart/view-table/css/view-table.min.css +2 -0
  82. package/dist/smart/view-table/css/view-table.min.css.gz +0 -0
  83. package/dist/smart/view-table/examples.json +499 -0
  84. package/dist/smart/view-table/examples.json.gz +0 -0
  85. package/dist/smart/view-table/js/view-table.js +13879 -0
  86. package/dist/smart/view-table/js/view-table.js.gz +0 -0
  87. package/dist/smart/view-table/js/view-table.min.js +1440 -0
  88. package/dist/smart/view-table/js/view-table.min.js.gz +0 -0
  89. package/dist/smart/view-table/lang/en.json +132 -0
  90. package/dist/smart/view-table/lang/en.json.gz +0 -0
  91. package/dist/smart/view-table/lang/ru.json +132 -0
  92. package/dist/smart/view-table/lang/ru.json.gz +0 -0
  93. package/dist/smart/view-table/probe.json +275 -0
  94. package/dist/smart/view-table/probe.json.gz +0 -0
  95. package/dist/smart/view-table/smart.manifest.json +2524 -0
  96. package/dist/smart/view-table/smart.manifest.json.gz +0 -0
  97. package/dist/smart/view-table/static/default/current.html +141 -0
  98. package/dist/smart/view-table/static/default/current.html.gz +0 -0
  99. package/dist/smart/view-table/static/default/current.skeleton.html +141 -0
  100. package/dist/smart/view-table/static/default/current.skeleton.html.gz +0 -0
  101. package/dist/smart/view-table/static/default/empty.html +149 -0
  102. package/dist/smart/view-table/static/default/empty.html.gz +0 -0
  103. package/dist/smart/view-table/static/default/loading.html +180 -0
  104. package/dist/smart/view-table/static/default/loading.html.gz +0 -0
  105. package/dist/smart/view-table/static/default/many.html +180 -0
  106. package/dist/smart/view-table/static/default/many.html.gz +0 -0
  107. package/dist/smart/view-table/static/default/reference.html +136 -0
  108. package/dist/smart/view-table/static/default/reference.html.gz +0 -0
  109. package/dist/smart/view-table/static/default/reference.skeleton.html +136 -0
  110. package/dist/smart/view-table/static/default/reference.skeleton.html.gz +0 -0
  111. package/dist/smart/view-table/static/default/typed-cells.html +229 -0
  112. package/dist/smart/view-table/static/default/typed-cells.html.gz +0 -0
  113. package/dist/smart/view-table/static/default/typed-cells.skeleton.html +229 -0
  114. package/dist/smart/view-table/static/default/typed-cells.skeleton.html.gz +0 -0
  115. package/dist/smart/view-table/static/sheets.json +480 -0
  116. package/dist/smart/view-table/static/sheets.json.gz +0 -0
  117. package/dist/smart/view-table/studio.fixture.json +17 -0
  118. package/dist/smart/view-table/studio.fixture.json.gz +0 -0
  119. package/dist/smart/view-table/studio.scenario.json +30 -0
  120. package/dist/smart/view-table/studio.scenario.json.gz +0 -0
  121. package/dist/smart/view-table/template/default.css +1301 -0
  122. package/dist/smart/view-table/template/default.css.gz +0 -0
  123. package/dist/smart/view-table/template/default.js +1215 -0
  124. package/dist/smart/view-table/template/default.js.gz +0 -0
  125. package/dist/smart/view-table/template/link-cell-contract.js +48 -0
  126. package/dist/smart/view-table/template/link-cell-contract.js.gz +0 -0
  127. package/package.json +29 -4
@@ -0,0 +1,3658 @@
1
+ @charset "UTF-8";
2
+ @layer sf.reset, sf.tokens, sf.base, sf.utilities, sf.components, sf.overrides, sf.states;
3
+ /* The table's published box (the :root block below, docs/docs.md) is
4
+ registered as lengths: a page that reads one from script
5
+ (getComputedStyle(document.documentElement).getPropertyValue(
6
+ '--sf-table-row-block-size-1/2') -- the name unescaped, as CSSOM spells it)
7
+ gets the length in px, not the token expression it is written in, and gets
8
+ it as soon as this sheet is linked, with no table on the page. */
9
+ @property --sf-table-row-block-size-1\/2 {
10
+ syntax: "<length>";
11
+ inherits: true;
12
+ initial-value: 0px;
13
+ }
14
+ @property --sf-table-row-block-size-1 {
15
+ syntax: "<length>";
16
+ inherits: true;
17
+ initial-value: 0px;
18
+ }
19
+ @property --sf-table-row-2-lines-block-size-1\/2 {
20
+ syntax: "<length>";
21
+ inherits: true;
22
+ initial-value: 0px;
23
+ }
24
+ @property --sf-table-row-2-lines-block-size-1 {
25
+ syntax: "<length>";
26
+ inherits: true;
27
+ initial-value: 0px;
28
+ }
29
+ @property --sf-table-head-block-size-1\/2 {
30
+ syntax: "<length>";
31
+ inherits: true;
32
+ initial-value: 0px;
33
+ }
34
+ @property --sf-table-head-block-size-1 {
35
+ syntax: "<length>";
36
+ inherits: true;
37
+ initial-value: 0px;
38
+ }
39
+ @property --sf-table-toolbar-block-size-1\/2 {
40
+ syntax: "<length>";
41
+ inherits: true;
42
+ initial-value: 0px;
43
+ }
44
+ @property --sf-table-toolbar-block-size-1 {
45
+ syntax: "<length>";
46
+ inherits: true;
47
+ initial-value: 0px;
48
+ }
49
+ @property --sf-table-toolbar-gap {
50
+ syntax: "<length>";
51
+ inherits: true;
52
+ initial-value: 0px;
53
+ }
54
+ @layer sf.components {
55
+ /* The toolbar is one line while one line is enough, and two lines when it is
56
+ not — with the search, Create and the gear on the upper line and the filter
57
+ and its chips below. `wrap-reverse` is what does it: the search block is the
58
+ last child, so when it no longer fits beside the chips it wraps onto the
59
+ line above.
60
+
61
+ Focus has nothing to do with the arrangement any more. The search block used
62
+ to move up only while the field was focused and drop back below the chips
63
+ when it lost focus, so the panel rearranged itself under the person's hands.
64
+ The rule it replaced also re-rendered on focusin, and a render around a
65
+ focused field makes the browser lose the caret: text inserted without
66
+ keystrokes — layout switchers, dictation, on-screen keyboards — came out
67
+ reversed. Nothing here changes the DOM either. */
68
+ sf-view-table .sf-table-toolbar {
69
+ flex-wrap: wrap-reverse;
70
+ align-items: stretch;
71
+ }
72
+ sf-table .sf-table-toolbar {
73
+ flex-wrap: wrap-reverse;
74
+ align-items: stretch;
75
+ }
76
+ /* The search row keeps a usable width or goes to the line above. Without a
77
+ floor it simply shrank instead of wrapping, and the field ended up a stub
78
+ beside the chips. */
79
+ sf-view-table .sf-table-toolbar .sf-table-toolbar-end {
80
+ flex: 1 1 auto;
81
+ min-width: var(--sf-g0);
82
+ min-inline-size: var(--sf-g0);
83
+ }
84
+ sf-table .sf-table-toolbar .sf-table-toolbar-end {
85
+ flex: 1 1 auto;
86
+ min-width: var(--sf-g0);
87
+ min-inline-size: var(--sf-g0);
88
+ }
89
+ sf-view-table .sf-table-toolbar .sf-search-input {
90
+ flex: 1 1 var(--sf-g0);
91
+ }
92
+ sf-table .sf-table-toolbar .sf-search-input {
93
+ flex: 1 1 var(--sf-g0);
94
+ }
95
+ /* The field animates when it collapses and jumps when it expands, on
96
+ purpose. A width transition running under a focused field leaves the
97
+ caret uncommitted in Chrome: text inserted without keystrokes — layout
98
+ switchers, dictation, on-screen keyboards — then lands at position 0 and
99
+ comes out reversed. The transition property is read from the state being
100
+ entered, so naming it only on the unfocused state animates the collapse
101
+ and leaves the expansion instant. */
102
+ sf-view-table .sf-table-toolbar .sf-search-input {
103
+ transition-property: flex-grow, flex-shrink, flex-basis;
104
+ transition-duration: var(--sf-duration-fast);
105
+ transition-timing-function: var(--sf-ease-exit);
106
+ }
107
+ sf-table .sf-table-toolbar .sf-search-input {
108
+ transition-property: flex-grow, flex-shrink, flex-basis;
109
+ transition-duration: var(--sf-duration-fast);
110
+ transition-timing-function: var(--sf-ease-exit);
111
+ }
112
+ sf-view-table .sf-table-toolbar:has(.sf-search-input :focus) .sf-search-input {
113
+ transition-property: none;
114
+ }
115
+ sf-table .sf-table-toolbar:has(.sf-search-input :focus) .sf-search-input {
116
+ transition-property: none;
117
+ }
118
+ /* In the list's toolbar the field takes what the three icons leave, from
119
+ nothing: a basis of g0 is wider than a phone with the icons beside it, and
120
+ the field overran the row to the left. */
121
+ sf-view-table .sf-table-toolbar.sf-table-toolbar--list {
122
+ flex-wrap: nowrap;
123
+ }
124
+ sf-table .sf-table-toolbar.sf-table-toolbar--list {
125
+ flex-wrap: nowrap;
126
+ }
127
+ sf-view-table .sf-table-toolbar--list > * {
128
+ min-width: 0;
129
+ min-inline-size: 0;
130
+ }
131
+ sf-table .sf-table-toolbar--list > * {
132
+ min-width: 0;
133
+ min-inline-size: 0;
134
+ }
135
+ sf-view-table .sf-table-toolbar--list .sf-search-input {
136
+ flex: 1 1 0;
137
+ min-width: 0;
138
+ min-inline-size: 0;
139
+ }
140
+ sf-table .sf-table-toolbar--list .sf-search-input {
141
+ flex: 1 1 0;
142
+ min-width: 0;
143
+ min-inline-size: 0;
144
+ }
145
+ /* The native field asks for its size in characters; in the list it takes the
146
+ width it is given. */
147
+ sf-view-table .sf-table-toolbar--list .sf-search-input input {
148
+ width: 100%;
149
+ inline-size: 100%;
150
+ min-width: 0;
151
+ min-inline-size: 0;
152
+ }
153
+ sf-table .sf-table-toolbar--list .sf-search-input input {
154
+ width: 100%;
155
+ inline-size: 100%;
156
+ min-width: 0;
157
+ min-inline-size: 0;
158
+ }
159
+ /* Nothing in the toolbar clips a focus ring: a ring is drawn outside the
160
+ element's box, so an ancestor that hides its overflow cuts it off. */
161
+ sf-view-table .sf-table-toolbar {
162
+ overflow: visible;
163
+ }
164
+ sf-table .sf-table-toolbar {
165
+ overflow: visible;
166
+ }
167
+ sf-view-table .sf-table-toolbar-start {
168
+ overflow: visible;
169
+ }
170
+ sf-table .sf-table-toolbar-start {
171
+ overflow: visible;
172
+ }
173
+ sf-view-table .sf-table-toolbar-end {
174
+ overflow: visible;
175
+ }
176
+ sf-table .sf-table-toolbar-end {
177
+ overflow: visible;
178
+ }
179
+ /* The component table carries a bottom margin, which inside the scroll area is
180
+ an empty band between the last row and whatever follows — Show more, in the
181
+ view the consumer reported. The area ends where the rows end. */
182
+ sf-view-table .sf-table-scroll > .table {
183
+ margin-bottom: 0;
184
+ -webkit-margin-after: 0;
185
+ margin-block-end: 0;
186
+ }
187
+ sf-table .sf-table-scroll > .table {
188
+ margin-bottom: 0;
189
+ -webkit-margin-after: 0;
190
+ margin-block-end: 0;
191
+ }
192
+ sf-view-table > * .table > :not(caption) > * > * {
193
+ vertical-align: middle;
194
+ padding-top: var(--sf-space-1);
195
+ padding-bottom: var(--sf-space-1);
196
+ padding-block: var(--sf-space-1);
197
+ }
198
+ sf-table > * .table > :not(caption) > * > * {
199
+ vertical-align: middle;
200
+ padding-top: var(--sf-space-1);
201
+ padding-bottom: var(--sf-space-1);
202
+ padding-block: var(--sf-space-1);
203
+ }
204
+ /* At step 1/2 a row is the ladder's: the 32px controls it holds and the step's
205
+ own vertical space around them -- a 45px row beside the admin menu's 32px
206
+ items, where step 1 keeps its 73. */
207
+ sf-view-table[size="1/2"] > * .table > :not(caption) > * > * {
208
+ padding-top: var(--sf-ui-1\/2--space-y);
209
+ padding-bottom: var(--sf-ui-1\/2--space-y);
210
+ padding-block: var(--sf-ui-1\/2--space-y);
211
+ }
212
+ sf-table[size="1/2"] > * .table > :not(caption) > * > * {
213
+ padding-top: var(--sf-ui-1\/2--space-y);
214
+ padding-bottom: var(--sf-ui-1\/2--space-y);
215
+ padding-block: var(--sf-ui-1\/2--space-y);
216
+ }
217
+ /* A cell's text is its step's, not whatever the page's body is: the rows'
218
+ published heights (--sf-table-row-*-block-size-*, on the root above) are
219
+ then the rows drawn on every page. A two-line row at 1/2 was 61 px on a
220
+ page of 16/24 text and 53 on Larena's 14/20. */
221
+ sf-view-table > * .table > :not(caption) > * > * {
222
+ font-size: var(--sf-text-size-1);
223
+ line-height: var(--sf-text-height-1);
224
+ }
225
+ sf-table > * .table > :not(caption) > * > * {
226
+ font-size: var(--sf-text-size-1);
227
+ line-height: var(--sf-text-height-1);
228
+ }
229
+ sf-view-table[size="1/2"] > * .table > :not(caption) > * > * {
230
+ font-size: var(--sf-text-size-1\/2);
231
+ line-height: var(--sf-text-height-1\/2);
232
+ }
233
+ sf-table[size="1/2"] > * .table > :not(caption) > * > * {
234
+ font-size: var(--sf-text-size-1\/2);
235
+ line-height: var(--sf-text-height-1\/2);
236
+ }
237
+ /* The windows' top-layer container (see getPortalContainer): the whole
238
+ viewport, invisible and click-through, so each window inside places itself
239
+ as it did at the end of the body. A popover is otherwise drawn as a small
240
+ centred box with a border, a fill and padding of the browser's own. */
241
+ .sf-table-portal:popover-open {
242
+ display: block;
243
+ position: fixed;
244
+ top: 0;
245
+ right: 0;
246
+ bottom: 0;
247
+ left: 0;
248
+ inset: 0;
249
+ width: auto;
250
+ inline-size: auto;
251
+ height: auto;
252
+ block-size: auto;
253
+ max-width: none;
254
+ max-inline-size: none;
255
+ max-height: none;
256
+ max-block-size: none;
257
+ margin: 0;
258
+ padding: 0;
259
+ border: 0;
260
+ background: transparent;
261
+ color: inherit;
262
+ overflow: visible;
263
+ pointer-events: none;
264
+ }
265
+ .sf-table-portal:popover-open > * {
266
+ pointer-events: auto;
267
+ }
268
+ /* A window is as wide as what it holds, from the standard menu's floor to its
269
+ ceiling or the room the window has: every window was 24rem whatever it
270
+ held, and a list of two short field names stood with a third of the width
271
+ empty between the name and its checkbox (owner, 2026-10-14). */
272
+ .sf-table-context-menu {
273
+ min-width: min(var(--sf-e8), 100vw);
274
+ min-width: min(var(--sf-context-menu--min-inline-size, var(--sf-e8)), var(--sf-table-context-menu--available-inline-size, 100vw));
275
+ max-width: min(var(--sf-g2), 100vw);
276
+ max-width: min(var(--sf-table-context-menu--max-width, var(--sf-g2)), var(--sf-table-context-menu--available-inline-size, 100vw));
277
+ width: -webkit-max-content;
278
+ width: -moz-max-content;
279
+ width: max-content;
280
+ /* A window as tall as its content puts its own buttons below the fold as
281
+ soon as a site has fifteen fields, and the page has to be scrolled to
282
+ reach them. The ceiling is the space left under the window's own top
283
+ edge, which only the component knows, so it arrives as a property. */
284
+ max-height: none;
285
+ max-block-size: none;
286
+ max-height: none;
287
+ max-height: var(--sf-table-context-menu--max-block-size, none);
288
+ max-block-size: var(--sf-table-context-menu--max-block-size, none);
289
+ overflow: hidden;
290
+ }
291
+ /* The chain a bounded window needs: every box between the ceiling and the
292
+ scrolling list must be allowed to shrink, or the list keeps its full
293
+ height and pushes the buttons out of the window instead. */
294
+ .sf-table-context-menu .sf-table-context-body {
295
+ min-height: 0;
296
+ min-block-size: 0;
297
+ }
298
+ /* The search stood flush against the window edges while every other block in
299
+ the window is inset by the same step. */
300
+ /* The inline insets of every block in these windows come from the menu's own
301
+ published axis -- --sf-context-menu--item-inset-start-1 / -end-1 -- rather
302
+ than from a step written here. They had been a literal --sf-space-2, which
303
+ measured 20px against the axis's 17 on desktop and 16 against 15 on mobile:
304
+ straight inside the window, because the rows live inside these blocks, and
305
+ 3px away from where every other menu in the Framework puts its content. A
306
+ second copy of the arithmetic is how the two drift apart; the fallback keeps
307
+ old runtimes rendering. */
308
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-table-column-search{
309
+ padding-right: var(--sf-table-column-search--padding-inline-end);
310
+ }
311
+ @supports not (padding-inline-end: initial){
312
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-table-column-search{
313
+ padding-right: var(--sf-table-column-search--padding-inline-end);
314
+ }
315
+ }
316
+ .sf-table-context-menu .sf-table-column-search:where(:dir(ltr)){
317
+ padding-right: var(--sf-table-column-search--padding-inline-end);
318
+ }
319
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-table-column-search{
320
+ padding-left: var(--sf-table-column-search--padding-inline-end);
321
+ }
322
+ @supports not (padding-inline-end: initial){
323
+ [dir="rtl"] .sf-table-context-menu .sf-table-column-search{
324
+ padding-left: var(--sf-table-column-search--padding-inline-end);
325
+ }
326
+ }
327
+ .sf-table-context-menu .sf-table-column-search:where(:dir(rtl)){
328
+ padding-left: var(--sf-table-column-search--padding-inline-end);
329
+ }
330
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-table-column-search{
331
+ padding-left: var(--sf-table-column-search--padding-inline-start);
332
+ }
333
+ @supports not (padding-inline-start: initial){
334
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-table-column-search{
335
+ padding-left: var(--sf-table-column-search--padding-inline-start);
336
+ }
337
+ }
338
+ .sf-table-context-menu .sf-table-column-search:where(:dir(ltr)){
339
+ padding-left: var(--sf-table-column-search--padding-inline-start);
340
+ }
341
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-table-column-search{
342
+ padding-right: var(--sf-table-column-search--padding-inline-start);
343
+ }
344
+ @supports not (padding-inline-start: initial){
345
+ [dir="rtl"] .sf-table-context-menu .sf-table-column-search{
346
+ padding-right: var(--sf-table-column-search--padding-inline-start);
347
+ }
348
+ }
349
+ .sf-table-context-menu .sf-table-column-search:where(:dir(rtl)){
350
+ padding-right: var(--sf-table-column-search--padding-inline-start);
351
+ }
352
+ .sf-table-context-menu .sf-table-column-search {
353
+ --sf-table-column-search--padding-inline-end: var(--sf-context-menu--inset-end);
354
+ --sf-table-column-search--padding-inline-start: var(--sf-context-menu--inset-start);
355
+ --sf-table-column-search--padding-top: var(--sf-context-menu--block-space);
356
+ padding-bottom: 0;
357
+ padding-bottom: var(--sf-table-column-search--padding-bottom, 0);
358
+ padding-top: var(--sf-table-column-search--padding-top);
359
+ -webkit-padding-end: var(--sf-table-column-search--padding-inline-end);
360
+ padding-inline-end: var(--sf-table-column-search--padding-inline-end);
361
+ -webkit-padding-start: var(--sf-table-column-search--padding-inline-start);
362
+ padding-inline-start: var(--sf-table-column-search--padding-inline-start);
363
+ }
364
+ sf-view-table > .sf-table thead th[data-key=select] {
365
+ --sf-table--select-column-width: var(--sf-text-height-1);
366
+ width: var(--sf-table--select-column-width);
367
+ }
368
+ sf-table > .sf-table thead th[data-key=select] {
369
+ --sf-table--select-column-width: var(--sf-text-height-1);
370
+ width: var(--sf-table--select-column-width);
371
+ }
372
+ sf-view-table > .sf-table thead th[data-key=settings] {
373
+ --sf-table--settigs-column-width: calc(var(--sf-text-height-1) + var(--sf-ui-1--space-y-tightness-default));
374
+ width: var(--sf-table--settigs-column-width);
375
+ text-align: center;
376
+ }
377
+ sf-table > .sf-table thead th[data-key=settings] {
378
+ --sf-table--settigs-column-width: calc(var(--sf-text-height-1) + var(--sf-ui-1--space-y-tightness-default));
379
+ width: var(--sf-table--settigs-column-width);
380
+ text-align: center;
381
+ }
382
+ /* The table's cell spacing, declared rather than inherited. Measured at 2px,
383
+ which is the browser's own default for a separated-border table: nobody in
384
+ this Framework chose it, and it sits between every pair of cells and above
385
+ every row while the spacing ladder is used for everything else. The value is
386
+ kept exactly as it was shipping, so nothing moves, and it is now a token a
387
+ consumer can see and an owner can decide about.
388
+
389
+ The inset is published because a container that embeds a list has to put the
390
+ row text on the same inline axis as whatever stands beside it, and the only
391
+ honest way to do that is with the table's own number -- not a constant typed
392
+ into the embedder, which would drift the first time either value changed.
393
+ It is the spacing before the first cell plus that cell's own padding. */
394
+ /* On the root, not on sf-view-table: a container that embeds a list has to read the
395
+ inset to align to it, and a custom property declared on the table would only
396
+ be visible to the table and its descendants. The first version of this
397
+ declared it on sf-view-table, where the embedder above it read nothing and the
398
+ compensation silently came to zero. */
399
+ :root {
400
+ /* No space between cells. It was 2px, and on a highlighted, selected or
401
+ hovered row the gaps read as dark separators between every cell (owner,
402
+ 2026-10-12). The row's own line below is the only rule a row needs; the
403
+ inset below is derived from this, so an embedded list stays on its axis. */
404
+ --sf-table--cell-spacing: 0px;
405
+ /* The narrowest a data column may be before the table scrolls instead of
406
+ squeezing further. Ten steps of the ladder, chosen by measurement rather
407
+ than by eye: at six the typed cells wrapped and a row grew from 57px to
408
+ 81 where the typed-cells probe watches it, because a badge and its text
409
+ need more room than a date does. At ten both hold -- a column keeps a
410
+ date, a status badge or a heading on one line, and a row that is typed
411
+ is no taller than the same row plain (owner, 2026-10-09).
412
+
413
+ A host that knows better says so per column, and that wins. */
414
+ --sf-table--column-min-inline-size: var(--sf-f0);
415
+ /* The widest a column grows to fit its content on one line; past it the
416
+ value wraps. A host that knows better sets a width per column. */
417
+ --sf-table--column-max-inline-size: var(--sf-g0);
418
+ /* The cell's own leading padding, measured at 8px on the built bytes rather
419
+ than derived -- and 8px is --sf-a8, so it is named here rather than
420
+ written out again (owner, 2026-10-09). It is set by a nested rule in this sheet, and a nested rule's
421
+ selector is relative, so neither a grep nor `cell.matches()` can attribute
422
+ it -- the honest thing is to say the number was measured and let a check
423
+ hold it true. tests/browser/property-view asserts the row text of an
424
+ embedded list lands on the field-label axis, so if this padding changes that
425
+ probe goes red rather than an embedded list quietly drifting.
426
+
427
+ It was 1px before: that was the user agent's default, measured on a table
428
+ in a shadow tree where this sheet does not reach. The first version of this
429
+ inset was computed from that reading and put an embedded list 7px out once
430
+ the table was styled. */
431
+ --sf-table--row-text-inset: calc(var(--sf-table--cell-spacing) + var(--sf-a8));
432
+ /* The table's box, published so a page can hold the room of a list before
433
+ it draws -- min-block-size = toolbar + toolbar gap + head + rows x row
434
+ (docs.md) -- from the same tokens the rows below are drawn with, never a
435
+ number typed into the page. On the root for the reason above: the page
436
+ reads them outside the table. One value per step of the ladder (size
437
+ 1/2 and 1); a row is its cells' padding at the step, its tallest
438
+ content -- the step's control (the row's box and menu) or its text,
439
+ one line or two -- and the line under it. */
440
+ --sf-table-row-block-size-1\/2: calc(2 * var(--sf-ui-1\/2--space-y) + max(var(--sf-ui-1\/2--control-height), var(--sf-text-height-1\/2)) + var(--sf-px));
441
+ --sf-table-row-block-size-1: calc(2 * var(--sf-space-1) + max(var(--sf-ui-1--control-height), var(--sf-text-height-1)) + var(--sf-px));
442
+ --sf-table-row-2-lines-block-size-1\/2: calc(2 * var(--sf-ui-1\/2--space-y) + max(var(--sf-ui-1\/2--control-height), 2 * var(--sf-text-height-1\/2)) + var(--sf-px));
443
+ --sf-table-row-2-lines-block-size-1: calc(2 * var(--sf-space-1) + max(var(--sf-ui-1--control-height), 2 * var(--sf-text-height-1)) + var(--sf-px));
444
+ /* The head row: the same padding, a line of the head's text, its line. */
445
+ --sf-table-head-block-size-1\/2: calc(2 * var(--sf-ui-1\/2--space-y) + var(--sf-text-height-1\/2) + var(--sf-px));
446
+ --sf-table-head-block-size-1: calc(2 * var(--sf-space-1) + var(--sf-text-height-1) + var(--sf-px));
447
+ /* The toolbar on one line (search, settings, export): the step's control,
448
+ and the gap between it and the head. */
449
+ --sf-table-toolbar-block-size-1\/2: var(--sf-ui-1\/2--control-height);
450
+ --sf-table-toolbar-block-size-1: var(--sf-ui-1--control-height);
451
+ --sf-table-toolbar-gap: var(--sf-space-1\/3);
452
+ }
453
+ /* The moment the table is measured for its content widths (see
454
+ measureContentWidths): laid out by content at its widest, with no column
455
+ width of its own. It is never painted like this. */
456
+ /* Once the columns carry their content widths the table is as wide as their
457
+ sum, and never narrower than its box. As wide as its content (w-max) it
458
+ took a long text's whole length and gave the surplus to that column, past
459
+ the cap it had been given. A fixed table is the greater of its width and
460
+ its columns' sum, so a width of 0 leaves the sum to decide. */
461
+ sf-view-table table.sf-table-content-sized {
462
+ width: 0;
463
+ inline-size: 0;
464
+ /* Never narrower than its content (measureContentWidths): the column left
465
+ without a width takes the spare room, and where there is none it keeps
466
+ its content width rather than a letter's. */
467
+ min-width: max(100%, 0px);
468
+ min-inline-size: max(100%, 0px);
469
+ min-width: max(100%, 0px);
470
+ min-width: max(100%, var(--sf-table--content-inline-size, 0px));
471
+ min-inline-size: max(100%, var(--sf-table--content-inline-size, 0px));
472
+ }
473
+ sf-table table.sf-table-content-sized {
474
+ width: 0;
475
+ inline-size: 0;
476
+ /* Never narrower than its content (measureContentWidths): the column left
477
+ without a width takes the spare room, and where there is none it keeps
478
+ its content width rather than a letter's. */
479
+ min-width: max(100%, 0px);
480
+ min-inline-size: max(100%, 0px);
481
+ min-width: max(100%, 0px);
482
+ min-width: max(100%, var(--sf-table--content-inline-size, 0px));
483
+ min-inline-size: max(100%, var(--sf-table--content-inline-size, 0px));
484
+ }
485
+ /* Content-sized but not measured yet -- the static markup a server prints
486
+ carries no measured size (standard 1.3.9 §5.4), nor do the columns' own
487
+ widths -- the table is laid out by its content, as wide as it is on one
488
+ line and never narrower than its box: what measureContentWidths will
489
+ give it. Fixed, without widths, it split a phone's 390 px evenly and
490
+ every cell wrapped (gate 24: 583 px against the drawn 271). */
491
+ sf-view-table table.sf-table-content-sized:not([style*="--sf-table--content-inline-size"]) {
492
+ table-layout: auto;
493
+ width: -webkit-max-content;
494
+ width: -moz-max-content;
495
+ width: max-content;
496
+ inline-size: -webkit-max-content;
497
+ inline-size: -moz-max-content;
498
+ inline-size: max-content;
499
+ min-width: 100%;
500
+ min-inline-size: 100%;
501
+ }
502
+ sf-table table.sf-table-content-sized:not([style*="--sf-table--content-inline-size"]) {
503
+ table-layout: auto;
504
+ width: -webkit-max-content;
505
+ width: -moz-max-content;
506
+ width: max-content;
507
+ inline-size: -webkit-max-content;
508
+ inline-size: -moz-max-content;
509
+ inline-size: max-content;
510
+ min-width: 100%;
511
+ min-inline-size: 100%;
512
+ }
513
+ sf-view-table table.sf-table-measuring {
514
+ table-layout: auto !important;
515
+ width: -webkit-max-content !important;
516
+ width: -moz-max-content !important;
517
+ width: max-content !important;
518
+ inline-size: -webkit-max-content !important;
519
+ inline-size: -moz-max-content !important;
520
+ inline-size: max-content !important;
521
+ min-width: 0 !important;
522
+ min-inline-size: 0 !important;
523
+ }
524
+ sf-table table.sf-table-measuring {
525
+ table-layout: auto !important;
526
+ width: -webkit-max-content !important;
527
+ width: -moz-max-content !important;
528
+ width: max-content !important;
529
+ inline-size: -webkit-max-content !important;
530
+ inline-size: -moz-max-content !important;
531
+ inline-size: max-content !important;
532
+ min-width: 0 !important;
533
+ min-inline-size: 0 !important;
534
+ }
535
+ sf-view-table table.sf-table-measuring col {
536
+ width: auto !important;
537
+ inline-size: auto !important;
538
+ width: auto !important;
539
+ }
540
+ sf-table table.sf-table-measuring col {
541
+ width: auto !important;
542
+ inline-size: auto !important;
543
+ width: auto !important;
544
+ }
545
+ sf-view-table .sf-table-cell-values {
546
+ flex-wrap: nowrap;
547
+ min-width: 0;
548
+ min-inline-size: 0;
549
+ overflow: hidden;
550
+ }
551
+ sf-table .sf-table-cell-values {
552
+ flex-wrap: nowrap;
553
+ min-width: 0;
554
+ min-inline-size: 0;
555
+ overflow: hidden;
556
+ }
557
+ /* Values keep their width; one drawn by an element that is display:
558
+ contents (sf-tag) is its child's box. */
559
+ sf-view-table .sf-table-cell-values > * {
560
+ flex: none;
561
+ }
562
+ sf-table .sf-table-cell-values > * {
563
+ flex: none;
564
+ }
565
+ sf-view-table .sf-table-cell-values > * > * {
566
+ flex: none;
567
+ }
568
+ sf-table .sf-table-cell-values > * > * {
569
+ flex: none;
570
+ }
571
+ /* A folded value leaves the line but not the text: visually hidden, read. */
572
+ sf-view-table .sf-table-cell-values .sf-table-cell-folded {
573
+ position: absolute;
574
+ width: 1px;
575
+ inline-size: 1px;
576
+ height: 1px;
577
+ block-size: 1px;
578
+ overflow: hidden;
579
+ -webkit-clip-path: inset(50%);
580
+ clip-path: inset(50%);
581
+ white-space: nowrap;
582
+ }
583
+ sf-table .sf-table-cell-values .sf-table-cell-folded {
584
+ position: absolute;
585
+ width: 1px;
586
+ inline-size: 1px;
587
+ height: 1px;
588
+ block-size: 1px;
589
+ overflow: hidden;
590
+ -webkit-clip-path: inset(50%);
591
+ clip-path: inset(50%);
592
+ white-space: nowrap;
593
+ }
594
+ sf-view-table .sf-table-cell-more {
595
+ color: var(--sf-on-surface-variant);
596
+ font-size: var(--sf-text-size-1\/2);
597
+ white-space: nowrap;
598
+ }
599
+ sf-table .sf-table-cell-more {
600
+ color: var(--sf-on-surface-variant);
601
+ font-size: var(--sf-text-size-1\/2);
602
+ white-space: nowrap;
603
+ }
604
+ sf-view-table .sf-table-cell-more[hidden] {
605
+ display: none;
606
+ }
607
+ sf-table .sf-table-cell-more[hidden] {
608
+ display: none;
609
+ }
610
+ sf-view-table .sf-table-cell-clip {
611
+ display: block;
612
+ overflow: hidden;
613
+ text-overflow: ellipsis;
614
+ white-space: nowrap;
615
+ }
616
+ sf-table .sf-table-cell-clip {
617
+ display: block;
618
+ overflow: hidden;
619
+ text-overflow: ellipsis;
620
+ white-space: nowrap;
621
+ }
622
+ sf-view-table table {
623
+ border-spacing: var(--sf-table--cell-spacing);
624
+ }
625
+ sf-table table {
626
+ border-spacing: var(--sf-table--cell-spacing);
627
+ }
628
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th{
629
+ border-left-width: var(--sf-px);
630
+ }
631
+ @supports not (border-inline-start-width: initial){
632
+ html:not([dir="rtl"]) sf-view-table th{
633
+ border-left-width: var(--sf-px);
634
+ }
635
+ }
636
+ sf-view-table th:where(:dir(ltr)){
637
+ border-left-width: var(--sf-px);
638
+ }
639
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th{
640
+ border-right-width: var(--sf-px);
641
+ }
642
+ @supports not (border-inline-start-width: initial){
643
+ [dir="rtl"] sf-view-table th{
644
+ border-right-width: var(--sf-px);
645
+ }
646
+ }
647
+ sf-view-table th:where(:dir(rtl)){
648
+ border-right-width: var(--sf-px);
649
+ }
650
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th{
651
+ border-left-style: solid;
652
+ }
653
+ @supports not (border-inline-start-style: initial){
654
+ html:not([dir="rtl"]) sf-view-table th{
655
+ border-left-style: solid;
656
+ }
657
+ }
658
+ sf-view-table th:where(:dir(ltr)){
659
+ border-left-style: solid;
660
+ }
661
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th{
662
+ border-right-style: solid;
663
+ }
664
+ @supports not (border-inline-start-style: initial){
665
+ [dir="rtl"] sf-view-table th{
666
+ border-right-style: solid;
667
+ }
668
+ }
669
+ sf-view-table th:where(:dir(rtl)){
670
+ border-right-style: solid;
671
+ }
672
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th{
673
+ border-left-color: transparent;
674
+ }
675
+ @supports not (border-inline-start-color: initial){
676
+ html:not([dir="rtl"]) sf-view-table th{
677
+ border-left-color: transparent;
678
+ }
679
+ }
680
+ sf-view-table th:where(:dir(ltr)){
681
+ border-left-color: transparent;
682
+ }
683
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th{
684
+ border-right-color: transparent;
685
+ }
686
+ @supports not (border-inline-start-color: initial){
687
+ [dir="rtl"] sf-view-table th{
688
+ border-right-color: transparent;
689
+ }
690
+ }
691
+ sf-view-table th:where(:dir(rtl)){
692
+ border-right-color: transparent;
693
+ }
694
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th{
695
+ border-right-width: var(--sf-px);
696
+ }
697
+ @supports not (border-inline-end-width: initial){
698
+ html:not([dir="rtl"]) sf-view-table th{
699
+ border-right-width: var(--sf-px);
700
+ }
701
+ }
702
+ sf-view-table th:where(:dir(ltr)){
703
+ border-right-width: var(--sf-px);
704
+ }
705
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th{
706
+ border-left-width: var(--sf-px);
707
+ }
708
+ @supports not (border-inline-end-width: initial){
709
+ [dir="rtl"] sf-view-table th{
710
+ border-left-width: var(--sf-px);
711
+ }
712
+ }
713
+ sf-view-table th:where(:dir(rtl)){
714
+ border-left-width: var(--sf-px);
715
+ }
716
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th{
717
+ border-right-style: solid;
718
+ }
719
+ @supports not (border-inline-end-style: initial){
720
+ html:not([dir="rtl"]) sf-view-table th{
721
+ border-right-style: solid;
722
+ }
723
+ }
724
+ sf-view-table th:where(:dir(ltr)){
725
+ border-right-style: solid;
726
+ }
727
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th{
728
+ border-left-style: solid;
729
+ }
730
+ @supports not (border-inline-end-style: initial){
731
+ [dir="rtl"] sf-view-table th{
732
+ border-left-style: solid;
733
+ }
734
+ }
735
+ sf-view-table th:where(:dir(rtl)){
736
+ border-left-style: solid;
737
+ }
738
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th{
739
+ border-right-color: transparent;
740
+ }
741
+ @supports not (border-inline-end-color: initial){
742
+ html:not([dir="rtl"]) sf-view-table th{
743
+ border-right-color: transparent;
744
+ }
745
+ }
746
+ sf-view-table th:where(:dir(ltr)){
747
+ border-right-color: transparent;
748
+ }
749
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th{
750
+ border-left-color: transparent;
751
+ }
752
+ @supports not (border-inline-end-color: initial){
753
+ [dir="rtl"] sf-view-table th{
754
+ border-left-color: transparent;
755
+ }
756
+ }
757
+ sf-view-table th:where(:dir(rtl)){
758
+ border-left-color: transparent;
759
+ }
760
+ sf-view-table th {
761
+ border-inline-start-width: var(--sf-px);
762
+ border-inline-start-style: solid;
763
+ border-inline-start-color: transparent;
764
+ border-inline-end-width: var(--sf-px);
765
+ border-inline-end-style: solid;
766
+ border-inline-end-color: transparent;
767
+ }
768
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th{
769
+ border-left-width: var(--sf-px);
770
+ }
771
+ @supports not (border-inline-start-width: initial){
772
+ html:not([dir="rtl"]) sf-table th{
773
+ border-left-width: var(--sf-px);
774
+ }
775
+ }
776
+ sf-table th:where(:dir(ltr)){
777
+ border-left-width: var(--sf-px);
778
+ }
779
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th{
780
+ border-right-width: var(--sf-px);
781
+ }
782
+ @supports not (border-inline-start-width: initial){
783
+ [dir="rtl"] sf-table th{
784
+ border-right-width: var(--sf-px);
785
+ }
786
+ }
787
+ sf-table th:where(:dir(rtl)){
788
+ border-right-width: var(--sf-px);
789
+ }
790
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th{
791
+ border-left-style: solid;
792
+ }
793
+ @supports not (border-inline-start-style: initial){
794
+ html:not([dir="rtl"]) sf-table th{
795
+ border-left-style: solid;
796
+ }
797
+ }
798
+ sf-table th:where(:dir(ltr)){
799
+ border-left-style: solid;
800
+ }
801
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th{
802
+ border-right-style: solid;
803
+ }
804
+ @supports not (border-inline-start-style: initial){
805
+ [dir="rtl"] sf-table th{
806
+ border-right-style: solid;
807
+ }
808
+ }
809
+ sf-table th:where(:dir(rtl)){
810
+ border-right-style: solid;
811
+ }
812
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th{
813
+ border-left-color: transparent;
814
+ }
815
+ @supports not (border-inline-start-color: initial){
816
+ html:not([dir="rtl"]) sf-table th{
817
+ border-left-color: transparent;
818
+ }
819
+ }
820
+ sf-table th:where(:dir(ltr)){
821
+ border-left-color: transparent;
822
+ }
823
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th{
824
+ border-right-color: transparent;
825
+ }
826
+ @supports not (border-inline-start-color: initial){
827
+ [dir="rtl"] sf-table th{
828
+ border-right-color: transparent;
829
+ }
830
+ }
831
+ sf-table th:where(:dir(rtl)){
832
+ border-right-color: transparent;
833
+ }
834
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th{
835
+ border-right-width: var(--sf-px);
836
+ }
837
+ @supports not (border-inline-end-width: initial){
838
+ html:not([dir="rtl"]) sf-table th{
839
+ border-right-width: var(--sf-px);
840
+ }
841
+ }
842
+ sf-table th:where(:dir(ltr)){
843
+ border-right-width: var(--sf-px);
844
+ }
845
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th{
846
+ border-left-width: var(--sf-px);
847
+ }
848
+ @supports not (border-inline-end-width: initial){
849
+ [dir="rtl"] sf-table th{
850
+ border-left-width: var(--sf-px);
851
+ }
852
+ }
853
+ sf-table th:where(:dir(rtl)){
854
+ border-left-width: var(--sf-px);
855
+ }
856
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th{
857
+ border-right-style: solid;
858
+ }
859
+ @supports not (border-inline-end-style: initial){
860
+ html:not([dir="rtl"]) sf-table th{
861
+ border-right-style: solid;
862
+ }
863
+ }
864
+ sf-table th:where(:dir(ltr)){
865
+ border-right-style: solid;
866
+ }
867
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th{
868
+ border-left-style: solid;
869
+ }
870
+ @supports not (border-inline-end-style: initial){
871
+ [dir="rtl"] sf-table th{
872
+ border-left-style: solid;
873
+ }
874
+ }
875
+ sf-table th:where(:dir(rtl)){
876
+ border-left-style: solid;
877
+ }
878
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th{
879
+ border-right-color: transparent;
880
+ }
881
+ @supports not (border-inline-end-color: initial){
882
+ html:not([dir="rtl"]) sf-table th{
883
+ border-right-color: transparent;
884
+ }
885
+ }
886
+ sf-table th:where(:dir(ltr)){
887
+ border-right-color: transparent;
888
+ }
889
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th{
890
+ border-left-color: transparent;
891
+ }
892
+ @supports not (border-inline-end-color: initial){
893
+ [dir="rtl"] sf-table th{
894
+ border-left-color: transparent;
895
+ }
896
+ }
897
+ sf-table th:where(:dir(rtl)){
898
+ border-left-color: transparent;
899
+ }
900
+ sf-table th {
901
+ border-inline-start-width: var(--sf-px);
902
+ border-inline-start-style: solid;
903
+ border-inline-start-color: transparent;
904
+ border-inline-end-width: var(--sf-px);
905
+ border-inline-end-style: solid;
906
+ border-inline-end-color: transparent;
907
+ }
908
+ /* The head's own separator on hover: a neutral line, not `inherit`, which
909
+ took whatever colour the head text happened to carry and read as a blue bar
910
+ wherever that was the primary colour. */
911
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th.hover{
912
+ border-right-color: var(--sf-outline);
913
+ }
914
+ @supports not (border-inline-end-color: initial){
915
+ html:not([dir="rtl"]) sf-view-table th.hover{
916
+ border-right-color: var(--sf-outline);
917
+ }
918
+ }
919
+ sf-view-table th.hover:where(:dir(ltr)){
920
+ border-right-color: var(--sf-outline);
921
+ }
922
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th.hover{
923
+ border-left-color: var(--sf-outline);
924
+ }
925
+ @supports not (border-inline-end-color: initial){
926
+ [dir="rtl"] sf-view-table th.hover{
927
+ border-left-color: var(--sf-outline);
928
+ }
929
+ }
930
+ sf-view-table th.hover:where(:dir(rtl)){
931
+ border-left-color: var(--sf-outline);
932
+ }
933
+ sf-view-table th.hover {
934
+ border-inline-end-color: var(--sf-outline);
935
+ }
936
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th.hover{
937
+ border-right-color: var(--sf-outline);
938
+ }
939
+ @supports not (border-inline-end-color: initial){
940
+ html:not([dir="rtl"]) sf-table th.hover{
941
+ border-right-color: var(--sf-outline);
942
+ }
943
+ }
944
+ sf-table th.hover:where(:dir(ltr)){
945
+ border-right-color: var(--sf-outline);
946
+ }
947
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th.hover{
948
+ border-left-color: var(--sf-outline);
949
+ }
950
+ @supports not (border-inline-end-color: initial){
951
+ [dir="rtl"] sf-table th.hover{
952
+ border-left-color: var(--sf-outline);
953
+ }
954
+ }
955
+ sf-table th.hover:where(:dir(rtl)){
956
+ border-left-color: var(--sf-outline);
957
+ }
958
+ sf-table th.hover {
959
+ border-inline-end-color: var(--sf-outline);
960
+ }
961
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-sort-button{
962
+ text-align: left;
963
+ }
964
+ @supports not (text-align: start){
965
+ html:not([dir="rtl"]) sf-view-table .sf-table-sort-button{
966
+ text-align: left;
967
+ }
968
+ }
969
+ sf-view-table .sf-table-sort-button:where(:dir(ltr)){
970
+ text-align: left;
971
+ }
972
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-sort-button{
973
+ text-align: right;
974
+ }
975
+ @supports not (text-align: start){
976
+ [dir="rtl"] sf-view-table .sf-table-sort-button{
977
+ text-align: right;
978
+ }
979
+ }
980
+ sf-view-table .sf-table-sort-button:where(:dir(rtl)){
981
+ text-align: right;
982
+ }
983
+ sf-view-table .sf-table-sort-button {
984
+ padding: 0;
985
+ border: 0;
986
+ background: none;
987
+ color: inherit;
988
+ font: inherit;
989
+ text-align: start;
990
+ cursor: pointer;
991
+ }
992
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-sort-button{
993
+ text-align: left;
994
+ }
995
+ @supports not (text-align: start){
996
+ html:not([dir="rtl"]) sf-table .sf-table-sort-button{
997
+ text-align: left;
998
+ }
999
+ }
1000
+ sf-table .sf-table-sort-button:where(:dir(ltr)){
1001
+ text-align: left;
1002
+ }
1003
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-sort-button{
1004
+ text-align: right;
1005
+ }
1006
+ @supports not (text-align: start){
1007
+ [dir="rtl"] sf-table .sf-table-sort-button{
1008
+ text-align: right;
1009
+ }
1010
+ }
1011
+ sf-table .sf-table-sort-button:where(:dir(rtl)){
1012
+ text-align: right;
1013
+ }
1014
+ sf-table .sf-table-sort-button {
1015
+ padding: 0;
1016
+ border: 0;
1017
+ background: none;
1018
+ color: inherit;
1019
+ font: inherit;
1020
+ text-align: start;
1021
+ cursor: pointer;
1022
+ }
1023
+ sf-view-table .sf-table-sort-icon {
1024
+ --sf-icon--font-size: var(--sf-icon-size-1);
1025
+ opacity: 0;
1026
+ }
1027
+ sf-table .sf-table-sort-icon {
1028
+ --sf-icon--font-size: var(--sf-icon-size-1);
1029
+ opacity: 0;
1030
+ }
1031
+ sf-view-table .sf-table-sort-button[data-direction] .sf-table-sort-icon {
1032
+ opacity: 1;
1033
+ }
1034
+ sf-table .sf-table-sort-button[data-direction] .sf-table-sort-icon {
1035
+ opacity: 1;
1036
+ }
1037
+ sf-view-table th:hover .sf-table-sort-icon {
1038
+ opacity: 1;
1039
+ }
1040
+ sf-table th:hover .sf-table-sort-icon {
1041
+ opacity: 1;
1042
+ }
1043
+ sf-view-table .sf-table-sort-button.focus-visible .sf-table-sort-icon {
1044
+ opacity: 1;
1045
+ }
1046
+ sf-table .sf-table-sort-button.focus-visible .sf-table-sort-icon {
1047
+ opacity: 1;
1048
+ }
1049
+ sf-view-table .sf-table-sort-button[data-direction] .sf-table-sort-icon {
1050
+ opacity: 1;
1051
+ }
1052
+ sf-table .sf-table-sort-button[data-direction] .sf-table-sort-icon {
1053
+ opacity: 1;
1054
+ }
1055
+ sf-view-table th:hover .sf-table-sort-icon {
1056
+ opacity: 1;
1057
+ }
1058
+ sf-table th:hover .sf-table-sort-icon {
1059
+ opacity: 1;
1060
+ }
1061
+ sf-view-table .sf-table-sort-button.focus-visible .sf-table-sort-icon {
1062
+ opacity: 1;
1063
+ }
1064
+ sf-view-table .sf-table-sort-button:focus-visible .sf-table-sort-icon {
1065
+ opacity: 1;
1066
+ }
1067
+ sf-table .sf-table-sort-button.focus-visible .sf-table-sort-icon {
1068
+ opacity: 1;
1069
+ }
1070
+ sf-table .sf-table-sort-button:focus-visible .sf-table-sort-icon {
1071
+ opacity: 1;
1072
+ }
1073
+ /* The strip that takes the width: it sits astride the line between two
1074
+ headers, is wide enough to hit with a mouse, and shows nothing of itself —
1075
+ the line it is on is the affordance, and the cursor says what it does. */
1076
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-column-resizer{
1077
+ right: calc(var(--sf-b0) / -2);
1078
+ }
1079
+ @supports not (inset-inline-end: initial){
1080
+ html:not([dir="rtl"]) sf-view-table .sf-table-column-resizer{
1081
+ right: calc(var(--sf-b0) / -2);
1082
+ }
1083
+ }
1084
+ sf-view-table .sf-table-column-resizer:where(:dir(ltr)){
1085
+ right: calc(var(--sf-b0) / -2);
1086
+ }
1087
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-column-resizer{
1088
+ left: calc(var(--sf-b0) / -2);
1089
+ }
1090
+ @supports not (inset-inline-end: initial){
1091
+ [dir="rtl"] sf-view-table .sf-table-column-resizer{
1092
+ left: calc(var(--sf-b0) / -2);
1093
+ }
1094
+ }
1095
+ sf-view-table .sf-table-column-resizer:where(:dir(rtl)){
1096
+ left: calc(var(--sf-b0) / -2);
1097
+ }
1098
+ sf-view-table .sf-table-column-resizer {
1099
+ position: absolute;
1100
+ top: 0;
1101
+ bottom: 0;
1102
+ inset-block: 0;
1103
+ inset-inline-end: calc(var(--sf-b0) / -2);
1104
+ width: var(--sf-b0);
1105
+ inline-size: var(--sf-b0);
1106
+ padding: 0;
1107
+ border: 0;
1108
+ background: none;
1109
+ color: inherit;
1110
+ cursor: col-resize;
1111
+ touch-action: none;
1112
+ z-index: 2;
1113
+ }
1114
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-column-resizer{
1115
+ right: calc(var(--sf-b0) / -2);
1116
+ }
1117
+ @supports not (inset-inline-end: initial){
1118
+ html:not([dir="rtl"]) sf-table .sf-table-column-resizer{
1119
+ right: calc(var(--sf-b0) / -2);
1120
+ }
1121
+ }
1122
+ sf-table .sf-table-column-resizer:where(:dir(ltr)){
1123
+ right: calc(var(--sf-b0) / -2);
1124
+ }
1125
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-column-resizer{
1126
+ left: calc(var(--sf-b0) / -2);
1127
+ }
1128
+ @supports not (inset-inline-end: initial){
1129
+ [dir="rtl"] sf-table .sf-table-column-resizer{
1130
+ left: calc(var(--sf-b0) / -2);
1131
+ }
1132
+ }
1133
+ sf-table .sf-table-column-resizer:where(:dir(rtl)){
1134
+ left: calc(var(--sf-b0) / -2);
1135
+ }
1136
+ sf-table .sf-table-column-resizer {
1137
+ position: absolute;
1138
+ top: 0;
1139
+ bottom: 0;
1140
+ inset-block: 0;
1141
+ inset-inline-end: calc(var(--sf-b0) / -2);
1142
+ width: var(--sf-b0);
1143
+ inline-size: var(--sf-b0);
1144
+ padding: 0;
1145
+ border: 0;
1146
+ background: none;
1147
+ color: inherit;
1148
+ cursor: col-resize;
1149
+ touch-action: none;
1150
+ z-index: 2;
1151
+ }
1152
+ /* The keyboard reaches it, so it has to show where it is: the shared ring,
1153
+ turned inwards, because the strip is flush with the headers on both sides
1154
+ and a ring drawn outside it would sit on their text. */
1155
+ sf-view-table .sf-table-column-resizer.focus-visible {
1156
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1157
+ outline-offset: calc(var(--sf-focus--width) * -1);
1158
+ }
1159
+ sf-table .sf-table-column-resizer.focus-visible {
1160
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1161
+ outline-offset: calc(var(--sf-focus--width) * -1);
1162
+ }
1163
+ sf-view-table .sf-table-column-resizer.focus-visible {
1164
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1165
+ outline-offset: calc(var(--sf-focus--width) * -1);
1166
+ }
1167
+ sf-view-table .sf-table-column-resizer:focus-visible {
1168
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1169
+ outline-offset: calc(var(--sf-focus--width) * -1);
1170
+ }
1171
+ sf-table .sf-table-column-resizer.focus-visible {
1172
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1173
+ outline-offset: calc(var(--sf-focus--width) * -1);
1174
+ }
1175
+ sf-table .sf-table-column-resizer:focus-visible {
1176
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1177
+ outline-offset: calc(var(--sf-focus--width) * -1);
1178
+ }
1179
+ sf-view-table th.is-resizing {
1180
+ -webkit-user-select: none;
1181
+ -moz-user-select: none;
1182
+ -ms-user-select: none;
1183
+ user-select: none;
1184
+ }
1185
+ sf-table th.is-resizing {
1186
+ -webkit-user-select: none;
1187
+ -moz-user-select: none;
1188
+ -ms-user-select: none;
1189
+ user-select: none;
1190
+ }
1191
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th.is-resizing-forward{
1192
+ border-right-color: var(--sf-primary);
1193
+ }
1194
+ @supports not (border-inline-end-color: initial){
1195
+ html:not([dir="rtl"]) sf-view-table th.is-resizing-forward{
1196
+ border-right-color: var(--sf-primary);
1197
+ }
1198
+ }
1199
+ sf-view-table th.is-resizing-forward:where(:dir(ltr)){
1200
+ border-right-color: var(--sf-primary);
1201
+ }
1202
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th.is-resizing-forward{
1203
+ border-left-color: var(--sf-primary);
1204
+ }
1205
+ @supports not (border-inline-end-color: initial){
1206
+ [dir="rtl"] sf-view-table th.is-resizing-forward{
1207
+ border-left-color: var(--sf-primary);
1208
+ }
1209
+ }
1210
+ sf-view-table th.is-resizing-forward:where(:dir(rtl)){
1211
+ border-left-color: var(--sf-primary);
1212
+ }
1213
+ sf-view-table th.is-resizing-forward {
1214
+ border-inline-end-color: var(--sf-primary);
1215
+ }
1216
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th.is-resizing-forward{
1217
+ border-right-color: var(--sf-primary);
1218
+ }
1219
+ @supports not (border-inline-end-color: initial){
1220
+ html:not([dir="rtl"]) sf-table th.is-resizing-forward{
1221
+ border-right-color: var(--sf-primary);
1222
+ }
1223
+ }
1224
+ sf-table th.is-resizing-forward:where(:dir(ltr)){
1225
+ border-right-color: var(--sf-primary);
1226
+ }
1227
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th.is-resizing-forward{
1228
+ border-left-color: var(--sf-primary);
1229
+ }
1230
+ @supports not (border-inline-end-color: initial){
1231
+ [dir="rtl"] sf-table th.is-resizing-forward{
1232
+ border-left-color: var(--sf-primary);
1233
+ }
1234
+ }
1235
+ sf-table th.is-resizing-forward:where(:dir(rtl)){
1236
+ border-left-color: var(--sf-primary);
1237
+ }
1238
+ sf-table th.is-resizing-forward {
1239
+ border-inline-end-color: var(--sf-primary);
1240
+ }
1241
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table th.is-resizing-backward{
1242
+ border-left-color: var(--sf-primary);
1243
+ }
1244
+ @supports not (border-inline-start-color: initial){
1245
+ html:not([dir="rtl"]) sf-view-table th.is-resizing-backward{
1246
+ border-left-color: var(--sf-primary);
1247
+ }
1248
+ }
1249
+ sf-view-table th.is-resizing-backward:where(:dir(ltr)){
1250
+ border-left-color: var(--sf-primary);
1251
+ }
1252
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table th.is-resizing-backward{
1253
+ border-right-color: var(--sf-primary);
1254
+ }
1255
+ @supports not (border-inline-start-color: initial){
1256
+ [dir="rtl"] sf-view-table th.is-resizing-backward{
1257
+ border-right-color: var(--sf-primary);
1258
+ }
1259
+ }
1260
+ sf-view-table th.is-resizing-backward:where(:dir(rtl)){
1261
+ border-right-color: var(--sf-primary);
1262
+ }
1263
+ sf-view-table th.is-resizing-backward {
1264
+ border-inline-start-color: var(--sf-primary);
1265
+ }
1266
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table th.is-resizing-backward{
1267
+ border-left-color: var(--sf-primary);
1268
+ }
1269
+ @supports not (border-inline-start-color: initial){
1270
+ html:not([dir="rtl"]) sf-table th.is-resizing-backward{
1271
+ border-left-color: var(--sf-primary);
1272
+ }
1273
+ }
1274
+ sf-table th.is-resizing-backward:where(:dir(ltr)){
1275
+ border-left-color: var(--sf-primary);
1276
+ }
1277
+ _:-ms-input-placeholder, [dir="rtl"] sf-table th.is-resizing-backward{
1278
+ border-right-color: var(--sf-primary);
1279
+ }
1280
+ @supports not (border-inline-start-color: initial){
1281
+ [dir="rtl"] sf-table th.is-resizing-backward{
1282
+ border-right-color: var(--sf-primary);
1283
+ }
1284
+ }
1285
+ sf-table th.is-resizing-backward:where(:dir(rtl)){
1286
+ border-right-color: var(--sf-primary);
1287
+ }
1288
+ sf-table th.is-resizing-backward {
1289
+ border-inline-start-color: var(--sf-primary);
1290
+ }
1291
+ /* A heading being dragged (SF.Sortable.attach): a sortable ghost follows
1292
+ the pointer and the heading text is not selected on the way. */
1293
+ html[data-sf-sortable-active] sf-view-table th {
1294
+ -webkit-user-select: none;
1295
+ -moz-user-select: none;
1296
+ -ms-user-select: none;
1297
+ user-select: none;
1298
+ }
1299
+ html[data-sf-sortable-active] sf-table th {
1300
+ -webkit-user-select: none;
1301
+ -moz-user-select: none;
1302
+ -ms-user-select: none;
1303
+ user-select: none;
1304
+ }
1305
+ .sf-table-column-resizing,
1306
+ .sf-table-column-resizing * {
1307
+ cursor: col-resize !important;
1308
+ -webkit-user-select: none !important;
1309
+ -moz-user-select: none !important;
1310
+ -ms-user-select: none !important;
1311
+ user-select: none !important;
1312
+ }
1313
+ /* The actions column's width is its <col>'s: as wide as the buttons it holds
1314
+ (sf-view-table actionsColumnWidth). A width on the head cell won in a fixed
1315
+ layout and held it at f0 -- 160px around one eye icon. */
1316
+ /* The head paints its own surface, and the colour has a role behind it.
1317
+ Until now it sat on `thead` alone, under a custom property nothing defines,
1318
+ so the head was transparent — invisible while the table rested on a surface
1319
+ of the same colour, and plainly wrong once the head became sticky: a sticky
1320
+ `th` leaves the box `thead` paints, and the rows scrolled through the
1321
+ labels. The fallback is `--sf-surface-0`, the surface `body` itself paints,
1322
+ because a table that is not inside a raised box rests on that one; a host
1323
+ that puts the table on another surface names it through the property. */
1324
+ sf-view-table > .sf-table thead {
1325
+ background-color: var(--sf-surface-0);
1326
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
1327
+ }
1328
+ sf-table > .sf-table thead {
1329
+ background-color: var(--sf-surface-0);
1330
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
1331
+ }
1332
+ sf-view-table > .sf-table thead th {
1333
+ background-color: var(--sf-surface-0);
1334
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
1335
+ }
1336
+ sf-table > .sf-table thead th {
1337
+ background-color: var(--sf-surface-0);
1338
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
1339
+ }
1340
+ sf-view-table > * .sf-table-avatar {
1341
+ max-width: var(--sf-table-avatar--max-width);
1342
+ }
1343
+ sf-table > * .sf-table-avatar {
1344
+ max-width: var(--sf-table-avatar--max-width);
1345
+ }
1346
+ sf-view-table .sf-table-link-cell {
1347
+ color: inherit;
1348
+ display: inline-flex;
1349
+ max-width: 100%;
1350
+ min-width: 0;
1351
+ text-decoration: none;
1352
+ }
1353
+ sf-table .sf-table-link-cell {
1354
+ color: inherit;
1355
+ display: inline-flex;
1356
+ max-width: 100%;
1357
+ min-width: 0;
1358
+ text-decoration: none;
1359
+ }
1360
+ /* One link in a table (owner, 2026-10-14): the link colour, no underline at
1361
+ rest, the underline on hover and focus -- the title, a link cell and a
1362
+ related record alike. Three styles side by side were visual noise. */
1363
+ sf-view-table a.sf-table-link-cell .sf-table-link-cell-text {
1364
+ color: var(--sf-link);
1365
+ text-decoration: none;
1366
+ text-underline-offset: var(--sf-a3);
1367
+ }
1368
+ sf-table a.sf-table-link-cell .sf-table-link-cell-text {
1369
+ color: var(--sf-link);
1370
+ text-decoration: none;
1371
+ text-underline-offset: var(--sf-a3);
1372
+ }
1373
+ sf-view-table .sf-table-title-link {
1374
+ color: var(--sf-link);
1375
+ text-decoration: none;
1376
+ text-underline-offset: var(--sf-a3);
1377
+ }
1378
+ sf-table .sf-table-title-link {
1379
+ color: var(--sf-link);
1380
+ text-decoration: none;
1381
+ text-underline-offset: var(--sf-a3);
1382
+ }
1383
+ sf-view-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a) {
1384
+ color: var(--sf-link);
1385
+ text-decoration: none;
1386
+ text-underline-offset: var(--sf-a3);
1387
+ }
1388
+ sf-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a) {
1389
+ color: var(--sf-link);
1390
+ text-decoration: none;
1391
+ text-underline-offset: var(--sf-a3);
1392
+ }
1393
+ sf-view-table a.sf-table-link-cell:hover .sf-table-link-cell-text {
1394
+ text-decoration: underline;
1395
+ }
1396
+ sf-view-table a.sf-table-link-cell.focus-visible .sf-table-link-cell-text {
1397
+ text-decoration: underline;
1398
+ }
1399
+ sf-table a.sf-table-link-cell:hover .sf-table-link-cell-text {
1400
+ text-decoration: underline;
1401
+ }
1402
+ sf-table a.sf-table-link-cell.focus-visible .sf-table-link-cell-text {
1403
+ text-decoration: underline;
1404
+ }
1405
+ sf-view-table .sf-table-title-link:hover {
1406
+ text-decoration: underline;
1407
+ }
1408
+ sf-view-table .sf-table-title-link.focus-visible {
1409
+ text-decoration: underline;
1410
+ }
1411
+ sf-table .sf-table-title-link:hover {
1412
+ text-decoration: underline;
1413
+ }
1414
+ sf-table .sf-table-title-link.focus-visible {
1415
+ text-decoration: underline;
1416
+ }
1417
+ sf-view-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a):hover {
1418
+ text-decoration: underline;
1419
+ }
1420
+ sf-view-table .sf-reference-link .focus-visible:where(.sf-reference-link__link, .sf-reference-link-left > a) {
1421
+ text-decoration: underline;
1422
+ }
1423
+ sf-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a):hover {
1424
+ text-decoration: underline;
1425
+ }
1426
+ sf-table .sf-reference-link .focus-visible:where(.sf-reference-link__link, .sf-reference-link-left > a) {
1427
+ text-decoration: underline;
1428
+ }
1429
+ sf-view-table a.sf-table-link-cell:hover .sf-table-link-cell-text {
1430
+ text-decoration: underline;
1431
+ }
1432
+ sf-view-table a.sf-table-link-cell.focus-visible .sf-table-link-cell-text {
1433
+ text-decoration: underline;
1434
+ }
1435
+ sf-view-table a.sf-table-link-cell:focus-visible .sf-table-link-cell-text {
1436
+ text-decoration: underline;
1437
+ }
1438
+ sf-table a.sf-table-link-cell:hover .sf-table-link-cell-text {
1439
+ text-decoration: underline;
1440
+ }
1441
+ sf-table a.sf-table-link-cell.focus-visible .sf-table-link-cell-text {
1442
+ text-decoration: underline;
1443
+ }
1444
+ sf-table a.sf-table-link-cell:focus-visible .sf-table-link-cell-text {
1445
+ text-decoration: underline;
1446
+ }
1447
+ sf-view-table .sf-table-title-link:hover {
1448
+ text-decoration: underline;
1449
+ }
1450
+ sf-view-table .sf-table-title-link.focus-visible {
1451
+ text-decoration: underline;
1452
+ }
1453
+ sf-view-table .sf-table-title-link:focus-visible {
1454
+ text-decoration: underline;
1455
+ }
1456
+ sf-table .sf-table-title-link:hover {
1457
+ text-decoration: underline;
1458
+ }
1459
+ sf-table .sf-table-title-link.focus-visible {
1460
+ text-decoration: underline;
1461
+ }
1462
+ sf-table .sf-table-title-link:focus-visible {
1463
+ text-decoration: underline;
1464
+ }
1465
+ sf-view-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a):hover {
1466
+ text-decoration: underline;
1467
+ }
1468
+ sf-view-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a).focus-visible {
1469
+ text-decoration: underline;
1470
+ }
1471
+ sf-view-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a):focus-visible {
1472
+ text-decoration: underline;
1473
+ }
1474
+ sf-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a):hover {
1475
+ text-decoration: underline;
1476
+ }
1477
+ sf-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a).focus-visible {
1478
+ text-decoration: underline;
1479
+ }
1480
+ sf-table .sf-reference-link :where(.sf-reference-link__link, .sf-reference-link-left > a):focus-visible {
1481
+ text-decoration: underline;
1482
+ }
1483
+ sf-view-table .sf-table-link-cell-text {
1484
+ overflow: hidden;
1485
+ text-overflow: ellipsis;
1486
+ white-space: nowrap;
1487
+ }
1488
+ sf-table .sf-table-link-cell-text {
1489
+ overflow: hidden;
1490
+ text-overflow: ellipsis;
1491
+ white-space: nowrap;
1492
+ }
1493
+ sf-view-table .sf-table-link-cell-subtext {
1494
+ overflow: hidden;
1495
+ text-overflow: ellipsis;
1496
+ white-space: nowrap;
1497
+ }
1498
+ sf-table .sf-table-link-cell-subtext {
1499
+ overflow: hidden;
1500
+ text-overflow: ellipsis;
1501
+ white-space: nowrap;
1502
+ }
1503
+ sf-view-table .sf-table-link-cell-subtext {
1504
+ color: var(--sf-on-surface-variant);
1505
+ }
1506
+ sf-table .sf-table-link-cell-subtext {
1507
+ color: var(--sf-on-surface-variant);
1508
+ }
1509
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-top{
1510
+ padding-right: var(--sf-table-context-top--padding-inline-end);
1511
+ }
1512
+ @supports not (padding-inline-end: initial){
1513
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-top{
1514
+ padding-right: var(--sf-table-context-top--padding-inline-end);
1515
+ }
1516
+ }
1517
+ .sf-table-context-menu .sf-table-context-top:where(:dir(ltr)){
1518
+ padding-right: var(--sf-table-context-top--padding-inline-end);
1519
+ }
1520
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-table-context-top{
1521
+ padding-left: var(--sf-table-context-top--padding-inline-end);
1522
+ }
1523
+ @supports not (padding-inline-end: initial){
1524
+ [dir="rtl"] .sf-table-context-menu .sf-table-context-top{
1525
+ padding-left: var(--sf-table-context-top--padding-inline-end);
1526
+ }
1527
+ }
1528
+ .sf-table-context-menu .sf-table-context-top:where(:dir(rtl)){
1529
+ padding-left: var(--sf-table-context-top--padding-inline-end);
1530
+ }
1531
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-top{
1532
+ padding-left: var(--sf-table-context-top--padding-inline-start);
1533
+ }
1534
+ @supports not (padding-inline-start: initial){
1535
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-top{
1536
+ padding-left: var(--sf-table-context-top--padding-inline-start);
1537
+ }
1538
+ }
1539
+ .sf-table-context-menu .sf-table-context-top:where(:dir(ltr)){
1540
+ padding-left: var(--sf-table-context-top--padding-inline-start);
1541
+ }
1542
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-table-context-top{
1543
+ padding-right: var(--sf-table-context-top--padding-inline-start);
1544
+ }
1545
+ @supports not (padding-inline-start: initial){
1546
+ [dir="rtl"] .sf-table-context-menu .sf-table-context-top{
1547
+ padding-right: var(--sf-table-context-top--padding-inline-start);
1548
+ }
1549
+ }
1550
+ .sf-table-context-menu .sf-table-context-top:where(:dir(rtl)){
1551
+ padding-right: var(--sf-table-context-top--padding-inline-start);
1552
+ }
1553
+ .sf-table-context-menu .sf-table-context-top {
1554
+ --sf-table-context-top--padding-inline-end: var(--sf-context-menu--inset-end);
1555
+ --sf-table-context-top--padding-inline-start: var(--sf-context-menu--inset-start);
1556
+ --sf-table-context-top--padding-top: var(--sf-context-menu--block-space);
1557
+ padding-bottom: 0;
1558
+ padding-bottom: var(--sf-table-context-top--padding-bottom, 0);
1559
+ padding-top: var(--sf-table-context-top--padding-top);
1560
+ -webkit-padding-end: var(--sf-table-context-top--padding-inline-end);
1561
+ padding-inline-end: var(--sf-table-context-top--padding-inline-end);
1562
+ -webkit-padding-start: var(--sf-table-context-top--padding-inline-start);
1563
+ padding-inline-start: var(--sf-table-context-top--padding-inline-start);
1564
+ }
1565
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-main{
1566
+ padding-right: var(--sf-table-context-main--padding-inline-end);
1567
+ }
1568
+ @supports not (padding-inline-end: initial){
1569
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-main{
1570
+ padding-right: var(--sf-table-context-main--padding-inline-end);
1571
+ }
1572
+ }
1573
+ .sf-table-context-menu .sf-table-context-main:where(:dir(ltr)){
1574
+ padding-right: var(--sf-table-context-main--padding-inline-end);
1575
+ }
1576
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-table-context-main{
1577
+ padding-left: var(--sf-table-context-main--padding-inline-end);
1578
+ }
1579
+ @supports not (padding-inline-end: initial){
1580
+ [dir="rtl"] .sf-table-context-menu .sf-table-context-main{
1581
+ padding-left: var(--sf-table-context-main--padding-inline-end);
1582
+ }
1583
+ }
1584
+ .sf-table-context-menu .sf-table-context-main:where(:dir(rtl)){
1585
+ padding-left: var(--sf-table-context-main--padding-inline-end);
1586
+ }
1587
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-main{
1588
+ padding-left: var(--sf-table-context-main--padding-inline-start);
1589
+ }
1590
+ @supports not (padding-inline-start: initial){
1591
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-table-context-main{
1592
+ padding-left: var(--sf-table-context-main--padding-inline-start);
1593
+ }
1594
+ }
1595
+ .sf-table-context-menu .sf-table-context-main:where(:dir(ltr)){
1596
+ padding-left: var(--sf-table-context-main--padding-inline-start);
1597
+ }
1598
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-table-context-main{
1599
+ padding-right: var(--sf-table-context-main--padding-inline-start);
1600
+ }
1601
+ @supports not (padding-inline-start: initial){
1602
+ [dir="rtl"] .sf-table-context-menu .sf-table-context-main{
1603
+ padding-right: var(--sf-table-context-main--padding-inline-start);
1604
+ }
1605
+ }
1606
+ .sf-table-context-menu .sf-table-context-main:where(:dir(rtl)){
1607
+ padding-right: var(--sf-table-context-main--padding-inline-start);
1608
+ }
1609
+ .sf-table-context-menu .sf-table-context-main {
1610
+ --sf-table-context-main--padding-inline-end: var(--sf-context-menu--inset-end);
1611
+ --sf-table-context-main--padding-inline-start: var(--sf-context-menu--inset-start);
1612
+ padding-bottom: 0;
1613
+ padding-bottom: var(--sf-table-context-main--padding-bottom, 0);
1614
+ padding-top: 0;
1615
+ padding-top: var(--sf-table-context-main--padding-top, 0);
1616
+ -webkit-padding-end: var(--sf-table-context-main--padding-inline-end);
1617
+ padding-inline-end: var(--sf-table-context-main--padding-inline-end);
1618
+ -webkit-padding-start: var(--sf-table-context-main--padding-inline-start);
1619
+ padding-inline-start: var(--sf-table-context-main--padding-inline-start);
1620
+ }
1621
+ /* The window's buttons are the standard menu's footer
1622
+ (.sf-context-menu-footer): its insets, separator and shared width. */
1623
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-context-menu-columns{
1624
+ padding-right: var(--sf-context-menu-columns--padding-inline-end);
1625
+ }
1626
+ @supports not (padding-inline-end: initial){
1627
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-context-menu-columns{
1628
+ padding-right: var(--sf-context-menu-columns--padding-inline-end);
1629
+ }
1630
+ }
1631
+ .sf-table-context-menu .sf-context-menu-columns:where(:dir(ltr)){
1632
+ padding-right: var(--sf-context-menu-columns--padding-inline-end);
1633
+ }
1634
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-context-menu-columns{
1635
+ padding-left: var(--sf-context-menu-columns--padding-inline-end);
1636
+ }
1637
+ @supports not (padding-inline-end: initial){
1638
+ [dir="rtl"] .sf-table-context-menu .sf-context-menu-columns{
1639
+ padding-left: var(--sf-context-menu-columns--padding-inline-end);
1640
+ }
1641
+ }
1642
+ .sf-table-context-menu .sf-context-menu-columns:where(:dir(rtl)){
1643
+ padding-left: var(--sf-context-menu-columns--padding-inline-end);
1644
+ }
1645
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-menu .sf-context-menu-columns{
1646
+ padding-left: var(--sf-context-menu-columns--padding-inline-start);
1647
+ }
1648
+ @supports not (padding-inline-start: initial){
1649
+ html:not([dir="rtl"]) .sf-table-context-menu .sf-context-menu-columns{
1650
+ padding-left: var(--sf-context-menu-columns--padding-inline-start);
1651
+ }
1652
+ }
1653
+ .sf-table-context-menu .sf-context-menu-columns:where(:dir(ltr)){
1654
+ padding-left: var(--sf-context-menu-columns--padding-inline-start);
1655
+ }
1656
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-menu .sf-context-menu-columns{
1657
+ padding-right: var(--sf-context-menu-columns--padding-inline-start);
1658
+ }
1659
+ @supports not (padding-inline-start: initial){
1660
+ [dir="rtl"] .sf-table-context-menu .sf-context-menu-columns{
1661
+ padding-right: var(--sf-context-menu-columns--padding-inline-start);
1662
+ }
1663
+ }
1664
+ .sf-table-context-menu .sf-context-menu-columns:where(:dir(rtl)){
1665
+ padding-right: var(--sf-context-menu-columns--padding-inline-start);
1666
+ }
1667
+ .sf-table-context-menu .sf-context-menu-columns {
1668
+ --sf-context-menu-columns--padding-inline-end: var(--sf-context-menu--inset-end);
1669
+ --sf-context-menu-columns--padding-inline-start: var(--sf-context-menu--inset-start);
1670
+ --sf-context-menu-columns--padding-top: var(--sf-context-menu--block-space);
1671
+ --sf-context-menu-columns--padding-bottom: var(--sf-context-menu--block-space);
1672
+ padding-bottom: 0;
1673
+ padding-bottom: var(--sf-context-menu-columns--padding-bottom, 0);
1674
+ padding-top: var(--sf-context-menu-columns--padding-top);
1675
+ -webkit-padding-end: var(--sf-context-menu-columns--padding-inline-end);
1676
+ padding-inline-end: var(--sf-context-menu-columns--padding-inline-end);
1677
+ -webkit-padding-start: var(--sf-context-menu-columns--padding-inline-start);
1678
+ padding-inline-start: var(--sf-context-menu-columns--padding-inline-start);
1679
+ }
1680
+ /* A table's windows are standard menus at the table's size (owner,
1681
+ 2026-10-14): their blocks take the menu's insets and block space, so a
1682
+ window at 1/2 reads at the step of the list it belongs to. */
1683
+ /* Skeleton bars at the dense step are about the height of the row's
1684
+ lowercase letters, not of the whole text line: at a text line's height a
1685
+ bar read heavier than the text it stands for (owner, 2026-10-13). */
1686
+ sf-view-table[size="1/2"] .sf-table-skeleton .sf-skeleton-text {
1687
+ --sf-skeleton-text--height: var(--sf-b0);
1688
+ }
1689
+ sf-table[size="1/2"] .sf-table-skeleton .sf-skeleton-text {
1690
+ --sf-skeleton-text--height: var(--sf-b0);
1691
+ }
1692
+ /* A loading row is as tall as a loaded one: the bar stands in a line of the
1693
+ row's own text, and the controls' columns hold a block of that line. */
1694
+ sf-view-table .sf-table-skeleton .sf-skeleton-text {
1695
+ --sf-skeleton-text--line: 1lh;
1696
+ }
1697
+ sf-table .sf-table-skeleton .sf-skeleton-text {
1698
+ --sf-skeleton-text--line: 1lh;
1699
+ }
1700
+ sf-view-table .sf-table-skeleton-control {
1701
+ height: 1lh;
1702
+ block-size: 1lh;
1703
+ }
1704
+ sf-table .sf-table-skeleton-control {
1705
+ height: 1lh;
1706
+ block-size: 1lh;
1707
+ }
1708
+ /* A window's own buttons keep their words on one line: a longer label
1709
+ («Применить фильтр» once) was two pixels wider than half the row and broke in two, making the
1710
+ buttons twice as tall as the controls above them. */
1711
+ .sf-table-context-menu .sf-context-menu-footer .sf-button-text-container {
1712
+ white-space: nowrap;
1713
+ }
1714
+ .sf-table-context-menu .sf-settings-context-menu-item [data-keep]:not(.sf-button-pinned) {
1715
+ opacity: 0;
1716
+ }
1717
+ .sf-table-context-menu .sf-settings-context-menu-item.is-dragging {
1718
+ opacity: 0.8;
1719
+ /* A dragged item is lifted to step 3: surface and shadow, or it is flat
1720
+ in the dark theme. */
1721
+ background-color: var(--sf-elevation-3--surface);
1722
+ --sf-on-surface-variant: var(--sf-on-elevation-3--variant);
1723
+ box-shadow: var(--sf-elevation-3--shadow);
1724
+ }
1725
+ /* Where a dragged row will land: the Framework's silhouette (sf-sortable
1726
+ preview="silhouette"), an outline of its size with a faint fill, the same
1727
+ in every list the admin reorders (owner, 2026-10-13). A placeholder at a
1728
+ third of the row's opacity read as a ghost of the row, not as a place. */
1729
+ sf-view-table .drag-placeholder {
1730
+ box-sizing: border-box;
1731
+ border: var(--sf-px) dashed var(--sf-outline-primary);
1732
+ border-radius: var(--sf-radius--ui);
1733
+ background-color: var(--sf-primary-transparent-select);
1734
+ pointer-events: none;
1735
+ }
1736
+ sf-table .drag-placeholder {
1737
+ box-sizing: border-box;
1738
+ border: var(--sf-px) dashed var(--sf-outline-primary);
1739
+ border-radius: var(--sf-radius--ui);
1740
+ background-color: var(--sf-primary-transparent-select);
1741
+ pointer-events: none;
1742
+ }
1743
+ .sf-table-context-menu .sf-settings-context-menu-item.drag-placeholder {
1744
+ box-sizing: border-box;
1745
+ border: var(--sf-px) dashed var(--sf-outline-primary);
1746
+ border-radius: var(--sf-radius--ui);
1747
+ background-color: var(--sf-primary-transparent-select);
1748
+ pointer-events: none;
1749
+ }
1750
+ sf-view-table .drag-placeholder > * {
1751
+ visibility: hidden;
1752
+ }
1753
+ sf-table .drag-placeholder > * {
1754
+ visibility: hidden;
1755
+ }
1756
+ .sf-table-context-menu .sf-settings-context-menu-item.drag-placeholder > * {
1757
+ visibility: hidden;
1758
+ }
1759
+ /* A tree row (data view port 1.8.0): the first data cell is indented by the
1760
+ row's level, one icon step per level, and leads with the button that
1761
+ opens or closes the node -- or with its width, so leaves line up with the
1762
+ nodes beside them. */
1763
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-tree-cell{
1764
+ padding-left: calc(0 * var(--sf-icon-size-2));
1765
+ padding-left: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1766
+ }
1767
+ @supports not (padding-inline-start: initial){
1768
+ html:not([dir="rtl"]) sf-view-table .sf-table-tree-cell{
1769
+ padding-left: calc(0 * var(--sf-icon-size-2));
1770
+ padding-left: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1771
+ }
1772
+ }
1773
+ sf-view-table .sf-table-tree-cell:where(:dir(ltr)){
1774
+ padding-left: calc(0 * var(--sf-icon-size-2));
1775
+ padding-left: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1776
+ }
1777
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-tree-cell{
1778
+ padding-right: calc(0 * var(--sf-icon-size-2));
1779
+ padding-right: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1780
+ }
1781
+ @supports not (padding-inline-start: initial){
1782
+ [dir="rtl"] sf-view-table .sf-table-tree-cell{
1783
+ padding-right: calc(0 * var(--sf-icon-size-2));
1784
+ padding-right: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1785
+ }
1786
+ }
1787
+ sf-view-table .sf-table-tree-cell:where(:dir(rtl)){
1788
+ padding-right: calc(0 * var(--sf-icon-size-2));
1789
+ padding-right: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1790
+ }
1791
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-tree-cell{
1792
+ padding-left: calc(0 * var(--sf-icon-size-2));
1793
+ }
1794
+ @supports not (padding-inline-start: initial){
1795
+ html:not([dir="rtl"]) sf-view-table .sf-table-tree-cell{
1796
+ padding-left: calc(0 * var(--sf-icon-size-2));
1797
+ }
1798
+ }
1799
+ sf-view-table .sf-table-tree-cell:where(:dir(ltr)){
1800
+ padding-left: calc(0 * var(--sf-icon-size-2));
1801
+ }
1802
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-tree-cell{
1803
+ padding-right: calc(0 * var(--sf-icon-size-2));
1804
+ }
1805
+ @supports not (padding-inline-start: initial){
1806
+ [dir="rtl"] sf-view-table .sf-table-tree-cell{
1807
+ padding-right: calc(0 * var(--sf-icon-size-2));
1808
+ }
1809
+ }
1810
+ sf-view-table .sf-table-tree-cell:where(:dir(rtl)){
1811
+ padding-right: calc(0 * var(--sf-icon-size-2));
1812
+ }
1813
+ sf-view-table .sf-table-tree-cell {
1814
+ display: flex;
1815
+ align-items: center;
1816
+ gap: var(--sf-a4);
1817
+ min-width: 0;
1818
+ min-inline-size: 0;
1819
+ -webkit-padding-start: calc(0 * var(--sf-icon-size-2));
1820
+ padding-inline-start: calc(0 * var(--sf-icon-size-2));
1821
+ -webkit-padding-start: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1822
+ padding-inline-start: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1823
+ }
1824
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-tree-cell{
1825
+ padding-left: calc(0 * var(--sf-icon-size-2));
1826
+ padding-left: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1827
+ }
1828
+ @supports not (padding-inline-start: initial){
1829
+ html:not([dir="rtl"]) sf-table .sf-table-tree-cell{
1830
+ padding-left: calc(0 * var(--sf-icon-size-2));
1831
+ padding-left: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1832
+ }
1833
+ }
1834
+ sf-table .sf-table-tree-cell:where(:dir(ltr)){
1835
+ padding-left: calc(0 * var(--sf-icon-size-2));
1836
+ padding-left: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1837
+ }
1838
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-tree-cell{
1839
+ padding-right: calc(0 * var(--sf-icon-size-2));
1840
+ padding-right: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1841
+ }
1842
+ @supports not (padding-inline-start: initial){
1843
+ [dir="rtl"] sf-table .sf-table-tree-cell{
1844
+ padding-right: calc(0 * var(--sf-icon-size-2));
1845
+ padding-right: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1846
+ }
1847
+ }
1848
+ sf-table .sf-table-tree-cell:where(:dir(rtl)){
1849
+ padding-right: calc(0 * var(--sf-icon-size-2));
1850
+ padding-right: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1851
+ }
1852
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-tree-cell{
1853
+ padding-left: calc(0 * var(--sf-icon-size-2));
1854
+ }
1855
+ @supports not (padding-inline-start: initial){
1856
+ html:not([dir="rtl"]) sf-table .sf-table-tree-cell{
1857
+ padding-left: calc(0 * var(--sf-icon-size-2));
1858
+ }
1859
+ }
1860
+ sf-table .sf-table-tree-cell:where(:dir(ltr)){
1861
+ padding-left: calc(0 * var(--sf-icon-size-2));
1862
+ }
1863
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-tree-cell{
1864
+ padding-right: calc(0 * var(--sf-icon-size-2));
1865
+ }
1866
+ @supports not (padding-inline-start: initial){
1867
+ [dir="rtl"] sf-table .sf-table-tree-cell{
1868
+ padding-right: calc(0 * var(--sf-icon-size-2));
1869
+ }
1870
+ }
1871
+ sf-table .sf-table-tree-cell:where(:dir(rtl)){
1872
+ padding-right: calc(0 * var(--sf-icon-size-2));
1873
+ }
1874
+ sf-table .sf-table-tree-cell {
1875
+ display: flex;
1876
+ align-items: center;
1877
+ gap: var(--sf-a4);
1878
+ min-width: 0;
1879
+ min-inline-size: 0;
1880
+ -webkit-padding-start: calc(0 * var(--sf-icon-size-2));
1881
+ padding-inline-start: calc(0 * var(--sf-icon-size-2));
1882
+ -webkit-padding-start: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1883
+ padding-inline-start: calc(var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
1884
+ }
1885
+ sf-view-table .sf-table-tree-toggle {
1886
+ flex: none;
1887
+ display: inline-flex;
1888
+ align-items: center;
1889
+ justify-content: center;
1890
+ width: var(--sf-icon-size-2);
1891
+ inline-size: var(--sf-icon-size-2);
1892
+ height: var(--sf-icon-size-2);
1893
+ block-size: var(--sf-icon-size-2);
1894
+ padding: 0;
1895
+ border: 0;
1896
+ border-radius: var(--sf-radius--ui);
1897
+ background: none;
1898
+ color: var(--sf-on-surface-variant);
1899
+ }
1900
+ sf-table .sf-table-tree-toggle {
1901
+ flex: none;
1902
+ display: inline-flex;
1903
+ align-items: center;
1904
+ justify-content: center;
1905
+ width: var(--sf-icon-size-2);
1906
+ inline-size: var(--sf-icon-size-2);
1907
+ height: var(--sf-icon-size-2);
1908
+ block-size: var(--sf-icon-size-2);
1909
+ padding: 0;
1910
+ border: 0;
1911
+ border-radius: var(--sf-radius--ui);
1912
+ background: none;
1913
+ color: var(--sf-on-surface-variant);
1914
+ }
1915
+ sf-view-table button.sf-table-tree-toggle {
1916
+ cursor: pointer;
1917
+ }
1918
+ sf-table button.sf-table-tree-toggle {
1919
+ cursor: pointer;
1920
+ }
1921
+ sf-view-table button.sf-table-tree-toggle.focus-visible {
1922
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1923
+ outline-offset: 0;
1924
+ outline-offset: var(--sf-focus--offset, 0);
1925
+ }
1926
+ sf-table button.sf-table-tree-toggle.focus-visible {
1927
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1928
+ outline-offset: 0;
1929
+ outline-offset: var(--sf-focus--offset, 0);
1930
+ }
1931
+ sf-view-table button.sf-table-tree-toggle.focus-visible {
1932
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1933
+ outline-offset: 0;
1934
+ outline-offset: var(--sf-focus--offset, 0);
1935
+ }
1936
+ sf-view-table button.sf-table-tree-toggle.focus-visible {
1937
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1938
+ outline-offset: 0;
1939
+ outline-offset: 0;
1940
+ outline-offset: var(--sf-focus--offset, 0);
1941
+ }
1942
+ sf-view-table button.sf-table-tree-toggle:focus-visible {
1943
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1944
+ outline-offset: 0;
1945
+ outline-offset: var(--sf-focus--offset, 0);
1946
+ }
1947
+ sf-table button.sf-table-tree-toggle.focus-visible {
1948
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1949
+ outline-offset: 0;
1950
+ outline-offset: var(--sf-focus--offset, 0);
1951
+ }
1952
+ sf-table button.sf-table-tree-toggle.focus-visible {
1953
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1954
+ outline-offset: 0;
1955
+ outline-offset: 0;
1956
+ outline-offset: var(--sf-focus--offset, 0);
1957
+ }
1958
+ sf-table button.sf-table-tree-toggle:focus-visible {
1959
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
1960
+ outline-offset: 0;
1961
+ outline-offset: var(--sf-focus--offset, 0);
1962
+ }
1963
+ sf-view-table .sf-table-tree-toggle .sf-icon {
1964
+ --sf-icon--color: currentColor;
1965
+ transition: -webkit-transform var(--sf-duration-fast);
1966
+ transition: transform var(--sf-duration-fast);
1967
+ transition: transform var(--sf-duration-fast), -webkit-transform var(--sf-duration-fast);
1968
+ }
1969
+ sf-table .sf-table-tree-toggle .sf-icon {
1970
+ --sf-icon--color: currentColor;
1971
+ transition: -webkit-transform var(--sf-duration-fast);
1972
+ transition: transform var(--sf-duration-fast);
1973
+ transition: transform var(--sf-duration-fast), -webkit-transform var(--sf-duration-fast);
1974
+ }
1975
+ sf-view-table .sf-table-tree-toggle:dir(rtl) .sf-icon {
1976
+ -webkit-transform: rotate(180deg);
1977
+ transform: rotate(180deg);
1978
+ }
1979
+ sf-table .sf-table-tree-toggle:dir(rtl) .sf-icon {
1980
+ -webkit-transform: rotate(180deg);
1981
+ transform: rotate(180deg);
1982
+ }
1983
+ sf-view-table .sf-table-tree-toggle[data-expanded] .sf-icon {
1984
+ -webkit-transform: rotate(90deg);
1985
+ transform: rotate(90deg);
1986
+ }
1987
+ sf-table .sf-table-tree-toggle[data-expanded] .sf-icon {
1988
+ -webkit-transform: rotate(90deg);
1989
+ transform: rotate(90deg);
1990
+ }
1991
+ /* Named for assistive technology, not drawn: the actions column's heading. */
1992
+ sf-view-table .sf-table-visually-hidden {
1993
+ position: absolute;
1994
+ width: var(--sf-px);
1995
+ inline-size: var(--sf-px);
1996
+ height: var(--sf-px);
1997
+ block-size: var(--sf-px);
1998
+ margin: calc(var(--sf-px) * -1);
1999
+ padding: 0;
2000
+ overflow: hidden;
2001
+ -webkit-clip-path: inset(50%);
2002
+ clip-path: inset(50%);
2003
+ white-space: nowrap;
2004
+ border: 0;
2005
+ }
2006
+ sf-table .sf-table-visually-hidden {
2007
+ position: absolute;
2008
+ width: var(--sf-px);
2009
+ inline-size: var(--sf-px);
2010
+ height: var(--sf-px);
2011
+ block-size: var(--sf-px);
2012
+ margin: calc(var(--sf-px) * -1);
2013
+ padding: 0;
2014
+ overflow: hidden;
2015
+ -webkit-clip-path: inset(50%);
2016
+ clip-path: inset(50%);
2017
+ white-space: nowrap;
2018
+ border: 0;
2019
+ }
2020
+ /* A cell's plain text, three lines at most. */
2021
+ sf-view-table .sf-table-cell-text {
2022
+ display: -webkit-box;
2023
+ -webkit-box-orient: vertical;
2024
+ -webkit-line-clamp: 3;
2025
+ -webkit-line-clamp: var(--sf-table-cell--line-clamp, 3);
2026
+ line-clamp: 3;
2027
+ line-clamp: var(--sf-table-cell--line-clamp, 3);
2028
+ overflow: hidden;
2029
+ word-wrap: anywhere;
2030
+ }
2031
+ sf-table .sf-table-cell-text {
2032
+ display: -webkit-box;
2033
+ -webkit-box-orient: vertical;
2034
+ -webkit-line-clamp: 3;
2035
+ -webkit-line-clamp: var(--sf-table-cell--line-clamp, 3);
2036
+ line-clamp: 3;
2037
+ line-clamp: var(--sf-table-cell--line-clamp, 3);
2038
+ overflow: hidden;
2039
+ word-wrap: anywhere;
2040
+ }
2041
+ /* The node's icon: one icon step, on the line, in the variant role -- it
2042
+ says what the node is, the title says which. */
2043
+ sf-view-table .sf-table-tree-icon {
2044
+ --sf-icon--color: var(--sf-on-surface-variant);
2045
+ --sf-icon--font-size: var(--sf-icon-size-2);
2046
+ --sf-icon--width: var(--sf-icon-size-2);
2047
+ --sf-icon--height: var(--sf-icon-size-2);
2048
+ flex: none;
2049
+ }
2050
+ sf-table .sf-table-tree-icon {
2051
+ --sf-icon--color: var(--sf-on-surface-variant);
2052
+ --sf-icon--font-size: var(--sf-icon-size-2);
2053
+ --sf-icon--width: var(--sf-icon-size-2);
2054
+ --sf-icon--height: var(--sf-icon-size-2);
2055
+ flex: none;
2056
+ }
2057
+ sf-view-table .sf-table-tree-path {
2058
+ overflow: hidden;
2059
+ text-overflow: ellipsis;
2060
+ white-space: nowrap;
2061
+ color: var(--sf-on-surface-variant);
2062
+ font-size: var(--sf-text-size-1\/3);
2063
+ line-height: var(--sf-text-height-1\/3);
2064
+ }
2065
+ sf-table .sf-table-tree-path {
2066
+ overflow: hidden;
2067
+ text-overflow: ellipsis;
2068
+ white-space: nowrap;
2069
+ color: var(--sf-on-surface-variant);
2070
+ font-size: var(--sf-text-size-1\/3);
2071
+ line-height: var(--sf-text-height-1\/3);
2072
+ }
2073
+ /* ─── the compact list (layout list, or auto below list-below) ───────────
2074
+ A record is a block: its box, its title and a few fields under it, its row
2075
+ menu. It carries the row's states with the row's colours, so selecting and
2076
+ hovering read the same in both. */
2077
+ sf-view-table .sf-table-list {
2078
+ display: flex;
2079
+ flex-direction: column;
2080
+ margin: 0;
2081
+ padding: 0;
2082
+ list-style: none;
2083
+ }
2084
+ sf-table .sf-table-list {
2085
+ display: flex;
2086
+ flex-direction: column;
2087
+ margin: 0;
2088
+ padding: 0;
2089
+ list-style: none;
2090
+ }
2091
+ sf-view-table .sf-table-list-item {
2092
+ display: grid;
2093
+ grid-template-columns: auto minmax(0, 1fr) auto;
2094
+ align-items: start;
2095
+ grid-gap: var(--sf-a8);
2096
+ gap: var(--sf-a8);
2097
+ padding: var(--sf-a8);
2098
+ border-bottom: var(--sf-px) solid var(--sf-outline-variant);
2099
+ -webkit-border-after: var(--sf-px) solid var(--sf-outline-variant);
2100
+ border-block-end: var(--sf-px) solid var(--sf-outline-variant);
2101
+ background-color: var(--sf-surface-0);
2102
+ background-color: var(--sf-table-row--background-color, var(--sf-surface-0));
2103
+ }
2104
+ sf-table .sf-table-list-item {
2105
+ display: grid;
2106
+ grid-template-columns: auto minmax(0, 1fr) auto;
2107
+ align-items: start;
2108
+ grid-gap: var(--sf-a8);
2109
+ gap: var(--sf-a8);
2110
+ padding: var(--sf-a8);
2111
+ border-bottom: var(--sf-px) solid var(--sf-outline-variant);
2112
+ -webkit-border-after: var(--sf-px) solid var(--sf-outline-variant);
2113
+ border-block-end: var(--sf-px) solid var(--sf-outline-variant);
2114
+ background-color: var(--sf-surface-0);
2115
+ background-color: var(--sf-table-row--background-color, var(--sf-surface-0));
2116
+ }
2117
+ sf-view-table .sf-table-list-item:hover {
2118
+ background-image: linear-gradient(var(--sf-surface-container-hover), var(--sf-surface-container-hover));
2119
+ }
2120
+ sf-table .sf-table-list-item:hover {
2121
+ background-image: linear-gradient(var(--sf-surface-container-hover), var(--sf-surface-container-hover));
2122
+ }
2123
+ sf-view-table .sf-table-list-item[data-selected] {
2124
+ background-image: linear-gradient(var(--sf-primary-container), var(--sf-primary-container));
2125
+ }
2126
+ sf-table .sf-table-list-item[data-selected] {
2127
+ background-image: linear-gradient(var(--sf-primary-container), var(--sf-primary-container));
2128
+ }
2129
+ sf-view-table .sf-table-list-item[data-selected]:hover {
2130
+ background-image: linear-gradient(var(--sf-primary-container-hover), var(--sf-primary-container-hover));
2131
+ }
2132
+ sf-table .sf-table-list-item[data-selected]:hover {
2133
+ background-image: linear-gradient(var(--sf-primary-container-hover), var(--sf-primary-container-hover));
2134
+ }
2135
+ sf-view-table .sf-table-list-item.focus-visible {
2136
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2137
+ outline-offset: calc(var(--sf-focus--width) * -1);
2138
+ }
2139
+ sf-table .sf-table-list-item.focus-visible {
2140
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2141
+ outline-offset: calc(var(--sf-focus--width) * -1);
2142
+ }
2143
+ sf-view-table .sf-table-list-item.focus-visible {
2144
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2145
+ outline-offset: calc(var(--sf-focus--width) * -1);
2146
+ }
2147
+ sf-view-table .sf-table-list-item:focus-visible {
2148
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2149
+ outline-offset: calc(var(--sf-focus--width) * -1);
2150
+ }
2151
+ sf-table .sf-table-list-item.focus-visible {
2152
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2153
+ outline-offset: calc(var(--sf-focus--width) * -1);
2154
+ }
2155
+ sf-table .sf-table-list-item:focus-visible {
2156
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2157
+ outline-offset: calc(var(--sf-focus--width) * -1);
2158
+ }
2159
+ sf-view-table .sf-table-list-main {
2160
+ display: flex;
2161
+ flex-direction: column;
2162
+ gap: var(--sf-a4);
2163
+ min-width: 0;
2164
+ min-inline-size: 0;
2165
+ }
2166
+ sf-table .sf-table-list-main {
2167
+ display: flex;
2168
+ flex-direction: column;
2169
+ gap: var(--sf-a4);
2170
+ min-width: 0;
2171
+ min-inline-size: 0;
2172
+ }
2173
+ sf-view-table .sf-table-list-title {
2174
+ min-width: 0;
2175
+ min-inline-size: 0;
2176
+ word-wrap: anywhere;
2177
+ font-weight: 500;
2178
+ }
2179
+ sf-table .sf-table-list-title {
2180
+ min-width: 0;
2181
+ min-inline-size: 0;
2182
+ word-wrap: anywhere;
2183
+ font-weight: 500;
2184
+ }
2185
+ sf-view-table .sf-table-list-fields {
2186
+ display: flex;
2187
+ flex-wrap: wrap;
2188
+ gap: var(--sf-a4) var(--sf-space-1\/2);
2189
+ min-width: 0;
2190
+ min-inline-size: 0;
2191
+ }
2192
+ sf-table .sf-table-list-fields {
2193
+ display: flex;
2194
+ flex-wrap: wrap;
2195
+ gap: var(--sf-a4) var(--sf-space-1\/2);
2196
+ min-width: 0;
2197
+ min-inline-size: 0;
2198
+ }
2199
+ sf-view-table .sf-table-list-field {
2200
+ display: inline-flex;
2201
+ flex-wrap: wrap;
2202
+ align-items: center;
2203
+ gap: var(--sf-a4);
2204
+ min-width: 0;
2205
+ min-inline-size: 0;
2206
+ max-width: 100%;
2207
+ max-inline-size: 100%;
2208
+ }
2209
+ sf-table .sf-table-list-field {
2210
+ display: inline-flex;
2211
+ flex-wrap: wrap;
2212
+ align-items: center;
2213
+ gap: var(--sf-a4);
2214
+ min-width: 0;
2215
+ min-inline-size: 0;
2216
+ max-width: 100%;
2217
+ max-inline-size: 100%;
2218
+ }
2219
+ sf-view-table .sf-table-list-label {
2220
+ color: var(--sf-on-surface-variant);
2221
+ font-size: var(--sf-text-size-1\/2);
2222
+ line-height: var(--sf-text-height-1\/2);
2223
+ }
2224
+ sf-table .sf-table-list-label {
2225
+ color: var(--sf-on-surface-variant);
2226
+ font-size: var(--sf-text-size-1\/2);
2227
+ line-height: var(--sf-text-height-1\/2);
2228
+ }
2229
+ sf-view-table .sf-table-list-value {
2230
+ min-width: 0;
2231
+ min-inline-size: 0;
2232
+ word-wrap: anywhere;
2233
+ }
2234
+ sf-table .sf-table-list-value {
2235
+ min-width: 0;
2236
+ min-inline-size: 0;
2237
+ word-wrap: anywhere;
2238
+ }
2239
+ /* Several values -- a page's badge per language -- wrap whole rather than
2240
+ each shrinking to an ellipsis. */
2241
+ sf-view-table .sf-table-list-value > .flex-wrap > * {
2242
+ flex-shrink: 0;
2243
+ max-width: 100%;
2244
+ max-inline-size: 100%;
2245
+ }
2246
+ sf-table .sf-table-list-value > .flex-wrap > * {
2247
+ flex-shrink: 0;
2248
+ max-width: 100%;
2249
+ max-inline-size: 100%;
2250
+ }
2251
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-list-more{
2252
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2253
+ padding-left: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2254
+ }
2255
+ @supports not (padding-inline-start: initial){
2256
+ html:not([dir="rtl"]) sf-view-table .sf-table-list-more{
2257
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2258
+ padding-left: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2259
+ }
2260
+ }
2261
+ sf-view-table .sf-table-list-more:where(:dir(ltr)){
2262
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2263
+ padding-left: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2264
+ }
2265
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-list-more{
2266
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2267
+ padding-right: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2268
+ }
2269
+ @supports not (padding-inline-start: initial){
2270
+ [dir="rtl"] sf-view-table .sf-table-list-more{
2271
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2272
+ padding-right: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2273
+ }
2274
+ }
2275
+ sf-view-table .sf-table-list-more:where(:dir(rtl)){
2276
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2277
+ padding-right: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2278
+ }
2279
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-list-more{
2280
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2281
+ }
2282
+ @supports not (padding-inline-start: initial){
2283
+ html:not([dir="rtl"]) sf-view-table .sf-table-list-more{
2284
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2285
+ }
2286
+ }
2287
+ sf-view-table .sf-table-list-more:where(:dir(ltr)){
2288
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2289
+ }
2290
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-list-more{
2291
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2292
+ }
2293
+ @supports not (padding-inline-start: initial){
2294
+ [dir="rtl"] sf-view-table .sf-table-list-more{
2295
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2296
+ }
2297
+ }
2298
+ sf-view-table .sf-table-list-more:where(:dir(rtl)){
2299
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2300
+ }
2301
+ sf-view-table .sf-table-list-more {
2302
+ padding: var(--sf-a4) var(--sf-a8);
2303
+ -webkit-padding-start: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2304
+ padding-inline-start: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2305
+ -webkit-padding-start: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2306
+ padding-inline-start: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2307
+ }
2308
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-list-more{
2309
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2310
+ padding-left: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2311
+ }
2312
+ @supports not (padding-inline-start: initial){
2313
+ html:not([dir="rtl"]) sf-table .sf-table-list-more{
2314
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2315
+ padding-left: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2316
+ }
2317
+ }
2318
+ sf-table .sf-table-list-more:where(:dir(ltr)){
2319
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2320
+ padding-left: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2321
+ }
2322
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-list-more{
2323
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2324
+ padding-right: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2325
+ }
2326
+ @supports not (padding-inline-start: initial){
2327
+ [dir="rtl"] sf-table .sf-table-list-more{
2328
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2329
+ padding-right: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2330
+ }
2331
+ }
2332
+ sf-table .sf-table-list-more:where(:dir(rtl)){
2333
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2334
+ padding-right: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2335
+ }
2336
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-list-more{
2337
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2338
+ }
2339
+ @supports not (padding-inline-start: initial){
2340
+ html:not([dir="rtl"]) sf-table .sf-table-list-more{
2341
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2342
+ }
2343
+ }
2344
+ sf-table .sf-table-list-more:where(:dir(ltr)){
2345
+ padding-left: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2346
+ }
2347
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-list-more{
2348
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2349
+ }
2350
+ @supports not (padding-inline-start: initial){
2351
+ [dir="rtl"] sf-table .sf-table-list-more{
2352
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2353
+ }
2354
+ }
2355
+ sf-table .sf-table-list-more:where(:dir(rtl)){
2356
+ padding-right: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2357
+ }
2358
+ sf-table .sf-table-list-more {
2359
+ padding: var(--sf-a4) var(--sf-a8);
2360
+ -webkit-padding-start: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2361
+ padding-inline-start: calc(var(--sf-a8) + 0 * var(--sf-icon-size-2));
2362
+ -webkit-padding-start: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2363
+ padding-inline-start: calc(var(--sf-a8) + var(--sf-table-tree--level, 0) * var(--sf-icon-size-2));
2364
+ }
2365
+ /* The filter button carries how many conditions are on. */
2366
+ sf-view-table .sf-table-list-filter {
2367
+ position: relative;
2368
+ display: inline-flex;
2369
+ flex: none;
2370
+ }
2371
+ sf-table .sf-table-list-filter {
2372
+ position: relative;
2373
+ display: inline-flex;
2374
+ flex: none;
2375
+ }
2376
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-list-filter-count{
2377
+ right: calc(var(--sf-a4) * -1);
2378
+ }
2379
+ @supports not (inset-inline-end: initial){
2380
+ html:not([dir="rtl"]) sf-view-table .sf-table-list-filter-count{
2381
+ right: calc(var(--sf-a4) * -1);
2382
+ }
2383
+ }
2384
+ sf-view-table .sf-table-list-filter-count:where(:dir(ltr)){
2385
+ right: calc(var(--sf-a4) * -1);
2386
+ }
2387
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-list-filter-count{
2388
+ left: calc(var(--sf-a4) * -1);
2389
+ }
2390
+ @supports not (inset-inline-end: initial){
2391
+ [dir="rtl"] sf-view-table .sf-table-list-filter-count{
2392
+ left: calc(var(--sf-a4) * -1);
2393
+ }
2394
+ }
2395
+ sf-view-table .sf-table-list-filter-count:where(:dir(rtl)){
2396
+ left: calc(var(--sf-a4) * -1);
2397
+ }
2398
+ sf-view-table .sf-table-list-filter-count {
2399
+ position: absolute;
2400
+ top: calc(var(--sf-a4) * -1);
2401
+ inset-block-start: calc(var(--sf-a4) * -1);
2402
+ inset-inline-end: calc(var(--sf-a4) * -1);
2403
+ min-width: var(--sf-text-height-1\/2);
2404
+ min-inline-size: var(--sf-text-height-1\/2);
2405
+ padding-left: var(--sf-a2);
2406
+ padding-right: var(--sf-a2);
2407
+ padding-inline: var(--sf-a2);
2408
+ border-radius: var(--sf-radius-circle);
2409
+ background-color: var(--sf-error);
2410
+ color: var(--sf-on-error);
2411
+ font-size: var(--sf-text-size-1\/2);
2412
+ line-height: var(--sf-text-height-1\/2);
2413
+ text-align: center;
2414
+ pointer-events: none;
2415
+ }
2416
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-list-filter-count{
2417
+ right: calc(var(--sf-a4) * -1);
2418
+ }
2419
+ @supports not (inset-inline-end: initial){
2420
+ html:not([dir="rtl"]) sf-table .sf-table-list-filter-count{
2421
+ right: calc(var(--sf-a4) * -1);
2422
+ }
2423
+ }
2424
+ sf-table .sf-table-list-filter-count:where(:dir(ltr)){
2425
+ right: calc(var(--sf-a4) * -1);
2426
+ }
2427
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-list-filter-count{
2428
+ left: calc(var(--sf-a4) * -1);
2429
+ }
2430
+ @supports not (inset-inline-end: initial){
2431
+ [dir="rtl"] sf-table .sf-table-list-filter-count{
2432
+ left: calc(var(--sf-a4) * -1);
2433
+ }
2434
+ }
2435
+ sf-table .sf-table-list-filter-count:where(:dir(rtl)){
2436
+ left: calc(var(--sf-a4) * -1);
2437
+ }
2438
+ sf-table .sf-table-list-filter-count {
2439
+ position: absolute;
2440
+ top: calc(var(--sf-a4) * -1);
2441
+ inset-block-start: calc(var(--sf-a4) * -1);
2442
+ inset-inline-end: calc(var(--sf-a4) * -1);
2443
+ min-width: var(--sf-text-height-1\/2);
2444
+ min-inline-size: var(--sf-text-height-1\/2);
2445
+ padding-left: var(--sf-a2);
2446
+ padding-right: var(--sf-a2);
2447
+ padding-inline: var(--sf-a2);
2448
+ border-radius: var(--sf-radius-circle);
2449
+ background-color: var(--sf-error);
2450
+ color: var(--sf-on-error);
2451
+ font-size: var(--sf-text-size-1\/2);
2452
+ line-height: var(--sf-text-height-1\/2);
2453
+ text-align: center;
2454
+ pointer-events: none;
2455
+ }
2456
+ /* Active filters: one row of chips that scrolls sideways, so the list starts
2457
+ where it starts however many there are. */
2458
+ sf-view-table .sf-table-list-tags {
2459
+ flex-wrap: nowrap;
2460
+ overflow-x: auto;
2461
+ scrollbar-width: none;
2462
+ }
2463
+ sf-table .sf-table-list-tags {
2464
+ flex-wrap: nowrap;
2465
+ overflow-x: auto;
2466
+ scrollbar-width: none;
2467
+ }
2468
+ sf-view-table .sf-table-list-tags > * {
2469
+ flex: none;
2470
+ }
2471
+ sf-table .sf-table-list-tags > * {
2472
+ flex: none;
2473
+ }
2474
+ /* The filter in the list opens as a sheet over the whole screen: a menu hung
2475
+ from a 32px button on a phone leaves no room for its fields. The menu
2476
+ lives in the table's portal, outside sf-view-table, and places itself with
2477
+ inline styles from the button; the sheet's rule overrides them. */
2478
+ .sf-table-context-layer[data-sf-sheet] .sf-table-context-menu {
2479
+ position: fixed !important;
2480
+ top: 0 !important;
2481
+ right: 0 !important;
2482
+ bottom: 0 !important;
2483
+ left: 0 !important;
2484
+ inset: 0 !important;
2485
+ -webkit-transform: none !important;
2486
+ transform: none !important;
2487
+ translate: none !important;
2488
+ width: 100% !important;
2489
+ inline-size: 100% !important;
2490
+ max-width: none !important;
2491
+ max-inline-size: none !important;
2492
+ height: 100% !important;
2493
+ block-size: 100% !important;
2494
+ max-height: none !important;
2495
+ max-block-size: none !important;
2496
+ margin: 0 !important;
2497
+ border-radius: 0 !important;
2498
+ overflow-y: auto;
2499
+ /* The sheet is the screen, so it paints the screen; the panel inside paints
2500
+ only as far as its fields reach. Room is left at the top for the way out. */
2501
+ background-color: var(--sf-elevation-3--surface) !important;
2502
+ padding-top: calc(var(--sf-text-height-1) + var(--sf-ui-1--space-y-tightness-default) * 2 + var(--sf-a8) * 2) !important;
2503
+ -webkit-padding-before: calc(var(--sf-text-height-1) + var(--sf-ui-1--space-y-tightness-default) * 2 + var(--sf-a8) * 2) !important;
2504
+ padding-block-start: calc(var(--sf-text-height-1) + var(--sf-ui-1--space-y-tightness-default) * 2 + var(--sf-a8) * 2) !important;
2505
+ --sf-table-context-menu--max-block-size: 100dvh;
2506
+ }
2507
+ /* The sheet's way out: nothing outside it is left to press. */
2508
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-context-layer[data-sf-sheet] .sf-table-sheet-close{
2509
+ right: var(--sf-a8);
2510
+ }
2511
+ @supports not (inset-inline-end: initial){
2512
+ html:not([dir="rtl"]) .sf-table-context-layer[data-sf-sheet] .sf-table-sheet-close{
2513
+ right: var(--sf-a8);
2514
+ }
2515
+ }
2516
+ .sf-table-context-layer[data-sf-sheet] .sf-table-sheet-close:where(:dir(ltr)){
2517
+ right: var(--sf-a8);
2518
+ }
2519
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-context-layer[data-sf-sheet] .sf-table-sheet-close{
2520
+ left: var(--sf-a8);
2521
+ }
2522
+ @supports not (inset-inline-end: initial){
2523
+ [dir="rtl"] .sf-table-context-layer[data-sf-sheet] .sf-table-sheet-close{
2524
+ left: var(--sf-a8);
2525
+ }
2526
+ }
2527
+ .sf-table-context-layer[data-sf-sheet] .sf-table-sheet-close:where(:dir(rtl)){
2528
+ left: var(--sf-a8);
2529
+ }
2530
+ .sf-table-context-layer[data-sf-sheet] .sf-table-sheet-close {
2531
+ position: fixed;
2532
+ top: var(--sf-a8);
2533
+ inset-block-start: var(--sf-a8);
2534
+ inset-inline-end: var(--sf-a8);
2535
+ z-index: calc(var(--sf-z-index-9) + 1);
2536
+ }
2537
+ }
2538
+ @layer sf.states {
2539
+ .sf-table-context-menu .sf-settings-context-menu-item:hover [data-keep] {
2540
+ opacity: 1;
2541
+ }
2542
+ }
2543
+ @layer sf.overrides {
2544
+ .sf-icon-button.sf-button-pinned .sf-icon {
2545
+ --sf-button-pinned--color: var(--sf-primary);
2546
+ --sf-icon--color: var(--sf-button-pinned--color);
2547
+ }
2548
+ .sf-table-context-menu .sf-context-menu-content {
2549
+ /*--sf-context-menu-content--padding-bottom: var(--sf-space-2);*/
2550
+ /*--sf-context-menu-content--padding-inline-end: var(--sf-space-2);*/
2551
+ /*--sf-context-menu-content--padding-inline-start: var(--sf-space-2);*/
2552
+ /*--sf-context-menu-content--padding-top: var(--sf-space-2);*/
2553
+ /* These are lengths, not numbers. The menu's own axis is published as
2554
+ `calc(space-x + 1px - var(--sf-context-menu-content--padding-inline-start))`,
2555
+ and a unitless 0 makes that calc invalid, so the whole declaration is
2556
+ dropped: the axis read as nothing on this panel, the menu's own items lost
2557
+ their inset here, and this window's blocks had no axis to follow. A zero
2558
+ with a unit costs nothing and keeps the arithmetic valid. */
2559
+ --sf-context-menu-content--padding-bottom: 0px;
2560
+ --sf-context-menu-content--padding-inline-end: 0px;
2561
+ --sf-context-menu-content--padding-inline-start: 0px;
2562
+ --sf-context-menu-content--padding-top: 0px;
2563
+ }
2564
+ .sf-table-context-menu .sf-settings-context-menu-item .sf-icon-button {
2565
+ --sf-icon-button--padding-top: var(--sf-ui-1\/2--space-y-tightness-default);
2566
+ --sf-icon-button--padding-bottom: var(--sf-ui-1\/2--space-y-tightness-default);
2567
+ --sf-icon-button--padding-inline-start: var(--sf-ui-1\/2--space-y-tightness-default);
2568
+ --sf-icon-button--padding-inline-end: var(--sf-ui-1\/2--space-y-tightness-default);
2569
+ }
2570
+ sf-view-table > * .sf-search-input.sf-input.sf-input--size-1 .sf-input-field {
2571
+ --sf-input-field--padding-bottom: var(
2572
+ --sf-ui-1\/3--space-y-tightness-default
2573
+ );
2574
+ --sf-input-field--padding-top: var(--sf-ui-1\/3--space-y-tightness-default);
2575
+ }
2576
+ sf-table > * .sf-search-input.sf-input.sf-input--size-1 .sf-input-field {
2577
+ --sf-input-field--padding-bottom: var(
2578
+ --sf-ui-1\/3--space-y-tightness-default
2579
+ );
2580
+ --sf-input-field--padding-top: var(--sf-ui-1\/3--space-y-tightness-default);
2581
+ }
2582
+ sf-view-table > * .sf-search-input.sf-input.sf-input--size-1 .sf-icon-button--size-1 {
2583
+ --sf-icon-button--padding-bottom: var(
2584
+ --sf-ui-1\/3--space-y-tightness-default
2585
+ );
2586
+ --sf-icon-button--padding-inline-end: var(
2587
+ --sf-ui-1\/3--space-y-tightness-default
2588
+ );
2589
+ --sf-icon-button--padding-inline-start: var(
2590
+ --sf-ui-1\/3--space-y-tightness-default
2591
+ );
2592
+ --sf-icon-button--padding-top: var(--sf-ui-1\/3--space-y-tightness-default);
2593
+ }
2594
+ sf-table > * .sf-search-input.sf-input.sf-input--size-1 .sf-icon-button--size-1 {
2595
+ --sf-icon-button--padding-bottom: var(
2596
+ --sf-ui-1\/3--space-y-tightness-default
2597
+ );
2598
+ --sf-icon-button--padding-inline-end: var(
2599
+ --sf-ui-1\/3--space-y-tightness-default
2600
+ );
2601
+ --sf-icon-button--padding-inline-start: var(
2602
+ --sf-ui-1\/3--space-y-tightness-default
2603
+ );
2604
+ --sf-icon-button--padding-top: var(--sf-ui-1\/3--space-y-tightness-default);
2605
+ }
2606
+ sf-view-table .sf-avatar-label-group-container {
2607
+ flex: 1 1 auto;
2608
+ min-width: 0;
2609
+ }
2610
+ sf-table .sf-avatar-label-group-container {
2611
+ flex: 1 1 auto;
2612
+ min-width: 0;
2613
+ }
2614
+ sf-view-table .sf-avatar-label-group-title {
2615
+ overflow: hidden;
2616
+ white-space: nowrap;
2617
+ text-overflow: ellipsis;
2618
+ }
2619
+ sf-table .sf-avatar-label-group-title {
2620
+ overflow: hidden;
2621
+ white-space: nowrap;
2622
+ text-overflow: ellipsis;
2623
+ }
2624
+ /* Who the head sticks to follows who owns the scroll. A sticky element binds
2625
+ to its nearest scroll container, so while the rows scroll in their own area
2626
+ the head sticks to that area — right when the host bounds the table's
2627
+ height, useless when it does not: the area never scrolls, the page does,
2628
+ and the head leaves with it.
2629
+
2630
+ In `page` mode the area stops being a scroll container at all, so the head
2631
+ resolves against the viewport. Measured rather than assumed: with the head
2632
+ sticky and the page scrolled by 600px, `overflow: auto` leaves it at
2633
+ -398px, `overflow-x: auto` with `overflow-y: clip` also leaves it at -398
2634
+ because the clip axis computes to `hidden` and still makes a scroll
2635
+ container, a bounded height leaves it at -398 as well, and only
2636
+ `overflow: visible` holds it at 0. The cost is that a table wider than the
2637
+ page scrolls the page sideways instead of scrolling inside its own box. */
2638
+ /* One scroll on a list page (owner, 2026-10-15, from the approved
2639
+ prototype): the page scrolls, never an area inside it, so in page mode the
2640
+ table takes the height of its rows rather than shrinking into its box; the
2641
+ area scrolls sideways only, its own bar replaced by the sticky rail under
2642
+ it; the head is held under the toolbar by the table itself (it moves the
2643
+ head while the page scrolls, see syncStickyHead), because a sticky head
2644
+ binds to the area, which scrolls sideways and so is a scroll container. */
2645
+ sf-view-table[data-sf-page-scroll] > .sf-table {
2646
+ flex: none;
2647
+ min-height: auto;
2648
+ min-block-size: auto;
2649
+ }
2650
+ sf-table[data-sf-page-scroll] > .sf-table {
2651
+ flex: none;
2652
+ min-height: auto;
2653
+ min-block-size: auto;
2654
+ }
2655
+ sf-view-table[data-sf-page-scroll] .table-wrap {
2656
+ flex: none;
2657
+ min-height: auto;
2658
+ min-block-size: auto;
2659
+ }
2660
+ sf-table[data-sf-page-scroll] .table-wrap {
2661
+ flex: none;
2662
+ min-height: auto;
2663
+ min-block-size: auto;
2664
+ }
2665
+ sf-view-table .sf-table-scroll[data-sf-vertical-scroll=page] {
2666
+ flex: none;
2667
+ min-height: auto;
2668
+ min-block-size: auto;
2669
+ }
2670
+ sf-table .sf-table-scroll[data-sf-vertical-scroll=page] {
2671
+ flex: none;
2672
+ min-height: auto;
2673
+ min-block-size: auto;
2674
+ }
2675
+ sf-view-table .sf-table-scroll[data-sf-vertical-scroll=page] {
2676
+ overflow-x: auto;
2677
+ overflow-y: hidden;
2678
+ scrollbar-width: none;
2679
+ }
2680
+ sf-table .sf-table-scroll[data-sf-vertical-scroll=page] {
2681
+ overflow-x: auto;
2682
+ overflow-y: hidden;
2683
+ scrollbar-width: none;
2684
+ }
2685
+ sf-view-table .sf-table-scroll[data-sf-vertical-scroll=page]::-webkit-scrollbar {
2686
+ display: none;
2687
+ }
2688
+ sf-table .sf-table-scroll[data-sf-vertical-scroll=page]::-webkit-scrollbar {
2689
+ display: none;
2690
+ }
2691
+ /* The sideways bar, held at the bottom of the window while the table runs
2692
+ past it, and in its place under the rows once they end. */
2693
+ /* The area and its rail follow each other step for step: a smooth scroll
2694
+ (the core's default) sent each half-way position back to the other, and
2695
+ the two settled near the start. */
2696
+ sf-view-table .sf-table-scroll[data-sf-vertical-scroll=page] {
2697
+ scroll-behavior: auto;
2698
+ }
2699
+ sf-table .sf-table-scroll[data-sf-vertical-scroll=page] {
2700
+ scroll-behavior: auto;
2701
+ }
2702
+ sf-view-table .sf-table-rail {
2703
+ scroll-behavior: auto;
2704
+ }
2705
+ sf-table .sf-table-rail {
2706
+ scroll-behavior: auto;
2707
+ }
2708
+ sf-view-table .sf-table-rail {
2709
+ position: sticky;
2710
+ bottom: 0;
2711
+ inset-block-end: 0;
2712
+ z-index: 5;
2713
+ overflow-x: auto;
2714
+ overflow-y: hidden;
2715
+ background-color: var(--sf-surface-0);
2716
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
2717
+ }
2718
+ sf-table .sf-table-rail {
2719
+ position: sticky;
2720
+ bottom: 0;
2721
+ inset-block-end: 0;
2722
+ z-index: 5;
2723
+ overflow-x: auto;
2724
+ overflow-y: hidden;
2725
+ background-color: var(--sf-surface-0);
2726
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
2727
+ }
2728
+ sf-view-table .sf-table-rail[hidden] {
2729
+ display: none;
2730
+ }
2731
+ sf-table .sf-table-rail[hidden] {
2732
+ display: none;
2733
+ }
2734
+ sf-view-table .sf-table-rail-track {
2735
+ height: var(--sf-px);
2736
+ block-size: var(--sf-px);
2737
+ }
2738
+ sf-table .sf-table-rail-track {
2739
+ height: var(--sf-px);
2740
+ block-size: var(--sf-px);
2741
+ }
2742
+ /* Held: the toolbar at the top of what scrolls, the head under it. */
2743
+ sf-view-table[data-sf-sticky-head] .sf-table-toolbar {
2744
+ position: sticky;
2745
+ top: 0;
2746
+ inset-block-start: 0;
2747
+ z-index: 6;
2748
+ background-color: var(--sf-surface-0);
2749
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
2750
+ }
2751
+ sf-table[data-sf-sticky-head] .sf-table-toolbar {
2752
+ position: sticky;
2753
+ top: 0;
2754
+ inset-block-start: 0;
2755
+ z-index: 6;
2756
+ background-color: var(--sf-surface-0);
2757
+ background-color: var(--sf-table-head--background-color, var(--sf-surface-0));
2758
+ }
2759
+ sf-view-table[data-sf-page-scroll] thead {
2760
+ position: relative;
2761
+ z-index: 4;
2762
+ }
2763
+ sf-table[data-sf-page-scroll] thead {
2764
+ position: relative;
2765
+ z-index: 4;
2766
+ }
2767
+ sf-view-table[data-sf-head-stuck] thead {
2768
+ box-shadow: 0 var(--sf-px) 0 var(--sf-outline-variant);
2769
+ }
2770
+ sf-table[data-sf-head-stuck] thead {
2771
+ box-shadow: 0 var(--sf-px) 0 var(--sf-outline-variant);
2772
+ }
2773
+ /* A re-query over rows already on screen dims them and shows one spinner in
2774
+ the middle of what the person can see. `sticky` centres it against the
2775
+ scrollport rather than the table, so it stays in the middle of the visible
2776
+ part of a table taller or wider than its box — the old loader replaced the
2777
+ rows and sat in the top left corner of the result. */
2778
+ /* The spinner over the rows takes no room: sticky, it stayed in the flow
2779
+ with its own height and pushed the table down for as long as a sort or a
2780
+ page took, and the table jumped down and back (owner, 2026-10-14). It is a
2781
+ line of no height in the middle of the visible box, the spinner hung on
2782
+ it. */
2783
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-busy{
2784
+ left: 50%;
2785
+ }
2786
+ @supports not (inset-inline-start: initial){
2787
+ html:not([dir="rtl"]) sf-view-table .sf-table-busy{
2788
+ left: 50%;
2789
+ }
2790
+ }
2791
+ sf-view-table .sf-table-busy:where(:dir(ltr)){
2792
+ left: 50%;
2793
+ }
2794
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-busy{
2795
+ right: 50%;
2796
+ }
2797
+ @supports not (inset-inline-start: initial){
2798
+ [dir="rtl"] sf-view-table .sf-table-busy{
2799
+ right: 50%;
2800
+ }
2801
+ }
2802
+ sf-view-table .sf-table-busy:where(:dir(rtl)){
2803
+ right: 50%;
2804
+ }
2805
+ sf-view-table .sf-table-busy {
2806
+ position: sticky;
2807
+ top: 50%;
2808
+ inset-block-start: 50%;
2809
+ inset-inline-start: 50%;
2810
+ translate: -50% 0;
2811
+ width: -webkit-fit-content;
2812
+ width: -moz-fit-content;
2813
+ width: fit-content;
2814
+ inline-size: -webkit-fit-content;
2815
+ inline-size: -moz-fit-content;
2816
+ inline-size: fit-content;
2817
+ height: 0;
2818
+ block-size: 0;
2819
+ overflow: visible;
2820
+ z-index: 4;
2821
+ pointer-events: none;
2822
+ }
2823
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-busy{
2824
+ left: 50%;
2825
+ }
2826
+ @supports not (inset-inline-start: initial){
2827
+ html:not([dir="rtl"]) sf-table .sf-table-busy{
2828
+ left: 50%;
2829
+ }
2830
+ }
2831
+ sf-table .sf-table-busy:where(:dir(ltr)){
2832
+ left: 50%;
2833
+ }
2834
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-busy{
2835
+ right: 50%;
2836
+ }
2837
+ @supports not (inset-inline-start: initial){
2838
+ [dir="rtl"] sf-table .sf-table-busy{
2839
+ right: 50%;
2840
+ }
2841
+ }
2842
+ sf-table .sf-table-busy:where(:dir(rtl)){
2843
+ right: 50%;
2844
+ }
2845
+ sf-table .sf-table-busy {
2846
+ position: sticky;
2847
+ top: 50%;
2848
+ inset-block-start: 50%;
2849
+ inset-inline-start: 50%;
2850
+ translate: -50% 0;
2851
+ width: -webkit-fit-content;
2852
+ width: -moz-fit-content;
2853
+ width: fit-content;
2854
+ inline-size: -webkit-fit-content;
2855
+ inline-size: -moz-fit-content;
2856
+ inline-size: fit-content;
2857
+ height: 0;
2858
+ block-size: 0;
2859
+ overflow: visible;
2860
+ z-index: 4;
2861
+ pointer-events: none;
2862
+ }
2863
+ sf-view-table .sf-table-busy > * {
2864
+ translate: 0 -50%;
2865
+ }
2866
+ sf-table .sf-table-busy > * {
2867
+ translate: 0 -50%;
2868
+ }
2869
+ /* The title column's link to the record: the table's one link style
2870
+ (above), in the title's weight. */
2871
+ sf-view-table .sf-table-title-link {
2872
+ font-weight: var(--sf-font-weight-medium);
2873
+ }
2874
+ sf-table .sf-table-title-link {
2875
+ font-weight: var(--sf-font-weight-medium);
2876
+ }
2877
+ sf-view-table .sf-table-title-link.focus-visible {
2878
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2879
+ outline-offset: var(--sf-a2);
2880
+ border-radius: var(--sf-radius--ui);
2881
+ }
2882
+ sf-table .sf-table-title-link.focus-visible {
2883
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2884
+ outline-offset: var(--sf-a2);
2885
+ border-radius: var(--sf-radius--ui);
2886
+ }
2887
+ sf-view-table .sf-table-title-link.focus-visible {
2888
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2889
+ outline-offset: var(--sf-a2);
2890
+ border-radius: var(--sf-radius--ui);
2891
+ }
2892
+ sf-view-table .sf-table-title-link:focus-visible {
2893
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2894
+ outline-offset: var(--sf-a2);
2895
+ border-radius: var(--sf-radius--ui);
2896
+ }
2897
+ sf-table .sf-table-title-link.focus-visible {
2898
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2899
+ outline-offset: var(--sf-a2);
2900
+ border-radius: var(--sf-radius--ui);
2901
+ }
2902
+ sf-table .sf-table-title-link:focus-visible {
2903
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
2904
+ outline-offset: var(--sf-a2);
2905
+ border-radius: var(--sf-radius--ui);
2906
+ }
2907
+ sf-view-table tbody[data-busy] {
2908
+ opacity: 0.5;
2909
+ transition-property: opacity;
2910
+ transition-duration: var(--sf-duration-fast);
2911
+ transition-timing-function: var(--sf-animation);
2912
+ }
2913
+ sf-table tbody[data-busy] {
2914
+ opacity: 0.5;
2915
+ transition-property: opacity;
2916
+ transition-duration: var(--sf-duration-fast);
2917
+ transition-timing-function: var(--sf-animation);
2918
+ }
2919
+ @media (prefers-reduced-motion: reduce) {
2920
+ sf-view-table tbody[data-busy] {
2921
+ transition-duration: 0s;
2922
+ }
2923
+ sf-table tbody[data-busy] {
2924
+ transition-duration: 0s;
2925
+ }
2926
+ }
2927
+ /* The pinned block keeps the box, the row menu and the title column in place
2928
+ while the rest of the row scrolls sideways. The edge of the block carries a
2929
+ soft shadow, and only while something is actually hidden behind it — the
2930
+ scroll handler sets the attribute. The shadow is drawn by the cell that
2931
+ ends the block, over the rows it overlaps, which is why it is a
2932
+ pseudo-element and not a border: a border would move the cell's content. */
2933
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2934
+ right: calc(var(--sf-a4) * -1);
2935
+ }
2936
+ @supports not (inset-inline-end: initial){
2937
+ html:not([dir="rtl"]) sf-view-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2938
+ right: calc(var(--sf-a4) * -1);
2939
+ }
2940
+ }
2941
+ sf-view-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after:where(:dir(ltr)){
2942
+ right: calc(var(--sf-a4) * -1);
2943
+ }
2944
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2945
+ left: calc(var(--sf-a4) * -1);
2946
+ }
2947
+ @supports not (inset-inline-end: initial){
2948
+ [dir="rtl"] sf-view-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2949
+ left: calc(var(--sf-a4) * -1);
2950
+ }
2951
+ }
2952
+ sf-view-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after:where(:dir(rtl)){
2953
+ left: calc(var(--sf-a4) * -1);
2954
+ }
2955
+ sf-view-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after {
2956
+ content: "";
2957
+ position: absolute;
2958
+ top: 0;
2959
+ bottom: 0;
2960
+ inset-block: 0;
2961
+ inset-inline-end: calc(var(--sf-a4) * -1);
2962
+ width: var(--sf-a4);
2963
+ inline-size: var(--sf-a4);
2964
+ pointer-events: none;
2965
+ /* `--sf-alpha-8` is the neutral ink of the current theme at 8%, so the
2966
+ shadow follows light and dark without a colour of its own. The direction
2967
+ is written physically because a gradient takes no logical keyword; the
2968
+ RTL pipeline mirrors it, as it does for the row's focus bar. */
2969
+ background-image: linear-gradient(to right, var(--sf-alpha-8), transparent);
2970
+ }
2971
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2972
+ right: calc(var(--sf-a4) * -1);
2973
+ }
2974
+ @supports not (inset-inline-end: initial){
2975
+ html:not([dir="rtl"]) sf-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2976
+ right: calc(var(--sf-a4) * -1);
2977
+ }
2978
+ }
2979
+ sf-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after:where(:dir(ltr)){
2980
+ right: calc(var(--sf-a4) * -1);
2981
+ }
2982
+ _:-ms-input-placeholder, [dir="rtl"] sf-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2983
+ left: calc(var(--sf-a4) * -1);
2984
+ }
2985
+ @supports not (inset-inline-end: initial){
2986
+ [dir="rtl"] sf-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after{
2987
+ left: calc(var(--sf-a4) * -1);
2988
+ }
2989
+ }
2990
+ sf-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after:where(:dir(rtl)){
2991
+ left: calc(var(--sf-a4) * -1);
2992
+ }
2993
+ sf-table .sf-table-scroll[data-sf-pin-scrolled] [data-sf-pin-edge]::after {
2994
+ content: "";
2995
+ position: absolute;
2996
+ top: 0;
2997
+ bottom: 0;
2998
+ inset-block: 0;
2999
+ inset-inline-end: calc(var(--sf-a4) * -1);
3000
+ width: var(--sf-a4);
3001
+ inline-size: var(--sf-a4);
3002
+ pointer-events: none;
3003
+ /* `--sf-alpha-8` is the neutral ink of the current theme at 8%, so the
3004
+ shadow follows light and dark without a colour of its own. The direction
3005
+ is written physically because a gradient takes no logical keyword; the
3006
+ RTL pipeline mirrors it, as it does for the row's focus bar. */
3007
+ background-image: linear-gradient(to right, var(--sf-alpha-8), transparent);
3008
+ }
3009
+ /* A row says whether it is selected, so the look is a rule rather than a
3010
+ reading of the checkbox in its cell. `data-selected` and not
3011
+ `aria-selected`: this is a plain table, its rows are not grid rows, and the
3012
+ checkbox already carries the state for assistive technology — claiming it
3013
+ twice, once invalidly, would be worse than not claiming it here.
3014
+
3015
+ The colour sits on the row, not on its cells. A pinned cell has to be
3016
+ opaque or the rows it overlaps read through it, and it has to be opaque in
3017
+ the colour of its own row — painting it with the table surface, as the
3018
+ pinned placement first did, left the pinned columns white under a selected
3019
+ or a hovered row.
3020
+
3021
+ So a row is two layers: an opaque surface underneath and the state as a
3022
+ tint over it. Every state colour here is an alpha colour, so a pinned cell
3023
+ that simply inherited the result painted the same tint a second time and
3024
+ came out a shade darker than the rest of its row — which is what the
3025
+ consumer saw on a hovered row. Inheriting both layers paints each exactly
3026
+ once. */
3027
+ sf-view-table tbody tr {
3028
+ background-color: var(--sf-surface-0);
3029
+ background-color: var(--sf-table-row--background-color, var(--sf-surface-0));
3030
+ }
3031
+ sf-table tbody tr {
3032
+ background-color: var(--sf-surface-0);
3033
+ background-color: var(--sf-table-row--background-color, var(--sf-surface-0));
3034
+ }
3035
+ sf-view-table .sf-table-scroll tbody [data-sf-pinned] {
3036
+ background-color: inherit;
3037
+ background-image: inherit;
3038
+ }
3039
+ sf-table .sf-table-scroll tbody [data-sf-pinned] {
3040
+ background-color: inherit;
3041
+ background-image: inherit;
3042
+ }
3043
+ /* The gear's «Вид» tab: the standard menu's rows -- its row height and
3044
+ inset -- a quiet heading over the density, a separator before the reach. */
3045
+ /* The tabs and the way out are the Framework panel's head now
3046
+ (sf-menu-context tabs, 2026-10-15). */
3047
+ .sf-table-view-settings .sf-table-settings-heading {
3048
+ padding-top: var(--sf-space-1\/4);
3049
+ -webkit-padding-before: var(--sf-space-1\/4);
3050
+ padding-block-start: var(--sf-space-1\/4);
3051
+ }
3052
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-view-settings .sf-table-settings-row{
3053
+ padding-left: var(--sf-a8);
3054
+ padding-left: var(--sf-context-menu--inset-start, var(--sf-a8));
3055
+ }
3056
+ @supports not (padding-inline-start: initial){
3057
+ html:not([dir="rtl"]) .sf-table-view-settings .sf-table-settings-row{
3058
+ padding-left: var(--sf-a8);
3059
+ padding-left: var(--sf-context-menu--inset-start, var(--sf-a8));
3060
+ }
3061
+ }
3062
+ _:-ms-input-placeholder, html:not([dir="rtl"]) .sf-table-view-settings .sf-table-settings-row{
3063
+ padding-right: var(--sf-a8);
3064
+ padding-right: var(--sf-context-menu--inset-end, var(--sf-a8));
3065
+ }
3066
+ @supports not (padding-inline-end: initial){
3067
+ html:not([dir="rtl"]) .sf-table-view-settings .sf-table-settings-row{
3068
+ padding-right: var(--sf-a8);
3069
+ padding-right: var(--sf-context-menu--inset-end, var(--sf-a8));
3070
+ }
3071
+ }
3072
+ .sf-table-view-settings .sf-table-settings-row:where(:dir(ltr)){
3073
+ padding-left: var(--sf-a8);
3074
+ padding-left: var(--sf-context-menu--inset-start, var(--sf-a8));
3075
+ padding-right: var(--sf-a8);
3076
+ padding-right: var(--sf-context-menu--inset-end, var(--sf-a8));
3077
+ }
3078
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-view-settings .sf-table-settings-row{
3079
+ padding-right: var(--sf-a8);
3080
+ padding-right: var(--sf-context-menu--inset-start, var(--sf-a8));
3081
+ }
3082
+ @supports not (padding-inline-start: initial){
3083
+ [dir="rtl"] .sf-table-view-settings .sf-table-settings-row{
3084
+ padding-right: var(--sf-a8);
3085
+ padding-right: var(--sf-context-menu--inset-start, var(--sf-a8));
3086
+ }
3087
+ }
3088
+ _:-ms-input-placeholder, [dir="rtl"] .sf-table-view-settings .sf-table-settings-row{
3089
+ padding-left: var(--sf-a8);
3090
+ padding-left: var(--sf-context-menu--inset-end, var(--sf-a8));
3091
+ }
3092
+ @supports not (padding-inline-end: initial){
3093
+ [dir="rtl"] .sf-table-view-settings .sf-table-settings-row{
3094
+ padding-left: var(--sf-a8);
3095
+ padding-left: var(--sf-context-menu--inset-end, var(--sf-a8));
3096
+ }
3097
+ }
3098
+ .sf-table-view-settings .sf-table-settings-row:where(:dir(rtl)){
3099
+ padding-right: var(--sf-a8);
3100
+ padding-right: var(--sf-context-menu--inset-start, var(--sf-a8));
3101
+ padding-left: var(--sf-a8);
3102
+ padding-left: var(--sf-context-menu--inset-end, var(--sf-a8));
3103
+ }
3104
+ .sf-table-view-settings .sf-table-settings-row {
3105
+ display: flex;
3106
+ align-items: center;
3107
+ gap: var(--sf-space-1\/2);
3108
+ min-height: calc(var(--sf-text-height-1\/2) + 2 * var(--sf-a6));
3109
+ min-block-size: calc(var(--sf-text-height-1\/2) + 2 * var(--sf-a6));
3110
+ min-height: calc(var(--sf-text-height-1\/2) + 2 * var(--sf-a6));
3111
+ min-height: calc(var(--sf-context-menu--line, var(--sf-text-height-1\/2)) + 2 * var(--sf-context-menu--space-y, var(--sf-a6)));
3112
+ min-block-size: calc(var(--sf-context-menu--line, var(--sf-text-height-1\/2)) + 2 * var(--sf-context-menu--space-y, var(--sf-a6)));
3113
+ padding-left: var(--sf-a8);
3114
+ padding-right: var(--sf-a8);
3115
+ padding-inline: var(--sf-a8) var(--sf-a8);
3116
+ padding-inline: var(--sf-context-menu--inset-start, var(--sf-a8)) var(--sf-context-menu--inset-end, var(--sf-a8));
3117
+ cursor: pointer;
3118
+ }
3119
+ .sf-table-view-settings .sf-table-settings-heading {
3120
+ padding-left: var(--sf-a8);
3121
+ padding-right: var(--sf-a8);
3122
+ padding-inline: var(--sf-a8);
3123
+ padding-left: var(--sf-a8);
3124
+ padding-left: var(--sf-context-menu--inset-start, var(--sf-a8));
3125
+ padding-right: var(--sf-a8);
3126
+ padding-right: var(--sf-context-menu--inset-start, var(--sf-a8));
3127
+ padding-inline: var(--sf-context-menu--inset-start, var(--sf-a8));
3128
+ color: var(--sf-on-surface-variant);
3129
+ font-size: var(--sf-text-size-1\/3);
3130
+ line-height: var(--sf-text-height-1\/3);
3131
+ }
3132
+ .sf-table-view-settings .sf-table-settings-separator {
3133
+ height: var(--sf-px);
3134
+ block-size: var(--sf-px);
3135
+ margin-top: var(--sf-space-1\/4);
3136
+ margin-bottom: var(--sf-space-1\/4);
3137
+ margin-block: var(--sf-space-1\/4);
3138
+ background-color: var(--sf-outline-variant);
3139
+ }
3140
+ /* The person's view of the table (the gear's «Вид», owner 2026-10-14),
3141
+ kept as a view preference and written on the host as data attributes.
3142
+ Density moves the rows' vertical space one ladder step either way. */
3143
+ sf-view-table[data-sf-view-density=compact] > * .table > :not(caption) > * > * {
3144
+ padding-top: var(--sf-space-1\/2);
3145
+ padding-bottom: var(--sf-space-1\/2);
3146
+ padding-block: var(--sf-space-1\/2);
3147
+ }
3148
+ sf-table[data-sf-view-density=compact] > * .table > :not(caption) > * > * {
3149
+ padding-top: var(--sf-space-1\/2);
3150
+ padding-bottom: var(--sf-space-1\/2);
3151
+ padding-block: var(--sf-space-1\/2);
3152
+ }
3153
+ sf-view-table[size="1/2"][data-sf-view-density=compact] > * .table > :not(caption) > * > * {
3154
+ padding-top: var(--sf-space-1\/4);
3155
+ padding-bottom: var(--sf-space-1\/4);
3156
+ padding-block: var(--sf-space-1\/4);
3157
+ }
3158
+ sf-table[size="1/2"][data-sf-view-density=compact] > * .table > :not(caption) > * > * {
3159
+ padding-top: var(--sf-space-1\/4);
3160
+ padding-bottom: var(--sf-space-1\/4);
3161
+ padding-block: var(--sf-space-1\/4);
3162
+ }
3163
+ sf-view-table[data-sf-view-density=spacious] > * .table > :not(caption) > * > * {
3164
+ padding-top: var(--sf-space-2);
3165
+ padding-bottom: var(--sf-space-2);
3166
+ padding-block: var(--sf-space-2);
3167
+ }
3168
+ sf-table[data-sf-view-density=spacious] > * .table > :not(caption) > * > * {
3169
+ padding-top: var(--sf-space-2);
3170
+ padding-bottom: var(--sf-space-2);
3171
+ padding-block: var(--sf-space-2);
3172
+ }
3173
+ sf-view-table[size="1/2"][data-sf-view-density=spacious] > * .table > :not(caption) > * > * {
3174
+ padding-top: var(--sf-space-1\/2);
3175
+ padding-bottom: var(--sf-space-1\/2);
3176
+ padding-block: var(--sf-space-1\/2);
3177
+ }
3178
+ sf-table[size="1/2"][data-sf-view-density=spacious] > * .table > :not(caption) > * > * {
3179
+ padding-top: var(--sf-space-1\/2);
3180
+ padding-bottom: var(--sf-space-1\/2);
3181
+ padding-block: var(--sf-space-1\/2);
3182
+ }
3183
+ /* Alternate rows on the container surface, under the hover and selection
3184
+ layers, which are images over it. Opaque: the container surface is an
3185
+ alpha colour, and a pinned cell inherits its row's colour, so the rows
3186
+ scrolling under the pinned columns read through them (owner,
3187
+ 2026-10-16). The same tint, mixed with the surface it lies on. */
3188
+ sf-view-table[data-sf-view-stripes] tbody tr:nth-child(even) {
3189
+ --sf-table-row--background-color: color-mix(in srgb,
3190
+ light-dark(var(--sf-neutral-50), var(--sf-neutral-90)) 16%, var(--sf-surface-0));
3191
+ }
3192
+ sf-table[data-sf-view-stripes] tbody tr:nth-child(even) {
3193
+ --sf-table-row--background-color: color-mix(in srgb,
3194
+ light-dark(var(--sf-neutral-50), var(--sf-neutral-90)) 16%, var(--sf-surface-0));
3195
+ }
3196
+ /* A line between the columns, the table's own line colour. */
3197
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table[data-sf-view-lines] th:not(:last-child){
3198
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3199
+ }
3200
+ @supports not (border-inline-end: initial){
3201
+ html:not([dir="rtl"]) sf-view-table[data-sf-view-lines] th:not(:last-child){
3202
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3203
+ }
3204
+ }
3205
+ sf-view-table[data-sf-view-lines] th:not(:last-child):where(:dir(ltr)){
3206
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3207
+ }
3208
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table[data-sf-view-lines] th:not(:last-child){
3209
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3210
+ }
3211
+ @supports not (border-inline-end: initial){
3212
+ [dir="rtl"] sf-view-table[data-sf-view-lines] th:not(:last-child){
3213
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3214
+ }
3215
+ }
3216
+ sf-view-table[data-sf-view-lines] th:not(:last-child):where(:dir(rtl)){
3217
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3218
+ }
3219
+ sf-view-table[data-sf-view-lines] th:not(:last-child) {
3220
+ -webkit-border-end: var(--sf-px) solid var(--sf-outline-variant);
3221
+ border-inline-end: var(--sf-px) solid var(--sf-outline-variant);
3222
+ }
3223
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-view-table[data-sf-view-lines] td:not(:last-child){
3224
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3225
+ }
3226
+ @supports not (border-inline-end: initial){
3227
+ html:not([dir="rtl"]) sf-view-table[data-sf-view-lines] td:not(:last-child){
3228
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3229
+ }
3230
+ }
3231
+ sf-view-table[data-sf-view-lines] td:not(:last-child):where(:dir(ltr)){
3232
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3233
+ }
3234
+ _:-ms-input-placeholder, [dir="rtl"] sf-view-table[data-sf-view-lines] td:not(:last-child){
3235
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3236
+ }
3237
+ @supports not (border-inline-end: initial){
3238
+ [dir="rtl"] sf-view-table[data-sf-view-lines] td:not(:last-child){
3239
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3240
+ }
3241
+ }
3242
+ sf-view-table[data-sf-view-lines] td:not(:last-child):where(:dir(rtl)){
3243
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3244
+ }
3245
+ sf-view-table[data-sf-view-lines] td:not(:last-child) {
3246
+ -webkit-border-end: var(--sf-px) solid var(--sf-outline-variant);
3247
+ border-inline-end: var(--sf-px) solid var(--sf-outline-variant);
3248
+ }
3249
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table[data-sf-view-lines] th:not(:last-child){
3250
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3251
+ }
3252
+ @supports not (border-inline-end: initial){
3253
+ html:not([dir="rtl"]) sf-table[data-sf-view-lines] th:not(:last-child){
3254
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3255
+ }
3256
+ }
3257
+ sf-table[data-sf-view-lines] th:not(:last-child):where(:dir(ltr)){
3258
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3259
+ }
3260
+ _:-ms-input-placeholder, [dir="rtl"] sf-table[data-sf-view-lines] th:not(:last-child){
3261
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3262
+ }
3263
+ @supports not (border-inline-end: initial){
3264
+ [dir="rtl"] sf-table[data-sf-view-lines] th:not(:last-child){
3265
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3266
+ }
3267
+ }
3268
+ sf-table[data-sf-view-lines] th:not(:last-child):where(:dir(rtl)){
3269
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3270
+ }
3271
+ sf-table[data-sf-view-lines] th:not(:last-child) {
3272
+ -webkit-border-end: var(--sf-px) solid var(--sf-outline-variant);
3273
+ border-inline-end: var(--sf-px) solid var(--sf-outline-variant);
3274
+ }
3275
+ _:-ms-input-placeholder, html:not([dir="rtl"]) sf-table[data-sf-view-lines] td:not(:last-child){
3276
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3277
+ }
3278
+ @supports not (border-inline-end: initial){
3279
+ html:not([dir="rtl"]) sf-table[data-sf-view-lines] td:not(:last-child){
3280
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3281
+ }
3282
+ }
3283
+ sf-table[data-sf-view-lines] td:not(:last-child):where(:dir(ltr)){
3284
+ border-right: var(--sf-px) solid var(--sf-outline-variant);
3285
+ }
3286
+ _:-ms-input-placeholder, [dir="rtl"] sf-table[data-sf-view-lines] td:not(:last-child){
3287
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3288
+ }
3289
+ @supports not (border-inline-end: initial){
3290
+ [dir="rtl"] sf-table[data-sf-view-lines] td:not(:last-child){
3291
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3292
+ }
3293
+ }
3294
+ sf-table[data-sf-view-lines] td:not(:last-child):where(:dir(rtl)){
3295
+ border-left: var(--sf-px) solid var(--sf-outline-variant);
3296
+ }
3297
+ sf-table[data-sf-view-lines] td:not(:last-child) {
3298
+ -webkit-border-end: var(--sf-px) solid var(--sf-outline-variant);
3299
+ border-inline-end: var(--sf-px) solid var(--sf-outline-variant);
3300
+ }
3301
+ /* One line a cell: a long text ends in «…» rather than taking three. */
3302
+ sf-view-table[data-sf-view-single-line] {
3303
+ --sf-table-cell--line-clamp: 1;
3304
+ }
3305
+ sf-table[data-sf-view-single-line] {
3306
+ --sf-table-cell--line-clamp: 1;
3307
+ }
3308
+ /* A colour option in a filter window: its swatch, a text line square. */
3309
+ .sf-table-filter-swatch {
3310
+ flex: none;
3311
+ width: var(--sf-text-height-1\/2);
3312
+ inline-size: var(--sf-text-height-1\/2);
3313
+ height: var(--sf-text-height-1\/2);
3314
+ block-size: var(--sf-text-height-1\/2);
3315
+ border-radius: var(--sf-radius--ui);
3316
+ box-shadow: inset 0 0 0 var(--sf-px) var(--sf-outline-variant);
3317
+ }
3318
+ sf-view-table tbody tr:hover {
3319
+ background-image: linear-gradient(var(--sf-surface-container-hover), var(--sf-surface-container-hover));
3320
+ }
3321
+ sf-table tbody tr:hover {
3322
+ background-image: linear-gradient(var(--sf-surface-container-hover), var(--sf-surface-container-hover));
3323
+ }
3324
+ sf-view-table tbody tr[data-selected] {
3325
+ background-image: linear-gradient(var(--sf-primary-container), var(--sf-primary-container));
3326
+ }
3327
+ sf-table tbody tr[data-selected] {
3328
+ background-image: linear-gradient(var(--sf-primary-container), var(--sf-primary-container));
3329
+ }
3330
+ /* The row the person is on carries `data-current` and takes focus, and shows
3331
+ nothing of its own. It used to draw a bar in its first cell, and the
3332
+ consumer found that the bar outlived what it meant: after a box was
3333
+ unticked the bar stayed, and a bar beside a row reads as a mark. Where the
3334
+ person is is answered by the focus ring instead, and only when the keyboard
3335
+ is what put them there.
3336
+
3337
+ The ring is one ring around the row, drawn by a pseudo-element above the
3338
+ pinned cells. A plain outline on the row is painted over by them — a cell
3339
+ is a child of the row, so its background covers the parent's outline — and
3340
+ that is what the consumer saw: blue segments across the loose cells only,
3341
+ appearing the moment a modifier key switched the browser into keyboard
3342
+ modality. */
3343
+ /* Only a row that has the keyboard focus is positioned, because only then is
3344
+ there a ring to hang on it. Positioning every row made each one a stacking
3345
+ context of its own, and a consumer saw pinned cells left unpainted while
3346
+ scrolling a table with two pinned columns — the kind of compositing
3347
+ difference that costs nothing to avoid. */
3348
+ sf-view-table tbody tr.focus-visible {
3349
+ position: relative;
3350
+ outline: none;
3351
+ }
3352
+ sf-table tbody tr.focus-visible {
3353
+ position: relative;
3354
+ outline: none;
3355
+ }
3356
+ sf-view-table tbody tr.focus-visible {
3357
+ position: relative;
3358
+ outline: none;
3359
+ }
3360
+ sf-view-table tbody tr:focus-visible {
3361
+ position: relative;
3362
+ outline: none;
3363
+ }
3364
+ sf-table tbody tr.focus-visible {
3365
+ position: relative;
3366
+ outline: none;
3367
+ }
3368
+ sf-table tbody tr:focus-visible {
3369
+ position: relative;
3370
+ outline: none;
3371
+ }
3372
+ sf-view-table tbody tr.focus-visible::after {
3373
+ content: "";
3374
+ position: absolute;
3375
+ top: 0;
3376
+ right: 0;
3377
+ bottom: 0;
3378
+ left: 0;
3379
+ inset: 0;
3380
+ z-index: 3;
3381
+ pointer-events: none;
3382
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3383
+ outline-offset: calc(var(--sf-focus--width) * -1);
3384
+ }
3385
+ sf-table tbody tr.focus-visible::after {
3386
+ content: "";
3387
+ position: absolute;
3388
+ top: 0;
3389
+ right: 0;
3390
+ bottom: 0;
3391
+ left: 0;
3392
+ inset: 0;
3393
+ z-index: 3;
3394
+ pointer-events: none;
3395
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3396
+ outline-offset: calc(var(--sf-focus--width) * -1);
3397
+ }
3398
+ sf-view-table tbody tr.focus-visible::after {
3399
+ content: "";
3400
+ position: absolute;
3401
+ top: 0;
3402
+ right: 0;
3403
+ bottom: 0;
3404
+ left: 0;
3405
+ inset: 0;
3406
+ z-index: 3;
3407
+ pointer-events: none;
3408
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3409
+ outline-offset: calc(var(--sf-focus--width) * -1);
3410
+ }
3411
+ sf-view-table tbody tr.focus-visible::after {
3412
+ content: "";
3413
+ position: absolute;
3414
+ top: 0;
3415
+ right: 0;
3416
+ bottom: 0;
3417
+ left: 0;
3418
+ top: 0;
3419
+ right: 0;
3420
+ bottom: 0;
3421
+ left: 0;
3422
+ inset: 0;
3423
+ z-index: 3;
3424
+ pointer-events: none;
3425
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3426
+ outline-offset: calc(var(--sf-focus--width) * -1);
3427
+ }
3428
+ sf-view-table tbody tr:focus-visible::after {
3429
+ content: "";
3430
+ position: absolute;
3431
+ top: 0;
3432
+ right: 0;
3433
+ bottom: 0;
3434
+ left: 0;
3435
+ inset: 0;
3436
+ z-index: 3;
3437
+ pointer-events: none;
3438
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3439
+ outline-offset: calc(var(--sf-focus--width) * -1);
3440
+ }
3441
+ sf-table tbody tr.focus-visible::after {
3442
+ content: "";
3443
+ position: absolute;
3444
+ top: 0;
3445
+ right: 0;
3446
+ bottom: 0;
3447
+ left: 0;
3448
+ inset: 0;
3449
+ z-index: 3;
3450
+ pointer-events: none;
3451
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3452
+ outline-offset: calc(var(--sf-focus--width) * -1);
3453
+ }
3454
+ sf-table tbody tr.focus-visible::after {
3455
+ content: "";
3456
+ position: absolute;
3457
+ top: 0;
3458
+ right: 0;
3459
+ bottom: 0;
3460
+ left: 0;
3461
+ top: 0;
3462
+ right: 0;
3463
+ bottom: 0;
3464
+ left: 0;
3465
+ inset: 0;
3466
+ z-index: 3;
3467
+ pointer-events: none;
3468
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3469
+ outline-offset: calc(var(--sf-focus--width) * -1);
3470
+ }
3471
+ sf-table tbody tr:focus-visible::after {
3472
+ content: "";
3473
+ position: absolute;
3474
+ top: 0;
3475
+ right: 0;
3476
+ bottom: 0;
3477
+ left: 0;
3478
+ inset: 0;
3479
+ z-index: 3;
3480
+ pointer-events: none;
3481
+ outline: var(--sf-focus--width) var(--sf-focus--style) var(--sf-focus--color);
3482
+ outline-offset: calc(var(--sf-focus--width) * -1);
3483
+ }
3484
+ sf-view-table tbody tr[data-selected]:hover {
3485
+ background-image: linear-gradient(var(--sf-primary-container-hover), var(--sf-primary-container-hover));
3486
+ }
3487
+ sf-table tbody tr[data-selected]:hover {
3488
+ background-image: linear-gradient(var(--sf-primary-container-hover), var(--sf-primary-container-hover));
3489
+ }
3490
+ /* Sorting is answered in the header, not by shading the column: a sorted
3491
+ column keeps the background of every other one. */
3492
+ sf-view-table th:hover .sf-table-sort-icon {
3493
+ /* A glyph is non-text graphics, and WCAG 1.4.11 asks 3:1 of it.
3494
+ --sf-on-surface-muted is 3.18:1 light and 2.92:1 dark, so it sat on the
3495
+ line in one theme and under it in the other. --sf-on-surface-variant is
3496
+ the Framework's own paler-than-text role, 6.47 and 5.95, and the one a
3497
+ label already reads in (owner, 2026-10-08). */
3498
+ --sf-icon--color: var(--sf-on-surface-variant);
3499
+ }
3500
+ sf-table th:hover .sf-table-sort-icon {
3501
+ /* A glyph is non-text graphics, and WCAG 1.4.11 asks 3:1 of it.
3502
+ --sf-on-surface-muted is 3.18:1 light and 2.92:1 dark, so it sat on the
3503
+ line in one theme and under it in the other. --sf-on-surface-variant is
3504
+ the Framework's own paler-than-text role, 6.47 and 5.95, and the one a
3505
+ label already reads in (owner, 2026-10-08). */
3506
+ --sf-icon--color: var(--sf-on-surface-variant);
3507
+ }
3508
+ sf-view-table th[aria-sort]:not([aria-sort=none]) .sf-table-sort-button {
3509
+ color: var(--sf-primary);
3510
+ }
3511
+ sf-table th[aria-sort]:not([aria-sort=none]) .sf-table-sort-button {
3512
+ color: var(--sf-primary);
3513
+ }
3514
+ sf-view-table th[aria-sort]:not([aria-sort=none]) .sf-table-sort-icon {
3515
+ --sf-icon--color: var(--sf-primary);
3516
+ }
3517
+ sf-table th[aria-sort]:not([aria-sort=none]) .sf-table-sort-icon {
3518
+ --sf-icon--color: var(--sf-primary);
3519
+ }
3520
+ /* The mark under a sorted header is drawn rather than bordered, so it does not
3521
+ move the cell or fight the separator the resize handle uses. */
3522
+ sf-view-table th[aria-sort]:not([aria-sort=none]) {
3523
+ position: relative;
3524
+ }
3525
+ sf-table th[aria-sort]:not([aria-sort=none]) {
3526
+ position: relative;
3527
+ }
3528
+ sf-view-table th[aria-sort]:not([aria-sort=none])::after {
3529
+ content: "";
3530
+ position: absolute;
3531
+ left: 0;
3532
+ right: 0;
3533
+ inset-inline: 0;
3534
+ bottom: 0;
3535
+ inset-block-end: 0;
3536
+ height: var(--sf-a2);
3537
+ block-size: var(--sf-a2);
3538
+ background-color: var(--sf-primary);
3539
+ pointer-events: none;
3540
+ }
3541
+ sf-table th[aria-sort]:not([aria-sort=none])::after {
3542
+ content: "";
3543
+ position: absolute;
3544
+ left: 0;
3545
+ right: 0;
3546
+ inset-inline: 0;
3547
+ bottom: 0;
3548
+ inset-block-end: 0;
3549
+ height: var(--sf-a2);
3550
+ block-size: var(--sf-a2);
3551
+ background-color: var(--sf-primary);
3552
+ pointer-events: none;
3553
+ }
3554
+ @media (forced-colors: active) {
3555
+ sf-view-table th[aria-sort]:not([aria-sort=none])::after {
3556
+ background-color: Highlight;
3557
+ }
3558
+ sf-table th[aria-sort]:not([aria-sort=none])::after {
3559
+ background-color: Highlight;
3560
+ }
3561
+ sf-view-table tbody tr[data-selected] > td {
3562
+ background-color: Highlight;
3563
+ color: HighlightText;
3564
+ }
3565
+ sf-table tbody tr[data-selected] > td {
3566
+ background-color: Highlight;
3567
+ color: HighlightText;
3568
+ }
3569
+ }
3570
+ /* The guide is one line, 1px in the colour of every other line in the table —
3571
+ not the primary colour, which would read as a selection. It runs through the
3572
+ rows only: the head keeps its own short separator below. */
3573
+ sf-view-table .sf-table-resize-guide {
3574
+ position: absolute;
3575
+ width: var(--sf-px);
3576
+ inline-size: var(--sf-px);
3577
+ background-color: var(--sf-outline-variant);
3578
+ pointer-events: none;
3579
+ z-index: 4;
3580
+ }
3581
+ sf-table .sf-table-resize-guide {
3582
+ position: absolute;
3583
+ width: var(--sf-px);
3584
+ inline-size: var(--sf-px);
3585
+ background-color: var(--sf-outline-variant);
3586
+ pointer-events: none;
3587
+ z-index: 4;
3588
+ }
3589
+ sf-view-table .sf-table-resize-guide[hidden] {
3590
+ display: none;
3591
+ }
3592
+ sf-table .sf-table-resize-guide[hidden] {
3593
+ display: none;
3594
+ }
3595
+ @media (forced-colors: active) {
3596
+ sf-view-table .sf-table-resize-guide {
3597
+ background-color: CanvasText;
3598
+ }
3599
+ sf-table .sf-table-resize-guide {
3600
+ background-color: CanvasText;
3601
+ }
3602
+ }
3603
+ }
3604
+ /* Where a dragged row lands in a list put in order by hand (row-reorder): a
3605
+ line on the edge it will stand at. */
3606
+ sf-view-table tbody tr[data-sf-drop-before] > td {
3607
+ box-shadow: inset 0 calc(2 * var(--sf-px)) 0 var(--sf-primary);
3608
+ }
3609
+ sf-table tbody tr[data-sf-drop-before] > td {
3610
+ box-shadow: inset 0 calc(2 * var(--sf-px)) 0 var(--sf-primary);
3611
+ }
3612
+
3613
+ sf-view-table tbody tr[data-sf-drop-after] > td {
3614
+ box-shadow: inset 0 calc(-2 * var(--sf-px)) 0 var(--sf-primary);
3615
+ }
3616
+
3617
+ sf-table tbody tr[data-sf-drop-after] > td {
3618
+ box-shadow: inset 0 calc(-2 * var(--sf-px)) 0 var(--sf-primary);
3619
+ }
3620
+
3621
+ /* Many entries (standard 1.3.8 §18.4): the spacer rows that stand for the
3622
+ rows not drawn hold their height and nothing else. */
3623
+ @layer sf.components {
3624
+ sf-view-table tbody tr.sf-table-window-spacer {
3625
+ background: none;
3626
+ }
3627
+ sf-table tbody tr.sf-table-window-spacer {
3628
+ background: none;
3629
+ }
3630
+ sf-view-table tbody tr.sf-table-window-spacer:hover {
3631
+ background: none;
3632
+ }
3633
+ sf-table tbody tr.sf-table-window-spacer:hover {
3634
+ background: none;
3635
+ }
3636
+ sf-view-table tbody tr.sf-table-window-spacer > td {
3637
+ padding: 0;
3638
+ border: 0;
3639
+ }
3640
+ sf-table tbody tr.sf-table-window-spacer > td {
3641
+ padding: 0;
3642
+ border: 0;
3643
+ }
3644
+ /* The spacers already keep every drawn row where it was: the browser's own
3645
+ scroll anchoring would move the page a second time when the range moves. */
3646
+ sf-view-table tbody[data-sf-window] {
3647
+ overflow-anchor: none;
3648
+ }
3649
+ sf-table tbody[data-sf-window] {
3650
+ overflow-anchor: none;
3651
+ }
3652
+ sf-view-table tbody[data-sf-window] > tr {
3653
+ overflow-anchor: none;
3654
+ }
3655
+ sf-table tbody[data-sf-window] > tr {
3656
+ overflow-anchor: none;
3657
+ }
3658
+ }