@axiapps/axi-design 1.36.0 → 1.37.1

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.
package/dist/axi.css CHANGED
@@ -2402,9 +2402,76 @@ textarea.axi-input {
2402
2402
  /* The row under the cursor comes forward on the neutral ramp. Not an ink:
2403
2403
  hovering a row is not a status, and forty rows that each flash a colour on
2404
2404
  the way past the one you want is the tinted-everything failure rule 2 is
2405
- about. */
2406
- .axi-table tbody tr:hover :is(td, th) { background: var(--axi-surface-raised); color: var(--axi-text); }
2405
+ about.
2406
+
2407
+ ONE SURFACE, MANY ELEMENTS - the attachment below, and on the sticky head,
2408
+ the pinned column and the prose table's head, which are the four places in
2409
+ this language where that is the shape of the problem. Everywhere else a
2410
+ themed fill lands on a single box: a panel, a rail, a toolbar, one hovered
2411
+ row of a palette. A table's surfaces are ASSEMBLED. A hovered row is every
2412
+ cell in it, a sticky head is a row of `th`, a pinned name column is one cell
2413
+ per row - one strip to the eye and N painting areas to the renderer. A theme
2414
+ is allowed to make any surface a gradient and glass makes all three of them
2415
+ one, so each cell restarts the ramp and the strip arrives as a row of
2416
+ separately lit boxes with a seam at every boundary.
2417
+
2418
+ Fixed is the same idiom as `body`, `.axi-mast` and `.axi-sheet`, for the
2419
+ reason .axi-mast gives at length: an element shows its SHARE of one light
2420
+ rather than its own private copy of it. Give the cells of a strip a shared
2421
+ painting area and they resolve back into the one surface they were always
2422
+ drawing. Note what the fix does NOT depend on: which box ends up shared. A
2423
+ filtered ancestor - any panel under a glass theme, since --axi-surface-filter
2424
+ is a backdrop-filter and establishes a containing block, the trap that
2425
+ token's own comment points at - takes the painting area from the viewport and
2426
+ makes it the panel's. Both are shared by every cell in the band, so both are
2427
+ continuous; the ancestor only decides where the light sits, which is a
2428
+ question with no wrong answer here. What is not available is the obvious
2429
+ alternative of filling the container and leaving the cells transparent: a
2430
+ sticky head has to carry its own fill, because a fill on `thead` stays
2431
+ behind while the cells travel. */
2432
+ .axi-table tbody tr:hover :is(td, th) {
2433
+ background: var(--axi-surface-raised);
2434
+ background-attachment: fixed;
2435
+ color: var(--axi-text);
2436
+ }
2407
2437
  /* The measured value in a row, as opposed to its supporting numbers. */
2438
+ /* A row that is the one currently shown somewhere else -- a detail pane, a
2439
+ chart, a second table. `aria-current`, for the same reason `aria-sort` above
2440
+ carries the sorted column and `.axi-rail__item[aria-current]` carries the
2441
+ chosen place: the attribute a screen reader already needs in order to announce
2442
+ the row is the whole fact, and a class beside it would be a second source of
2443
+ truth for one thing.
2444
+
2445
+ The MARK is the leading edge, not the fill, and that is the whole design. The
2446
+ hover directly above already raises a row, so any selection drawn as a fill
2447
+ has to find a neutral step that hover is not using -- and there isn't one. The
2448
+ ramp a theme is guaranteed to give is ground, surface, surface-raised; the
2449
+ fourth token, --axi-surface-float, is not a step on it at all but a promise of
2450
+ OPACITY for things that sit over content, which is why the default theme sets
2451
+ it equal to --axi-surface and glass sets it darker than --axi-surface-raised.
2452
+ A selection filled from it is invisible in one theme and a step backwards in
2453
+ the other. This is the trap the token's name invites and the reason this
2454
+ comment says so: float is an axis, not a rung.
2455
+
2456
+ So selection and hover share the raised fill and are told apart by the edge,
2457
+ the same answer and the same reasoning as `.axi-rail__nav--quiet`. The first
2458
+ cell of every body row reserves a transparent control-weight border for it, so
2459
+ lighting the edge costs no reflow -- again exactly what `.axi-rail__item`
2460
+ does. One edge is a mark; rule 8's refusal is of a BOX around a row, which is
2461
+ what turns a list of numbers into a grid.
2462
+
2463
+ The attachment is the one-surface-many-elements case, same as the hover. */
2464
+ .axi-table :where(tbody tr) > :where(td, th):first-child {
2465
+ border-inline-start: var(--axi-border-control) solid transparent;
2466
+ }
2467
+ .axi-table tbody tr[aria-current] :is(td, th) {
2468
+ background: var(--axi-surface-raised);
2469
+ background-attachment: fixed;
2470
+ color: var(--axi-text);
2471
+ }
2472
+ .axi-table tbody tr[aria-current] > :is(td, th):first-child {
2473
+ border-inline-start-color: var(--axi-accent);
2474
+ }
2408
2475
  .axi-table__num { color: var(--axi-text); }
2409
2476
  /* A name cell: an icon, a diamond or a rank beside the label. */
2410
2477
  .axi-table__who { display: flex; align-items: center; gap: 9px; }
@@ -2453,8 +2520,14 @@ textarea.axi-input {
2453
2520
  --axi-surface-float exists: rows travel behind both of these, and a glass
2454
2521
  theme's ordinary surfaces are alpha, so a head at --axi-surface-raised
2455
2522
  would have numbers sliding through it. Opaque is not a look here, it is
2456
- the requirement. */
2523
+ the requirement.
2524
+
2525
+ Opaque and a gradient, under glass, which is why the attachment is here:
2526
+ the head is a row of cells and this is the one-surface-many-elements case
2527
+ the hover rule explains. Nothing about the sticky positioning changes it -
2528
+ a sticky box is still its own painting area. */
2457
2529
  background: var(--axi-surface-float);
2530
+ background-attachment: fixed;
2458
2531
  border-bottom: var(--axi-border-control) solid var(--axi-ink-line);
2459
2532
  }
2460
2533
  /* The first column stays. It holds the row's name, and a name scrolled out of
@@ -2466,7 +2539,10 @@ textarea.axi-input {
2466
2539
  position: sticky;
2467
2540
  left: 0;
2468
2541
  z-index: 1;
2542
+ /* The same strip as the head, turned ninety degrees, so the same attachment:
2543
+ one cell per row means forty painting areas down a single column. */
2469
2544
  background: var(--axi-surface-float);
2545
+ background-attachment: fixed;
2470
2546
  border-right: var(--axi-border-control) solid var(--axi-ink-line);
2471
2547
  }
2472
2548
  /* The corner belongs to both and has to outrank both. */
@@ -2836,9 +2912,16 @@ textarea.axi-input {
2836
2912
  overflow: hidden;
2837
2913
  font-size: 13.5px;
2838
2914
  }
2915
+ /* A markdown table's head is a row of cells filled from a themed surface, so
2916
+ it is the one-surface-many-elements case `.axi-table tbody tr:hover` sets
2917
+ out in data.css, and it takes the same attachment. Nothing here is sticky,
2918
+ which makes no difference: the seam is per-cell repetition of the gradient,
2919
+ not anything to do with scrolling. */
2839
2920
  .axi-prose th {
2840
2921
  text-align: left; padding: 10px 12px;
2841
- background: var(--axi-surface-raised); color: var(--axi-text);
2922
+ background: var(--axi-surface-raised);
2923
+ background-attachment: fixed;
2924
+ color: var(--axi-text);
2842
2925
  font: var(--axi-t-micro); letter-spacing: var(--axi-ls-micro); text-transform: uppercase;
2843
2926
  }
2844
2927
  .axi-prose td { padding: 10px 12px; border-top: var(--axi-border-hairline) solid var(--axi-rule); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiapps/axi-design",
3
- "version": "1.36.0",
3
+ "version": "1.37.1",
4
4
  "description": "The design language for the axi suite — flat and outlined, dark, drawn in saturated ink.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/data.css CHANGED
@@ -100,9 +100,76 @@
100
100
  /* The row under the cursor comes forward on the neutral ramp. Not an ink:
101
101
  hovering a row is not a status, and forty rows that each flash a colour on
102
102
  the way past the one you want is the tinted-everything failure rule 2 is
103
- about. */
104
- .axi-table tbody tr:hover :is(td, th) { background: var(--axi-surface-raised); color: var(--axi-text); }
103
+ about.
104
+
105
+ ONE SURFACE, MANY ELEMENTS - the attachment below, and on the sticky head,
106
+ the pinned column and the prose table's head, which are the four places in
107
+ this language where that is the shape of the problem. Everywhere else a
108
+ themed fill lands on a single box: a panel, a rail, a toolbar, one hovered
109
+ row of a palette. A table's surfaces are ASSEMBLED. A hovered row is every
110
+ cell in it, a sticky head is a row of `th`, a pinned name column is one cell
111
+ per row - one strip to the eye and N painting areas to the renderer. A theme
112
+ is allowed to make any surface a gradient and glass makes all three of them
113
+ one, so each cell restarts the ramp and the strip arrives as a row of
114
+ separately lit boxes with a seam at every boundary.
115
+
116
+ Fixed is the same idiom as `body`, `.axi-mast` and `.axi-sheet`, for the
117
+ reason .axi-mast gives at length: an element shows its SHARE of one light
118
+ rather than its own private copy of it. Give the cells of a strip a shared
119
+ painting area and they resolve back into the one surface they were always
120
+ drawing. Note what the fix does NOT depend on: which box ends up shared. A
121
+ filtered ancestor - any panel under a glass theme, since --axi-surface-filter
122
+ is a backdrop-filter and establishes a containing block, the trap that
123
+ token's own comment points at - takes the painting area from the viewport and
124
+ makes it the panel's. Both are shared by every cell in the band, so both are
125
+ continuous; the ancestor only decides where the light sits, which is a
126
+ question with no wrong answer here. What is not available is the obvious
127
+ alternative of filling the container and leaving the cells transparent: a
128
+ sticky head has to carry its own fill, because a fill on `thead` stays
129
+ behind while the cells travel. */
130
+ .axi-table tbody tr:hover :is(td, th) {
131
+ background: var(--axi-surface-raised);
132
+ background-attachment: fixed;
133
+ color: var(--axi-text);
134
+ }
105
135
  /* The measured value in a row, as opposed to its supporting numbers. */
136
+ /* A row that is the one currently shown somewhere else -- a detail pane, a
137
+ chart, a second table. `aria-current`, for the same reason `aria-sort` above
138
+ carries the sorted column and `.axi-rail__item[aria-current]` carries the
139
+ chosen place: the attribute a screen reader already needs in order to announce
140
+ the row is the whole fact, and a class beside it would be a second source of
141
+ truth for one thing.
142
+
143
+ The MARK is the leading edge, not the fill, and that is the whole design. The
144
+ hover directly above already raises a row, so any selection drawn as a fill
145
+ has to find a neutral step that hover is not using -- and there isn't one. The
146
+ ramp a theme is guaranteed to give is ground, surface, surface-raised; the
147
+ fourth token, --axi-surface-float, is not a step on it at all but a promise of
148
+ OPACITY for things that sit over content, which is why the default theme sets
149
+ it equal to --axi-surface and glass sets it darker than --axi-surface-raised.
150
+ A selection filled from it is invisible in one theme and a step backwards in
151
+ the other. This is the trap the token's name invites and the reason this
152
+ comment says so: float is an axis, not a rung.
153
+
154
+ So selection and hover share the raised fill and are told apart by the edge,
155
+ the same answer and the same reasoning as `.axi-rail__nav--quiet`. The first
156
+ cell of every body row reserves a transparent control-weight border for it, so
157
+ lighting the edge costs no reflow -- again exactly what `.axi-rail__item`
158
+ does. One edge is a mark; rule 8's refusal is of a BOX around a row, which is
159
+ what turns a list of numbers into a grid.
160
+
161
+ The attachment is the one-surface-many-elements case, same as the hover. */
162
+ .axi-table :where(tbody tr) > :where(td, th):first-child {
163
+ border-inline-start: var(--axi-border-control) solid transparent;
164
+ }
165
+ .axi-table tbody tr[aria-current] :is(td, th) {
166
+ background: var(--axi-surface-raised);
167
+ background-attachment: fixed;
168
+ color: var(--axi-text);
169
+ }
170
+ .axi-table tbody tr[aria-current] > :is(td, th):first-child {
171
+ border-inline-start-color: var(--axi-accent);
172
+ }
106
173
  .axi-table__num { color: var(--axi-text); }
107
174
  /* A name cell: an icon, a diamond or a rank beside the label. */
108
175
  .axi-table__who { display: flex; align-items: center; gap: 9px; }
@@ -151,8 +218,14 @@
151
218
  --axi-surface-float exists: rows travel behind both of these, and a glass
152
219
  theme's ordinary surfaces are alpha, so a head at --axi-surface-raised
153
220
  would have numbers sliding through it. Opaque is not a look here, it is
154
- the requirement. */
221
+ the requirement.
222
+
223
+ Opaque and a gradient, under glass, which is why the attachment is here:
224
+ the head is a row of cells and this is the one-surface-many-elements case
225
+ the hover rule explains. Nothing about the sticky positioning changes it -
226
+ a sticky box is still its own painting area. */
155
227
  background: var(--axi-surface-float);
228
+ background-attachment: fixed;
156
229
  border-bottom: var(--axi-border-control) solid var(--axi-ink-line);
157
230
  }
158
231
  /* The first column stays. It holds the row's name, and a name scrolled out of
@@ -164,7 +237,10 @@
164
237
  position: sticky;
165
238
  left: 0;
166
239
  z-index: 1;
240
+ /* The same strip as the head, turned ninety degrees, so the same attachment:
241
+ one cell per row means forty painting areas down a single column. */
167
242
  background: var(--axi-surface-float);
243
+ background-attachment: fixed;
168
244
  border-right: var(--axi-border-control) solid var(--axi-ink-line);
169
245
  }
170
246
  /* The corner belongs to both and has to outrank both. */
package/src/prose.css CHANGED
@@ -76,9 +76,16 @@
76
76
  overflow: hidden;
77
77
  font-size: 13.5px;
78
78
  }
79
+ /* A markdown table's head is a row of cells filled from a themed surface, so
80
+ it is the one-surface-many-elements case `.axi-table tbody tr:hover` sets
81
+ out in data.css, and it takes the same attachment. Nothing here is sticky,
82
+ which makes no difference: the seam is per-cell repetition of the gradient,
83
+ not anything to do with scrolling. */
79
84
  .axi-prose th {
80
85
  text-align: left; padding: 10px 12px;
81
- background: var(--axi-surface-raised); color: var(--axi-text);
86
+ background: var(--axi-surface-raised);
87
+ background-attachment: fixed;
88
+ color: var(--axi-text);
82
89
  font: var(--axi-t-micro); letter-spacing: var(--axi-ls-micro); text-transform: uppercase;
83
90
  }
84
91
  .axi-prose td { padding: 10px 12px; border-top: var(--axi-border-hairline) solid var(--axi-rule); }