@tangible/ui 0.0.2 → 0.0.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.
Files changed (64) hide show
  1. package/README.md +21 -13
  2. package/components/Accordion/Accordion.d.ts +1 -1
  3. package/components/Accordion/Accordion.js +3 -3
  4. package/components/Accordion/types.d.ts +8 -1
  5. package/components/Avatar/Avatar.js +16 -7
  6. package/components/Avatar/AvatarGroup.js +7 -5
  7. package/components/Avatar/types.d.ts +11 -0
  8. package/components/Button/Button.js +10 -3
  9. package/components/Button/types.d.ts +9 -1
  10. package/components/Card/Card.js +26 -13
  11. package/components/Checkbox/Checkbox.d.ts +1 -1
  12. package/components/Chip/Chip.d.ts +37 -1
  13. package/components/Chip/Chip.js +10 -8
  14. package/components/ChipGroup/ChipGroup.js +5 -4
  15. package/components/ChipGroup/types.d.ts +3 -0
  16. package/components/Dropdown/Dropdown.d.ts +19 -1
  17. package/components/Dropdown/Dropdown.js +84 -28
  18. package/components/Dropdown/index.d.ts +2 -2
  19. package/components/Dropdown/index.js +1 -1
  20. package/components/Dropdown/types.d.ts +15 -0
  21. package/components/IconButton/IconButton.js +5 -4
  22. package/components/IconButton/index.d.ts +1 -1
  23. package/components/IconButton/types.d.ts +24 -4
  24. package/components/Modal/Modal.d.ts +16 -2
  25. package/components/Modal/Modal.js +45 -20
  26. package/components/MoveHandle/MoveHandle.d.ts +2 -0
  27. package/components/MoveHandle/MoveHandle.js +84 -0
  28. package/components/MoveHandle/index.d.ts +2 -0
  29. package/components/MoveHandle/index.js +1 -0
  30. package/components/MoveHandle/types.d.ts +53 -0
  31. package/components/MoveHandle/types.js +1 -0
  32. package/components/Notice/Notice.js +32 -19
  33. package/components/Select/Select.js +6 -2
  34. package/components/Sidebar/Sidebar.d.ts +6 -1
  35. package/components/Sidebar/Sidebar.js +65 -11
  36. package/components/Sidebar/index.d.ts +1 -1
  37. package/components/Sidebar/types.d.ts +39 -14
  38. package/components/Tabs/Tabs.d.ts +1 -1
  39. package/components/Tabs/Tabs.js +12 -3
  40. package/components/Tabs/types.d.ts +20 -5
  41. package/components/TextInput/TextInput.js +10 -2
  42. package/components/Tooltip/Tooltip.d.ts +2 -2
  43. package/components/Tooltip/Tooltip.js +61 -40
  44. package/components/Tooltip/index.d.ts +1 -1
  45. package/components/Tooltip/types.d.ts +28 -1
  46. package/components/index.d.ts +4 -2
  47. package/components/index.js +2 -1
  48. package/icons/icons.svg +1 -0
  49. package/icons/manifest.json +8 -0
  50. package/icons/registry.d.ts +2 -0
  51. package/icons/registry.js +1 -0
  52. package/icons/system/index.d.ts +2 -0
  53. package/icons/system/index.js +11 -0
  54. package/package.json +1 -1
  55. package/styles/all.css +1 -1
  56. package/styles/all.expanded.css +961 -97
  57. package/styles/all.expanded.unlayered.css +961 -97
  58. package/styles/all.unlayered.css +1 -1
  59. package/styles/components/_bundle.scss +2 -0
  60. package/styles/index.scss +5 -0
  61. package/styles/system/_control.scss +18 -3
  62. package/styles/system/_tokens.scss +119 -2
  63. package/tui-manifest.json +526 -88
  64. package/utils/focus-trap.js +8 -1
package/tui-manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.0.2",
3
- "generated": "2026-02-17T04:01:35.339Z",
2
+ "version": "0.0.4",
3
+ "generated": "2026-03-05T21:09:18.762Z",
4
4
  "components": {
5
5
  "Accordion": {
6
6
  "props": {
@@ -80,7 +80,9 @@
80
80
  ],
81
81
  "related": [
82
82
  "Tabs"
83
- ]
83
+ ],
84
+ "use": null,
85
+ "notFor": null
84
86
  },
85
87
  "Avatar": {
86
88
  "props": {
@@ -122,13 +124,32 @@
122
124
  "defaultValue": "bottom-right",
123
125
  "description": "Position of the indicator"
124
126
  },
127
+ "tooltip": {
128
+ "type": "boolean",
129
+ "required": false,
130
+ "description": "When true, wraps the avatar with a Tooltip showing the `name`.\nHelps sighted users discover the user's name on hover/focus.\nHas no effect when `name` is not provided."
131
+ },
125
132
  "className": {
126
133
  "type": "string",
127
134
  "required": false,
128
135
  "description": "Additional CSS class"
129
136
  }
130
137
  },
131
- "cssTokens": [],
138
+ "cssTokens": [
139
+ "--tui-avatar-size",
140
+ "--tui-avatar-radius",
141
+ "--tui-avatar-bg",
142
+ "--tui-avatar-fg",
143
+ "--tui-avatar-border",
144
+ "--tui-avatar-indicator-bg",
145
+ "--tui-avatar-indicator-fg",
146
+ "--tui-avatar-overflow-bg",
147
+ "--tui-avatar-overflow-fg",
148
+ "--tui-avatar-group-overlap",
149
+ "--tui-avatar-group-gap",
150
+ "--tui-avatar-group-border-width",
151
+ "--tui-avatar-group-border-color"
152
+ ],
132
153
  "story": {
133
154
  "title": "Primitives/Avatar",
134
155
  "tags": [
@@ -140,7 +161,9 @@
140
161
  "description": null,
141
162
  "gotchas": null,
142
163
  "examples": null,
143
- "related": null
164
+ "related": null,
165
+ "use": null,
166
+ "notFor": null
144
167
  },
145
168
  "Button": {
146
169
  "props": {
@@ -190,6 +213,12 @@
190
213
  "defaultValue": "false",
191
214
  "description": "Loading state. Shows spinner and prevents interaction."
192
215
  },
216
+ "loadingLabel": {
217
+ "type": "string",
218
+ "required": false,
219
+ "defaultValue": "`${label}, loading` (English)",
220
+ "description": "Accessible label override during loading state. For i18n support.\nWhen loading, this replaces the auto-composed label."
221
+ },
193
222
  "target": {
194
223
  "type": "HTMLAttributeAnchorTarget",
195
224
  "required": false,
@@ -228,7 +257,7 @@
228
257
  "iconSize": {
229
258
  "type": "\"xs\" | \"sm\" | \"md\" | \"lg\"",
230
259
  "required": false,
231
- "defaultValue": "sm",
260
+ "defaultValue": "'sm'",
232
261
  "description": "Size of icons."
233
262
  },
234
263
  "className": {
@@ -270,7 +299,11 @@
270
299
  "--tui-button-radius",
271
300
  "--tui-button-bg-interact",
272
301
  "--tui-button-fg-interact",
273
- "--tui-button-border-interact"
302
+ "--tui-button-border-interact",
303
+ "--tui-button-fg-active",
304
+ "--tui-control-height-sm",
305
+ "--tui-control-height-md",
306
+ "--tui-control-height-lg"
274
307
  ],
275
308
  "story": {
276
309
  "title": "Primitives/Button",
@@ -319,8 +352,11 @@
319
352
  }
320
353
  ],
321
354
  "related": [
322
- "IconButton"
323
- ]
355
+ "IconButton",
356
+ "Chip"
357
+ ],
358
+ "use": "for actions the user performs — save, delete, submit, navigate, open a dialog",
359
+ "notFor": "labels, tags, or filter toggles that represent a value or category — use Chip or ChipGroup instead"
324
360
  },
325
361
  "Card": {
326
362
  "props": {
@@ -433,7 +469,9 @@
433
469
  ],
434
470
  "related": [
435
471
  "Notice"
436
- ]
472
+ ],
473
+ "use": null,
474
+ "notFor": null
437
475
  },
438
476
  "Checkbox": {
439
477
  "props": {
@@ -474,7 +512,9 @@
474
512
  "required": false
475
513
  }
476
514
  },
477
- "cssTokens": [],
515
+ "cssTokens": [
516
+ "--tui-input-accent"
517
+ ],
478
518
  "story": {
479
519
  "title": "Forms/Checkbox",
480
520
  "tags": [
@@ -486,14 +526,17 @@
486
526
  "description": null,
487
527
  "gotchas": null,
488
528
  "examples": null,
489
- "related": null
529
+ "related": null,
530
+ "use": null,
531
+ "notFor": null
490
532
  },
491
533
  "Chip": {
492
534
  "props": {
493
535
  "as": {
494
536
  "type": "\"span\" | \"div\" | \"a\"",
495
537
  "required": false,
496
- "defaultValue": "span"
538
+ "defaultValue": "span",
539
+ "description": "HTML element to render.\n- `'span'` (default): Inline element. Use for chips within text flow,\n inline lists, or inside `<p>`/`<li>` elements.\n- `'div'`: Block element. Use when the chip contains block-level content\n or needs to be a flex/grid child without inline constraints.\n- `'a'`: Anchor element. Use for navigational chips with an `href`."
497
540
  },
498
541
  "href": {
499
542
  "type": "string",
@@ -576,7 +619,14 @@
576
619
  "required": false
577
620
  }
578
621
  },
579
- "cssTokens": [],
622
+ "cssTokens": [
623
+ "--tui-chip-bg",
624
+ "--tui-chip-fg",
625
+ "--tui-chip-border",
626
+ "--tui-chip-icon",
627
+ "--tui-chip-radius",
628
+ "--tui-chip-selected-ring"
629
+ ],
580
630
  "story": {
581
631
  "title": "Primitives/Chip",
582
632
  "tags": [
@@ -584,11 +634,49 @@
584
634
  "stable"
585
635
  ]
586
636
  },
587
- "subcomponents": null,
588
- "description": null,
589
- "gotchas": null,
590
- "examples": null,
591
- "related": null
637
+ "subcomponents": [],
638
+ "description": "Compact label, tag, or interactive toggle. Use standalone for badges/status indicators, or inside ChipGroup for filter token sets.",
639
+ "gotchas": [
640
+ {
641
+ "note": "Add value prop when inside ChipGroup — without it the chip won't be managed by the group"
642
+ },
643
+ {
644
+ "note": "Interactive chips (onClick or inside ChipGroup) get role=button and aria-pressed automatically"
645
+ },
646
+ {
647
+ "note": "Anchor chips (as='a') inside a ChipGroup get role=button — toggle semantics override link semantics"
648
+ },
649
+ {
650
+ "note": "Non-interactive chips are pure display — no role, no tabIndex, no keyboard handling"
651
+ },
652
+ {
653
+ "note": "Size scale is xs/sm/md (compact), not sm/md/lg — Chip does not participate in control sizing"
654
+ }
655
+ ],
656
+ "examples": [
657
+ {
658
+ "name": "Label / badge",
659
+ "code": "<Chip theme=\"success\">Published</Chip>"
660
+ },
661
+ {
662
+ "name": "Filter toggle",
663
+ "code": "<Chip interactive onClick={toggle} selected={active}>Design</Chip>"
664
+ },
665
+ {
666
+ "name": "Filter group",
667
+ "code": "<ChipGroup value={filter} onValueChange={setFilter}>\n <Chip value=\"all\">All</Chip>\n <Chip value=\"active\">Active</Chip>\n <Chip value=\"done\">Done</Chip>\n</ChipGroup>"
668
+ },
669
+ {
670
+ "name": "With icon",
671
+ "code": "<Chip leftIcon={<Icon name=\"system/check\" />} theme=\"success\">Verified</Chip>"
672
+ }
673
+ ],
674
+ "related": [
675
+ "ChipGroup",
676
+ "Button"
677
+ ],
678
+ "use": "for labels, tags, status badges, or filter toggles that represent a value or category",
679
+ "notFor": "actions like save, delete, submit, or navigation — use Button instead (action intent vs value state)"
592
680
  },
593
681
  "ChipGroup": {
594
682
  "props": {
@@ -611,6 +699,12 @@
611
699
  "required": false,
612
700
  "description": "Alignment along main axis."
613
701
  },
702
+ "multipleLabel": {
703
+ "type": "string",
704
+ "required": false,
705
+ "defaultValue": "'Multiple selections allowed'",
706
+ "description": "Visually hidden label describing multi-select behaviour. For i18n support."
707
+ },
614
708
  "className": {
615
709
  "type": "string",
616
710
  "required": false
@@ -620,7 +714,9 @@
620
714
  "required": false
621
715
  }
622
716
  },
623
- "cssTokens": [],
717
+ "cssTokens": [
718
+ "--tui-chip-group-gap"
719
+ ],
624
720
  "story": {
625
721
  "title": "Primitives/ChipGroup",
626
722
  "tags": [
@@ -632,7 +728,9 @@
632
728
  "description": null,
633
729
  "gotchas": null,
634
730
  "examples": null,
635
- "related": null
731
+ "related": null,
732
+ "use": null,
733
+ "notFor": null
636
734
  },
637
735
  "Chips": {
638
736
  "props": {
@@ -664,7 +762,9 @@
664
762
  "description": null,
665
763
  "gotchas": null,
666
764
  "examples": null,
667
- "related": null
765
+ "related": null,
766
+ "use": null,
767
+ "notFor": null
668
768
  },
669
769
  "Combobox": {
670
770
  "props": {
@@ -724,7 +824,19 @@
724
824
  "description": "Class name applied directly to the `<input>` element.\nUse for utilities like `tui-input-reset` that must target the input itself."
725
825
  }
726
826
  },
727
- "cssTokens": [],
827
+ "cssTokens": [
828
+ "--tui-combobox-input-bg",
829
+ "--tui-combobox-input-fg",
830
+ "--tui-combobox-input-border",
831
+ "--tui-combobox-input-border-focus",
832
+ "--tui-combobox-input-radius",
833
+ "--tui-combobox-content-bg",
834
+ "--tui-combobox-content-border",
835
+ "--tui-combobox-content-shadow",
836
+ "--tui-combobox-content-radius",
837
+ "--tui-combobox-option-bg-hover",
838
+ "--tui-combobox-option-bg-selected"
839
+ ],
728
840
  "story": {
729
841
  "title": "Forms/Combobox",
730
842
  "tags": [
@@ -735,7 +847,9 @@
735
847
  "description": null,
736
848
  "gotchas": null,
737
849
  "examples": null,
738
- "related": null
850
+ "related": null,
851
+ "use": null,
852
+ "notFor": null
739
853
  },
740
854
  "ContentIndicator": {
741
855
  "props": {
@@ -773,7 +887,11 @@
773
887
  "description": "Additional CSS class names."
774
888
  }
775
889
  },
776
- "cssTokens": [],
890
+ "cssTokens": [
891
+ "--tui-content-indicator-bg",
892
+ "--tui-content-indicator-border",
893
+ "--tui-content-indicator-fg"
894
+ ],
777
895
  "story": {
778
896
  "title": "Primitives/ContentIndicator",
779
897
  "tags": [
@@ -786,7 +904,9 @@
786
904
  "description": null,
787
905
  "gotchas": null,
788
906
  "examples": null,
789
- "related": null
907
+ "related": null,
908
+ "use": null,
909
+ "notFor": null
790
910
  },
791
911
  "Dropdown": {
792
912
  "props": {
@@ -802,7 +922,17 @@
802
922
  "description": "Default open state for uncontrolled usage."
803
923
  }
804
924
  },
805
- "cssTokens": [],
925
+ "cssTokens": [
926
+ "--tui-dropdown-bg",
927
+ "--tui-dropdown-fg",
928
+ "--tui-dropdown-radius",
929
+ "--tui-dropdown-shadow",
930
+ "--tui-dropdown-border",
931
+ "--tui-dropdown-z",
932
+ "--tui-dropdown-min-width",
933
+ "--tui-dropdown-item-bg-hover",
934
+ "--tui-dropdown-item-bg-active"
935
+ ],
806
936
  "story": {
807
937
  "title": "Primitives/Dropdown",
808
938
  "tags": [
@@ -814,7 +944,9 @@
814
944
  "description": null,
815
945
  "gotchas": null,
816
946
  "examples": null,
817
- "related": null
947
+ "related": null,
948
+ "use": null,
949
+ "notFor": null
818
950
  },
819
951
  "Field": {
820
952
  "props": {
@@ -861,7 +993,9 @@
861
993
  "description": null,
862
994
  "gotchas": null,
863
995
  "examples": null,
864
- "related": null
996
+ "related": null,
997
+ "use": null,
998
+ "notFor": null
865
999
  },
866
1000
  "Icon": {
867
1001
  "props": {
@@ -890,7 +1024,14 @@
890
1024
  "required": false
891
1025
  }
892
1026
  },
893
- "cssTokens": [],
1027
+ "cssTokens": [
1028
+ "--tui-icon-size-xs",
1029
+ "--tui-icon-size-sm",
1030
+ "--tui-icon-size-md",
1031
+ "--tui-icon-size-lg",
1032
+ "--tui-icon-size-xl",
1033
+ "--tui-icon-size-xxl"
1034
+ ],
894
1035
  "story": {
895
1036
  "title": "Primitives/Icon",
896
1037
  "tags": [
@@ -902,7 +1043,9 @@
902
1043
  "description": null,
903
1044
  "gotchas": null,
904
1045
  "examples": null,
905
- "related": null
1046
+ "related": null,
1047
+ "use": null,
1048
+ "notFor": null
906
1049
  },
907
1050
  "IconButton": {
908
1051
  "props": {
@@ -920,7 +1063,7 @@
920
1063
  "type": "\"xs\" | \"sm\" | \"md\" | \"lg\"",
921
1064
  "required": false,
922
1065
  "defaultValue": "'sm'",
923
- "description": "Size of the button.\n- `'xs'`: 24px\n- `'sm'`: 32px (default)\n- `'md'`: 40px\n- `'lg'`: 48px"
1066
+ "description": "Size of the button.\n- `'xs'`: 24px — below WCAG 2.5.8 minimum target size (24×24 CSS px).\n Use only in dense, mouse-first UIs (toolbars, table rows) where touch\n is not expected. Consider pairing with adequate spacing or a larger\n touch target via padding/margin.\n- `'sm'`: 32px (default)\n- `'md'`: 40px\n- `'lg'`: 48px"
924
1067
  },
925
1068
  "theme": {
926
1069
  "type": "\"primary\" | \"secondary\" | \"danger\"",
@@ -932,7 +1075,7 @@
932
1075
  "type": "\"solid\" | \"outline\" | \"ghost\"",
933
1076
  "required": false,
934
1077
  "defaultValue": "'ghost'",
935
- "description": "Visual style variant.\n- `'solid'`: Filled background\n- `'outline'`: Border only, transparent background\n- `'ghost'`: No border or background, icon only"
1078
+ "description": "Visual style variant.\n- `'solid'`: Filled background\n- `'outline'`: Border only, transparent background\n- `'ghost'`: No border or background, icon only — has no at-rest visual\n affordance. Best suited for toolbar groups, icon bars, or other contexts\n where surrounding UI makes the interactive nature obvious."
936
1079
  },
937
1080
  "disabled": {
938
1081
  "type": "boolean",
@@ -944,6 +1087,12 @@
944
1087
  "required": false,
945
1088
  "description": "Loading state — shows spinner, disables interaction."
946
1089
  },
1090
+ "loadingLabel": {
1091
+ "type": "string",
1092
+ "required": false,
1093
+ "defaultValue": "`${label}, loading` (English)",
1094
+ "description": "Accessible label override during loading state. For i18n support."
1095
+ },
947
1096
  "pressed": {
948
1097
  "type": "boolean",
949
1098
  "required": false,
@@ -953,7 +1102,7 @@
953
1102
  "type": "boolean",
954
1103
  "required": false,
955
1104
  "defaultValue": "false",
956
- "description": "Show the label as a tooltip on hover.\nSince icon-only buttons have no visible text, this helps sighted\nusers discover what the button does."
1105
+ "description": "Show the label as a tooltip on hover.\nSince icon-only buttons have no visible text, enabling this helps\nsighted users discover what the button does. Recommended for most\nstandalone icon buttons. Can be omitted in toolbars where a shared\nTooltip provider handles it, or where adjacent visible text already\ncommunicates the action."
957
1106
  },
958
1107
  "tooltipSide": {
959
1108
  "type": "\"top\" | \"right\" | \"bottom\" | \"left\"",
@@ -961,6 +1110,12 @@
961
1110
  "defaultValue": "'top'",
962
1111
  "description": "Tooltip placement side."
963
1112
  },
1113
+ "shape": {
1114
+ "type": "\"square\" | \"circle\"",
1115
+ "required": false,
1116
+ "defaultValue": "'square'",
1117
+ "description": "Button shape. Use `'circle'` for avatar-adjacent actions, FABs,\nor anywhere a round affordance is expected."
1118
+ },
964
1119
  "className": {
965
1120
  "type": "string",
966
1121
  "required": false,
@@ -1003,7 +1158,14 @@
1003
1158
  "required": false
1004
1159
  }
1005
1160
  },
1006
- "cssTokens": [],
1161
+ "cssTokens": [
1162
+ "--tui-icon-button-bg",
1163
+ "--tui-icon-button-fg",
1164
+ "--tui-icon-button-border",
1165
+ "--tui-icon-button-radius",
1166
+ "--tui-icon-button-bg-interact",
1167
+ "--tui-icon-button-fg-interact"
1168
+ ],
1007
1169
  "story": {
1008
1170
  "title": "Primitives/IconButton",
1009
1171
  "tags": [
@@ -1015,7 +1177,9 @@
1015
1177
  "description": null,
1016
1178
  "gotchas": null,
1017
1179
  "examples": null,
1018
- "related": null
1180
+ "related": null,
1181
+ "use": null,
1182
+ "notFor": null
1019
1183
  },
1020
1184
  "Modal": {
1021
1185
  "props": {
@@ -1081,7 +1245,80 @@
1081
1245
  ],
1082
1246
  "related": [
1083
1247
  "Notice"
1084
- ]
1248
+ ],
1249
+ "use": null,
1250
+ "notFor": null
1251
+ },
1252
+ "MoveHandle": {
1253
+ "props": {
1254
+ "mode": {
1255
+ "type": "\"full\" | \"handle\"",
1256
+ "required": false,
1257
+ "defaultValue": "full",
1258
+ "description": "Structural mode. 'full' (default) shows background panel with arrows/index. 'handle' shows only the bare drag icon button."
1259
+ },
1260
+ "size": {
1261
+ "type": "\"sm\" | \"md\"",
1262
+ "required": false,
1263
+ "defaultValue": "md",
1264
+ "description": "Component scale. sm = 32px, md = 40px. Ignored when mode is 'handle'."
1265
+ },
1266
+ "index": {
1267
+ "type": "number",
1268
+ "required": false,
1269
+ "description": "Position index. When provided, shows number at rest, drag handle on hover."
1270
+ },
1271
+ "locked": {
1272
+ "type": "boolean",
1273
+ "required": false,
1274
+ "defaultValue": "false",
1275
+ "description": "When true, shows lock icon and disables all interaction."
1276
+ },
1277
+ "canMoveUp": {
1278
+ "type": "boolean",
1279
+ "required": false,
1280
+ "defaultValue": "true",
1281
+ "description": "When false, disables the move-up button without hiding it. Default: true."
1282
+ },
1283
+ "canMoveDown": {
1284
+ "type": "boolean",
1285
+ "required": false,
1286
+ "defaultValue": "true",
1287
+ "description": "When false, disables the move-down button without hiding it. Default: true."
1288
+ },
1289
+ "labels": {
1290
+ "type": "MoveHandleLabels",
1291
+ "required": false,
1292
+ "description": "Override internal button labels for i18n."
1293
+ },
1294
+ "dragHandleProps": {
1295
+ "type": "HTMLAttributes<HTMLButtonElement>",
1296
+ "required": false,
1297
+ "description": "Props to spread on the drag handle button (e.g., from dnd-kit useSortable)."
1298
+ },
1299
+ "className": {
1300
+ "type": "string",
1301
+ "required": false
1302
+ }
1303
+ },
1304
+ "cssTokens": [
1305
+ "--tui-move-handle-size",
1306
+ "--tui-move-handle-icon-size"
1307
+ ],
1308
+ "story": {
1309
+ "title": "Components/MoveHandle",
1310
+ "tags": [
1311
+ "autodocs",
1312
+ "lms"
1313
+ ]
1314
+ },
1315
+ "subcomponents": null,
1316
+ "description": null,
1317
+ "gotchas": null,
1318
+ "examples": null,
1319
+ "related": null,
1320
+ "use": null,
1321
+ "notFor": null
1085
1322
  },
1086
1323
  "MultiSelect": {
1087
1324
  "props": {
@@ -1141,7 +1378,21 @@
1141
1378
  "description": "Optional trigger ID override.\nUseful for Field integration via htmlFor."
1142
1379
  }
1143
1380
  },
1144
- "cssTokens": [],
1381
+ "cssTokens": [
1382
+ "--tui-multiselect-trigger-bg",
1383
+ "--tui-multiselect-trigger-fg",
1384
+ "--tui-multiselect-trigger-border",
1385
+ "--tui-multiselect-trigger-border-focus",
1386
+ "--tui-multiselect-trigger-radius",
1387
+ "--tui-multiselect-content-bg",
1388
+ "--tui-multiselect-content-border",
1389
+ "--tui-multiselect-content-shadow",
1390
+ "--tui-multiselect-content-radius",
1391
+ "--tui-multiselect-option-bg-hover",
1392
+ "--tui-multiselect-option-bg-selected",
1393
+ "--tui-multiselect-chip-bg",
1394
+ "--tui-multiselect-chip-fg"
1395
+ ],
1145
1396
  "story": {
1146
1397
  "title": "Forms/MultiSelect",
1147
1398
  "tags": [
@@ -1153,7 +1404,9 @@
1153
1404
  "description": null,
1154
1405
  "gotchas": null,
1155
1406
  "examples": null,
1156
- "related": null
1407
+ "related": null,
1408
+ "use": null,
1409
+ "notFor": null
1157
1410
  },
1158
1411
  "Notice": {
1159
1412
  "props": {
@@ -1252,6 +1505,7 @@
1252
1505
  "--tui-notice-bg",
1253
1506
  "--tui-notice-border",
1254
1507
  "--tui-notice-stripe",
1508
+ "--tui-notice-stripe-width",
1255
1509
  "--tui-notice-fg",
1256
1510
  "--tui-notice-radius",
1257
1511
  "--tui-notice-padding",
@@ -1304,7 +1558,9 @@
1304
1558
  "related": [
1305
1559
  "Card",
1306
1560
  "Modal"
1307
- ]
1561
+ ],
1562
+ "use": null,
1563
+ "notFor": null
1308
1564
  },
1309
1565
  "OverlapStack": {
1310
1566
  "props": {
@@ -1350,7 +1606,14 @@
1350
1606
  "description": "Inline styles"
1351
1607
  }
1352
1608
  },
1353
- "cssTokens": [],
1609
+ "cssTokens": [
1610
+ "--tui-overlap-stack-overlap",
1611
+ "--tui-overlap-stack-overflow-bg",
1612
+ "--tui-overlap-stack-overflow-fg",
1613
+ "--tui-overlap-stack-item-radius",
1614
+ "--tui-overlap-stack-border-width",
1615
+ "--tui-overlap-stack-border-color"
1616
+ ],
1354
1617
  "story": {
1355
1618
  "title": "Components/OverlapStack",
1356
1619
  "tags": [
@@ -1362,7 +1625,9 @@
1362
1625
  "description": null,
1363
1626
  "gotchas": null,
1364
1627
  "examples": null,
1365
- "related": null
1628
+ "related": null,
1629
+ "use": null,
1630
+ "notFor": null
1366
1631
  },
1367
1632
  "Pager": {
1368
1633
  "props": {
@@ -1410,7 +1675,9 @@
1410
1675
  "description": "Additional class name"
1411
1676
  }
1412
1677
  },
1413
- "cssTokens": [],
1678
+ "cssTokens": [
1679
+ "--tui-pager-gap"
1680
+ ],
1414
1681
  "story": {
1415
1682
  "title": "Primitives/Pager",
1416
1683
  "tags": [
@@ -1422,7 +1689,9 @@
1422
1689
  "description": null,
1423
1690
  "gotchas": null,
1424
1691
  "examples": null,
1425
- "related": null
1692
+ "related": null,
1693
+ "use": null,
1694
+ "notFor": null
1426
1695
  },
1427
1696
  "Progress": {
1428
1697
  "props": {
@@ -1505,7 +1774,17 @@
1505
1774
  "description": "Visual variant for circle mode.\n- `'ring'`: Hollow centre (default) — shows progress as a ring/donut\n- `'solid'`: Filled centre — shows as a solid filled circle\n\nOnly applies when `mode=\"circle\"`. Ignored in line mode."
1506
1775
  }
1507
1776
  },
1508
- "cssTokens": [],
1777
+ "cssTokens": [
1778
+ "--tui-progress-track",
1779
+ "--tui-progress-fill",
1780
+ "--tui-progress-label",
1781
+ "--tui-progress-radius",
1782
+ "--tui-progress-z1-fill",
1783
+ "--tui-progress-z2-fill",
1784
+ "--tui-progress-z3-fill",
1785
+ "--tui-progress-z4-fill",
1786
+ "--tui-progress-z5-fill"
1787
+ ],
1509
1788
  "story": {
1510
1789
  "title": "Primitives/Progress",
1511
1790
  "tags": [
@@ -1517,7 +1796,9 @@
1517
1796
  "description": null,
1518
1797
  "gotchas": null,
1519
1798
  "examples": null,
1520
- "related": null
1799
+ "related": null,
1800
+ "use": null,
1801
+ "notFor": null
1521
1802
  },
1522
1803
  "Radio": {
1523
1804
  "props": {
@@ -1535,7 +1816,9 @@
1535
1816
  "required": false
1536
1817
  }
1537
1818
  },
1538
- "cssTokens": [],
1819
+ "cssTokens": [
1820
+ "--tui-radio-accent"
1821
+ ],
1539
1822
  "story": {
1540
1823
  "title": "Forms/RadioGroup",
1541
1824
  "tags": [
@@ -1547,7 +1830,9 @@
1547
1830
  "description": null,
1548
1831
  "gotchas": null,
1549
1832
  "examples": null,
1550
- "related": null
1833
+ "related": null,
1834
+ "use": null,
1835
+ "notFor": null
1551
1836
  },
1552
1837
  "Rating": {
1553
1838
  "props": {
@@ -1609,7 +1894,11 @@
1609
1894
  "description": "Gap override (e.g. '0.25rem') – otherwise uses density utilities"
1610
1895
  }
1611
1896
  },
1612
- "cssTokens": [],
1897
+ "cssTokens": [
1898
+ "--tui-rating-active",
1899
+ "--tui-rating-inactive",
1900
+ "--tui-rating-scale"
1901
+ ],
1613
1902
  "story": {
1614
1903
  "title": "Primitives/Rating",
1615
1904
  "tags": [
@@ -1621,7 +1910,9 @@
1621
1910
  "description": null,
1622
1911
  "gotchas": null,
1623
1912
  "examples": null,
1624
- "related": null
1913
+ "related": null,
1914
+ "use": null,
1915
+ "notFor": null
1625
1916
  },
1626
1917
  "SegmentedControl": {
1627
1918
  "props": {
@@ -1666,7 +1957,18 @@
1666
1957
  "description": "Additional classes"
1667
1958
  }
1668
1959
  },
1669
- "cssTokens": [],
1960
+ "cssTokens": [
1961
+ "--tui-segmented-gap",
1962
+ "--tui-segmented-padding",
1963
+ "--tui-segmented-radius",
1964
+ "--tui-segmented-bg",
1965
+ "--tui-segmented-border",
1966
+ "--tui-segmented-item-padding",
1967
+ "--tui-segmented-item-radius",
1968
+ "--tui-segmented-item-fg",
1969
+ "--tui-segmented-item-bg-active",
1970
+ "--tui-segmented-item-fg-active"
1971
+ ],
1670
1972
  "story": {
1671
1973
  "title": "Components/SegmentedControl",
1672
1974
  "tags": [
@@ -1674,11 +1976,42 @@
1674
1976
  "stable"
1675
1977
  ]
1676
1978
  },
1677
- "subcomponents": null,
1678
- "description": null,
1679
- "gotchas": null,
1680
- "examples": null,
1681
- "related": null
1979
+ "subcomponents": [
1980
+ "Item"
1981
+ ],
1982
+ "description": "Accessible radiogroup for standalone choices — filters, view modes, sort orders. No owned content panels.",
1983
+ "gotchas": [
1984
+ {
1985
+ "note": "Always provide aria-label or aria-labelledby on the root — it is a radiogroup landmark"
1986
+ },
1987
+ {
1988
+ "note": "Arrow keys move focus AND select simultaneously — there is no manual activation mode"
1989
+ },
1990
+ {
1991
+ "note": "Uses aria-disabled (not native disabled) to keep items visible and focusable"
1992
+ },
1993
+ {
1994
+ "note": "Supports controlled (value) and uncontrolled (defaultValue) modes"
1995
+ },
1996
+ {
1997
+ "note": "Keyboard: Arrow keys navigate and select, Tab moves out of the group"
1998
+ }
1999
+ ],
2000
+ "examples": [
2001
+ {
2002
+ "name": "Basic",
2003
+ "code": "<SegmentedControl defaultValue=\"week\" aria-label=\"Time period\">\n <SegmentedControl.Item value=\"day\">Day</SegmentedControl.Item>\n <SegmentedControl.Item value=\"week\">Week</SegmentedControl.Item>\n <SegmentedControl.Item value=\"month\">Month</SegmentedControl.Item>\n</SegmentedControl>"
2004
+ },
2005
+ {
2006
+ "name": "Controlled",
2007
+ "code": "<SegmentedControl value={view} onValueChange={setView} aria-label=\"View mode\">\n <SegmentedControl.Item value=\"list\">List</SegmentedControl.Item>\n <SegmentedControl.Item value=\"grid\">Grid</SegmentedControl.Item>\n</SegmentedControl>"
2008
+ }
2009
+ ],
2010
+ "related": [
2011
+ "Tabs"
2012
+ ],
2013
+ "use": "when selection is a standalone choice that drives external state (filter, view mode, sort order, time period)",
2014
+ "notFor": "switching between content sections on the same page — use Tabs instead (owns the content panels)"
1682
2015
  },
1683
2016
  "Select": {
1684
2017
  "props": {
@@ -1745,7 +2078,19 @@
1745
2078
  "description": "Optional trigger ID override.\nUseful for Field integration via htmlFor."
1746
2079
  }
1747
2080
  },
1748
- "cssTokens": [],
2081
+ "cssTokens": [
2082
+ "--tui-select-trigger-bg",
2083
+ "--tui-select-trigger-fg",
2084
+ "--tui-select-trigger-border",
2085
+ "--tui-select-trigger-border-focus",
2086
+ "--tui-select-trigger-radius",
2087
+ "--tui-select-content-bg",
2088
+ "--tui-select-content-border",
2089
+ "--tui-select-content-shadow",
2090
+ "--tui-select-content-radius",
2091
+ "--tui-select-option-bg-hover",
2092
+ "--tui-select-option-bg-selected"
2093
+ ],
1749
2094
  "story": {
1750
2095
  "title": "Forms/Select",
1751
2096
  "tags": [
@@ -1757,7 +2102,9 @@
1757
2102
  "description": null,
1758
2103
  "gotchas": null,
1759
2104
  "examples": null,
1760
- "related": null
2105
+ "related": null,
2106
+ "use": null,
2107
+ "notFor": null
1761
2108
  },
1762
2109
  "Sidebar": {
1763
2110
  "props": {
@@ -1767,34 +2114,40 @@
1767
2114
  "defaultValue": "'left'",
1768
2115
  "description": "Sidebar position. Affects border placement and drawer slide direction."
1769
2116
  },
2117
+ "children": {
2118
+ "type": "ReactNode",
2119
+ "required": true,
2120
+ "description": "Sidebar content (Header, Nav, etc.)."
2121
+ },
2122
+ "className": {
2123
+ "type": "string",
2124
+ "required": false,
2125
+ "description": "Additional CSS class names."
2126
+ },
1770
2127
  "drawer": {
1771
2128
  "type": "boolean",
1772
2129
  "required": false,
1773
2130
  "defaultValue": "false",
1774
- "description": "Enable drawer mode (mobile overlay).\nWhen true, sidebar renders via portal with backdrop and focus trap."
2131
+ "description": "Enable drawer mode (mobile overlay).\nEnable drawer mode (mobile overlay).\nWhen true, sidebar renders with backdrop, focus trap, and dialog semantics."
1775
2132
  },
1776
2133
  "open": {
1777
2134
  "type": "boolean",
1778
2135
  "required": false,
1779
- "description": "Drawer open state. Required when `drawer={true}`."
2136
+ "description": "Drawer open state."
1780
2137
  },
1781
2138
  "onClose": {
1782
2139
  "type": "() => void",
1783
- "required": false,
1784
- "description": "Callback to close the drawer.\nCalled when ESC is pressed or backdrop is clicked."
1785
- },
1786
- "children": {
1787
- "type": "ReactNode",
1788
2140
  "required": true,
1789
- "description": "Sidebar content (Header, Nav, etc.)."
1790
- },
1791
- "className": {
1792
- "type": "string",
1793
- "required": false,
1794
- "description": "Additional CSS class names."
2141
+ "description": "Callback to close the drawer. Required when `drawer={true}`.\nCalled when ESC is pressed or backdrop is clicked.\nOmitting this in drawer mode means the user cannot dismiss the overlay,\nwhich is a WCAG 2.1.1 (Keyboard) failure."
1795
2142
  }
1796
2143
  },
1797
- "cssTokens": [],
2144
+ "cssTokens": [
2145
+ "--tui-sidebar-width",
2146
+ "--tui-sidebar-bg",
2147
+ "--tui-sidebar-border",
2148
+ "--tui-sidebar-padding",
2149
+ "--tui-sidebar-z"
2150
+ ],
1798
2151
  "story": {
1799
2152
  "title": "Components/Sidebar",
1800
2153
  "tags": [
@@ -1807,7 +2160,9 @@
1807
2160
  "description": null,
1808
2161
  "gotchas": null,
1809
2162
  "examples": null,
1810
- "related": null
2163
+ "related": null,
2164
+ "use": null,
2165
+ "notFor": null
1811
2166
  },
1812
2167
  "StepIndicator": {
1813
2168
  "props": {
@@ -1863,7 +2218,9 @@
1863
2218
  "description": null,
1864
2219
  "gotchas": null,
1865
2220
  "examples": null,
1866
- "related": null
2221
+ "related": null,
2222
+ "use": null,
2223
+ "notFor": null
1867
2224
  },
1868
2225
  "StepList": {
1869
2226
  "props": {
@@ -1889,7 +2246,14 @@
1889
2246
  "description": "Additional CSS class names."
1890
2247
  }
1891
2248
  },
1892
- "cssTokens": [],
2249
+ "cssTokens": [
2250
+ "--tui-steplist-gap",
2251
+ "--tui-steplist-padding",
2252
+ "--tui-steplist-radius",
2253
+ "--tui-steplist-current-bg",
2254
+ "--tui-steplist-current-border",
2255
+ "--tui-steplist-hover-bg"
2256
+ ],
1893
2257
  "story": {
1894
2258
  "title": "Components/StepList",
1895
2259
  "tags": [
@@ -1902,7 +2266,9 @@
1902
2266
  "description": null,
1903
2267
  "gotchas": null,
1904
2268
  "examples": null,
1905
- "related": null
2269
+ "related": null,
2270
+ "use": null,
2271
+ "notFor": null
1906
2272
  },
1907
2273
  "Switch": {
1908
2274
  "props": {
@@ -1944,7 +2310,10 @@
1944
2310
  "required": false
1945
2311
  }
1946
2312
  },
1947
- "cssTokens": [],
2313
+ "cssTokens": [
2314
+ "--tui-switch-accent",
2315
+ "--tui-switch-track-off"
2316
+ ],
1948
2317
  "story": {
1949
2318
  "title": "Forms/Switch",
1950
2319
  "tags": [
@@ -1956,7 +2325,9 @@
1956
2325
  "description": null,
1957
2326
  "gotchas": null,
1958
2327
  "examples": null,
1959
- "related": null
2328
+ "related": null,
2329
+ "use": null,
2330
+ "notFor": null
1960
2331
  },
1961
2332
  "Tabs": {
1962
2333
  "props": {
@@ -2053,7 +2424,9 @@
2053
2424
  ],
2054
2425
  "related": [
2055
2426
  "SegmentedControl"
2056
- ]
2427
+ ],
2428
+ "use": "when selecting reveals a content panel owned by this component (Tabs.Panel below the tab list)",
2429
+ "notFor": "filters, view-mode switches, or sort-order pickers — use SegmentedControl instead (no owned panels)"
2057
2430
  },
2058
2431
  "Textarea": {
2059
2432
  "props": {
@@ -2126,7 +2499,9 @@
2126
2499
  "description": null,
2127
2500
  "gotchas": null,
2128
2501
  "examples": null,
2129
- "related": null
2502
+ "related": null,
2503
+ "use": null,
2504
+ "notFor": null
2130
2505
  },
2131
2506
  "TextInput": {
2132
2507
  "props": {
@@ -2190,7 +2565,9 @@
2190
2565
  "description": "Class name applied directly to the `<input>` element.\nUse for utilities like `tui-input-reset` that must target the input itself."
2191
2566
  }
2192
2567
  },
2193
- "cssTokens": [],
2568
+ "cssTokens": [
2569
+ "--tui-input-group-gap"
2570
+ ],
2194
2571
  "story": {
2195
2572
  "title": "Forms/TextInput",
2196
2573
  "tags": [
@@ -2203,7 +2580,9 @@
2203
2580
  "description": null,
2204
2581
  "gotchas": null,
2205
2582
  "examples": null,
2206
- "related": null
2583
+ "related": null,
2584
+ "use": null,
2585
+ "notFor": null
2207
2586
  },
2208
2587
  "Toolbar": {
2209
2588
  "props": {
@@ -2227,7 +2606,10 @@
2227
2606
  "description": "Inline styles for layout integration"
2228
2607
  }
2229
2608
  },
2230
- "cssTokens": [],
2609
+ "cssTokens": [
2610
+ "--tui-toolbar-gap",
2611
+ "--tui-toolbar-padding"
2612
+ ],
2231
2613
  "story": {
2232
2614
  "title": "Components/Toolbar",
2233
2615
  "tags": [
@@ -2239,7 +2621,9 @@
2239
2621
  "description": null,
2240
2622
  "gotchas": null,
2241
2623
  "examples": null,
2242
- "related": null
2624
+ "related": null,
2625
+ "use": null,
2626
+ "notFor": null
2243
2627
  },
2244
2628
  "Tooltip": {
2245
2629
  "props": {
@@ -2260,7 +2644,12 @@
2260
2644
  "description": "Override provider's delay for this tooltip."
2261
2645
  }
2262
2646
  },
2263
- "cssTokens": [],
2647
+ "cssTokens": [
2648
+ "--tui-tooltip-bg",
2649
+ "--tui-tooltip-fg",
2650
+ "--tui-tooltip-radius",
2651
+ "--tui-tooltip-z"
2652
+ ],
2264
2653
  "story": {
2265
2654
  "title": "Primitives/Tooltip",
2266
2655
  "tags": [
@@ -2272,7 +2661,9 @@
2272
2661
  "description": null,
2273
2662
  "gotchas": null,
2274
2663
  "examples": null,
2275
- "related": null
2664
+ "related": null,
2665
+ "use": null,
2666
+ "notFor": null
2276
2667
  }
2277
2668
  },
2278
2669
  "utilities": {
@@ -2415,15 +2806,62 @@
2415
2806
  "is-layer-top"
2416
2807
  ]
2417
2808
  },
2809
+ "guides": {
2810
+ "tabsVsSegmentedControl": {
2811
+ "title": "Tabs vs SegmentedControl",
2812
+ "question": "Does selecting an option reveal a content panel owned by this component?",
2813
+ "rules": [
2814
+ {
2815
+ "answer": "Yes — selecting shows a Tabs.Panel below the tab list",
2816
+ "use": "Tabs"
2817
+ },
2818
+ {
2819
+ "answer": "No — selection drives external state (filter, view mode, sort order)",
2820
+ "use": "SegmentedControl"
2821
+ }
2822
+ ],
2823
+ "components": [
2824
+ "Tabs",
2825
+ "SegmentedControl"
2826
+ ],
2827
+ "storybookPath": "Guides/Tabs vs SegmentedControl",
2828
+ "detail": "Both components look identical across all visual variants (pill, underline, outline). The difference is semantic, not visual. Tabs uses role=tablist/tab/tabpanel with aria-selected and aria-controls. SegmentedControl uses role=radiogroup/radio with aria-checked. Using the wrong one produces incorrect screen reader announcements."
2829
+ },
2830
+ "chipVsButton": {
2831
+ "title": "Chip vs Button",
2832
+ "question": "Is this an action the user performs, or a label/tag/toggle representing a value?",
2833
+ "rules": [
2834
+ {
2835
+ "answer": "Action — save, delete, submit, navigate, open a modal",
2836
+ "use": "Button"
2837
+ },
2838
+ {
2839
+ "answer": "Label or tag — a category, status badge, or read-only value indicator",
2840
+ "use": "Chip (non-interactive, no onClick)"
2841
+ },
2842
+ {
2843
+ "answer": "Filter toggle or multi-select token — represents 'is this category active?'",
2844
+ "use": "Chip (interactive or inside ChipGroup)"
2845
+ }
2846
+ ],
2847
+ "components": [
2848
+ "Chip",
2849
+ "ChipGroup",
2850
+ "Button"
2851
+ ],
2852
+ "storybookPath": "Guides/Chip vs Button",
2853
+ "detail": "The visual overlap comes from shared size tokens and variants. The semantic difference is the ARIA contract. Button always means 'do something' — it carries action intent. Chip means 'this value is present or selected' — it carries state. An interactive Chip uses aria-pressed (toggle), not action semantics. Use ChipGroup when you have multiple selectable filter tokens — it manages selection state, keyboard navigation, and aria-pressed across the group. A ghost or outline Button that looks like a Chip is still a Button if the intent is to trigger an action, not represent a value."
2854
+ }
2855
+ },
2418
2856
  "icons": {
2419
2857
  "sets": {
2420
2858
  "cred": 12,
2421
2859
  "lms": 7,
2422
2860
  "player": 24,
2423
2861
  "reaction": 36,
2424
- "system": 75
2862
+ "system": 76
2425
2863
  },
2426
- "total": 154,
2864
+ "total": 155,
2427
2865
  "manifest": "./icons/manifest.json"
2428
2866
  }
2429
2867
  }