@axiapps/axi-design 1.15.0 → 1.16.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
@@ -874,24 +874,67 @@ textarea.axi-input {
874
874
  color: var(--axi-text-faint);
875
875
  letter-spacing: .09em; text-transform: uppercase;
876
876
  }
877
- .axi-tabs { display: flex; gap: 8px; margin-left: auto; }
878
- .axi-tabs a {
877
+ /* Anchors and buttons both. A strip that moves between URLs is made of links;
878
+ a strip inside an application that swaps a view in place is made of buttons,
879
+ and they look the same because they answer the same question. A button also
880
+ arrives carrying the UA's own font, fill and cursor, which an anchor does
881
+ not, so those three are cleared here rather than left to the consumer. */
882
+ .axi-tabs { display: flex; gap: 8px; }
883
+ /* The auto margin belongs to the masthead, not to the strip: it is a statement
884
+ about where the tabs sit in that row, and a strip standing on its own -
885
+ spanning a view instead of ending a header - has nothing to push away from. */
886
+ .axi-mast .axi-tabs { margin-left: auto; }
887
+ .axi-tabs a,
888
+ .axi-tabs button {
879
889
  padding: 8px 16px;
880
890
  font: 800 13.5px/1 var(--axi-sans);
881
891
  color: var(--axi-text-dim); text-decoration: none;
892
+ background: none;
893
+ cursor: pointer;
882
894
  border: var(--axi-border-control) solid transparent;
883
895
  border-radius: var(--axi-radius-sm);
884
896
  }
885
- .axi-tabs a:hover { color: var(--axi-text); border-color: var(--axi-rule); }
897
+ .axi-tabs a:hover,
898
+ .axi-tabs button:hover { color: var(--axi-text); border-color: var(--axi-rule); }
886
899
  /* The current tab is filled and blocked - the same treatment a pressed pill
887
900
  gets, because it is the same idea: this one is on. */
888
- .axi-tabs a[aria-current="page"] {
901
+ .axi-tabs a[aria-current="page"],
902
+ .axi-tabs button[aria-current="page"] {
889
903
  background: var(--axi-accent);
890
904
  color: var(--axi-accent-ink);
891
905
  border-color: var(--axi-ink-line);
892
906
  box-shadow: var(--axi-shadow-control);
893
907
  }
894
908
 
909
+ /* A closable tab - a report or a document, an open thing rather than a place.
910
+ The label and its close control travel together, so the pair is a box and
911
+ the strip's gap falls between pairs instead of between a tab and its own X.
912
+
913
+ The close control is a tab's affordance and not a tab, so it opts out of the
914
+ tab treatment: no tab padding, no tab weight, and faint until the cursor is
915
+ on it. Two classes to outrank `.axi-tabs button`, which is one class and one
916
+ element and would otherwise win on source order alone. */
917
+ /* A document title is arbitrarily long, so the label truncates rather than
918
+ pushing the close control off the strip. Both boxes need min-width: 0 - a
919
+ flex item's default min-width is its content, so without it the label simply
920
+ refuses to shrink and the ellipsis never appears. The consumer sets the width
921
+ it wants to hold on .axi-tabs__tab. */
922
+ .axi-tabs__tab { display: inline-flex; align-items: center; min-width: 0; }
923
+ .axi-tabs__tab > a:first-child,
924
+ .axi-tabs__tab > button:first-child {
925
+ min-width: 0;
926
+ overflow: hidden;
927
+ text-overflow: ellipsis;
928
+ white-space: nowrap;
929
+ }
930
+ .axi-tabs .axi-tabs__close {
931
+ padding: 0 6px;
932
+ font: var(--axi-t-micro);
933
+ color: var(--axi-text-faint);
934
+ border-color: transparent;
935
+ }
936
+ .axi-tabs .axi-tabs__close:hover { color: var(--axi-text); border-color: transparent; }
937
+
895
938
  /* ---------- notice ---------- */
896
939
  .axi-notice {
897
940
  display: flex; gap: 14px; padding: 15px 18px;
@@ -1205,7 +1248,8 @@ textarea.axi-input {
1205
1248
 
1206
1249
  @media (max-width: 640px) {
1207
1250
  .axi-mast__in { min-height: 0; padding: 10px 16px; gap: 12px; }
1208
- .axi-tabs { margin-left: 0; width: 100%; overflow-x: auto; }
1251
+ .axi-mast .axi-tabs { margin-left: 0; }
1252
+ .axi-tabs { width: 100%; overflow-x: auto; }
1209
1253
  /* The offset blocks eat horizontal room a phone does not have, so the panel
1210
1254
  step drops to the control step here rather than to an invented number.
1211
1255
  The card's hover has to come down with it - left alone it kept deepening
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiapps/axi-design",
3
- "version": "1.15.0",
3
+ "version": "1.16.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/shells.css CHANGED
@@ -48,24 +48,67 @@
48
48
  color: var(--axi-text-faint);
49
49
  letter-spacing: .09em; text-transform: uppercase;
50
50
  }
51
- .axi-tabs { display: flex; gap: 8px; margin-left: auto; }
52
- .axi-tabs a {
51
+ /* Anchors and buttons both. A strip that moves between URLs is made of links;
52
+ a strip inside an application that swaps a view in place is made of buttons,
53
+ and they look the same because they answer the same question. A button also
54
+ arrives carrying the UA's own font, fill and cursor, which an anchor does
55
+ not, so those three are cleared here rather than left to the consumer. */
56
+ .axi-tabs { display: flex; gap: 8px; }
57
+ /* The auto margin belongs to the masthead, not to the strip: it is a statement
58
+ about where the tabs sit in that row, and a strip standing on its own -
59
+ spanning a view instead of ending a header - has nothing to push away from. */
60
+ .axi-mast .axi-tabs { margin-left: auto; }
61
+ .axi-tabs a,
62
+ .axi-tabs button {
53
63
  padding: 8px 16px;
54
64
  font: 800 13.5px/1 var(--axi-sans);
55
65
  color: var(--axi-text-dim); text-decoration: none;
66
+ background: none;
67
+ cursor: pointer;
56
68
  border: var(--axi-border-control) solid transparent;
57
69
  border-radius: var(--axi-radius-sm);
58
70
  }
59
- .axi-tabs a:hover { color: var(--axi-text); border-color: var(--axi-rule); }
71
+ .axi-tabs a:hover,
72
+ .axi-tabs button:hover { color: var(--axi-text); border-color: var(--axi-rule); }
60
73
  /* The current tab is filled and blocked - the same treatment a pressed pill
61
74
  gets, because it is the same idea: this one is on. */
62
- .axi-tabs a[aria-current="page"] {
75
+ .axi-tabs a[aria-current="page"],
76
+ .axi-tabs button[aria-current="page"] {
63
77
  background: var(--axi-accent);
64
78
  color: var(--axi-accent-ink);
65
79
  border-color: var(--axi-ink-line);
66
80
  box-shadow: var(--axi-shadow-control);
67
81
  }
68
82
 
83
+ /* A closable tab - a report or a document, an open thing rather than a place.
84
+ The label and its close control travel together, so the pair is a box and
85
+ the strip's gap falls between pairs instead of between a tab and its own X.
86
+
87
+ The close control is a tab's affordance and not a tab, so it opts out of the
88
+ tab treatment: no tab padding, no tab weight, and faint until the cursor is
89
+ on it. Two classes to outrank `.axi-tabs button`, which is one class and one
90
+ element and would otherwise win on source order alone. */
91
+ /* A document title is arbitrarily long, so the label truncates rather than
92
+ pushing the close control off the strip. Both boxes need min-width: 0 - a
93
+ flex item's default min-width is its content, so without it the label simply
94
+ refuses to shrink and the ellipsis never appears. The consumer sets the width
95
+ it wants to hold on .axi-tabs__tab. */
96
+ .axi-tabs__tab { display: inline-flex; align-items: center; min-width: 0; }
97
+ .axi-tabs__tab > a:first-child,
98
+ .axi-tabs__tab > button:first-child {
99
+ min-width: 0;
100
+ overflow: hidden;
101
+ text-overflow: ellipsis;
102
+ white-space: nowrap;
103
+ }
104
+ .axi-tabs .axi-tabs__close {
105
+ padding: 0 6px;
106
+ font: var(--axi-t-micro);
107
+ color: var(--axi-text-faint);
108
+ border-color: transparent;
109
+ }
110
+ .axi-tabs .axi-tabs__close:hover { color: var(--axi-text); border-color: transparent; }
111
+
69
112
  /* ---------- notice ---------- */
70
113
  .axi-notice {
71
114
  display: flex; gap: 14px; padding: 15px 18px;
@@ -379,7 +422,8 @@
379
422
 
380
423
  @media (max-width: 640px) {
381
424
  .axi-mast__in { min-height: 0; padding: 10px 16px; gap: 12px; }
382
- .axi-tabs { margin-left: 0; width: 100%; overflow-x: auto; }
425
+ .axi-mast .axi-tabs { margin-left: 0; }
426
+ .axi-tabs { width: 100%; overflow-x: auto; }
383
427
  /* The offset blocks eat horizontal room a phone does not have, so the panel
384
428
  step drops to the control step here rather than to an invented number.
385
429
  The card's hover has to come down with it - left alone it kept deepening