@nexub/react 3.7.0 → 3.8.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.
Files changed (2) hide show
  1. package/accessibility.json +1181 -0
  2. package/package.json +9 -7
@@ -0,0 +1,1181 @@
1
+ {
2
+ "version": "3.8.0",
3
+ "standard": "WCAG 2.2 Level AA",
4
+ "method": {
5
+ "automated": "axe-core rules tagged wcag2a, wcag2aa, wcag21a, wcag21aa and wcag22aa, run on every Storybook story in light and dark on every pull request; a new violation fails the build.",
6
+ "contrast": "Every colour role pair is tested for 4.5:1 (text) and 3:1 (non-text) at standard, medium and high contrast in light and dark.",
7
+ "manual": "Keyboard behaviour and screen-reader output are documented per component; recorded VoiceOver, NVDA and TalkBack sessions are not published yet."
8
+ },
9
+ "exceptions": [
10
+ {
11
+ "component": "appshell",
12
+ "rules": [
13
+ "label-content-name-mismatch"
14
+ ]
15
+ },
16
+ {
17
+ "component": "topnav",
18
+ "rules": [
19
+ "label-content-name-mismatch"
20
+ ]
21
+ },
22
+ {
23
+ "component": "appheader",
24
+ "rules": [
25
+ "label-content-name-mismatch"
26
+ ]
27
+ },
28
+ {
29
+ "component": "settingslayout",
30
+ "rules": [
31
+ "label-content-name-mismatch"
32
+ ]
33
+ }
34
+ ],
35
+ "components": [
36
+ {
37
+ "slug": "accordion",
38
+ "name": "Accordion",
39
+ "package": "@nexub/react",
40
+ "automated": "pass",
41
+ "exceptions": [],
42
+ "keyboard": [],
43
+ "screenReader": []
44
+ },
45
+ {
46
+ "slug": "alert-dialog",
47
+ "name": "Alert Dialog",
48
+ "package": "@nexub/react",
49
+ "automated": "pass",
50
+ "exceptions": [],
51
+ "keyboard": [],
52
+ "screenReader": []
53
+ },
54
+ {
55
+ "slug": "alert",
56
+ "name": "Alert",
57
+ "package": "@nexub/react",
58
+ "automated": "pass",
59
+ "exceptions": [],
60
+ "keyboard": [],
61
+ "screenReader": []
62
+ },
63
+ {
64
+ "slug": "amount",
65
+ "name": "Amount",
66
+ "package": "@nexub/react",
67
+ "automated": "pass",
68
+ "exceptions": [],
69
+ "keyboard": [],
70
+ "screenReader": []
71
+ },
72
+ {
73
+ "slug": "autocomplete",
74
+ "name": "Autocomplete",
75
+ "package": "@nexub/react",
76
+ "automated": "pass",
77
+ "exceptions": [],
78
+ "keyboard": [],
79
+ "screenReader": []
80
+ },
81
+ {
82
+ "slug": "avatar-group",
83
+ "name": "Avatar Group",
84
+ "package": "@nexub/react",
85
+ "automated": "pass",
86
+ "exceptions": [],
87
+ "keyboard": [],
88
+ "screenReader": []
89
+ },
90
+ {
91
+ "slug": "avatar",
92
+ "name": "Avatar",
93
+ "package": "@nexub/react",
94
+ "automated": "pass",
95
+ "exceptions": [],
96
+ "keyboard": [],
97
+ "screenReader": []
98
+ },
99
+ {
100
+ "slug": "badge",
101
+ "name": "Badge",
102
+ "package": "@nexub/react",
103
+ "automated": "pass",
104
+ "exceptions": [],
105
+ "keyboard": [
106
+ "—: Badges are non-interactive and have no keyboard handlers."
107
+ ],
108
+ "screenReader": [
109
+ "Reads as inline text. For live status changes, wrap in an element with `role=\"status\"` and `aria-live=\"polite\"`.",
110
+ "Skipped in tab order. Decorative — never trap focus on a Badge."
111
+ ]
112
+ },
113
+ {
114
+ "slug": "bar-chart",
115
+ "name": "Bar Chart",
116
+ "package": "@nexub/react",
117
+ "automated": "not covered",
118
+ "exceptions": [],
119
+ "keyboard": [],
120
+ "screenReader": [
121
+ "The chart is a `figure` named by `title`. The drawing is hidden from assistive tech; a visually hidden table carries every value.",
122
+ "Colour is never the only cue: the legend and table name each series. Past six series, label directly or group the rest as \"Other\"."
123
+ ]
124
+ },
125
+ {
126
+ "slug": "box",
127
+ "name": "Box",
128
+ "package": "@nexub/react",
129
+ "automated": "pass",
130
+ "exceptions": [],
131
+ "keyboard": [],
132
+ "screenReader": []
133
+ },
134
+ {
135
+ "slug": "breadcrumb",
136
+ "name": "Breadcrumb",
137
+ "package": "@nexub/react",
138
+ "automated": "pass",
139
+ "exceptions": [],
140
+ "keyboard": [],
141
+ "screenReader": []
142
+ },
143
+ {
144
+ "slug": "button-group",
145
+ "name": "Button Group",
146
+ "package": "@nexub/react",
147
+ "automated": "pass",
148
+ "exceptions": [],
149
+ "keyboard": [],
150
+ "screenReader": []
151
+ },
152
+ {
153
+ "slug": "button",
154
+ "name": "Button",
155
+ "package": "@nexub/react",
156
+ "automated": "pass",
157
+ "exceptions": [],
158
+ "keyboard": [
159
+ "Space: Activates the focused button.",
160
+ "Enter: Activates the focused button.",
161
+ "Tab: Moves focus to the button in document order."
162
+ ],
163
+ "screenReader": [
164
+ "Announces the visible label plus the implicit \"button\" role.",
165
+ "While loading the button sets `aria-busy` and `aria-disabled` (not `disabled`), so focus stays on it and clicks are ignored.",
166
+ "A button with `status` or `loading` renders a polite `role=\"status\"` region next to it that announces `loadingLabel`, `successLabel` or `errorLabel` as the status changes.",
167
+ "Receives focus in document order; `disabled` removes it from the tab sequence.",
168
+ "Visible focus ring uses `--color-border-focus` and meets WCAG 2.4.7 contrast."
169
+ ]
170
+ },
171
+ {
172
+ "slug": "card",
173
+ "name": "Card",
174
+ "package": "@nexub/react",
175
+ "automated": "pass",
176
+ "exceptions": [],
177
+ "keyboard": [
178
+ "Tab: Focuses interactive children. The card itself is never focusable; with a CardLink, the link is."
179
+ ],
180
+ "screenReader": [
181
+ "Group related content with a heading inside the Card so AT users can navigate by heading level.",
182
+ "With a CardLink inside, the focus ring is drawn on the card, not around the title.",
183
+ "Prefer CardLink over wrapping the whole card in `<a>`: the link’s accessible name stays the title instead of every word on the card."
184
+ ]
185
+ },
186
+ {
187
+ "slug": "checkbox-card",
188
+ "name": "Checkbox Card",
189
+ "package": "@nexub/react",
190
+ "automated": "pass",
191
+ "exceptions": [],
192
+ "keyboard": [
193
+ "Tab: Moves focus to the card.",
194
+ "Space: Toggles the card."
195
+ ],
196
+ "screenReader": [
197
+ "The title is the accessible name and the description is the accessible description.",
198
+ "Wrap related cards in a `fieldset` with a `legend` so the set has a name."
199
+ ]
200
+ },
201
+ {
202
+ "slug": "checkbox",
203
+ "name": "Checkbox",
204
+ "package": "@nexub/react",
205
+ "automated": "pass",
206
+ "exceptions": [],
207
+ "keyboard": [],
208
+ "screenReader": []
209
+ },
210
+ {
211
+ "slug": "chip",
212
+ "name": "Chip",
213
+ "package": "@nexub/react",
214
+ "automated": "pass",
215
+ "exceptions": [],
216
+ "keyboard": [],
217
+ "screenReader": []
218
+ },
219
+ {
220
+ "slug": "citation",
221
+ "name": "Citation",
222
+ "package": "@nexub/react",
223
+ "automated": "pass",
224
+ "exceptions": [],
225
+ "keyboard": [
226
+ "Tab: Focuses a marker and opens its preview.",
227
+ "Enter: Opens the source in a new tab."
228
+ ],
229
+ "screenReader": [
230
+ "Markers are named \"Source 1: <title>\", not just the number.",
231
+ "The hover preview repeats the marker’s information; nothing in it is only available on hover."
232
+ ]
233
+ },
234
+ {
235
+ "slug": "code-inline",
236
+ "name": "Code",
237
+ "package": "@nexub/react",
238
+ "automated": "pass",
239
+ "exceptions": [],
240
+ "keyboard": [],
241
+ "screenReader": []
242
+ },
243
+ {
244
+ "slug": "collapsible",
245
+ "name": "Collapsible",
246
+ "package": "@nexub/react",
247
+ "automated": "pass",
248
+ "exceptions": [],
249
+ "keyboard": [],
250
+ "screenReader": []
251
+ },
252
+ {
253
+ "slug": "combobox",
254
+ "name": "Combobox",
255
+ "package": "@nexub/react",
256
+ "automated": "pass",
257
+ "exceptions": [],
258
+ "keyboard": [],
259
+ "screenReader": []
260
+ },
261
+ {
262
+ "slug": "data-table",
263
+ "name": "Data Table",
264
+ "package": "@nexub/react",
265
+ "automated": "pass",
266
+ "exceptions": [],
267
+ "keyboard": [],
268
+ "screenReader": []
269
+ },
270
+ {
271
+ "slug": "date-picker",
272
+ "name": "Date Picker",
273
+ "package": "@nexub/react",
274
+ "automated": "pass",
275
+ "exceptions": [],
276
+ "keyboard": [],
277
+ "screenReader": []
278
+ },
279
+ {
280
+ "slug": "date-range-picker",
281
+ "name": "Date Range Picker",
282
+ "package": "@nexub/react",
283
+ "automated": "pass",
284
+ "exceptions": [],
285
+ "keyboard": [],
286
+ "screenReader": []
287
+ },
288
+ {
289
+ "slug": "dialog",
290
+ "name": "Dialog",
291
+ "package": "@nexub/react",
292
+ "automated": "pass",
293
+ "exceptions": [],
294
+ "keyboard": [],
295
+ "screenReader": []
296
+ },
297
+ {
298
+ "slug": "donut-chart",
299
+ "name": "Donut Chart",
300
+ "package": "@nexub/react",
301
+ "automated": "not covered",
302
+ "exceptions": [],
303
+ "keyboard": [],
304
+ "screenReader": [
305
+ "The chart is a `figure` named by `title`. The drawing is hidden from assistive tech; a visually hidden table carries every value.",
306
+ "Colour is never the only cue: the legend and table name each series. Past six series, label directly or group the rest as \"Other\"."
307
+ ]
308
+ },
309
+ {
310
+ "slug": "drawer",
311
+ "name": "Drawer",
312
+ "package": "@nexub/react",
313
+ "automated": "pass",
314
+ "exceptions": [],
315
+ "keyboard": [],
316
+ "screenReader": []
317
+ },
318
+ {
319
+ "slug": "empty-state",
320
+ "name": "Empty State",
321
+ "package": "@nexub/react",
322
+ "automated": "pass",
323
+ "exceptions": [],
324
+ "keyboard": [],
325
+ "screenReader": []
326
+ },
327
+ {
328
+ "slug": "error-state",
329
+ "name": "Error State",
330
+ "package": "@nexub/react",
331
+ "automated": "pass",
332
+ "exceptions": [],
333
+ "keyboard": [],
334
+ "screenReader": []
335
+ },
336
+ {
337
+ "slug": "eyebrow-chip",
338
+ "name": "Eyebrow Chip",
339
+ "package": "@nexub/react",
340
+ "automated": "pass",
341
+ "exceptions": [],
342
+ "keyboard": [],
343
+ "screenReader": []
344
+ },
345
+ {
346
+ "slug": "filter-chip",
347
+ "name": "Filter Chip",
348
+ "package": "@nexub/react",
349
+ "automated": "pass",
350
+ "exceptions": [],
351
+ "keyboard": [],
352
+ "screenReader": []
353
+ },
354
+ {
355
+ "slug": "flex",
356
+ "name": "Flex",
357
+ "package": "@nexub/react",
358
+ "automated": "pass",
359
+ "exceptions": [],
360
+ "keyboard": [],
361
+ "screenReader": []
362
+ },
363
+ {
364
+ "slug": "form-field",
365
+ "name": "Form Field",
366
+ "package": "@nexub/react",
367
+ "automated": "pass",
368
+ "exceptions": [],
369
+ "keyboard": [],
370
+ "screenReader": []
371
+ },
372
+ {
373
+ "slug": "gradient-divider",
374
+ "name": "Gradient Divider",
375
+ "package": "@nexub/react",
376
+ "automated": "pass",
377
+ "exceptions": [],
378
+ "keyboard": [],
379
+ "screenReader": []
380
+ },
381
+ {
382
+ "slug": "grid",
383
+ "name": "Grid",
384
+ "package": "@nexub/react",
385
+ "automated": "pass",
386
+ "exceptions": [],
387
+ "keyboard": [],
388
+ "screenReader": []
389
+ },
390
+ {
391
+ "slug": "heading",
392
+ "name": "Heading",
393
+ "package": "@nexub/react",
394
+ "automated": "pass",
395
+ "exceptions": [],
396
+ "keyboard": [],
397
+ "screenReader": []
398
+ },
399
+ {
400
+ "slug": "helper-text",
401
+ "name": "Helper Text",
402
+ "package": "@nexub/react",
403
+ "automated": "pass",
404
+ "exceptions": [],
405
+ "keyboard": [],
406
+ "screenReader": []
407
+ },
408
+ {
409
+ "slug": "hover-card",
410
+ "name": "Hover Card",
411
+ "package": "@nexub/react",
412
+ "automated": "pass",
413
+ "exceptions": [],
414
+ "keyboard": [],
415
+ "screenReader": []
416
+ },
417
+ {
418
+ "slug": "icon-button",
419
+ "name": "Icon Button",
420
+ "package": "@nexub/react",
421
+ "automated": "pass",
422
+ "exceptions": [],
423
+ "keyboard": [],
424
+ "screenReader": []
425
+ },
426
+ {
427
+ "slug": "input",
428
+ "name": "Input",
429
+ "package": "@nexub/react",
430
+ "automated": "pass",
431
+ "exceptions": [],
432
+ "keyboard": [
433
+ "Tab: Moves focus to the input.",
434
+ "Esc: Browsers may revert recent changes (autofill suggestions)."
435
+ ],
436
+ "screenReader": [
437
+ "`invalid` toggles `aria-invalid=\"true\"` so AT users hear the error state.",
438
+ "Use `aria-describedby` to associate `HelperText` or error messages.",
439
+ "Visible focus ring on `:focus-visible`. Pair with a `<Label htmlFor>` so clicking the label moves focus into the field."
440
+ ]
441
+ },
442
+ {
443
+ "slug": "kbd",
444
+ "name": "Kbd",
445
+ "package": "@nexub/react",
446
+ "automated": "pass",
447
+ "exceptions": [],
448
+ "keyboard": [],
449
+ "screenReader": []
450
+ },
451
+ {
452
+ "slug": "label",
453
+ "name": "Label",
454
+ "package": "@nexub/react",
455
+ "automated": "pass",
456
+ "exceptions": [],
457
+ "keyboard": [],
458
+ "screenReader": []
459
+ },
460
+ {
461
+ "slug": "line-chart",
462
+ "name": "Line Chart",
463
+ "package": "@nexub/react",
464
+ "automated": "not covered",
465
+ "exceptions": [],
466
+ "keyboard": [],
467
+ "screenReader": [
468
+ "The chart is a `figure` named by `title`. The drawing is hidden from assistive tech; a visually hidden table carries every value.",
469
+ "Colour is never the only cue: the legend and table name each series. Past six series, label directly or group the rest as \"Other\"."
470
+ ]
471
+ },
472
+ {
473
+ "slug": "link",
474
+ "name": "Link",
475
+ "package": "@nexub/react",
476
+ "automated": "pass",
477
+ "exceptions": [],
478
+ "keyboard": [],
479
+ "screenReader": []
480
+ },
481
+ {
482
+ "slug": "media-card",
483
+ "name": "Media Card",
484
+ "package": "@nexub/react",
485
+ "automated": "pass",
486
+ "exceptions": [],
487
+ "keyboard": [
488
+ "Tab: Focuses the link (the card shows the focus ring), then any actions.",
489
+ "Enter: Follows the link."
490
+ ],
491
+ "screenReader": [
492
+ "With `href`, the link’s name is the title only, not the whole caption.",
493
+ "Most card images repeat the title, so `alt=\"\"` is usually right."
494
+ ]
495
+ },
496
+ {
497
+ "slug": "message-bubble",
498
+ "name": "Message Bubble",
499
+ "package": "@nexub/react",
500
+ "automated": "pass",
501
+ "exceptions": [],
502
+ "keyboard": [
503
+ "Tab: Moves through the action buttons; focusing one reveals the row.",
504
+ "Space / Enter: Activates an action. Feedback buttons toggle."
505
+ ],
506
+ "screenReader": [
507
+ "Each message is an `article` named \"You said\" or \"Assistant said\", so users can jump between messages.",
508
+ "Feedback buttons expose `aria-pressed`. Copy announces \"Copied\" through a status region.",
509
+ "The action row is only visually hidden until hover; it stays in the tab order and accessibility tree."
510
+ ]
511
+ },
512
+ {
513
+ "slug": "money-input",
514
+ "name": "Money Input",
515
+ "package": "@nexub/react",
516
+ "automated": "not covered",
517
+ "exceptions": [],
518
+ "keyboard": [],
519
+ "screenReader": []
520
+ },
521
+ {
522
+ "slug": "motion-collapse",
523
+ "name": "Collapse",
524
+ "package": "@nexub/react",
525
+ "automated": "pass",
526
+ "exceptions": [],
527
+ "keyboard": [],
528
+ "screenReader": []
529
+ },
530
+ {
531
+ "slug": "motion-fade",
532
+ "name": "Fade",
533
+ "package": "@nexub/react",
534
+ "automated": "pass",
535
+ "exceptions": [],
536
+ "keyboard": [],
537
+ "screenReader": []
538
+ },
539
+ {
540
+ "slug": "motion-float",
541
+ "name": "Float",
542
+ "package": "@nexub/react",
543
+ "automated": "not covered",
544
+ "exceptions": [],
545
+ "keyboard": [],
546
+ "screenReader": []
547
+ },
548
+ {
549
+ "slug": "motion-marquee",
550
+ "name": "Marquee",
551
+ "package": "@nexub/react",
552
+ "automated": "not covered",
553
+ "exceptions": [],
554
+ "keyboard": [],
555
+ "screenReader": []
556
+ },
557
+ {
558
+ "slug": "motion-reveal",
559
+ "name": "Reveal",
560
+ "package": "@nexub/react",
561
+ "automated": "not covered",
562
+ "exceptions": [],
563
+ "keyboard": [],
564
+ "screenReader": []
565
+ },
566
+ {
567
+ "slug": "motion-scale",
568
+ "name": "Scale",
569
+ "package": "@nexub/react",
570
+ "automated": "pass",
571
+ "exceptions": [],
572
+ "keyboard": [],
573
+ "screenReader": []
574
+ },
575
+ {
576
+ "slug": "motion-slide",
577
+ "name": "Slide",
578
+ "package": "@nexub/react",
579
+ "automated": "pass",
580
+ "exceptions": [],
581
+ "keyboard": [],
582
+ "screenReader": []
583
+ },
584
+ {
585
+ "slug": "navigation-rail",
586
+ "name": "Navigation Rail",
587
+ "package": "@nexub/react",
588
+ "automated": "not covered",
589
+ "exceptions": [],
590
+ "keyboard": [],
591
+ "screenReader": []
592
+ },
593
+ {
594
+ "slug": "number-input",
595
+ "name": "Number Input",
596
+ "package": "@nexub/react",
597
+ "automated": "pass",
598
+ "exceptions": [],
599
+ "keyboard": [],
600
+ "screenReader": []
601
+ },
602
+ {
603
+ "slug": "number-ticker",
604
+ "name": "Number Ticker",
605
+ "package": "@nexub/react",
606
+ "automated": "pass",
607
+ "exceptions": [],
608
+ "keyboard": [],
609
+ "screenReader": [
610
+ "The full value is read as one string; the rolling digits are hidden from assistive tech.",
611
+ "Under reduced motion digits change instantly."
612
+ ]
613
+ },
614
+ {
615
+ "slug": "pagination",
616
+ "name": "Pagination",
617
+ "package": "@nexub/react",
618
+ "automated": "pass",
619
+ "exceptions": [],
620
+ "keyboard": [],
621
+ "screenReader": []
622
+ },
623
+ {
624
+ "slug": "password-input",
625
+ "name": "Password Input",
626
+ "package": "@nexub/react",
627
+ "automated": "pass",
628
+ "exceptions": [],
629
+ "keyboard": [],
630
+ "screenReader": []
631
+ },
632
+ {
633
+ "slug": "popover",
634
+ "name": "Popover",
635
+ "package": "@nexub/react",
636
+ "automated": "pass",
637
+ "exceptions": [],
638
+ "keyboard": [],
639
+ "screenReader": []
640
+ },
641
+ {
642
+ "slug": "progress",
643
+ "name": "Progress",
644
+ "package": "@nexub/react",
645
+ "automated": "pass",
646
+ "exceptions": [],
647
+ "keyboard": [],
648
+ "screenReader": []
649
+ },
650
+ {
651
+ "slug": "prompt-input",
652
+ "name": "Prompt Input",
653
+ "package": "@nexub/react",
654
+ "automated": "pass",
655
+ "exceptions": [],
656
+ "keyboard": [
657
+ "Enter: Sends. Ignored while an IME composition is open.",
658
+ "Shift + Enter: New line.",
659
+ "Escape: Stops the reply while streaming."
660
+ ],
661
+ "screenReader": [
662
+ "The field is named by `label` (default \"Message\") and described by the Enter/Shift+Enter hint.",
663
+ "Send and Stop are icon buttons with their own names; the swap does not move focus.",
664
+ "Focus stays in the field after sending, so the user can type the next message straight away.",
665
+ "An empty field keeps Send focusable with `aria-disabled`, rather than removing it from the tab order."
666
+ ]
667
+ },
668
+ {
669
+ "slug": "radio-card",
670
+ "name": "Radio Card",
671
+ "package": "@nexub/react",
672
+ "automated": "pass",
673
+ "exceptions": [],
674
+ "keyboard": [
675
+ "Tab: Moves focus into the group, to the selected card.",
676
+ "Arrow keys: Move between cards and select.",
677
+ "Space: Selects the focused card."
678
+ ],
679
+ "screenReader": [
680
+ "The title is the accessible name and the description is the accessible description.",
681
+ "Give the group an `aria-label` or `aria-labelledby`."
682
+ ]
683
+ },
684
+ {
685
+ "slug": "radio-group",
686
+ "name": "Radio Group",
687
+ "package": "@nexub/react",
688
+ "automated": "pass",
689
+ "exceptions": [],
690
+ "keyboard": [],
691
+ "screenReader": []
692
+ },
693
+ {
694
+ "slug": "rating",
695
+ "name": "Rating",
696
+ "package": "@nexub/react",
697
+ "automated": "pass",
698
+ "exceptions": [],
699
+ "keyboard": [],
700
+ "screenReader": []
701
+ },
702
+ {
703
+ "slug": "scroll-area",
704
+ "name": "Scroll Area",
705
+ "package": "@nexub/react",
706
+ "automated": "pass",
707
+ "exceptions": [],
708
+ "keyboard": [],
709
+ "screenReader": []
710
+ },
711
+ {
712
+ "slug": "search-input",
713
+ "name": "Search Input",
714
+ "package": "@nexub/react",
715
+ "automated": "pass",
716
+ "exceptions": [],
717
+ "keyboard": [],
718
+ "screenReader": []
719
+ },
720
+ {
721
+ "slug": "segmented-control",
722
+ "name": "Segmented Control",
723
+ "package": "@nexub/react",
724
+ "automated": "pass",
725
+ "exceptions": [],
726
+ "keyboard": [],
727
+ "screenReader": []
728
+ },
729
+ {
730
+ "slug": "select",
731
+ "name": "Select",
732
+ "package": "@nexub/react",
733
+ "automated": "pass",
734
+ "exceptions": [],
735
+ "keyboard": [],
736
+ "screenReader": []
737
+ },
738
+ {
739
+ "slug": "separator",
740
+ "name": "Separator",
741
+ "package": "@nexub/react",
742
+ "automated": "pass",
743
+ "exceptions": [],
744
+ "keyboard": [],
745
+ "screenReader": []
746
+ },
747
+ {
748
+ "slug": "sheet",
749
+ "name": "Sheet",
750
+ "package": "@nexub/react",
751
+ "automated": "not covered",
752
+ "exceptions": [],
753
+ "keyboard": [],
754
+ "screenReader": []
755
+ },
756
+ {
757
+ "slug": "skeleton",
758
+ "name": "Skeleton",
759
+ "package": "@nexub/react",
760
+ "automated": "pass",
761
+ "exceptions": [],
762
+ "keyboard": [],
763
+ "screenReader": []
764
+ },
765
+ {
766
+ "slug": "slider",
767
+ "name": "Slider",
768
+ "package": "@nexub/react",
769
+ "automated": "pass",
770
+ "exceptions": [],
771
+ "keyboard": [],
772
+ "screenReader": []
773
+ },
774
+ {
775
+ "slug": "sparkline",
776
+ "name": "Sparkline",
777
+ "package": "@nexub/react",
778
+ "automated": "not covered",
779
+ "exceptions": [],
780
+ "keyboard": [],
781
+ "screenReader": [
782
+ "The chart is a `figure` named by `title`. The drawing is hidden from assistive tech; a visually hidden table carries every value.",
783
+ "Colour is never the only cue: the legend and table name each series. Past six series, label directly or group the rest as \"Other\"."
784
+ ]
785
+ },
786
+ {
787
+ "slug": "spinner",
788
+ "name": "Spinner",
789
+ "package": "@nexub/react",
790
+ "automated": "pass",
791
+ "exceptions": [],
792
+ "keyboard": [],
793
+ "screenReader": []
794
+ },
795
+ {
796
+ "slug": "split-button",
797
+ "name": "Split Button",
798
+ "package": "@nexub/react",
799
+ "automated": "not covered",
800
+ "exceptions": [],
801
+ "keyboard": [],
802
+ "screenReader": []
803
+ },
804
+ {
805
+ "slug": "stack",
806
+ "name": "Stack",
807
+ "package": "@nexub/react",
808
+ "automated": "pass",
809
+ "exceptions": [],
810
+ "keyboard": [],
811
+ "screenReader": []
812
+ },
813
+ {
814
+ "slug": "streaming-text",
815
+ "name": "Streaming Text",
816
+ "package": "@nexub/react",
817
+ "automated": "pass",
818
+ "exceptions": [],
819
+ "keyboard": [],
820
+ "screenReader": [
821
+ "Not a live region by default. Announce the finished message once instead, e.g. through a polite status or Conversation’s `announce` for whole messages.",
822
+ "`aria-busy` is true while streaming, so assistive tech can wait for the final text."
823
+ ]
824
+ },
825
+ {
826
+ "slug": "switch",
827
+ "name": "Switch",
828
+ "package": "@nexub/react",
829
+ "automated": "pass",
830
+ "exceptions": [],
831
+ "keyboard": [],
832
+ "screenReader": []
833
+ },
834
+ {
835
+ "slug": "table",
836
+ "name": "Table",
837
+ "package": "@nexub/react",
838
+ "automated": "pass",
839
+ "exceptions": [],
840
+ "keyboard": [],
841
+ "screenReader": []
842
+ },
843
+ {
844
+ "slug": "tabs",
845
+ "name": "Tabs",
846
+ "package": "@nexub/react",
847
+ "automated": "pass",
848
+ "exceptions": [],
849
+ "keyboard": [],
850
+ "screenReader": []
851
+ },
852
+ {
853
+ "slug": "text-gradient",
854
+ "name": "Text Gradient",
855
+ "package": "@nexub/react",
856
+ "automated": "pass",
857
+ "exceptions": [],
858
+ "keyboard": [],
859
+ "screenReader": []
860
+ },
861
+ {
862
+ "slug": "text",
863
+ "name": "Text",
864
+ "package": "@nexub/react",
865
+ "automated": "pass",
866
+ "exceptions": [],
867
+ "keyboard": [],
868
+ "screenReader": []
869
+ },
870
+ {
871
+ "slug": "textarea",
872
+ "name": "Textarea",
873
+ "package": "@nexub/react",
874
+ "automated": "pass",
875
+ "exceptions": [],
876
+ "keyboard": [],
877
+ "screenReader": []
878
+ },
879
+ {
880
+ "slug": "thinking-indicator",
881
+ "name": "Thinking Indicator",
882
+ "package": "@nexub/react",
883
+ "automated": "pass",
884
+ "exceptions": [],
885
+ "keyboard": [],
886
+ "screenReader": [
887
+ "A polite live region: the label is announced once when it mounts. Changing the label announces the new step.",
888
+ "Render it only while waiting and remove it when tokens start, so it is not announced again."
889
+ ]
890
+ },
891
+ {
892
+ "slug": "toast",
893
+ "name": "Toast",
894
+ "package": "@nexub/react",
895
+ "automated": "pass",
896
+ "exceptions": [],
897
+ "keyboard": [],
898
+ "screenReader": []
899
+ },
900
+ {
901
+ "slug": "toggle-group",
902
+ "name": "Toggle Group",
903
+ "package": "@nexub/react",
904
+ "automated": "pass",
905
+ "exceptions": [],
906
+ "keyboard": [],
907
+ "screenReader": []
908
+ },
909
+ {
910
+ "slug": "toggle",
911
+ "name": "Toggle",
912
+ "package": "@nexub/react",
913
+ "automated": "pass",
914
+ "exceptions": [],
915
+ "keyboard": [],
916
+ "screenReader": []
917
+ },
918
+ {
919
+ "slug": "tooltip",
920
+ "name": "Tooltip",
921
+ "package": "@nexub/react",
922
+ "automated": "pass",
923
+ "exceptions": [],
924
+ "keyboard": [],
925
+ "screenReader": []
926
+ },
927
+ {
928
+ "slug": "activity-feed",
929
+ "name": "ActivityFeed",
930
+ "package": "@nexub/patterns",
931
+ "automated": "pass",
932
+ "exceptions": [],
933
+ "keyboard": [],
934
+ "screenReader": []
935
+ },
936
+ {
937
+ "slug": "auth-card",
938
+ "name": "AuthCard",
939
+ "package": "@nexub/patterns",
940
+ "automated": "pass",
941
+ "exceptions": [],
942
+ "keyboard": [],
943
+ "screenReader": []
944
+ },
945
+ {
946
+ "slug": "bento-grid",
947
+ "name": "Bento Grid",
948
+ "package": "@nexub/patterns",
949
+ "automated": "pass",
950
+ "exceptions": [],
951
+ "keyboard": [],
952
+ "screenReader": []
953
+ },
954
+ {
955
+ "slug": "conversation",
956
+ "name": "Conversation",
957
+ "package": "@nexub/patterns",
958
+ "automated": "pass",
959
+ "exceptions": [],
960
+ "keyboard": [
961
+ "Tab: The message list is focusable so keyboard users can scroll it."
962
+ ],
963
+ "screenReader": [
964
+ "The list is named \"Conversation\". Leave `announce` off while streaming tokens and announce the finished reply once instead.",
965
+ "With reduced motion, \"Jump to latest\" scrolls instantly.",
966
+ "Keep focus in the composer while a reply streams; don’t move it to the new message."
967
+ ]
968
+ },
969
+ {
970
+ "slug": "cta-band",
971
+ "name": "CTABand",
972
+ "package": "@nexub/marketing",
973
+ "automated": "not covered",
974
+ "exceptions": [],
975
+ "keyboard": [],
976
+ "screenReader": []
977
+ },
978
+ {
979
+ "slug": "error-summary",
980
+ "name": "Error Summary",
981
+ "package": "@nexub/patterns",
982
+ "automated": "pass",
983
+ "exceptions": [],
984
+ "keyboard": [],
985
+ "screenReader": [
986
+ "An `alert` labelled by its heading. Fields get `aria-invalid` and `aria-describedby` pointing at their inline message.",
987
+ "Takes focus whenever it receives a new, non-empty `errors` array, so screen readers read it and keyboard users start from it.",
988
+ "Each link scrolls its field into view and focuses it."
989
+ ]
990
+ },
991
+ {
992
+ "slug": "faq",
993
+ "name": "FAQ",
994
+ "package": "@nexub/marketing",
995
+ "automated": "not covered",
996
+ "exceptions": [],
997
+ "keyboard": [],
998
+ "screenReader": []
999
+ },
1000
+ {
1001
+ "slug": "feature-split",
1002
+ "name": "FeatureSplit",
1003
+ "package": "@nexub/marketing",
1004
+ "automated": "not covered",
1005
+ "exceptions": [],
1006
+ "keyboard": [],
1007
+ "screenReader": []
1008
+ },
1009
+ {
1010
+ "slug": "filter-bar",
1011
+ "name": "FilterBar",
1012
+ "package": "@nexub/patterns",
1013
+ "automated": "pass",
1014
+ "exceptions": [],
1015
+ "keyboard": [],
1016
+ "screenReader": []
1017
+ },
1018
+ {
1019
+ "slug": "hero",
1020
+ "name": "Hero",
1021
+ "package": "@nexub/marketing",
1022
+ "automated": "not covered",
1023
+ "exceptions": [],
1024
+ "keyboard": [],
1025
+ "screenReader": []
1026
+ },
1027
+ {
1028
+ "slug": "how-it-works",
1029
+ "name": "HowItWorks",
1030
+ "package": "@nexub/marketing",
1031
+ "automated": "not covered",
1032
+ "exceptions": [],
1033
+ "keyboard": [],
1034
+ "screenReader": []
1035
+ },
1036
+ {
1037
+ "slug": "info-list",
1038
+ "name": "InfoList",
1039
+ "package": "@nexub/patterns",
1040
+ "automated": "pass",
1041
+ "exceptions": [],
1042
+ "keyboard": [],
1043
+ "screenReader": []
1044
+ },
1045
+ {
1046
+ "slug": "list-detail",
1047
+ "name": "List Detail",
1048
+ "package": "@nexub/patterns",
1049
+ "automated": "pass",
1050
+ "exceptions": [],
1051
+ "keyboard": [],
1052
+ "screenReader": []
1053
+ },
1054
+ {
1055
+ "slug": "logo-strip",
1056
+ "name": "LogoStrip",
1057
+ "package": "@nexub/marketing",
1058
+ "automated": "not covered",
1059
+ "exceptions": [],
1060
+ "keyboard": [],
1061
+ "screenReader": []
1062
+ },
1063
+ {
1064
+ "slug": "marketing-footer",
1065
+ "name": "MarketingFooter",
1066
+ "package": "@nexub/marketing",
1067
+ "automated": "not covered",
1068
+ "exceptions": [],
1069
+ "keyboard": [],
1070
+ "screenReader": []
1071
+ },
1072
+ {
1073
+ "slug": "marketing-nav",
1074
+ "name": "MarketingNav",
1075
+ "package": "@nexub/marketing",
1076
+ "automated": "not covered",
1077
+ "exceptions": [],
1078
+ "keyboard": [],
1079
+ "screenReader": []
1080
+ },
1081
+ {
1082
+ "slug": "notification-item",
1083
+ "name": "NotificationItem",
1084
+ "package": "@nexub/patterns",
1085
+ "automated": "pass",
1086
+ "exceptions": [],
1087
+ "keyboard": [],
1088
+ "screenReader": []
1089
+ },
1090
+ {
1091
+ "slug": "plan-card",
1092
+ "name": "PlanCard",
1093
+ "package": "@nexub/patterns",
1094
+ "automated": "pass",
1095
+ "exceptions": [],
1096
+ "keyboard": [],
1097
+ "screenReader": []
1098
+ },
1099
+ {
1100
+ "slug": "pricing-table",
1101
+ "name": "PricingTable",
1102
+ "package": "@nexub/marketing",
1103
+ "automated": "not covered",
1104
+ "exceptions": [],
1105
+ "keyboard": [],
1106
+ "screenReader": []
1107
+ },
1108
+ {
1109
+ "slug": "product-grid",
1110
+ "name": "ProductGrid",
1111
+ "package": "@nexub/marketing",
1112
+ "automated": "not covered",
1113
+ "exceptions": [],
1114
+ "keyboard": [],
1115
+ "screenReader": []
1116
+ },
1117
+ {
1118
+ "slug": "section-header",
1119
+ "name": "SectionHeader",
1120
+ "package": "@nexub/marketing",
1121
+ "automated": "not covered",
1122
+ "exceptions": [],
1123
+ "keyboard": [],
1124
+ "screenReader": []
1125
+ },
1126
+ {
1127
+ "slug": "settings-section",
1128
+ "name": "SettingsSection",
1129
+ "package": "@nexub/patterns",
1130
+ "automated": "pass",
1131
+ "exceptions": [],
1132
+ "keyboard": [],
1133
+ "screenReader": []
1134
+ },
1135
+ {
1136
+ "slug": "stat-band",
1137
+ "name": "StatBand",
1138
+ "package": "@nexub/marketing",
1139
+ "automated": "not covered",
1140
+ "exceptions": [],
1141
+ "keyboard": [],
1142
+ "screenReader": []
1143
+ },
1144
+ {
1145
+ "slug": "stat-card",
1146
+ "name": "StatCard",
1147
+ "package": "@nexub/patterns",
1148
+ "automated": "pass",
1149
+ "exceptions": [],
1150
+ "keyboard": [],
1151
+ "screenReader": []
1152
+ },
1153
+ {
1154
+ "slug": "step-indicator",
1155
+ "name": "StepIndicator",
1156
+ "package": "@nexub/patterns",
1157
+ "automated": "pass",
1158
+ "exceptions": [],
1159
+ "keyboard": [],
1160
+ "screenReader": []
1161
+ },
1162
+ {
1163
+ "slug": "testimonial-grid",
1164
+ "name": "TestimonialGrid",
1165
+ "package": "@nexub/marketing",
1166
+ "automated": "not covered",
1167
+ "exceptions": [],
1168
+ "keyboard": [],
1169
+ "screenReader": []
1170
+ },
1171
+ {
1172
+ "slug": "user-card",
1173
+ "name": "UserCard",
1174
+ "package": "@nexub/patterns",
1175
+ "automated": "pass",
1176
+ "exceptions": [],
1177
+ "keyboard": [],
1178
+ "screenReader": []
1179
+ }
1180
+ ]
1181
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexub/react",
3
- "version": "3.7.0",
3
+ "version": "3.8.0",
4
4
  "description": "React component library for Nexub Design System — 90+ accessible, themeable UI components built on Radix UI primitives.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,7 +23,8 @@
23
23
  "access": "public"
24
24
  },
25
25
  "files": [
26
- "dist"
26
+ "dist",
27
+ "accessibility.json"
27
28
  ],
28
29
  "sideEffects": [
29
30
  "*.css"
@@ -42,6 +43,7 @@
42
43
  "types": "./dist/components/*/index.d.ts",
43
44
  "default": "./dist/components/*/index.js"
44
45
  },
46
+ "./accessibility.json": "./accessibility.json",
45
47
  "./package.json": "./package.json"
46
48
  },
47
49
  "main": "./dist/index.js",
@@ -79,13 +81,13 @@
79
81
  "date-fns": "^4.4.0",
80
82
  "react-day-picker": "^10.0.2",
81
83
  "tailwind-merge": "^3.7.0",
82
- "@nexub/core": "3.7.0",
83
- "@nexub/icons": "3.7.0"
84
+ "@nexub/core": "3.8.0",
85
+ "@nexub/icons": "3.8.0"
84
86
  },
85
87
  "peerDependencies": {
86
88
  "react": ">=18 <20",
87
89
  "react-dom": ">=18 <20",
88
- "@nexub/tokens": "^3.7.0"
90
+ "@nexub/tokens": "^3.8.0"
89
91
  },
90
92
  "devDependencies": {
91
93
  "@playwright/test": "1.64.0",
@@ -111,8 +113,8 @@
111
113
  "vaul": "1.1.2",
112
114
  "vite": "^8.3.5",
113
115
  "vitest": "^5.0.5",
114
- "@nexub/themes": "3.7.0",
115
- "@nexub/tokens": "3.7.0"
116
+ "@nexub/themes": "3.8.0",
117
+ "@nexub/tokens": "3.8.0"
116
118
  },
117
119
  "scripts": {
118
120
  "build": "rm -rf dist && tsup && tsc -p tsconfig.build.json && rm -f dist/vendor/*.d.ts && node scripts/check-dts.mjs && tailwindcss -i src/styles.css -o dist/styles.css --minify && cp -R ../themes/src/fonts dist/fonts",