@tangible/ui 0.0.1 → 0.0.2

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 (129) hide show
  1. package/components/Card/Card.d.ts +1 -0
  2. package/components/Card/Card.js +17 -20
  3. package/components/Checkbox/Checkbox.d.ts +9 -0
  4. package/components/Checkbox/Checkbox.js +92 -0
  5. package/components/Checkbox/index.d.ts +2 -0
  6. package/components/Checkbox/index.js +1 -0
  7. package/components/Checkbox/types.d.ts +10 -0
  8. package/components/Checkbox/types.js +1 -0
  9. package/components/Chip/Chip.d.ts +4 -1
  10. package/components/Chip/Chip.js +32 -7
  11. package/components/ChipGroup/ChipGroup.d.ts +5 -0
  12. package/components/ChipGroup/ChipGroup.js +68 -0
  13. package/components/ChipGroup/ChipGroupContext.d.ts +3 -0
  14. package/components/ChipGroup/ChipGroupContext.js +5 -0
  15. package/components/ChipGroup/index.d.ts +3 -0
  16. package/components/ChipGroup/index.js +2 -0
  17. package/components/ChipGroup/types.d.ts +36 -0
  18. package/components/ChipGroup/types.js +1 -0
  19. package/components/Chips/Chips.d.ts +2 -0
  20. package/components/Chips/Chips.js +1 -1
  21. package/components/Combobox/Combobox.d.ts +33 -0
  22. package/components/Combobox/Combobox.js +466 -0
  23. package/components/Combobox/ComboboxContext.d.ts +8 -0
  24. package/components/Combobox/ComboboxContext.js +36 -0
  25. package/components/Combobox/index.d.ts +2 -0
  26. package/components/Combobox/index.js +1 -0
  27. package/components/Combobox/types.d.ts +204 -0
  28. package/components/Combobox/types.js +1 -0
  29. package/components/Dropdown/Dropdown.js +2 -1
  30. package/components/Field/Field.d.ts +39 -0
  31. package/components/Field/Field.js +92 -0
  32. package/components/Field/FieldContext.d.ts +16 -0
  33. package/components/Field/FieldContext.js +10 -0
  34. package/components/Field/index.d.ts +2 -0
  35. package/components/Field/index.js +1 -0
  36. package/components/Modal/Modal.d.ts +4 -4
  37. package/components/Modal/Modal.js +14 -12
  38. package/components/MultiSelect/MultiSelect.d.ts +39 -0
  39. package/components/MultiSelect/MultiSelect.js +623 -0
  40. package/components/MultiSelect/MultiSelectContext.d.ts +20 -0
  41. package/components/MultiSelect/MultiSelectContext.js +56 -0
  42. package/components/MultiSelect/index.d.ts +2 -0
  43. package/components/MultiSelect/index.js +1 -0
  44. package/components/MultiSelect/types.d.ts +218 -0
  45. package/components/MultiSelect/types.js +3 -0
  46. package/components/Notice/Notice.d.ts +1 -1
  47. package/components/Notice/Notice.js +1 -1
  48. package/components/Progress/Progress.js +1 -1
  49. package/components/Progress/types.d.ts +7 -7
  50. package/components/Radio/Radio.d.ts +2 -0
  51. package/components/Radio/Radio.js +50 -0
  52. package/components/Radio/RadioGroup.d.ts +2 -0
  53. package/components/Radio/RadioGroup.js +54 -0
  54. package/components/Radio/RadioGroupContext.d.ts +3 -0
  55. package/components/Radio/RadioGroupContext.js +9 -0
  56. package/components/Radio/index.d.ts +8 -0
  57. package/components/Radio/index.js +6 -0
  58. package/components/Radio/types.d.ts +32 -0
  59. package/components/Radio/types.js +1 -0
  60. package/components/Rating/Rating.d.ts +5 -5
  61. package/components/Rating/Rating.js +2 -2
  62. package/components/SegmentedControl/SegmentedControl.js +20 -104
  63. package/components/SegmentedControl/types.d.ts +4 -8
  64. package/components/Select/Select.d.ts +39 -0
  65. package/components/Select/Select.js +497 -0
  66. package/components/Select/SelectContext.d.ts +20 -0
  67. package/components/Select/SelectContext.js +56 -0
  68. package/components/Select/index.d.ts +3 -0
  69. package/components/Select/index.js +1 -0
  70. package/components/Select/types.d.ts +216 -0
  71. package/components/Select/types.js +11 -0
  72. package/components/Sidebar/Sidebar.js +12 -12
  73. package/components/Sidebar/types.d.ts +5 -5
  74. package/components/StepIndicator/StepIndicator.js +1 -1
  75. package/components/StepList/StepList.js +2 -2
  76. package/components/StepList/types.d.ts +4 -4
  77. package/components/Switch/Switch.d.ts +9 -0
  78. package/components/Switch/Switch.js +91 -0
  79. package/components/Switch/index.d.ts +2 -0
  80. package/components/Switch/index.js +1 -0
  81. package/components/Switch/types.d.ts +11 -0
  82. package/components/Switch/types.js +1 -0
  83. package/components/TextInput/TextInput.d.ts +8 -0
  84. package/components/TextInput/TextInput.js +25 -0
  85. package/components/TextInput/index.d.ts +2 -0
  86. package/components/TextInput/index.js +1 -0
  87. package/components/TextInput/types.d.ts +32 -0
  88. package/components/TextInput/types.js +1 -0
  89. package/components/Textarea/Textarea.d.ts +6 -0
  90. package/components/Textarea/Textarea.js +49 -0
  91. package/components/Textarea/index.d.ts +2 -0
  92. package/components/Textarea/index.js +1 -0
  93. package/components/Textarea/types.d.ts +25 -0
  94. package/components/Textarea/types.js +1 -0
  95. package/components/index.d.ts +20 -0
  96. package/components/index.js +10 -0
  97. package/icons/icons.svg +1 -0
  98. package/icons/manifest.json +8 -0
  99. package/icons/registry.d.ts +2 -0
  100. package/icons/registry.js +1 -0
  101. package/icons/system/index.d.ts +2 -0
  102. package/icons/system/index.js +11 -0
  103. package/package.json +1 -1
  104. package/styles/all.css +1 -1
  105. package/styles/all.expanded.css +1187 -96
  106. package/styles/all.expanded.unlayered.css +1187 -96
  107. package/styles/all.unlayered.css +1 -1
  108. package/styles/components/_bundle.scss +20 -0
  109. package/styles/components/input/index.scss +5 -20
  110. package/styles/index.scss +16 -0
  111. package/styles/system/_control.scss +34 -0
  112. package/styles/system/_tokens.scss +8 -0
  113. package/styles/system/index.scss +2 -1
  114. package/styles/utilities/_index.scss +50 -0
  115. package/tui-manifest.json +632 -61
  116. package/utils/compose-events.d.ts +15 -0
  117. package/utils/compose-events.js +27 -0
  118. package/utils/hash.d.ts +15 -0
  119. package/utils/hash.js +32 -0
  120. package/utils/index.d.ts +3 -0
  121. package/utils/index.js +6 -0
  122. package/utils/is-dev.d.ts +5 -0
  123. package/utils/is-dev.js +7 -0
  124. package/utils/use-controllable-state.d.ts +19 -0
  125. package/utils/use-controllable-state.js +59 -0
  126. package/utils/use-roving-group.d.ts +33 -0
  127. package/utils/use-roving-group.js +123 -0
  128. package/utils/value-key.d.ts +16 -0
  129. package/utils/value-key.js +14 -0
package/tui-manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.0.1",
3
- "generated": "2026-01-31T03:28:47.490Z",
2
+ "version": "0.0.2",
3
+ "generated": "2026-02-17T04:01:35.339Z",
4
4
  "components": {
5
5
  "Accordion": {
6
6
  "props": {
@@ -354,7 +354,8 @@
354
354
  },
355
355
  "onClick": {
356
356
  "type": "MouseEventHandler<HTMLElement>",
357
- "required": false
357
+ "required": false,
358
+ "description": "@deprecated Use Card.Link for interactive cards. onClick without Card.Link has no keyboard/screen-reader semantics."
358
359
  },
359
360
  "title": {
360
361
  "type": "string",
@@ -434,6 +435,59 @@
434
435
  "Notice"
435
436
  ]
436
437
  },
438
+ "Checkbox": {
439
+ "props": {
440
+ "disabled": {
441
+ "type": "boolean",
442
+ "required": false
443
+ },
444
+ "size": {
445
+ "type": "number",
446
+ "required": false
447
+ },
448
+ "className": {
449
+ "type": "string",
450
+ "required": false
451
+ },
452
+ "id": {
453
+ "type": "string",
454
+ "required": false
455
+ },
456
+ "style": {
457
+ "type": "CSSProperties",
458
+ "required": false
459
+ },
460
+ "title": {
461
+ "type": "string",
462
+ "required": false
463
+ },
464
+ "rel": {
465
+ "type": "string",
466
+ "required": false
467
+ },
468
+ "onClick": {
469
+ "type": "MouseEventHandler<HTMLInputElement>",
470
+ "required": false
471
+ },
472
+ "label": {
473
+ "type": "ReactNode",
474
+ "required": false
475
+ }
476
+ },
477
+ "cssTokens": [],
478
+ "story": {
479
+ "title": "Forms/Checkbox",
480
+ "tags": [
481
+ "autodocs",
482
+ "lms"
483
+ ]
484
+ },
485
+ "subcomponents": null,
486
+ "description": null,
487
+ "gotchas": null,
488
+ "examples": null,
489
+ "related": null
490
+ },
437
491
  "Chip": {
438
492
  "props": {
439
493
  "as": {
@@ -496,6 +550,11 @@
496
550
  "type": "MouseEventHandler<HTMLElement>",
497
551
  "required": false
498
552
  },
553
+ "value": {
554
+ "type": "OptionValue",
555
+ "required": false,
556
+ "description": "When inside ChipGroup, identifies this chip for selection tracking"
557
+ },
499
558
  "id": {
500
559
  "type": "string",
501
560
  "required": false
@@ -531,6 +590,50 @@
531
590
  "examples": null,
532
591
  "related": null
533
592
  },
593
+ "ChipGroup": {
594
+ "props": {
595
+ "disabled": {
596
+ "type": "boolean",
597
+ "required": false
598
+ },
599
+ "density": {
600
+ "type": "\"xs\" | \"sm\" | \"md\"",
601
+ "required": false,
602
+ "description": "Gap between chips. Default 'sm'."
603
+ },
604
+ "direction": {
605
+ "type": "\"inline\" | \"stack\"",
606
+ "required": false,
607
+ "description": "Layout direction. Default 'inline' (row wrap)."
608
+ },
609
+ "alignment": {
610
+ "type": "\"start\" | \"center\" | \"end\"",
611
+ "required": false,
612
+ "description": "Alignment along main axis."
613
+ },
614
+ "className": {
615
+ "type": "string",
616
+ "required": false
617
+ },
618
+ "onValueChange": {
619
+ "type": "((value: OptionValue) => void) | ((value: OptionValue[]) => void)",
620
+ "required": false
621
+ }
622
+ },
623
+ "cssTokens": [],
624
+ "story": {
625
+ "title": "Primitives/ChipGroup",
626
+ "tags": [
627
+ "autodocs",
628
+ "stable"
629
+ ]
630
+ },
631
+ "subcomponents": null,
632
+ "description": null,
633
+ "gotchas": null,
634
+ "examples": null,
635
+ "related": null
636
+ },
534
637
  "Chips": {
535
638
  "props": {
536
639
  "density": {
@@ -563,6 +666,77 @@
563
666
  "examples": null,
564
667
  "related": null
565
668
  },
669
+ "Combobox": {
670
+ "props": {
671
+ "size": {
672
+ "type": "\"sm\" | \"md\" | \"lg\"",
673
+ "required": false,
674
+ "defaultValue": "'md'",
675
+ "description": "Control size."
676
+ },
677
+ "value": {
678
+ "type": "OptionValue",
679
+ "required": false,
680
+ "description": "Controlled selected value."
681
+ },
682
+ "onValueChange": {
683
+ "type": "(value: OptionValue) => void",
684
+ "required": false,
685
+ "description": "Callback when selection changes.\nCalled with the option's value when user selects, or undefined when cleared.\nDoes NOT mutate inputValue — consumer should update inputValue in handler if desired."
686
+ },
687
+ "inputValue": {
688
+ "type": "string",
689
+ "required": false,
690
+ "description": "Controlled input value for search/filter."
691
+ },
692
+ "filterMode": {
693
+ "type": "\"always\" | \"when-searching\"",
694
+ "required": false,
695
+ "defaultValue": "'always'",
696
+ "description": "Controls filtering behavior.\n- 'always': Filter on inputValue at all times (default)\n- 'when-searching': Query is empty when not actively typing,\n so consumers can show all options when user is browsing a selection"
697
+ },
698
+ "open": {
699
+ "type": "boolean",
700
+ "required": false,
701
+ "description": "Controlled open state."
702
+ },
703
+ "defaultOpen": {
704
+ "type": "boolean",
705
+ "required": false,
706
+ "defaultValue": "false",
707
+ "description": "Default open state for uncontrolled usage."
708
+ },
709
+ "disabled": {
710
+ "type": "boolean",
711
+ "required": false,
712
+ "defaultValue": "false",
713
+ "description": "Whether the combobox is disabled."
714
+ },
715
+ "openOnFocus": {
716
+ "type": "boolean",
717
+ "required": false,
718
+ "defaultValue": "true",
719
+ "description": "Whether to open the listbox when the input receives focus."
720
+ },
721
+ "inputClassName": {
722
+ "type": "string",
723
+ "required": false,
724
+ "description": "Class name applied directly to the `<input>` element.\nUse for utilities like `tui-input-reset` that must target the input itself."
725
+ }
726
+ },
727
+ "cssTokens": [],
728
+ "story": {
729
+ "title": "Forms/Combobox",
730
+ "tags": [
731
+ "lms"
732
+ ]
733
+ },
734
+ "subcomponents": null,
735
+ "description": null,
736
+ "gotchas": null,
737
+ "examples": null,
738
+ "related": null
739
+ },
566
740
  "ContentIndicator": {
567
741
  "props": {
568
742
  "icon": {
@@ -642,6 +816,53 @@
642
816
  "examples": null,
643
817
  "related": null
644
818
  },
819
+ "Field": {
820
+ "props": {
821
+ "error": {
822
+ "type": "boolean",
823
+ "required": false,
824
+ "description": "Whether the field has an error state"
825
+ },
826
+ "required": {
827
+ "type": "boolean",
828
+ "required": false,
829
+ "description": "Whether the field is required"
830
+ },
831
+ "disabled": {
832
+ "type": "boolean",
833
+ "required": false,
834
+ "description": "Whether the field is disabled"
835
+ },
836
+ "inline": {
837
+ "type": "boolean",
838
+ "required": false,
839
+ "description": "Inline layout: label and control on same row"
840
+ },
841
+ "className": {
842
+ "type": "string",
843
+ "required": false,
844
+ "description": "Additional class name for the field wrapper"
845
+ }
846
+ },
847
+ "cssTokens": [
848
+ "--tui-field-gap",
849
+ "--tui-field-label-fg",
850
+ "--tui-field-helper-fg",
851
+ "--tui-field-error-fg"
852
+ ],
853
+ "story": {
854
+ "title": "Forms/Field",
855
+ "tags": [
856
+ "stable",
857
+ "lms"
858
+ ]
859
+ },
860
+ "subcomponents": null,
861
+ "description": null,
862
+ "gotchas": null,
863
+ "examples": null,
864
+ "related": null
865
+ },
645
866
  "Icon": {
646
867
  "props": {
647
868
  "name": {
@@ -833,7 +1054,7 @@
833
1054
  "description": "Accessible dialog with focus trap, backdrop, and portal rendering",
834
1055
  "gotchas": [
835
1056
  {
836
- "note": "Always provide labelledBy pointing to a heading id for accessibility"
1057
+ "note": "Always provide aria-labelledby pointing to a heading id for accessibility"
837
1058
  },
838
1059
  {
839
1060
  "note": "Body uses two-layer wrapper for scroll + :has() composition"
@@ -851,17 +1072,89 @@
851
1072
  "examples": [
852
1073
  {
853
1074
  "name": "Basic",
854
- "code": "<Modal isOpen={open} onClose={close} labelledBy=\"modal-title\">\n <Modal.Head><h2 id=\"modal-title\">Title</h2></Modal.Head>\n <Modal.Body>Content</Modal.Body>\n <Modal.Foot><Button label=\"Close\" onClick={close} /></Modal.Foot>\n</Modal>"
1075
+ "code": "<Modal open={open} onClose={close} aria-labelledby=\"modal-title\">\n <Modal.Head><h2 id=\"modal-title\">Title</h2></Modal.Head>\n <Modal.Body>Content</Modal.Body>\n <Modal.Foot><Button label=\"Close\" onClick={close} /></Modal.Foot>\n</Modal>"
855
1076
  },
856
1077
  {
857
1078
  "name": "With close button",
858
- "code": "<Modal isOpen={open} onClose={close} showCloseButton labelledBy=\"title\">\n <Modal.Head><h2 id=\"title\">Confirm</h2></Modal.Head>\n <Modal.Body>Are you sure?</Modal.Body>\n</Modal>"
1079
+ "code": "<Modal open={open} onClose={close} showCloseButton aria-labelledby=\"title\">\n <Modal.Head><h2 id=\"title\">Confirm</h2></Modal.Head>\n <Modal.Body>Are you sure?</Modal.Body>\n</Modal>"
859
1080
  }
860
1081
  ],
861
1082
  "related": [
862
1083
  "Notice"
863
1084
  ]
864
1085
  },
1086
+ "MultiSelect": {
1087
+ "props": {
1088
+ "size": {
1089
+ "type": "\"sm\" | \"md\" | \"lg\"",
1090
+ "required": false,
1091
+ "defaultValue": "'md'",
1092
+ "description": "Control size."
1093
+ },
1094
+ "value": {
1095
+ "type": "MultiSelectValue",
1096
+ "required": false,
1097
+ "description": "Controlled selected values."
1098
+ },
1099
+ "onValueChange": {
1100
+ "type": "(value: MultiSelectValue) => void",
1101
+ "required": false,
1102
+ "description": "Callback when selection changes."
1103
+ },
1104
+ "open": {
1105
+ "type": "boolean",
1106
+ "required": false,
1107
+ "description": "Controlled open state."
1108
+ },
1109
+ "defaultOpen": {
1110
+ "type": "boolean",
1111
+ "required": false,
1112
+ "defaultValue": "false",
1113
+ "description": "Default open state for uncontrolled usage."
1114
+ },
1115
+ "disabled": {
1116
+ "type": "boolean",
1117
+ "required": false,
1118
+ "defaultValue": "false",
1119
+ "description": "Whether the entire select is disabled."
1120
+ },
1121
+ "display": {
1122
+ "type": "\"count\" | \"chips\"",
1123
+ "required": false,
1124
+ "defaultValue": "'count'",
1125
+ "description": "Display mode for the trigger.\n- 'count': Shows \"N selected\"\n- 'chips': Shows visual chips for selected items"
1126
+ },
1127
+ "maxChips": {
1128
+ "type": "number",
1129
+ "required": false,
1130
+ "defaultValue": "3",
1131
+ "description": "Maximum number of chips to show before \"+N more\" badge.\nOnly applies when display='chips'."
1132
+ },
1133
+ "max": {
1134
+ "type": "number",
1135
+ "required": false,
1136
+ "description": "Maximum number of selections allowed.\nWhen reached, unselected options become disabled."
1137
+ },
1138
+ "id": {
1139
+ "type": "string",
1140
+ "required": false,
1141
+ "description": "Optional trigger ID override.\nUseful for Field integration via htmlFor."
1142
+ }
1143
+ },
1144
+ "cssTokens": [],
1145
+ "story": {
1146
+ "title": "Forms/MultiSelect",
1147
+ "tags": [
1148
+ "autodocs",
1149
+ "lms"
1150
+ ]
1151
+ },
1152
+ "subcomponents": null,
1153
+ "description": null,
1154
+ "gotchas": null,
1155
+ "examples": null,
1156
+ "related": null
1157
+ },
865
1158
  "Notice": {
866
1159
  "props": {
867
1160
  "inline": {
@@ -911,11 +1204,6 @@
911
1204
  "required": false,
912
1205
  "description": "Controls screen-reader announcement behavior.\n- off: no live region\n- polite: role=status\n- assertive: role=alert"
913
1206
  },
914
- "ariaLabel": {
915
- "type": "string",
916
- "required": false,
917
- "description": "Accessible name when there is no visible title in Notice.Head.\nOnly use when Notice.Head has no title prop - if both exist, the visible title takes precedence."
918
- },
919
1207
  "dismissible": {
920
1208
  "type": "boolean",
921
1209
  "required": false,
@@ -1161,20 +1449,10 @@
1161
1449
  "defaultValue": "true",
1162
1450
  "description": "Whether to display labels.\nWhen false, hides all label content regardless of other props."
1163
1451
  },
1164
- "labelledBy": {
1165
- "type": "string",
1166
- "required": false,
1167
- "description": "ARIA: ID of an element that labels this progress bar.\nTakes precedence over `ariaLabel` and `defaultLabel`."
1168
- },
1169
- "ariaLabel": {
1170
- "type": "string",
1171
- "required": false,
1172
- "description": "ARIA: Accessible name for the progress bar.\nUse when no visible label exists. Takes precedence over `defaultLabel`."
1173
- },
1174
1452
  "defaultLabel": {
1175
1453
  "type": "string",
1176
1454
  "required": false,
1177
- "description": "Fallback accessible name, rendered as visually-hidden text.\nOnly used if neither `labelledBy` nor `ariaLabel` is provided."
1455
+ "description": "Fallback accessible name, rendered as visually-hidden text.\nOnly used if neither `aria-labelledby` nor `aria-label` is provided."
1178
1456
  },
1179
1457
  "className": {
1180
1458
  "type": "string",
@@ -1241,26 +1519,56 @@
1241
1519
  "examples": null,
1242
1520
  "related": null
1243
1521
  },
1244
- "Rating": {
1522
+ "Radio": {
1245
1523
  "props": {
1246
- "value": {
1247
- "type": "number",
1248
- "required": false,
1249
- "description": "Controlled value (1..max). Use with onChange"
1250
- },
1251
- "max": {
1252
- "type": "number",
1253
- "required": false,
1254
- "defaultValue": "5",
1255
- "description": "Maximum icons shown"
1524
+ "label": {
1525
+ "type": "ReactNode",
1526
+ "required": false
1256
1527
  },
1257
1528
  "disabled": {
1258
1529
  "type": "boolean",
1259
1530
  "required": false,
1260
- "description": "Disable interaction (keeps semantics)"
1531
+ "defaultValue": "false"
1261
1532
  },
1262
- "readOnly": {
1263
- "type": "boolean",
1533
+ "className": {
1534
+ "type": "string",
1535
+ "required": false
1536
+ }
1537
+ },
1538
+ "cssTokens": [],
1539
+ "story": {
1540
+ "title": "Forms/RadioGroup",
1541
+ "tags": [
1542
+ "autodocs",
1543
+ "lms"
1544
+ ]
1545
+ },
1546
+ "subcomponents": null,
1547
+ "description": null,
1548
+ "gotchas": null,
1549
+ "examples": null,
1550
+ "related": null
1551
+ },
1552
+ "Rating": {
1553
+ "props": {
1554
+ "value": {
1555
+ "type": "number",
1556
+ "required": false,
1557
+ "description": "Controlled value (1..max). Use with onValueChange"
1558
+ },
1559
+ "max": {
1560
+ "type": "number",
1561
+ "required": false,
1562
+ "defaultValue": "5",
1563
+ "description": "Maximum icons shown"
1564
+ },
1565
+ "disabled": {
1566
+ "type": "boolean",
1567
+ "required": false,
1568
+ "description": "Disable interaction (keeps semantics)"
1569
+ },
1570
+ "readOnly": {
1571
+ "type": "boolean",
1264
1572
  "required": false,
1265
1573
  "description": "Presentational readOnly (no form semantics)"
1266
1574
  },
@@ -1281,10 +1589,10 @@
1281
1589
  "defaultValue": "secondary",
1282
1590
  "description": "Theme feeds foreground color tokens"
1283
1591
  },
1284
- "onChange": {
1592
+ "onValueChange": {
1285
1593
  "type": "(value: number) => void",
1286
1594
  "required": false,
1287
- "description": "Called on change (controlled or uncontrolled)"
1595
+ "description": "Called when the value changes"
1288
1596
  },
1289
1597
  "allowClear": {
1290
1598
  "type": "boolean",
@@ -1299,11 +1607,6 @@
1299
1607
  "type": "string",
1300
1608
  "required": false,
1301
1609
  "description": "Gap override (e.g. '0.25rem') – otherwise uses density utilities"
1302
- },
1303
- "ariaLabel": {
1304
- "type": "string",
1305
- "required": false,
1306
- "description": "Accessible label for the rating group. Defaults to \"Rating: X of Y\""
1307
1610
  }
1308
1611
  },
1309
1612
  "cssTokens": [],
@@ -1377,6 +1680,85 @@
1377
1680
  "examples": null,
1378
1681
  "related": null
1379
1682
  },
1683
+ "Select": {
1684
+ "props": {
1685
+ "size": {
1686
+ "type": "\"sm\" | \"md\" | \"lg\"",
1687
+ "required": false,
1688
+ "defaultValue": "'md'",
1689
+ "description": "Control size."
1690
+ },
1691
+ "value": {
1692
+ "type": "OptionValue",
1693
+ "required": false,
1694
+ "description": "Controlled selected value."
1695
+ },
1696
+ "onValueChange": {
1697
+ "type": "(value: OptionValue) => void",
1698
+ "required": false,
1699
+ "description": "Callback when selection changes.\nCalled with undefined when selection is cleared."
1700
+ },
1701
+ "open": {
1702
+ "type": "boolean",
1703
+ "required": false,
1704
+ "description": "Controlled open state."
1705
+ },
1706
+ "defaultOpen": {
1707
+ "type": "boolean",
1708
+ "required": false,
1709
+ "defaultValue": "false",
1710
+ "description": "Default open state for uncontrolled usage."
1711
+ },
1712
+ "disabled": {
1713
+ "type": "boolean",
1714
+ "required": false,
1715
+ "defaultValue": "false",
1716
+ "description": "Whether the entire select is disabled."
1717
+ },
1718
+ "side": {
1719
+ "type": "\"top\" | \"bottom\"",
1720
+ "required": false,
1721
+ "defaultValue": "'bottom'",
1722
+ "description": "Preferred side of the trigger to place the listbox."
1723
+ },
1724
+ "align": {
1725
+ "type": "\"start\" | \"center\" | \"end\"",
1726
+ "required": false,
1727
+ "defaultValue": "'start'",
1728
+ "description": "Alignment along the side."
1729
+ },
1730
+ "sideOffset": {
1731
+ "type": "number",
1732
+ "required": false,
1733
+ "defaultValue": "4",
1734
+ "description": "Distance from the trigger in pixels."
1735
+ },
1736
+ "clearable": {
1737
+ "type": "boolean",
1738
+ "required": false,
1739
+ "defaultValue": "false",
1740
+ "description": "Whether the selection can be cleared with a clear button."
1741
+ },
1742
+ "id": {
1743
+ "type": "string",
1744
+ "required": false,
1745
+ "description": "Optional trigger ID override.\nUseful for Field integration via htmlFor."
1746
+ }
1747
+ },
1748
+ "cssTokens": [],
1749
+ "story": {
1750
+ "title": "Forms/Select",
1751
+ "tags": [
1752
+ "autodocs",
1753
+ "lms"
1754
+ ]
1755
+ },
1756
+ "subcomponents": null,
1757
+ "description": null,
1758
+ "gotchas": null,
1759
+ "examples": null,
1760
+ "related": null
1761
+ },
1380
1762
  "Sidebar": {
1381
1763
  "props": {
1382
1764
  "position": {
@@ -1391,7 +1773,7 @@
1391
1773
  "defaultValue": "false",
1392
1774
  "description": "Enable drawer mode (mobile overlay).\nWhen true, sidebar renders via portal with backdrop and focus trap."
1393
1775
  },
1394
- "isOpen": {
1776
+ "open": {
1395
1777
  "type": "boolean",
1396
1778
  "required": false,
1397
1779
  "description": "Drawer open state. Required when `drawer={true}`."
@@ -1401,11 +1783,6 @@
1401
1783
  "required": false,
1402
1784
  "description": "Callback to close the drawer.\nCalled when ESC is pressed or backdrop is clicked."
1403
1785
  },
1404
- "ariaLabel": {
1405
- "type": "string",
1406
- "required": false,
1407
- "description": "Accessible label for the aside landmark.\nTypically omit this if using `ariaLabel` on `Sidebar.Nav` instead."
1408
- },
1409
1786
  "children": {
1410
1787
  "type": "ReactNode",
1411
1788
  "required": true,
@@ -1490,16 +1867,6 @@
1490
1867
  },
1491
1868
  "StepList": {
1492
1869
  "props": {
1493
- "ariaLabel": {
1494
- "type": "string",
1495
- "required": false,
1496
- "description": "Accessible label for the navigation landmark.\nUse either `ariaLabel` or `ariaLabelledBy`, not both."
1497
- },
1498
- "ariaLabelledBy": {
1499
- "type": "string",
1500
- "required": false,
1501
- "description": "ID of a visible heading that labels the navigation.\nUse either `ariaLabel` or `ariaLabelledBy`, not both."
1502
- },
1503
1870
  "ariaCurrent": {
1504
1871
  "type": "\"step\" | \"page\"",
1505
1872
  "required": false,
@@ -1537,6 +1904,60 @@
1537
1904
  "examples": null,
1538
1905
  "related": null
1539
1906
  },
1907
+ "Switch": {
1908
+ "props": {
1909
+ "disabled": {
1910
+ "type": "boolean",
1911
+ "required": false
1912
+ },
1913
+ "className": {
1914
+ "type": "string",
1915
+ "required": false
1916
+ },
1917
+ "id": {
1918
+ "type": "string",
1919
+ "required": false
1920
+ },
1921
+ "style": {
1922
+ "type": "CSSProperties",
1923
+ "required": false
1924
+ },
1925
+ "title": {
1926
+ "type": "string",
1927
+ "required": false
1928
+ },
1929
+ "rel": {
1930
+ "type": "string",
1931
+ "required": false
1932
+ },
1933
+ "onClick": {
1934
+ "type": "MouseEventHandler<HTMLButtonElement>",
1935
+ "required": false
1936
+ },
1937
+ "size": {
1938
+ "type": "\"sm\" | \"md\" | \"lg\"",
1939
+ "required": false,
1940
+ "defaultValue": "md"
1941
+ },
1942
+ "label": {
1943
+ "type": "ReactNode",
1944
+ "required": false
1945
+ }
1946
+ },
1947
+ "cssTokens": [],
1948
+ "story": {
1949
+ "title": "Forms/Switch",
1950
+ "tags": [
1951
+ "autodocs",
1952
+ "lms"
1953
+ ]
1954
+ },
1955
+ "subcomponents": null,
1956
+ "description": null,
1957
+ "gotchas": null,
1958
+ "examples": null,
1959
+ "related": null
1960
+ },
1540
1961
  "Tabs": {
1541
1962
  "props": {
1542
1963
  "variant": {
@@ -1634,6 +2055,156 @@
1634
2055
  "SegmentedControl"
1635
2056
  ]
1636
2057
  },
2058
+ "Textarea": {
2059
+ "props": {
2060
+ "disabled": {
2061
+ "type": "boolean",
2062
+ "required": false
2063
+ },
2064
+ "onChange": {
2065
+ "type": "ChangeEventHandler<HTMLTextAreaElement>",
2066
+ "required": false
2067
+ },
2068
+ "className": {
2069
+ "type": "string",
2070
+ "required": false,
2071
+ "description": "Class name applied to the textarea element."
2072
+ },
2073
+ "id": {
2074
+ "type": "string",
2075
+ "required": false
2076
+ },
2077
+ "style": {
2078
+ "type": "CSSProperties",
2079
+ "required": false
2080
+ },
2081
+ "title": {
2082
+ "type": "string",
2083
+ "required": false
2084
+ },
2085
+ "role": {
2086
+ "type": "AriaRole",
2087
+ "required": false
2088
+ },
2089
+ "rel": {
2090
+ "type": "string",
2091
+ "required": false
2092
+ },
2093
+ "onClick": {
2094
+ "type": "MouseEventHandler<HTMLTextAreaElement>",
2095
+ "required": false
2096
+ },
2097
+ "size": {
2098
+ "type": "\"sm\" | \"md\" | \"lg\"",
2099
+ "required": false,
2100
+ "defaultValue": "md",
2101
+ "description": "Control size."
2102
+ },
2103
+ "resize": {
2104
+ "type": "\"none\" | \"vertical\" | \"horizontal\" | \"both\"",
2105
+ "required": false,
2106
+ "defaultValue": "vertical",
2107
+ "description": "Resize behaviour.\nIgnored when `autoResize` is true (resize is disabled to avoid conflict)."
2108
+ },
2109
+ "autoResize": {
2110
+ "type": "boolean",
2111
+ "required": false,
2112
+ "defaultValue": "false",
2113
+ "description": "Automatically grow height to fit content.\nDisables manual resize and scrollbar."
2114
+ }
2115
+ },
2116
+ "cssTokens": [],
2117
+ "story": {
2118
+ "title": "Forms/Textarea",
2119
+ "tags": [
2120
+ "autodocs",
2121
+ "stable",
2122
+ "lms"
2123
+ ]
2124
+ },
2125
+ "subcomponents": null,
2126
+ "description": null,
2127
+ "gotchas": null,
2128
+ "examples": null,
2129
+ "related": null
2130
+ },
2131
+ "TextInput": {
2132
+ "props": {
2133
+ "disabled": {
2134
+ "type": "boolean",
2135
+ "required": false
2136
+ },
2137
+ "onChange": {
2138
+ "type": "ChangeEventHandler<HTMLInputElement>",
2139
+ "required": false
2140
+ },
2141
+ "className": {
2142
+ "type": "string",
2143
+ "required": false,
2144
+ "description": "Additional class name applied to the root wrapper element."
2145
+ },
2146
+ "id": {
2147
+ "type": "string",
2148
+ "required": false
2149
+ },
2150
+ "style": {
2151
+ "type": "CSSProperties",
2152
+ "required": false
2153
+ },
2154
+ "title": {
2155
+ "type": "string",
2156
+ "required": false
2157
+ },
2158
+ "role": {
2159
+ "type": "AriaRole",
2160
+ "required": false
2161
+ },
2162
+ "rel": {
2163
+ "type": "string",
2164
+ "required": false
2165
+ },
2166
+ "onClick": {
2167
+ "type": "MouseEventHandler<HTMLInputElement>",
2168
+ "required": false
2169
+ },
2170
+ "type": {
2171
+ "type": "\"number\" | \"text\" | \"email\" | \"password\" | \"url\" | \"tel\" | \"search\"",
2172
+ "required": false,
2173
+ "defaultValue": "text",
2174
+ "description": "Input type."
2175
+ },
2176
+ "size": {
2177
+ "type": "\"sm\" | \"md\" | \"lg\"",
2178
+ "required": false,
2179
+ "defaultValue": "md",
2180
+ "description": "Control size."
2181
+ },
2182
+ "suffix": {
2183
+ "type": "ReactNode",
2184
+ "required": false,
2185
+ "description": "Content to render after the input (icon, button)."
2186
+ },
2187
+ "inputClassName": {
2188
+ "type": "string",
2189
+ "required": false,
2190
+ "description": "Class name applied directly to the `<input>` element.\nUse for utilities like `tui-input-reset` that must target the input itself."
2191
+ }
2192
+ },
2193
+ "cssTokens": [],
2194
+ "story": {
2195
+ "title": "Forms/TextInput",
2196
+ "tags": [
2197
+ "autodocs",
2198
+ "stable",
2199
+ "lms"
2200
+ ]
2201
+ },
2202
+ "subcomponents": null,
2203
+ "description": null,
2204
+ "gotchas": null,
2205
+ "examples": null,
2206
+ "related": null
2207
+ },
1637
2208
  "Toolbar": {
1638
2209
  "props": {
1639
2210
  "orientation": {
@@ -1850,9 +2421,9 @@
1850
2421
  "lms": 7,
1851
2422
  "player": 24,
1852
2423
  "reaction": 36,
1853
- "system": 74
2424
+ "system": 75
1854
2425
  },
1855
- "total": 153,
2426
+ "total": 154,
1856
2427
  "manifest": "./icons/manifest.json"
1857
2428
  }
1858
2429
  }