@axiapps/axi-design 1.37.1 → 1.38.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.
package/dist/axi.css CHANGED
@@ -2473,8 +2473,29 @@ textarea.axi-input {
2473
2473
  border-inline-start-color: var(--axi-accent);
2474
2474
  }
2475
2475
  .axi-table__num { color: var(--axi-text); }
2476
- /* A name cell: an icon, a diamond or a rank beside the label. */
2477
- .axi-table__who { display: flex; align-items: center; gap: 9px; }
2476
+ /* A name cell: an icon, a diamond or a rank beside the label.
2477
+
2478
+ The label truncates and the mark does not. A name is arbitrarily long - a
2479
+ skill called "Chapter 4: Scorched Aftermath" measured 417px against a 183px
2480
+ column - and with nothing said, a flex row lets it spill across its
2481
+ neighbours rather than shrink. The same reasoning as the comment on
2482
+ .axi-tabs__tab, and the same pair of requirements: min-width: 0 on the
2483
+ container AND on the shrinking child, because a flex item's default
2484
+ min-width is its content, so the ellipsis never appears without both.
2485
+
2486
+ Selected by element, not by a class the consumer adds: which child is the
2487
+ icon and which is the label is visible in the markup, and asking every
2488
+ consumer to label it invites exactly the omission this rule exists to fix.
2489
+ The `flex: none` on the mark is the load-bearing half - without it the icon
2490
+ squashes toward zero before the text gives up any room at all. */
2491
+ .axi-table__who { display: flex; align-items: center; gap: 9px; min-width: 0; }
2492
+ .axi-table__who > :where(img, svg) { flex: none; }
2493
+ .axi-table__who > :where(span, a, div, p) {
2494
+ min-width: 0;
2495
+ overflow: hidden;
2496
+ text-overflow: ellipsis;
2497
+ white-space: nowrap;
2498
+ }
2478
2499
  /* Rank is the only fill a table gets, and only where the position is real -
2479
2500
  a podium, not a row number. An outlined rank is the ordinary case. */
2480
2501
  .axi-table__rank {
@@ -2552,6 +2573,25 @@ textarea.axi-input {
2552
2573
  its being a modifier rather than a second table. */
2553
2574
  .axi-table--dense thead th { padding: 0 7px 6px; }
2554
2575
  .axi-table--dense :is(td, tbody th) { padding: 5px 7px; font: var(--axi-t-micro); }
2576
+ /* Proportional columns, for a table inside a pane rather than a page.
2577
+
2578
+ `width: 100%` is a floor, not a cap. Under the default auto layout the
2579
+ columns size to their content, and because every cell here is `nowrap`,
2580
+ content wins: a three-column table measured 581px inside a 360px pane.
2581
+ A page-width table absorbs that, and .axi-table__scroll turns it into a
2582
+ horizontal scrollbar on purpose. A table sharing a 480px pane with a
2583
+ selector list has neither option - it needs the columns to divide the room
2584
+ it has, which is what a grid's `fr` gives for free and is the reason
2585
+ hand-built tables in panes were grids.
2586
+
2587
+ The consumer sets the proportions in a <colgroup>, because they are facts
2588
+ about one table's columns and nothing here can know them.
2589
+
2590
+ Cells get the clip, not just the ellipsis: fixed layout makes a cell
2591
+ narrower than its content the normal case rather than the exception, and
2592
+ an unclipped cell paints over the column beside it. */
2593
+ .axi-table--fixed { table-layout: fixed; }
2594
+ .axi-table--fixed :where(td, th) { overflow: hidden; text-overflow: ellipsis; }
2555
2595
  /* The sorted column, named with the attribute a screen reader already needs
2556
2596
  in order to announce it. A class beside `aria-sort` would be a second
2557
2597
  source of truth for one fact. The mark is ink on the head and its edge -
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiapps/axi-design",
3
- "version": "1.37.1",
3
+ "version": "1.38.0",
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
@@ -171,8 +171,29 @@
171
171
  border-inline-start-color: var(--axi-accent);
172
172
  }
173
173
  .axi-table__num { color: var(--axi-text); }
174
- /* A name cell: an icon, a diamond or a rank beside the label. */
175
- .axi-table__who { display: flex; align-items: center; gap: 9px; }
174
+ /* A name cell: an icon, a diamond or a rank beside the label.
175
+
176
+ The label truncates and the mark does not. A name is arbitrarily long - a
177
+ skill called "Chapter 4: Scorched Aftermath" measured 417px against a 183px
178
+ column - and with nothing said, a flex row lets it spill across its
179
+ neighbours rather than shrink. The same reasoning as the comment on
180
+ .axi-tabs__tab, and the same pair of requirements: min-width: 0 on the
181
+ container AND on the shrinking child, because a flex item's default
182
+ min-width is its content, so the ellipsis never appears without both.
183
+
184
+ Selected by element, not by a class the consumer adds: which child is the
185
+ icon and which is the label is visible in the markup, and asking every
186
+ consumer to label it invites exactly the omission this rule exists to fix.
187
+ The `flex: none` on the mark is the load-bearing half - without it the icon
188
+ squashes toward zero before the text gives up any room at all. */
189
+ .axi-table__who { display: flex; align-items: center; gap: 9px; min-width: 0; }
190
+ .axi-table__who > :where(img, svg) { flex: none; }
191
+ .axi-table__who > :where(span, a, div, p) {
192
+ min-width: 0;
193
+ overflow: hidden;
194
+ text-overflow: ellipsis;
195
+ white-space: nowrap;
196
+ }
176
197
  /* Rank is the only fill a table gets, and only where the position is real -
177
198
  a podium, not a row number. An outlined rank is the ordinary case. */
178
199
  .axi-table__rank {
@@ -250,6 +271,25 @@
250
271
  its being a modifier rather than a second table. */
251
272
  .axi-table--dense thead th { padding: 0 7px 6px; }
252
273
  .axi-table--dense :is(td, tbody th) { padding: 5px 7px; font: var(--axi-t-micro); }
274
+ /* Proportional columns, for a table inside a pane rather than a page.
275
+
276
+ `width: 100%` is a floor, not a cap. Under the default auto layout the
277
+ columns size to their content, and because every cell here is `nowrap`,
278
+ content wins: a three-column table measured 581px inside a 360px pane.
279
+ A page-width table absorbs that, and .axi-table__scroll turns it into a
280
+ horizontal scrollbar on purpose. A table sharing a 480px pane with a
281
+ selector list has neither option - it needs the columns to divide the room
282
+ it has, which is what a grid's `fr` gives for free and is the reason
283
+ hand-built tables in panes were grids.
284
+
285
+ The consumer sets the proportions in a <colgroup>, because they are facts
286
+ about one table's columns and nothing here can know them.
287
+
288
+ Cells get the clip, not just the ellipsis: fixed layout makes a cell
289
+ narrower than its content the normal case rather than the exception, and
290
+ an unclipped cell paints over the column beside it. */
291
+ .axi-table--fixed { table-layout: fixed; }
292
+ .axi-table--fixed :where(td, th) { overflow: hidden; text-overflow: ellipsis; }
253
293
  /* The sorted column, named with the attribute a screen reader already needs
254
294
  in order to announce it. A class beside `aria-sort` would be a second
255
295
  source of truth for one fact. The mark is ink on the head and its edge -