@axiapps/axi-design 1.14.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/README.md CHANGED
@@ -55,7 +55,7 @@ everything-at-once view.
55
55
 
56
56
  ### An icon set of its own
57
57
 
58
- Forty-seven glyphs drawn to [rule 12](docs/RULES.md) — a 24 canvas, a 3px
58
+ Fifty-seven glyphs drawn to [rule 12](docs/RULES.md) — a 24 canvas, a 3px
59
59
  stroke, mitered joins, square corners, and no angle that is not 0°, 45° or 90°.
60
60
  They take their ink from whatever they sit in, so a glyph inside an accent
61
61
  button turns accent-ink with the label and follows every accent and theme
@@ -74,12 +74,19 @@ absent, no error, no fallback. In that case do one of two things: inline
74
74
  `dist/icons/sprite.svg` into the document once (a hidden `<svg>` before
75
75
  `</body>`, which is what this project's own docs site does) and reference bare
76
76
  fragments like `#axi-search`, or use the standalone `dist/icons/<name>.svg`
77
- files. Serving the renderer over `http://localhost` also works.
77
+ files. Serving the renderer over `http://localhost` also works. Note that
78
+ alias names resolve only through the sprite — there is no
79
+ `dist/icons/triangle-alert.svg` — so the standalone-file route wants the
80
+ canonical name.
78
81
 
79
82
  One sprite holds the set; `dist/icons/<name>.svg` is the same drawing on its own,
80
83
  and `dist/icons/icons.json` is the catalogue — name, categories, aliases and
81
- keywords — for an app that wants to build a picker. Size a glyph with
82
- `--axi-icon-size`. The vocabulary derives from [Lucide](https://lucide.dev)
84
+ keywords — for an app that wants to build a picker. A Lucide name this set
85
+ answers to under a different one — `triangle-alert`, `alert-circle`, `loader-2` —
86
+ resolves in the sprite too, so porting off `lucide-react` is a rename rather than
87
+ a call-site audit. Where the set will not draw a shape at all, the
88
+ [icons page](https://darkharasho.github.io/axi-design/icons/#substitutions) says
89
+ what to use instead. Size a glyph with `--axi-icon-size`. The vocabulary derives from [Lucide](https://lucide.dev)
83
90
  under the ISC licence (`icons/LICENSE-LUCIDE`); none of the path data does.
84
91
  Browse the set at [`/icons/`](https://darkharasho.github.io/axi-design/icons/).
85
92
 
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
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M2.5 12 L6 12 L9.5 15.5 L15.5 9.5 L18 12 L21.5 12"/>
3
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M8.5 1.5 L15.5 1.5 L22.5 8.5 L22.5 15.5 L15.5 22.5 L8.5 22.5 L1.5 15.5 L1.5 8.5 Z"/>
3
+ <path d="M7 9 L8.5 7.5 L14.5 7.5 L14.5 11.5 L12 11.5 L12 14.5"/>
4
+ <path d="M12 17.5 L12 19"/>
5
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M3.5 8.5 L7.5 12.5 L12 8 L16.5 12.5 L20.5 8.5 L20.5 17.5 L3.5 17.5 Z"/>
3
+ </svg>
@@ -1,3 +1,3 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
- <path d="M2.5 4.5 L21.5 4.5 L13.5 12.5 L13.5 19.5 L10.5 19.5 L10.5 12.5 Z"/>
2
+ <path d="M4.5 4.5 L19.5 4.5 L13.5 10.5 L13.5 19.5 L10.5 19.5 L10.5 10.5 Z"/>
3
3
  </svg>
@@ -1,4 +1,4 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
- <path d="M2.5 20.5 L2.5 4.5 L8.5 4.5 L11.5 7.5 L19.5 7.5 L19.5 12.5"/>
3
- <path d="M10.5 12.5 L22.5 12.5 L14.5 20.5 L2.5 20.5 Z"/>
2
+ <path d="M3.5 18.5 L3.5 4.5 L8.5 4.5 L11.5 7.5 L19.5 7.5 L19.5 11.5"/>
3
+ <path d="M11.5 11.5 L19.5 11.5 L12.5 18.5 L4.5 18.5 Z"/>
4
4
  </svg>
@@ -1,4 +1,20 @@
1
1
  [
2
+ {
3
+ "name": "activity",
4
+ "categories": [
5
+ "status"
6
+ ],
7
+ "aliases": [
8
+ "pulse",
9
+ "live"
10
+ ],
11
+ "keywords": [
12
+ "health",
13
+ "chart",
14
+ "monitor",
15
+ "heartbeat"
16
+ ]
17
+ },
2
18
  {
3
19
  "name": "arrow-down",
4
20
  "categories": [
@@ -165,6 +181,11 @@
165
181
  "warning",
166
182
  "exclamation"
167
183
  ],
184
+ "lucide": [
185
+ "alert-circle",
186
+ "triangle-alert",
187
+ "alert-triangle"
188
+ ],
168
189
  "keywords": [
169
190
  "danger",
170
191
  "error",
@@ -179,12 +200,35 @@
179
200
  "aliases": [
180
201
  "success"
181
202
  ],
203
+ "lucide": [
204
+ "check-circle",
205
+ "check-circle-2"
206
+ ],
182
207
  "keywords": [
183
208
  "verified",
184
209
  "passed",
185
210
  "complete"
186
211
  ]
187
212
  },
213
+ {
214
+ "name": "circle-help",
215
+ "categories": [
216
+ "status"
217
+ ],
218
+ "aliases": [
219
+ "help",
220
+ "question"
221
+ ],
222
+ "lucide": [
223
+ "help-circle"
224
+ ],
225
+ "keywords": [
226
+ "what",
227
+ "support",
228
+ "unknown",
229
+ "faq"
230
+ ]
231
+ },
188
232
  {
189
233
  "name": "circle-x",
190
234
  "categories": [
@@ -193,6 +237,9 @@
193
237
  "aliases": [
194
238
  "failure"
195
239
  ],
240
+ "lucide": [
241
+ "x-circle"
242
+ ],
196
243
  "keywords": [
197
244
  "error",
198
245
  "rejected",
@@ -226,6 +273,22 @@
226
273
  "clone"
227
274
  ]
228
275
  },
276
+ {
277
+ "name": "crown",
278
+ "categories": [
279
+ "objects"
280
+ ],
281
+ "aliases": [
282
+ "king",
283
+ "best"
284
+ ],
285
+ "keywords": [
286
+ "rank",
287
+ "premium",
288
+ "featured",
289
+ "top"
290
+ ]
291
+ },
229
292
  {
230
293
  "name": "download",
231
294
  "categories": [
@@ -366,6 +429,25 @@
366
429
  "connect"
367
430
  ]
368
431
  },
432
+ {
433
+ "name": "loader-circle",
434
+ "categories": [
435
+ "status"
436
+ ],
437
+ "aliases": [
438
+ "spinner",
439
+ "loading"
440
+ ],
441
+ "lucide": [
442
+ "loader-2"
443
+ ],
444
+ "keywords": [
445
+ "busy",
446
+ "pending",
447
+ "wait",
448
+ "progress"
449
+ ]
450
+ },
369
451
  {
370
452
  "name": "lock",
371
453
  "categories": [
@@ -381,6 +463,21 @@
381
463
  "closed"
382
464
  ]
383
465
  },
466
+ {
467
+ "name": "maximize-2",
468
+ "categories": [
469
+ "actions"
470
+ ],
471
+ "aliases": [
472
+ "expand",
473
+ "fullscreen"
474
+ ],
475
+ "keywords": [
476
+ "enlarge",
477
+ "grow",
478
+ "open"
479
+ ]
480
+ },
384
481
  {
385
482
  "name": "menu",
386
483
  "categories": [
@@ -395,6 +492,22 @@
395
492
  "more"
396
493
  ]
397
494
  },
495
+ {
496
+ "name": "message-square",
497
+ "categories": [
498
+ "objects"
499
+ ],
500
+ "aliases": [
501
+ "comment",
502
+ "chat"
503
+ ],
504
+ "keywords": [
505
+ "speech",
506
+ "reply",
507
+ "thread",
508
+ "note"
509
+ ]
510
+ },
398
511
  {
399
512
  "name": "minus",
400
513
  "categories": [
@@ -431,6 +544,10 @@
431
544
  "edit",
432
545
  "write"
433
546
  ],
547
+ "lucide": [
548
+ "edit-2",
549
+ "square-pen"
550
+ ],
434
551
  "keywords": [
435
552
  "rename",
436
553
  "modify",
@@ -509,6 +626,22 @@
509
626
  "query"
510
627
  ]
511
628
  },
629
+ {
630
+ "name": "settings",
631
+ "categories": [
632
+ "actions"
633
+ ],
634
+ "aliases": [
635
+ "gear",
636
+ "cog"
637
+ ],
638
+ "keywords": [
639
+ "admin",
640
+ "system",
641
+ "controls",
642
+ "setup"
643
+ ]
644
+ },
512
645
  {
513
646
  "name": "settings-2",
514
647
  "categories": [
@@ -524,6 +657,37 @@
524
657
  "tune"
525
658
  ]
526
659
  },
660
+ {
661
+ "name": "share-2",
662
+ "categories": [
663
+ "actions"
664
+ ],
665
+ "aliases": [
666
+ "share"
667
+ ],
668
+ "keywords": [
669
+ "send",
670
+ "distribute",
671
+ "network",
672
+ "nodes"
673
+ ]
674
+ },
675
+ {
676
+ "name": "shield",
677
+ "categories": [
678
+ "status"
679
+ ],
680
+ "aliases": [
681
+ "secure",
682
+ "protected"
683
+ ],
684
+ "keywords": [
685
+ "guard",
686
+ "safety",
687
+ "defence",
688
+ "trust"
689
+ ]
690
+ },
527
691
  {
528
692
  "name": "skip-forward",
529
693
  "categories": [
@@ -545,12 +709,31 @@
545
709
  "aliases": [
546
710
  "stop"
547
711
  ],
712
+ "lucide": [
713
+ "circle"
714
+ ],
548
715
  "keywords": [
549
716
  "halt",
550
717
  "end",
551
718
  "record"
552
719
  ]
553
720
  },
721
+ {
722
+ "name": "swords",
723
+ "categories": [
724
+ "objects"
725
+ ],
726
+ "aliases": [
727
+ "combat",
728
+ "versus"
729
+ ],
730
+ "keywords": [
731
+ "battle",
732
+ "fight",
733
+ "pvp",
734
+ "duel"
735
+ ]
736
+ },
554
737
  {
555
738
  "name": "tag",
556
739
  "categories": [
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M12 3.5 L3.5 3.5 L3.5 20.5 L20.5 20.5 L20.5 12"/>
3
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M14.5 3.5 L20.5 3.5 L20.5 9.5"/>
3
+ <path d="M9.5 20.5 L3.5 20.5 L3.5 14.5"/>
4
+ <path d="M20.5 3.5 L3.5 20.5"/>
5
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M3.5 4.5 L20.5 4.5 L20.5 16.5 L9.5 16.5 L6.5 19.5 L6.5 16.5 L3.5 16.5 Z"/>
3
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M5.5 5.5 L10.5 5.5 L10.5 2.5 L13.5 2.5 L13.5 5.5 L18.5 5.5 L18.5 10.5 L21.5 10.5 L21.5 13.5 L18.5 13.5 L18.5 18.5 L13.5 18.5 L13.5 21.5 L10.5 21.5 L10.5 18.5 L5.5 18.5 L5.5 13.5 L2.5 13.5 L2.5 10.5 L5.5 10.5 Z"/>
3
+ <path d="M12 10 L14 12 L12 14 L10 12 Z" fill="currentColor" stroke="none"/>
4
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M8 10 L10 12 L8 14 L6 12 Z"/>
3
+ <path d="M15.5 2.5 L17.5 4.5 L15.5 6.5 L13.5 4.5 Z"/>
4
+ <path d="M15.5 17.5 L17.5 19.5 L15.5 21.5 L13.5 19.5 Z"/>
5
+ <path d="M10 10 L13.5 6.5"/>
6
+ <path d="M10 14 L13.5 17.5"/>
7
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M5.5 3.5 L18.5 3.5 L18.5 14.5 L12 21 L5.5 14.5 Z"/>
3
+ </svg>
@@ -1,6 +1,9 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg">
2
2
  <!-- axi design language - generated by scripts/build.mjs from icons/.
3
3
  Edit the files in icons/ and run `npm run build`; do not edit this file. -->
4
+ <symbol id="axi-activity" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
5
+ <path d="M2.5 12 L6 12 L9.5 15.5 L15.5 9.5 L18 12 L21.5 12"/>
6
+ </symbol>
4
7
  <symbol id="axi-arrow-down" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
5
8
  <path d="M12 3.5 L12 19.5"/>
6
9
  <path d="M6 13.5 L12 19.5 L18 13.5"/>
@@ -51,6 +54,11 @@
51
54
  <path d="M8.5 1.5 L15.5 1.5 L22.5 8.5 L22.5 15.5 L15.5 22.5 L8.5 22.5 L1.5 15.5 L1.5 8.5 Z"/>
52
55
  <path d="M7 12 L10.5 15.5 L17 9"/>
53
56
  </symbol>
57
+ <symbol id="axi-circle-help" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
58
+ <path d="M8.5 1.5 L15.5 1.5 L22.5 8.5 L22.5 15.5 L15.5 22.5 L8.5 22.5 L1.5 15.5 L1.5 8.5 Z"/>
59
+ <path d="M7 9 L8.5 7.5 L14.5 7.5 L14.5 11.5 L12 11.5 L12 14.5"/>
60
+ <path d="M12 17.5 L12 19"/>
61
+ </symbol>
54
62
  <symbol id="axi-circle-x" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
55
63
  <path d="M8.5 1.5 L15.5 1.5 L22.5 8.5 L22.5 15.5 L15.5 22.5 L8.5 22.5 L1.5 15.5 L1.5 8.5 Z"/>
56
64
  <path d="M8 8 L16 16"/>
@@ -64,6 +72,9 @@
64
72
  <path d="M8.5 8.5 L20.5 8.5 L20.5 20.5 L8.5 20.5 Z"/>
65
73
  <path d="M15.5 5.5 L15.5 3.5 L3.5 3.5 L3.5 15.5 L5.5 15.5"/>
66
74
  </symbol>
75
+ <symbol id="axi-crown" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
76
+ <path d="M3.5 8.5 L7.5 12.5 L12 8 L16.5 12.5 L20.5 8.5 L20.5 17.5 L3.5 17.5 Z"/>
77
+ </symbol>
67
78
  <symbol id="axi-download" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
68
79
  <path d="M12 2.5 L12 14.5"/>
69
80
  <path d="M6.5 9 L12 14.5 L17.5 9"/>
@@ -89,14 +100,14 @@
89
100
  <path d="M8.5 16.5 L15.5 16.5"/>
90
101
  </symbol>
91
102
  <symbol id="axi-filter" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
92
- <path d="M2.5 4.5 L21.5 4.5 L13.5 12.5 L13.5 19.5 L10.5 19.5 L10.5 12.5 Z"/>
103
+ <path d="M4.5 4.5 L19.5 4.5 L13.5 10.5 L13.5 19.5 L10.5 19.5 L10.5 10.5 Z"/>
93
104
  </symbol>
94
105
  <symbol id="axi-folder" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
95
106
  <path d="M2.5 20.5 L2.5 4.5 L8.5 4.5 L11.5 7.5 L21.5 7.5 L21.5 20.5 Z"/>
96
107
  </symbol>
97
108
  <symbol id="axi-folder-open" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
98
- <path d="M2.5 20.5 L2.5 4.5 L8.5 4.5 L11.5 7.5 L19.5 7.5 L19.5 12.5"/>
99
- <path d="M10.5 12.5 L22.5 12.5 L14.5 20.5 L2.5 20.5 Z"/>
109
+ <path d="M3.5 18.5 L3.5 4.5 L8.5 4.5 L11.5 7.5 L19.5 7.5 L19.5 11.5"/>
110
+ <path d="M11.5 11.5 L19.5 11.5 L12.5 18.5 L4.5 18.5 Z"/>
100
111
  </symbol>
101
112
  <symbol id="axi-info" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
102
113
  <path d="M3.5 3.5 L20.5 3.5 L20.5 20.5 L3.5 20.5 Z"/>
@@ -108,15 +119,26 @@
108
119
  <path d="M13.5 6.5 L16.5 3.5 L20.5 7.5 L17.5 10.5"/>
109
120
  <path d="M10.5 17.5 L7.5 20.5 L3.5 16.5 L6.5 13.5"/>
110
121
  </symbol>
122
+ <symbol id="axi-loader-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
123
+ <path d="M12 3.5 L3.5 3.5 L3.5 20.5 L20.5 20.5 L20.5 12"/>
124
+ </symbol>
111
125
  <symbol id="axi-lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
112
126
  <path d="M4.5 11.5 L19.5 11.5 L19.5 21.5 L4.5 21.5 Z"/>
113
127
  <path d="M8.5 11.5 L8.5 6.5 L15.5 6.5 L15.5 11.5"/>
114
128
  </symbol>
129
+ <symbol id="axi-maximize-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
130
+ <path d="M14.5 3.5 L20.5 3.5 L20.5 9.5"/>
131
+ <path d="M9.5 20.5 L3.5 20.5 L3.5 14.5"/>
132
+ <path d="M20.5 3.5 L3.5 20.5"/>
133
+ </symbol>
115
134
  <symbol id="axi-menu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
116
135
  <path d="M3.5 5.5 L20.5 5.5"/>
117
136
  <path d="M3.5 12 L20.5 12"/>
118
137
  <path d="M3.5 18.5 L20.5 18.5"/>
119
138
  </symbol>
139
+ <symbol id="axi-message-square" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
140
+ <path d="M3.5 4.5 L20.5 4.5 L20.5 16.5 L9.5 16.5 L6.5 19.5 L6.5 16.5 L3.5 16.5 Z"/>
141
+ </symbol>
120
142
  <symbol id="axi-minus" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
121
143
  <path d="M3.5 12 L20.5 12"/>
122
144
  </symbol>
@@ -150,12 +172,26 @@
150
172
  <path d="M9.5 3.5 L15.5 9.5 L9.5 15.5 L3.5 9.5 Z"/>
151
173
  <path d="M13.5 13.5 L20.5 20.5"/>
152
174
  </symbol>
175
+ <symbol id="axi-settings" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
176
+ <path d="M5.5 5.5 L10.5 5.5 L10.5 2.5 L13.5 2.5 L13.5 5.5 L18.5 5.5 L18.5 10.5 L21.5 10.5 L21.5 13.5 L18.5 13.5 L18.5 18.5 L13.5 18.5 L13.5 21.5 L10.5 21.5 L10.5 18.5 L5.5 18.5 L5.5 13.5 L2.5 13.5 L2.5 10.5 L5.5 10.5 Z"/>
177
+ <path d="M12 10 L14 12 L12 14 L10 12 Z" fill="currentColor" stroke="none"/>
178
+ </symbol>
153
179
  <symbol id="axi-settings-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
154
180
  <path d="M3.5 8.5 L20.5 8.5"/>
155
181
  <path d="M3.5 15.5 L20.5 15.5"/>
156
182
  <path d="M9.5 5.5 L12.5 8.5 L9.5 11.5 L6.5 8.5 Z"/>
157
183
  <path d="M15.5 12.5 L18.5 15.5 L15.5 18.5 L12.5 15.5 Z"/>
158
184
  </symbol>
185
+ <symbol id="axi-share-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
186
+ <path d="M8 10 L10 12 L8 14 L6 12 Z"/>
187
+ <path d="M15.5 2.5 L17.5 4.5 L15.5 6.5 L13.5 4.5 Z"/>
188
+ <path d="M15.5 17.5 L17.5 19.5 L15.5 21.5 L13.5 19.5 Z"/>
189
+ <path d="M10 10 L13.5 6.5"/>
190
+ <path d="M10 14 L13.5 17.5"/>
191
+ </symbol>
192
+ <symbol id="axi-shield" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
193
+ <path d="M5.5 3.5 L18.5 3.5 L18.5 14.5 L12 21 L5.5 14.5 Z"/>
194
+ </symbol>
159
195
  <symbol id="axi-skip-forward" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
160
196
  <path d="M6.5 5.5 L13 12 L6.5 18.5 Z"/>
161
197
  <path d="M17.5 5.5 L17.5 18.5"/>
@@ -163,6 +199,12 @@
163
199
  <symbol id="axi-square" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
164
200
  <path d="M4.5 4.5 L19.5 4.5 L19.5 19.5 L4.5 19.5 Z"/>
165
201
  </symbol>
202
+ <symbol id="axi-swords" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
203
+ <path d="M3.5 6.5 L16.5 19.5"/>
204
+ <path d="M20.5 6.5 L7.5 19.5"/>
205
+ <path d="M12.5 18.5 L15.5 15.5"/>
206
+ <path d="M8.5 15.5 L11.5 18.5"/>
207
+ </symbol>
166
208
  <symbol id="axi-tag" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
167
209
  <path d="M2.5 2.5 L13.5 2.5 L21.5 10.5 L10.5 21.5 L2.5 13.5 Z"/>
168
210
  <path d="M6.5 4.5 L8.5 6.5 L6.5 8.5 L4.5 6.5 Z"/>
@@ -192,7 +234,7 @@
192
234
  <path d="M17 14.5 L19.5 14.5 L22.5 17.5 L22.5 20.5"/>
193
235
  </symbol>
194
236
  <symbol id="axi-volume-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
195
- <path d="M2.5 9.5 L6.5 9.5 L12.5 3.5 L12.5 20.5 L6.5 14.5 L2.5 14.5 Z"/>
237
+ <path d="M2.5 9.5 L7.5 9.5 L12.5 4.5 L12.5 19.5 L7.5 14.5 L2.5 14.5 Z"/>
196
238
  <path d="M16.5 8.5 L16.5 15.5"/>
197
239
  <path d="M20.5 5.5 L20.5 18.5"/>
198
240
  </symbol>
@@ -200,4 +242,37 @@
200
242
  <path d="M5.5 5.5 L18.5 18.5"/>
201
243
  <path d="M18.5 5.5 L5.5 18.5"/>
202
244
  </symbol>
245
+ <symbol id="axi-alert-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
246
+ <use href="#axi-circle-alert"/>
247
+ </symbol>
248
+ <symbol id="axi-alert-triangle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
249
+ <use href="#axi-circle-alert"/>
250
+ </symbol>
251
+ <symbol id="axi-check-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
252
+ <use href="#axi-circle-check"/>
253
+ </symbol>
254
+ <symbol id="axi-check-circle-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
255
+ <use href="#axi-circle-check"/>
256
+ </symbol>
257
+ <symbol id="axi-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
258
+ <use href="#axi-square"/>
259
+ </symbol>
260
+ <symbol id="axi-edit-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
261
+ <use href="#axi-pencil"/>
262
+ </symbol>
263
+ <symbol id="axi-help-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
264
+ <use href="#axi-circle-help"/>
265
+ </symbol>
266
+ <symbol id="axi-loader-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
267
+ <use href="#axi-loader-circle"/>
268
+ </symbol>
269
+ <symbol id="axi-square-pen" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
270
+ <use href="#axi-pencil"/>
271
+ </symbol>
272
+ <symbol id="axi-triangle-alert" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
273
+ <use href="#axi-circle-alert"/>
274
+ </symbol>
275
+ <symbol id="axi-x-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
276
+ <use href="#axi-circle-x"/>
277
+ </symbol>
203
278
  </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M3.5 6.5 L16.5 19.5"/>
3
+ <path d="M20.5 6.5 L7.5 19.5"/>
4
+ <path d="M12.5 18.5 L15.5 15.5"/>
5
+ <path d="M8.5 15.5 L11.5 18.5"/>
6
+ </svg>
@@ -1,5 +1,5 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
- <path d="M2.5 9.5 L6.5 9.5 L12.5 3.5 L12.5 20.5 L6.5 14.5 L2.5 14.5 Z"/>
2
+ <path d="M2.5 9.5 L7.5 9.5 L12.5 4.5 L12.5 19.5 L7.5 14.5 L2.5 14.5 Z"/>
3
3
  <path d="M16.5 8.5 L16.5 15.5"/>
4
4
  <path d="M20.5 5.5 L20.5 18.5"/>
5
5
  </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M2.5 12 L6 12 L9.5 15.5 L15.5 9.5 L18 12 L21.5 12"/>
3
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M8.5 1.5 L15.5 1.5 L22.5 8.5 L22.5 15.5 L15.5 22.5 L8.5 22.5 L1.5 15.5 L1.5 8.5 Z"/>
3
+ <path d="M7 9 L8.5 7.5 L14.5 7.5 L14.5 11.5 L12 11.5 L12 14.5"/>
4
+ <path d="M12 17.5 L12 19"/>
5
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M3.5 8.5 L7.5 12.5 L12 8 L16.5 12.5 L20.5 8.5 L20.5 17.5 L3.5 17.5 Z"/>
3
+ </svg>
package/icons/filter.svg CHANGED
@@ -1,3 +1,3 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
- <path d="M2.5 4.5 L21.5 4.5 L13.5 12.5 L13.5 19.5 L10.5 19.5 L10.5 12.5 Z"/>
2
+ <path d="M4.5 4.5 L19.5 4.5 L13.5 10.5 L13.5 19.5 L10.5 19.5 L10.5 10.5 Z"/>
3
3
  </svg>
@@ -1,4 +1,4 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
- <path d="M2.5 20.5 L2.5 4.5 L8.5 4.5 L11.5 7.5 L19.5 7.5 L19.5 12.5"/>
3
- <path d="M10.5 12.5 L22.5 12.5 L14.5 20.5 L2.5 20.5 Z"/>
2
+ <path d="M3.5 18.5 L3.5 4.5 L8.5 4.5 L11.5 7.5 L19.5 7.5 L19.5 11.5"/>
3
+ <path d="M11.5 11.5 L19.5 11.5 L12.5 18.5 L4.5 18.5 Z"/>
4
4
  </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M12 3.5 L3.5 3.5 L3.5 20.5 L20.5 20.5 L20.5 12"/>
3
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M14.5 3.5 L20.5 3.5 L20.5 9.5"/>
3
+ <path d="M9.5 20.5 L3.5 20.5 L3.5 14.5"/>
4
+ <path d="M20.5 3.5 L3.5 20.5"/>
5
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M3.5 4.5 L20.5 4.5 L20.5 16.5 L9.5 16.5 L6.5 19.5 L6.5 16.5 L3.5 16.5 Z"/>
3
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M5.5 5.5 L10.5 5.5 L10.5 2.5 L13.5 2.5 L13.5 5.5 L18.5 5.5 L18.5 10.5 L21.5 10.5 L21.5 13.5 L18.5 13.5 L18.5 18.5 L13.5 18.5 L13.5 21.5 L10.5 21.5 L10.5 18.5 L5.5 18.5 L5.5 13.5 L2.5 13.5 L2.5 10.5 L5.5 10.5 Z"/>
3
+ <path d="M12 10 L14 12 L12 14 L10 12 Z" fill="currentColor" stroke="none"/>
4
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M8 10 L10 12 L8 14 L6 12 Z"/>
3
+ <path d="M15.5 2.5 L17.5 4.5 L15.5 6.5 L13.5 4.5 Z"/>
4
+ <path d="M15.5 17.5 L17.5 19.5 L15.5 21.5 L13.5 19.5 Z"/>
5
+ <path d="M10 10 L13.5 6.5"/>
6
+ <path d="M10 14 L13.5 17.5"/>
7
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M5.5 3.5 L18.5 3.5 L18.5 14.5 L12 21 L5.5 14.5 Z"/>
3
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
+ <path d="M3.5 6.5 L16.5 19.5"/>
3
+ <path d="M20.5 6.5 L7.5 19.5"/>
4
+ <path d="M12.5 18.5 L15.5 15.5"/>
5
+ <path d="M8.5 15.5 L11.5 18.5"/>
6
+ </svg>
@@ -1,5 +1,5 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="miter">
2
- <path d="M2.5 9.5 L6.5 9.5 L12.5 3.5 L12.5 20.5 L6.5 14.5 L2.5 14.5 Z"/>
2
+ <path d="M2.5 9.5 L7.5 9.5 L12.5 4.5 L12.5 19.5 L7.5 14.5 L2.5 14.5 Z"/>
3
3
  <path d="M16.5 8.5 L16.5 15.5"/>
4
4
  <path d="M20.5 5.5 L20.5 18.5"/>
5
5
  </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiapps/axi-design",
3
- "version": "1.14.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