@uxelle/skills 0.2.2 → 0.2.4
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/index.js +40 -35
- package/index.json +40 -35
- package/package.json +1 -1
- package/skills/uxelle-components/Icon.md +4 -4
- package/skills/uxelle-components/NavLink.md +2 -2
- package/skills/uxelle-components/Navigation.md +33 -23
- package/skills/uxelle-components/NavigationSide.md +3 -3
- package/skills/uxelle-components/NavigationSideItem.md +4 -4
- package/skills/uxelle-components/NavigationSideSubItem.md +3 -3
- package/skills/uxelle-components/SKILL.md +6 -1
- package/skills/uxelle-components/StatTile.md +13 -42
- package/skills/uxelle-components/getting-started.md +38 -7
- package/skills/uxelle-design-harness/SKILL.md +6 -2
- package/skills/uxelle-design-harness/a2ui.md +9 -0
- package/skills/uxelle-design-harness/how-to-accessibility.md +1 -1
- package/skills/uxelle-design-harness/how-to-host.md +5 -1
- package/skills/uxelle-design-harness/how-to-page-layout.md +4 -2
- package/skills/uxelle-design-harness/recipe-app-chrome.md +102 -25
- package/skills/uxelle-design-harness/recipe-dashboard-overview.md +4 -2
- package/skills/uxelle-design-harness/recipe-navigation.md +433 -0
- package/skills/uxelle-design-harness/recipe-stat-callouts.md +6 -4
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/manifest.generated.ts
|
|
2
2
|
var manifest = {
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.4",
|
|
5
5
|
"skills": [
|
|
6
6
|
{
|
|
7
7
|
"name": "uxelle-components",
|
|
@@ -154,8 +154,8 @@ var manifest = {
|
|
|
154
154
|
},
|
|
155
155
|
{
|
|
156
156
|
"path": "getting-started.md",
|
|
157
|
-
"size":
|
|
158
|
-
"hash": "sha256:
|
|
157
|
+
"size": 3387,
|
|
158
|
+
"hash": "sha256:5aa1009aaf71d2d45d8f57198ee52942d4220d031948357c646b799b19ffd34f"
|
|
159
159
|
},
|
|
160
160
|
{
|
|
161
161
|
"path": "Hero.md",
|
|
@@ -164,8 +164,8 @@ var manifest = {
|
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
"path": "Icon.md",
|
|
167
|
-
"size":
|
|
168
|
-
"hash": "sha256:
|
|
167
|
+
"size": 2948,
|
|
168
|
+
"hash": "sha256:c467d672c13c5d52120618d5f932454e5f3a8dbd5f8bdd2e1498b26f676d523d"
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"path": "IconButton.md",
|
|
@@ -249,13 +249,13 @@ var manifest = {
|
|
|
249
249
|
},
|
|
250
250
|
{
|
|
251
251
|
"path": "Navigation.md",
|
|
252
|
-
"size":
|
|
253
|
-
"hash": "sha256:
|
|
252
|
+
"size": 3749,
|
|
253
|
+
"hash": "sha256:d51bf6f799deda23afae3b13a60e38d90b8a8069be1eedd05c5c6ec5d6d806ad"
|
|
254
254
|
},
|
|
255
255
|
{
|
|
256
256
|
"path": "NavigationSide.md",
|
|
257
|
-
"size":
|
|
258
|
-
"hash": "sha256:
|
|
257
|
+
"size": 5474,
|
|
258
|
+
"hash": "sha256:ffe9e9a88ade7c6cef99c1953e4e265afce446d616af366fd4b63206517396bf"
|
|
259
259
|
},
|
|
260
260
|
{
|
|
261
261
|
"path": "NavigationSideGroup.md",
|
|
@@ -264,18 +264,18 @@ var manifest = {
|
|
|
264
264
|
},
|
|
265
265
|
{
|
|
266
266
|
"path": "NavigationSideItem.md",
|
|
267
|
-
"size":
|
|
268
|
-
"hash": "sha256:
|
|
267
|
+
"size": 6595,
|
|
268
|
+
"hash": "sha256:3e7f51a9eabb5bf144022064b14416cebbc4d7d9eb87ee9c82299c5ecbb50e34"
|
|
269
269
|
},
|
|
270
270
|
{
|
|
271
271
|
"path": "NavigationSideSubItem.md",
|
|
272
|
-
"size":
|
|
273
|
-
"hash": "sha256:
|
|
272
|
+
"size": 2649,
|
|
273
|
+
"hash": "sha256:3edf70cb4a3cb43abd112cbae73d83385481f004d8e48513ab455596388d221e"
|
|
274
274
|
},
|
|
275
275
|
{
|
|
276
276
|
"path": "NavLink.md",
|
|
277
|
-
"size":
|
|
278
|
-
"hash": "sha256:
|
|
277
|
+
"size": 2765,
|
|
278
|
+
"hash": "sha256:6d8d696c1066b536cb3a36a145f316968bef40879b265a8d5fac06fbeaf9d69b"
|
|
279
279
|
},
|
|
280
280
|
{
|
|
281
281
|
"path": "NotificationBadge.md",
|
|
@@ -344,8 +344,8 @@ var manifest = {
|
|
|
344
344
|
},
|
|
345
345
|
{
|
|
346
346
|
"path": "SKILL.md",
|
|
347
|
-
"size":
|
|
348
|
-
"hash": "sha256:
|
|
347
|
+
"size": 14816,
|
|
348
|
+
"hash": "sha256:a15ed6eb6c149096d9cb6376ee47e17700cbf36ed498edd176232ff87f78d94b"
|
|
349
349
|
},
|
|
350
350
|
{
|
|
351
351
|
"path": "Spinner.md",
|
|
@@ -354,8 +354,8 @@ var manifest = {
|
|
|
354
354
|
},
|
|
355
355
|
{
|
|
356
356
|
"path": "StatTile.md",
|
|
357
|
-
"size":
|
|
358
|
-
"hash": "sha256:
|
|
357
|
+
"size": 8042,
|
|
358
|
+
"hash": "sha256:76a99c8ea47082659e625c59030d0cef527bd19d8d6cabd635e71016be13754d"
|
|
359
359
|
},
|
|
360
360
|
{
|
|
361
361
|
"path": "Stepper.md",
|
|
@@ -415,8 +415,8 @@ var manifest = {
|
|
|
415
415
|
"files": [
|
|
416
416
|
{
|
|
417
417
|
"path": "a2ui.md",
|
|
418
|
-
"size":
|
|
419
|
-
"hash": "sha256:
|
|
418
|
+
"size": 5279,
|
|
419
|
+
"hash": "sha256:9ebad576e8878251c6ce2210a7cab70066b30d04f0b38e1963b5eeb9f5c820e3"
|
|
420
420
|
},
|
|
421
421
|
{
|
|
422
422
|
"path": "density.md",
|
|
@@ -425,8 +425,8 @@ var manifest = {
|
|
|
425
425
|
},
|
|
426
426
|
{
|
|
427
427
|
"path": "how-to-accessibility.md",
|
|
428
|
-
"size":
|
|
429
|
-
"hash": "sha256:
|
|
428
|
+
"size": 3732,
|
|
429
|
+
"hash": "sha256:c66c97e67182cb444fb9ff6f1b02db8da663f928a79bf31517008b9dc3f7a82e"
|
|
430
430
|
},
|
|
431
431
|
{
|
|
432
432
|
"path": "how-to-color.md",
|
|
@@ -435,13 +435,13 @@ var manifest = {
|
|
|
435
435
|
},
|
|
436
436
|
{
|
|
437
437
|
"path": "how-to-host.md",
|
|
438
|
-
"size":
|
|
439
|
-
"hash": "sha256:
|
|
438
|
+
"size": 2856,
|
|
439
|
+
"hash": "sha256:dab3dc61a74b069600d56940f4b2b5e9210f2899ab5688613fbbbfdc035c60ba"
|
|
440
440
|
},
|
|
441
441
|
{
|
|
442
442
|
"path": "how-to-page-layout.md",
|
|
443
|
-
"size":
|
|
444
|
-
"hash": "sha256:
|
|
443
|
+
"size": 11126,
|
|
444
|
+
"hash": "sha256:2d06c39afbe035eb13bace7c744f7d19a2130248eb574a8b11f2bf179f83fa67"
|
|
445
445
|
},
|
|
446
446
|
{
|
|
447
447
|
"path": "principles.md",
|
|
@@ -450,8 +450,8 @@ var manifest = {
|
|
|
450
450
|
},
|
|
451
451
|
{
|
|
452
452
|
"path": "recipe-app-chrome.md",
|
|
453
|
-
"size":
|
|
454
|
-
"hash": "sha256:
|
|
453
|
+
"size": 12052,
|
|
454
|
+
"hash": "sha256:f4a1380400b4ea54a70dd8d77bb800d37fdf90240e1aaecd5aafad67730730bb"
|
|
455
455
|
},
|
|
456
456
|
{
|
|
457
457
|
"path": "recipe-card-grid.md",
|
|
@@ -465,8 +465,8 @@ var manifest = {
|
|
|
465
465
|
},
|
|
466
466
|
{
|
|
467
467
|
"path": "recipe-dashboard-overview.md",
|
|
468
|
-
"size":
|
|
469
|
-
"hash": "sha256:
|
|
468
|
+
"size": 4857,
|
|
469
|
+
"hash": "sha256:4fe4573d6eb09730c1737875c835ca9b939cd3d8e8587ecae09ba7331b2ff8d7"
|
|
470
470
|
},
|
|
471
471
|
{
|
|
472
472
|
"path": "recipe-data-table-page.md",
|
|
@@ -508,6 +508,11 @@ var manifest = {
|
|
|
508
508
|
"size": 3876,
|
|
509
509
|
"hash": "sha256:351069ddf1e5d085d9f1a89caa47c368874b5d15d4cb9a53e9e1691c3df44a14"
|
|
510
510
|
},
|
|
511
|
+
{
|
|
512
|
+
"path": "recipe-navigation.md",
|
|
513
|
+
"size": 17612,
|
|
514
|
+
"hash": "sha256:37dde1f17bb34f12b9e53a930f336a7beafbb4ae9fc237bcff02a2b37018f922"
|
|
515
|
+
},
|
|
511
516
|
{
|
|
512
517
|
"path": "recipe-page-header.md",
|
|
513
518
|
"size": 4161,
|
|
@@ -540,8 +545,8 @@ var manifest = {
|
|
|
540
545
|
},
|
|
541
546
|
{
|
|
542
547
|
"path": "recipe-stat-callouts.md",
|
|
543
|
-
"size":
|
|
544
|
-
"hash": "sha256:
|
|
548
|
+
"size": 4207,
|
|
549
|
+
"hash": "sha256:ef84f56f302f623b990dff4e5051256642a41cf2dabab0e102ddf030bff4f61c"
|
|
545
550
|
},
|
|
546
551
|
{
|
|
547
552
|
"path": "recipe-states.md",
|
|
@@ -565,8 +570,8 @@ var manifest = {
|
|
|
565
570
|
},
|
|
566
571
|
{
|
|
567
572
|
"path": "SKILL.md",
|
|
568
|
-
"size":
|
|
569
|
-
"hash": "sha256:
|
|
573
|
+
"size": 11032,
|
|
574
|
+
"hash": "sha256:75b96a393abccffd6c6292a22bbaf88f402fc68edbcd9326f7d099ea0d575d48"
|
|
570
575
|
},
|
|
571
576
|
{
|
|
572
577
|
"path": "spacing-steps.md",
|
package/index.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"skills": [
|
|
5
5
|
{
|
|
6
6
|
"name": "uxelle-components",
|
|
@@ -153,8 +153,8 @@
|
|
|
153
153
|
},
|
|
154
154
|
{
|
|
155
155
|
"path": "getting-started.md",
|
|
156
|
-
"size":
|
|
157
|
-
"hash": "sha256:
|
|
156
|
+
"size": 3387,
|
|
157
|
+
"hash": "sha256:5aa1009aaf71d2d45d8f57198ee52942d4220d031948357c646b799b19ffd34f"
|
|
158
158
|
},
|
|
159
159
|
{
|
|
160
160
|
"path": "Hero.md",
|
|
@@ -163,8 +163,8 @@
|
|
|
163
163
|
},
|
|
164
164
|
{
|
|
165
165
|
"path": "Icon.md",
|
|
166
|
-
"size":
|
|
167
|
-
"hash": "sha256:
|
|
166
|
+
"size": 2948,
|
|
167
|
+
"hash": "sha256:c467d672c13c5d52120618d5f932454e5f3a8dbd5f8bdd2e1498b26f676d523d"
|
|
168
168
|
},
|
|
169
169
|
{
|
|
170
170
|
"path": "IconButton.md",
|
|
@@ -248,13 +248,13 @@
|
|
|
248
248
|
},
|
|
249
249
|
{
|
|
250
250
|
"path": "Navigation.md",
|
|
251
|
-
"size":
|
|
252
|
-
"hash": "sha256:
|
|
251
|
+
"size": 3749,
|
|
252
|
+
"hash": "sha256:d51bf6f799deda23afae3b13a60e38d90b8a8069be1eedd05c5c6ec5d6d806ad"
|
|
253
253
|
},
|
|
254
254
|
{
|
|
255
255
|
"path": "NavigationSide.md",
|
|
256
|
-
"size":
|
|
257
|
-
"hash": "sha256:
|
|
256
|
+
"size": 5474,
|
|
257
|
+
"hash": "sha256:ffe9e9a88ade7c6cef99c1953e4e265afce446d616af366fd4b63206517396bf"
|
|
258
258
|
},
|
|
259
259
|
{
|
|
260
260
|
"path": "NavigationSideGroup.md",
|
|
@@ -263,18 +263,18 @@
|
|
|
263
263
|
},
|
|
264
264
|
{
|
|
265
265
|
"path": "NavigationSideItem.md",
|
|
266
|
-
"size":
|
|
267
|
-
"hash": "sha256:
|
|
266
|
+
"size": 6595,
|
|
267
|
+
"hash": "sha256:3e7f51a9eabb5bf144022064b14416cebbc4d7d9eb87ee9c82299c5ecbb50e34"
|
|
268
268
|
},
|
|
269
269
|
{
|
|
270
270
|
"path": "NavigationSideSubItem.md",
|
|
271
|
-
"size":
|
|
272
|
-
"hash": "sha256:
|
|
271
|
+
"size": 2649,
|
|
272
|
+
"hash": "sha256:3edf70cb4a3cb43abd112cbae73d83385481f004d8e48513ab455596388d221e"
|
|
273
273
|
},
|
|
274
274
|
{
|
|
275
275
|
"path": "NavLink.md",
|
|
276
|
-
"size":
|
|
277
|
-
"hash": "sha256:
|
|
276
|
+
"size": 2765,
|
|
277
|
+
"hash": "sha256:6d8d696c1066b536cb3a36a145f316968bef40879b265a8d5fac06fbeaf9d69b"
|
|
278
278
|
},
|
|
279
279
|
{
|
|
280
280
|
"path": "NotificationBadge.md",
|
|
@@ -343,8 +343,8 @@
|
|
|
343
343
|
},
|
|
344
344
|
{
|
|
345
345
|
"path": "SKILL.md",
|
|
346
|
-
"size":
|
|
347
|
-
"hash": "sha256:
|
|
346
|
+
"size": 14816,
|
|
347
|
+
"hash": "sha256:a15ed6eb6c149096d9cb6376ee47e17700cbf36ed498edd176232ff87f78d94b"
|
|
348
348
|
},
|
|
349
349
|
{
|
|
350
350
|
"path": "Spinner.md",
|
|
@@ -353,8 +353,8 @@
|
|
|
353
353
|
},
|
|
354
354
|
{
|
|
355
355
|
"path": "StatTile.md",
|
|
356
|
-
"size":
|
|
357
|
-
"hash": "sha256:
|
|
356
|
+
"size": 8042,
|
|
357
|
+
"hash": "sha256:76a99c8ea47082659e625c59030d0cef527bd19d8d6cabd635e71016be13754d"
|
|
358
358
|
},
|
|
359
359
|
{
|
|
360
360
|
"path": "Stepper.md",
|
|
@@ -414,8 +414,8 @@
|
|
|
414
414
|
"files": [
|
|
415
415
|
{
|
|
416
416
|
"path": "a2ui.md",
|
|
417
|
-
"size":
|
|
418
|
-
"hash": "sha256:
|
|
417
|
+
"size": 5279,
|
|
418
|
+
"hash": "sha256:9ebad576e8878251c6ce2210a7cab70066b30d04f0b38e1963b5eeb9f5c820e3"
|
|
419
419
|
},
|
|
420
420
|
{
|
|
421
421
|
"path": "density.md",
|
|
@@ -424,8 +424,8 @@
|
|
|
424
424
|
},
|
|
425
425
|
{
|
|
426
426
|
"path": "how-to-accessibility.md",
|
|
427
|
-
"size":
|
|
428
|
-
"hash": "sha256:
|
|
427
|
+
"size": 3732,
|
|
428
|
+
"hash": "sha256:c66c97e67182cb444fb9ff6f1b02db8da663f928a79bf31517008b9dc3f7a82e"
|
|
429
429
|
},
|
|
430
430
|
{
|
|
431
431
|
"path": "how-to-color.md",
|
|
@@ -434,13 +434,13 @@
|
|
|
434
434
|
},
|
|
435
435
|
{
|
|
436
436
|
"path": "how-to-host.md",
|
|
437
|
-
"size":
|
|
438
|
-
"hash": "sha256:
|
|
437
|
+
"size": 2856,
|
|
438
|
+
"hash": "sha256:dab3dc61a74b069600d56940f4b2b5e9210f2899ab5688613fbbbfdc035c60ba"
|
|
439
439
|
},
|
|
440
440
|
{
|
|
441
441
|
"path": "how-to-page-layout.md",
|
|
442
|
-
"size":
|
|
443
|
-
"hash": "sha256:
|
|
442
|
+
"size": 11126,
|
|
443
|
+
"hash": "sha256:2d06c39afbe035eb13bace7c744f7d19a2130248eb574a8b11f2bf179f83fa67"
|
|
444
444
|
},
|
|
445
445
|
{
|
|
446
446
|
"path": "principles.md",
|
|
@@ -449,8 +449,8 @@
|
|
|
449
449
|
},
|
|
450
450
|
{
|
|
451
451
|
"path": "recipe-app-chrome.md",
|
|
452
|
-
"size":
|
|
453
|
-
"hash": "sha256:
|
|
452
|
+
"size": 12052,
|
|
453
|
+
"hash": "sha256:f4a1380400b4ea54a70dd8d77bb800d37fdf90240e1aaecd5aafad67730730bb"
|
|
454
454
|
},
|
|
455
455
|
{
|
|
456
456
|
"path": "recipe-card-grid.md",
|
|
@@ -464,8 +464,8 @@
|
|
|
464
464
|
},
|
|
465
465
|
{
|
|
466
466
|
"path": "recipe-dashboard-overview.md",
|
|
467
|
-
"size":
|
|
468
|
-
"hash": "sha256:
|
|
467
|
+
"size": 4857,
|
|
468
|
+
"hash": "sha256:4fe4573d6eb09730c1737875c835ca9b939cd3d8e8587ecae09ba7331b2ff8d7"
|
|
469
469
|
},
|
|
470
470
|
{
|
|
471
471
|
"path": "recipe-data-table-page.md",
|
|
@@ -507,6 +507,11 @@
|
|
|
507
507
|
"size": 3876,
|
|
508
508
|
"hash": "sha256:351069ddf1e5d085d9f1a89caa47c368874b5d15d4cb9a53e9e1691c3df44a14"
|
|
509
509
|
},
|
|
510
|
+
{
|
|
511
|
+
"path": "recipe-navigation.md",
|
|
512
|
+
"size": 17612,
|
|
513
|
+
"hash": "sha256:37dde1f17bb34f12b9e53a930f336a7beafbb4ae9fc237bcff02a2b37018f922"
|
|
514
|
+
},
|
|
510
515
|
{
|
|
511
516
|
"path": "recipe-page-header.md",
|
|
512
517
|
"size": 4161,
|
|
@@ -539,8 +544,8 @@
|
|
|
539
544
|
},
|
|
540
545
|
{
|
|
541
546
|
"path": "recipe-stat-callouts.md",
|
|
542
|
-
"size":
|
|
543
|
-
"hash": "sha256:
|
|
547
|
+
"size": 4207,
|
|
548
|
+
"hash": "sha256:ef84f56f302f623b990dff4e5051256642a41cf2dabab0e102ddf030bff4f61c"
|
|
544
549
|
},
|
|
545
550
|
{
|
|
546
551
|
"path": "recipe-states.md",
|
|
@@ -564,8 +569,8 @@
|
|
|
564
569
|
},
|
|
565
570
|
{
|
|
566
571
|
"path": "SKILL.md",
|
|
567
|
-
"size":
|
|
568
|
-
"hash": "sha256:
|
|
572
|
+
"size": 11032,
|
|
573
|
+
"hash": "sha256:75b96a393abccffd6c6292a22bbaf88f402fc68edbcd9326f7d099ea0d575d48"
|
|
569
574
|
},
|
|
570
575
|
{
|
|
571
576
|
"path": "spacing-steps.md",
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Import: `import { Icon } from "@uxelle/components";`
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Inline Material Symbols Sharp pictogram.
|
|
6
6
|
|
|
7
7
|
## Props
|
|
8
8
|
|
|
@@ -10,13 +10,13 @@ Renders Material Symbols icons.
|
|
|
10
10
|
|
|
11
11
|
| Prop | Type | Default | Description |
|
|
12
12
|
|------|------|---------|-------------|
|
|
13
|
-
| iconName | `string` | `"add"` | Material Symbols
|
|
13
|
+
| iconName | `string` | `"add"` | Material Symbols Sharp name to render, e.g. `home`, `close`, or `settings`. GPF chrome names always resolve. Any other name needs `import "@uxelle/icons/register"` (or `registerIcons`) before render. Unknown names render no glyph (an empty span — a visual-only miss that a11y tests will not catch). Type names with `UxelleIconName` from `@uxelle/icons` to catch typos at compile time. |
|
|
14
14
|
| size | `number` | `24` | Glyph size in pixels, applied as an inline `font-size`. Valid range is 8–128 and out-of-range values warn in development; leaving it at the default emits no inline size, so CSS or a parent token can drive it. |
|
|
15
15
|
| style | `CSSProperties` | `—` | Inline styles merged onto the icon `span`, applied after the `size`-derived `font-size` — a `fontSize` here therefore overrides `size`. |
|
|
16
16
|
| "aria-label" | `string` | `""` | Accessible name for an icon that carries meaning. Setting it also suppresses the automatic `aria-hidden`, so the icon becomes visible to assistive technology. |
|
|
17
17
|
| "aria-hidden" | `"auto" \| "true" \| "false"` | `undefined` | Explicitly includes or excludes the icon from the accessibility tree. Leave it unset for the default: hidden when there is no `aria-label`, exposed once there is one. |
|
|
18
18
|
| role | `string` | `""` | Role placed on the icon `span`. Pair `img` with `aria-label` when the glyph is meaningful content; leave it unset for decorative icons. |
|
|
19
|
-
| variant | `"sharpUnfilled" \| "sharpFilled"` | `"sharpUnfilled"` | Glyph weight: `sharpFilled` renders the solid
|
|
19
|
+
| variant | `"sharpUnfilled" \| "sharpFilled"` | `"sharpUnfilled"` | Glyph weight: `sharpFilled` renders the solid SVG, `sharpUnfilled` the outlined form. |
|
|
20
20
|
|
|
21
21
|
<!-- prettier-ignore-end -->
|
|
22
22
|
|
|
@@ -40,4 +40,4 @@ Renders Material Symbols icons.
|
|
|
40
40
|
|
|
41
41
|
## Notes
|
|
42
42
|
|
|
43
|
-
-
|
|
43
|
+
- Looks up a Sharp SVG from `iconName` and `variant`. `@uxelle/components` ships the GPF chrome set; register the full catalog with `import "@uxelle/icons/register"` or **registerIcons** before the first render. Unknown names render no glyph and warn in development — treat that as an authoring error, not UI copy. Production is silent: an icon-only control with `aria-label` still has an accessible name, so this is a visual-only failure that a11y tests will not catch. Import `@uxelle/icons/register` in the host, or type names with `UxelleIconName` from `@uxelle/icons`. By default, icons are hidden from screen readers (`aria-hidden="true"`) as they are typically decorative. Provide an `aria-label` when the icon conveys meaningful information.
|
|
@@ -17,7 +17,7 @@ Primary or secondary navigation item with Navigation Link typography.
|
|
|
17
17
|
| trailingIconName | `string` | `"keyboard_arrow_down"` | Material Symbol name for the trailing icon. Ignored when `trailingIcon` is false, and overridden by the menu chevron when `withMenu` is true. |
|
|
18
18
|
| iconVariant | `"sharpUnfilled" \| "sharpFilled"` | `"sharpUnfilled"` | Fill style shared by both icons: `sharpUnfilled` for the outline glyph, `sharpFilled` for the solid one. |
|
|
19
19
|
| navigationLevel | `"Primary" \| "Secondary"` | `"Primary"` | Which `Navigation` band the link sits in, so its colors match that surface: `Primary` for the main bar, `Secondary` for the sub-navigation bar. |
|
|
20
|
-
| withMenu | `boolean` | `false` | Wraps the link in a `Menu`
|
|
20
|
+
| withMenu | `boolean` | `false` | Wraps the link in a `Menu` (`pattern="menu"`, Tab dismisses) for overflow labeled More — not destination panels (`Menu` `pattern="disclosure"` with a `NavLink` trigger instead). The trigger stays a button (so `href` is ignored) and always shows a trailing `keyboard_arrow_down` that rotates 180° when open. |
|
|
21
21
|
| href | `string` | `undefined` | Destination URL, which renders the link as an anchor instead of a button. Ignored when `withMenu` is true. |
|
|
22
22
|
| children | `ReactNode` | `undefined` | Dropdown panel content — typically a `List` of `ListItem`s — shown when `withMenu` is true. Ignored otherwise; the visible text comes from `label`. |
|
|
23
23
|
| className | `string` | `—` | |
|
|
@@ -40,5 +40,5 @@ Primary or secondary navigation item with Navigation Link typography.
|
|
|
40
40
|
## Notes
|
|
41
41
|
|
|
42
42
|
- Renders as an anchor when `href` is set; otherwise a button.
|
|
43
|
-
- Set `withMenu`
|
|
43
|
+
- Set `withMenu` for overflow items labeled More. Destination panels use `Menu` `pattern="disclosure"` with a `NavLink` trigger (no `href`) so Tab walks links. `href` is ignored while `withMenu` is true so the trigger stays a button. A trailing `keyboard_arrow_down` icon is shown and rotates 180° when open.
|
|
44
44
|
- Use `navigationLevel="Secondary"` in the secondary nav band so colors follow that surface.
|
|
@@ -10,10 +10,10 @@ Two-tier navigation bar for enterprise applications.
|
|
|
10
10
|
|
|
11
11
|
| Prop | Type | Default | Description |
|
|
12
12
|
|------|------|---------|-------------|
|
|
13
|
-
| leadingSlot | `ReactNode \| null` | `undefined` | Start of the primary bar
|
|
14
|
-
| centerSlot | `ReactNode \| null` | `undefined` | Middle of the primary bar
|
|
15
|
-
| trailingSlot | `ReactNode \| null` | `undefined` | End of the primary bar
|
|
16
|
-
| bottomSlot | `ReactNode \| null` | `undefined` | Contents of the secondary bar
|
|
13
|
+
| leadingSlot | `ReactNode \| null` | `undefined` | Start of the primary bar. Slots are open — any node is valid. Generation default: a **Logo** home control plus a two-line lockup (`Text` Condensed Alt for the site name, optional Condensed for location or a short descriptor). The compact (below-desktop) menu `IconButton` does not belong here unless asked. Pass `null` to drop the region; omit to render the built-in placeholder branding. |
|
|
14
|
+
| centerSlot | `ReactNode \| null` | `undefined` | Middle of the primary bar. Slots are open. Generation default: `null` (destinations live in a trailing **Sheet**). Fill from desktop up with **Menu** `pattern="disclosure"` category triggers when the IA is two or more levels deep (`NavLink withMenu` is overflow More only). Pass `null` to leave the middle empty (blank space between leading and trailing); omit to render placeholder links. |
|
|
15
|
+
| trailingSlot | `ReactNode \| null` | `undefined` | End of the primary bar. Slots are open. Generation default: utilities (search, session) plus, below desktop, the menu `IconButton` that opens a **Sheet** from this side. Pass `null` to drop the region; omit for the built-in utility set. |
|
|
16
|
+
| bottomSlot | `ReactNode \| null` | `undefined` | Contents of the secondary bar. Generation default: `null` unless a persistent L2 module bar is needed (`NavLink`s with `navigationLevel="Secondary"`). Pass `null` to drop the secondary bar entirely; omit to render placeholder links. |
|
|
17
17
|
|
|
18
18
|
<!-- prettier-ignore-end -->
|
|
19
19
|
|
|
@@ -22,40 +22,50 @@ Extends `HTMLAttributes` — supports standard HTML attributes.
|
|
|
22
22
|
## Usage
|
|
23
23
|
|
|
24
24
|
```tsx
|
|
25
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
26
|
+
|
|
25
27
|
<Navigation
|
|
26
28
|
leadingSlot={
|
|
27
29
|
<>
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
<NavLink label="Menu Link" href="#" />
|
|
36
|
-
<NavLink label="Menu Link" href="#" />
|
|
30
|
+
<a href="/" aria-label="Home">
|
|
31
|
+
<Logo name="generic" width={48} interactive aria-hidden />
|
|
32
|
+
</a>
|
|
33
|
+
<Layout display="flex" flexDirection="column" gap={0}>
|
|
34
|
+
<Text type="Condensed Alt" truncation width={false}>Crop Science</Text>
|
|
35
|
+
<Text type="Condensed" truncation width={false}>United States</Text>
|
|
36
|
+
</Layout>
|
|
37
37
|
</>
|
|
38
38
|
}
|
|
39
|
+
centerSlot={null}
|
|
39
40
|
trailingSlot={
|
|
40
41
|
<>
|
|
41
42
|
<IconButton iconName="search" aria-label="Search" emphasis="low" size="small" />
|
|
42
43
|
<LanguageSelector value="EN" />
|
|
43
|
-
<
|
|
44
|
-
<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
<Button emphasis="low" size="small">Log In</Button>
|
|
45
|
+
<Sheet
|
|
46
|
+
open={menuOpen}
|
|
47
|
+
onOpenChange={setMenuOpen}
|
|
48
|
+
direction="Right"
|
|
49
|
+
title=""
|
|
50
|
+
aria-label="Menu"
|
|
51
|
+
trigger={
|
|
52
|
+
<IconButton emphasis="low" size="small" iconName="menu" iconVariant="sharpUnfilled" aria-label="Menu" />
|
|
53
|
+
}
|
|
54
|
+
>
|
|
55
|
+
<List>
|
|
56
|
+
<ListItem interactive href="/about" centerText="About" bottomText="" onClick={() => setMenuOpen(false)} />
|
|
57
|
+
</List>
|
|
58
|
+
</Sheet>
|
|
51
59
|
</>
|
|
52
60
|
}
|
|
61
|
+
bottomSlot={null}
|
|
53
62
|
/>
|
|
54
63
|
```
|
|
55
64
|
|
|
56
65
|
|
|
57
66
|
## Notes
|
|
58
67
|
|
|
59
|
-
- **
|
|
68
|
+
- **Slots are open**: any node may go in `leadingSlot`, `centerSlot`, `trailingSlot`, or `bottomSlot`.
|
|
69
|
+
- **Generation defaults** (overridable): lockup in leading (Logo as home, Condensed Alt name, optional Condensed location or descriptor), `centerSlot` `null` unless the IA is two or more levels deep, compact menu `IconButton` in `trailingSlot` below desktop opening a **Sheet** from that same side (`open` / `onOpenChange` to close after a leaf). Omit a slot for the built-in placeholder. Pass `null` to drop leading, trailing, or the secondary bar; `centerSlot={null}` leaves blank space between leading and trailing.
|
|
70
|
+
- **Primary nav**: Leading, center, and trailing regions.
|
|
60
71
|
- **Secondary nav**: Optional bottom bar for sub-navigation.
|
|
61
|
-
- **Slots**: Pass `leadingSlot`, `centerSlot`, `trailingSlot`, and `bottomSlot` to customize each region. Omit a slot for the built-in placeholder; pass `null` to drop that region.
|
|
@@ -10,9 +10,9 @@ App chrome for a vertical side rail, or a compact top bar on small layouts.
|
|
|
10
10
|
|
|
11
11
|
| Prop | Type | Default | Description |
|
|
12
12
|
|------|------|---------|-------------|
|
|
13
|
-
| expanded | `boolean` | `—` | Controlled rail width: wide labeled rail when true, icon-only rail when false. Pass with `onExpandedChange`; omit to let `defaultExpanded` and the built-in toggle own the width. Ignored when the mobile layout is shown. |
|
|
13
|
+
| expanded | `boolean` | `—` | Controlled rail width: wide labeled rail when true, icon-only rail when false. Pass with `onExpandedChange`; omit to let `defaultExpanded` and the built-in toggle own the width. Ignored when the mobile layout is shown. Collapsing hides open nested destination lists; accordion parents of the current nested page show the selected appearance. |
|
|
14
14
|
| defaultExpanded | `boolean` | `true` | Whether the rail starts wide and labeled (true) or icon-only (false) when `expanded` is omitted. The built-in toggle owns the width after mount. |
|
|
15
|
-
| onExpandedChange | `(expanded: boolean) => void` | `—` | Called with the next width state each time the expand/collapse control is activated. Required to track the width when `expanded` is set. |
|
|
15
|
+
| onExpandedChange | `(expanded: boolean) => void` | `—` | Called with the next width state each time the expand/collapse control is activated. Required to track the width when `expanded` is set. Collapsing hides open nested destination lists on accordion rows. |
|
|
16
16
|
| mobile | `boolean` | `—` | Top-bar chrome when true; side rail when false. SSR hosts must pass `true` or `false` so server and client markup match. Omit only in client-only surfaces to follow the theme mobile range (`--uxl-theme-layout-mobile-screen-width-max`). The menu opens a right sheet with the same center and bottom slots as the rail. |
|
|
17
17
|
| logoSlot | `boolean` | `true` | Renders the logo region on the expanded rail and the mobile top bar. Set `false` to leave it empty; the collapsed rail never shows the logo. |
|
|
18
18
|
| logoSlotContent | `ReactNode` | `undefined` | Content for the logo region, typically a decorative **Logo**. Rendered only when `logoSlot` is true; omit for a neutral placeholder block. |
|
|
@@ -45,7 +45,7 @@ Extends `HTMLAttributes` — supports standard HTML attributes.
|
|
|
45
45
|
## Notes
|
|
46
46
|
|
|
47
47
|
- **Rail**: Logo, expand/collapse control, `centerSlotContent` (`NavigationSideGroup` rows), and `bottomSlotContent`. Renders an `<aside>`. Groups remain named `<nav>` landmarks — do not wrap this chrome in another `nav`.
|
|
48
|
-
- **Width**: Set `expanded` for the labeled rail and `expanded={false}` for the icon-only rail. Hosts own when to pass those values (tablet-and-up). This component does not hard-code those widths.
|
|
48
|
+
- **Width**: Set `expanded` for the labeled rail and `expanded={false}` for the icon-only rail. Hosts own when to pass those values (tablet-and-up). This component does not hard-code those widths. Collapsing hides any open accordion nested lists (focus moves to the parent if a nested row had it) and shows the selected appearance on an accordion parent when a nested row is the current page. Expanding restores that open state unless the flyout was dismissed while collapsed.
|
|
49
49
|
- **Mobile**: Pass `mobile` (`true` or `false`) in SSR so the first paint matches hydration. The server snapshot for an omitted `mobile` is always the rail, so a phone viewport would swap to the top bar on the client. Omit `mobile` only in client-only surfaces (for example Storybook) to follow the theme mobile range (`--uxl-theme-layout-mobile-screen-width-max`). When the mobile layout is shown, the menu control opens a right `Sheet` (no visible title, labeled Menu for assistive tech) with the same `centerSlotContent` and `bottomSlotContent` as the rail (labeled rows, not the collapsed icon rail). The logo stays on the top bar. Use `menuOpen` / `onMenuOpenChange` to control the sheet (for example to close it after navigation). `onMenuClick` still fires on the menu control.
|
|
50
50
|
- **Slots**: Omit a slot to fill demo content. Pass `false` to leave a region empty. `logoSlot={false}` hides the logo on the expanded rail and the mobile bar.
|
|
51
51
|
- **Bottom slot**: Typical account rows use `List` + `ListItem`. List item text stays on one line during the rail width transition (same as destination labels) so it is revealed horizontally instead of wrapping.
|
|
@@ -17,10 +17,10 @@ Destination row for a vertical side navigation rail. Shows a leading icon, label
|
|
|
17
17
|
| trailingSlotContent | `ReactNode` | `undefined` | Content for the trailing region, typically a `LabelBadge`, short text, or a decorative icon. Rendered only when `trailingSlot` is true, and it must stay non-interactive because it sits inside the row's own link or button. |
|
|
18
18
|
| subNavigationItemsSlot | `ReactNode` | `undefined` | Nested `NavigationSideSubItem` rows revealed when `accordion` is true; takes precedence over `children`. On the collapsed rail they are re-rendered as a `List` of `ListItem`s inside the flyout. |
|
|
19
19
|
| children | `ReactNode` | `undefined` | Nested `NavigationSideSubItem` rows revealed when `accordion` is true, used when `subNavigationItemsSlot` is omitted. Not the row label — that is `label`. On the collapsed rail they become a `List` of `ListItem`s in the flyout. |
|
|
20
|
-
| activated | `boolean` | `false` | Marks this row as the current page: filled surface plus a leading indicator bar. Destination rows also get `aria-current="page"`; accordion parents do not, so set it on the matching child instead. |
|
|
20
|
+
| activated | `boolean` | `false` | Marks this row as the current page: filled surface plus a leading indicator bar. Destination rows also get `aria-current="page"`; accordion parents do not, so set it on the matching child instead. When the rail is collapsed, an accordion parent also shows this selected appearance if any nested `NavigationSideSubItem` is activated (pass the sub item directly, not wrapped in a custom component). |
|
|
21
21
|
| navCollapsed | `boolean` | `false` | Icon-only rail layout: hides the label, the trailing slot, and the inline accordion panel, and shows the label in a tooltip on hover and focus. Inherited from the enclosing `NavigationSideGroup` when omitted. |
|
|
22
22
|
| accordion | `boolean` | `false` | Turns the row into an expandable parent with a trailing chevron that reveals its nested rows. The control is always a button, so `href` is ignored. |
|
|
23
|
-
| open | `boolean` | `undefined` | Controlled expanded state of the accordion panel (or of the collapsed-rail flyout). Pass with `onOpenChange`; omit to use `defaultOpen` instead. |
|
|
23
|
+
| open | `boolean` | `undefined` | Controlled expanded state of the accordion panel (or of the collapsed-rail flyout). Pass with `onOpenChange`; omit to use `defaultOpen` instead. Collapsing the rail hides an open nested list even if this stays true; pass `true` again (or let the user open the flyout) to show it while collapsed. |
|
|
24
24
|
| defaultOpen | `boolean` | `false` | Whether the accordion panel starts expanded when `open` is omitted. |
|
|
25
25
|
| onOpenChange | `(open: boolean) => void` | `undefined` | Called with the next expanded state each time the accordion parent toggles. |
|
|
26
26
|
| notificationBadge | `boolean` | `false` | Overlays an unread dot on the leading icon. The dot itself is decorative; the state is folded into the control name as `"{label}, notifications"`. |
|
|
@@ -48,8 +48,8 @@ Destination row for a vertical side navigation rail. Shows a leading icon, label
|
|
|
48
48
|
- Do not use as a top or header nav link (`NavLink`). Nested accordion destinations use `NavigationSideSubItem`.
|
|
49
49
|
- Compose inside `NavigationSideGroup` (a `<nav>` list). This row is a list item; other HTML attributes (`aria-*`, `data-*`, `id`) go to the interactive control, and `className` is on the row wrapper.
|
|
50
50
|
- Renders as an anchor when `href` is set; otherwise a button. Accordion parents are **not** destinations: `href` is ignored and the control is always a button. Put a section landing page in a `NavigationSideSubItem` child instead.
|
|
51
|
-
- Set `activated` for the current page — fill and leading indicator. Destinations also set `aria-current="page"`; accordion parents do not. When a child is the current page, set `activated` on that child, not only on the parent.
|
|
52
|
-
- Set `accordion` for a parent that reveals `subNavigationItemsSlot` (or `children`): `NavigationSideSubItem` rows (`href` for destinations). Omit `open` for uncontrolled (`defaultOpen` + `onOpenChange`). The trigger is a button with `aria-expanded` / `aria-controls`; the nested list animates open and closed (inert and `aria-hidden` when collapsed). When `navCollapsed` is also true, those rows open in a disclosure flyout (`Menu` `pattern="disclosure"`, `direction="Right Top"`) as a `List` of interactive `ListItem`s. Keyboard: Enter/Space toggles; Tab moves through destinations; Tab-out and Escape close and return focus to the trigger.
|
|
51
|
+
- Set `activated` for the current page — fill and leading indicator. Destinations also set `aria-current="page"`; accordion parents do not. When a child is the current page, set `activated` on that child, not only on the parent. Collapsing the rail still shows the selected appearance on that accordion parent so the section remains visible on the icon-only rail.
|
|
52
|
+
- Set `accordion` for a parent that reveals `subNavigationItemsSlot` (or `children`): `NavigationSideSubItem` rows (`href` for destinations). Omit `open` for uncontrolled (`defaultOpen` + `onOpenChange`). The trigger is a button with `aria-expanded` / `aria-controls`; the nested list animates open and closed (inert and `aria-hidden` when collapsed). Collapsing the rail hides any open nested list (and moves keyboard focus to the parent if a nested row had it). Expanding restores that open state unless the flyout was dismissed while collapsed. Opening a disclosure flyout from the collapsed parent is still available. When `navCollapsed` is also true, those rows open in a disclosure flyout (`Menu` `pattern="disclosure"`, `direction="Right Top"`) as a `List` of interactive `ListItem`s. Keyboard: Enter/Space toggles; Tab moves through destinations; Tab-out and Escape close and return focus to the trigger.
|
|
53
53
|
- The leading icon is always shown. Group collapsed layout with `NavigationSideGroup` (`collapsed`) or set `navCollapsed`.
|
|
54
54
|
- When `navCollapsed`, the visible label is hidden; pass `label` (or `aria-label`) for the accessible name. A tooltip shows the label on hover and focus.
|
|
55
55
|
- When `notificationBadge` is true, the dot stays decorative; unread state is included in the control name (`"{label}, notifications"`). Override with `aria-label` when you need a different name.
|
|
@@ -14,7 +14,7 @@ Nested destination row under an accordion side-nav parent.
|
|
|
14
14
|
| leadingIcon | `boolean` | `true` | Renders the leading icon before the label. Set `false` for text-only nested rows, which is the usual look under an accordion parent. |
|
|
15
15
|
| leadingIconName | `string` | `"outbound"` | Material Symbol name for the leading icon. Ignored when `leadingIcon` is false. |
|
|
16
16
|
| iconVariant | `"sharpUnfilled" \| "sharpFilled"` | `"sharpUnfilled"` | Fill style for the leading icon: `sharpUnfilled` for the outline glyph, `sharpFilled` for the solid one. |
|
|
17
|
-
| activated | `boolean` | `false` | Marks this row as the current page: filled surface, leading indicator bar, and `aria-current="page"`. Set it here rather than on the accordion parent. |
|
|
17
|
+
| activated | `boolean` | `false` | Marks this row as the current page: filled surface, leading indicator bar, and `aria-current="page"`. Set it here rather than on the accordion parent. When the rail is collapsed, that parent also shows the selected appearance. |
|
|
18
18
|
| href | `string` | `undefined` | Destination URL, which renders the row as an anchor instead of a button. Omit for a button that only reports clicks through `onClick`. |
|
|
19
19
|
| className | `string` | `—` | |
|
|
20
20
|
|
|
@@ -34,6 +34,6 @@ Nested destination row under an accordion side-nav parent.
|
|
|
34
34
|
|
|
35
35
|
- Use as a child of an accordion `NavigationSideItem`, not as a top-level rail row (`NavigationSideItem`). Compose inside `NavigationSideGroup` so this row is a list item in the side `nav`.
|
|
36
36
|
- Renders as an anchor when `href` is set; otherwise a button. `className` is on the row wrapper; other HTML attributes (`aria-*`, `data-*`, `id`) go to the interactive control.
|
|
37
|
-
- Set `activated` for the current page — fill, leading indicator, and `aria-current="page"`.
|
|
37
|
+
- Set `activated` for the current page — fill, leading indicator, and `aria-current="page"`. When the rail is collapsed, the accordion parent also shows the selected appearance so the section remains visible on the icon-only rail.
|
|
38
38
|
- Set `leadingIcon={false}` to hide the icon.
|
|
39
|
-
- When the parent accordion is collapsed (`navCollapsed`), this row is presented as a `ListItem` in the disclosure flyout (a list of links, not a menu).
|
|
39
|
+
- When the parent accordion is collapsed (`navCollapsed`), this row is presented as a `ListItem` in the disclosure flyout (a list of links, not a menu). Collapsing the rail hides an open nested list; the parent can still open the flyout.
|
|
@@ -221,7 +221,12 @@ Use `List` + `ListItem` for menus and lists. Prefer `centerText` / `bottomText`
|
|
|
221
221
|
Prefer **`ListControls`** when each row has title/description plus an embedded trailing control (settings and exclusive choices). Page layout: harness [recipe-settings-page.md](../uxelle-design-harness/recipe-settings-page.md). Set **`controlType`** to **`switch`**, **`checkbox`**, or **`radio`**. Same selection roles as **`RadioGroup`** / **`CheckboxGroup`** for checkbox/radio, list layout instead of stacked form options. Use **`interactive`** **`ListItem`** rows with **`embedded`** Switch / Checkbox / Radio in **`trailing`**. Set **`dense`** on **`ListControls`** (or per **`ListItem`**) for compact row padding.
|
|
222
222
|
|
|
223
223
|
### Icon variants
|
|
224
|
-
Icons use `sharpFilled` or `sharpUnfilled`. Default is `sharpUnfilled`.
|
|
224
|
+
Icons use `sharpFilled` or `sharpUnfilled`. Default is `sharpUnfilled`. GPF chrome
|
|
225
|
+
names always resolve from `@uxelle/components`. Any other Material Symbol requires
|
|
226
|
+
`import "@uxelle/icons/register"` in the host (`@uxelle/a2ui` already does this).
|
|
227
|
+
Unknown names render no glyph (empty span, production-silent) — a visual-only miss
|
|
228
|
+
that a11y tests will not catch on icon-only buttons that already have `aria-label`.
|
|
229
|
+
Type product names with `UxelleIconName` from `@uxelle/icons`.
|
|
225
230
|
|
|
226
231
|
### Theme tokens
|
|
227
232
|
Generated app CSS uses `--uxl-color-switcher-*` and layout/page-chrome tokens. Do not use `--uxl-component-*` in app CSS (those tokens belong inside components). Focus rings on catalog controls already use `--uxl-color-switcher-interactive-icon`.
|