@fragments-sdk/ui 0.17.1 → 0.18.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 (69) hide show
  1. package/fragments.json +1 -1
  2. package/package.json +3 -3
  3. package/src/components/Accordion/Accordion.contract.json +169 -0
  4. package/src/components/Alert/Alert.contract.json +157 -0
  5. package/src/components/AppShell/AppShell.contract.json +155 -0
  6. package/src/components/Avatar/Avatar.contract.json +189 -0
  7. package/src/components/Badge/Badge.contract.json +187 -0
  8. package/src/components/BentoGrid/BentoGrid.contract.json +135 -0
  9. package/src/components/Box/Box.contract.json +423 -0
  10. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +143 -0
  11. package/src/components/Button/Button.contract.json +205 -0
  12. package/src/components/ButtonGroup/ButtonGroup.contract.json +140 -0
  13. package/src/components/Card/Card.contract.json +185 -0
  14. package/src/components/Chart/Chart.contract.json +129 -0
  15. package/src/components/Checkbox/Checkbox.contract.json +246 -0
  16. package/src/components/Chip/Chip.contract.json +212 -0
  17. package/src/components/CodeBlock/CodeBlock.contract.json +388 -0
  18. package/src/components/Collapsible/Collapsible.contract.json +154 -0
  19. package/src/components/ColorPicker/ColorPicker.contract.json +212 -0
  20. package/src/components/Combobox/Combobox.contract.json +297 -0
  21. package/src/components/Command/Command.contract.json +165 -0
  22. package/src/components/ConversationList/ConversationList.contract.json +151 -0
  23. package/src/components/DataTable/DataTable.contract.json +302 -0
  24. package/src/components/DatePicker/DatePicker.contract.json +288 -0
  25. package/src/components/Dialog/Dialog.contract.json +159 -0
  26. package/src/components/Drawer/Drawer.contract.json +160 -0
  27. package/src/components/Editor/Editor.contract.json +263 -0
  28. package/src/components/EmptyState/EmptyState.contract.json +133 -0
  29. package/src/components/Field/Field.contract.json +157 -0
  30. package/src/components/Fieldset/Fieldset.contract.json +117 -0
  31. package/src/components/Form/Form.contract.json +145 -0
  32. package/src/components/Grid/Grid.contract.json +195 -0
  33. package/src/components/Header/Header.contract.json +194 -0
  34. package/src/components/Icon/Icon.contract.json +194 -0
  35. package/src/components/Image/Image.contract.json +209 -0
  36. package/src/components/Input/Input.contract.json +344 -0
  37. package/src/components/Link/Link.contract.json +180 -0
  38. package/src/components/List/List.contract.json +154 -0
  39. package/src/components/Listbox/Listbox.contract.json +158 -0
  40. package/src/components/Loading/Loading.contract.json +167 -0
  41. package/src/components/Markdown/Markdown.contract.json +127 -0
  42. package/src/components/Menu/Menu.contract.json +177 -0
  43. package/src/components/Message/Message.contract.json +183 -0
  44. package/src/components/NavigationMenu/NavigationMenu.contract.json +203 -0
  45. package/src/components/Pagination/Pagination.contract.json +163 -0
  46. package/src/components/Popover/Popover.contract.json +163 -0
  47. package/src/components/Progress/Progress.contract.json +176 -0
  48. package/src/components/Prompt/Prompt.contract.json +211 -0
  49. package/src/components/RadioGroup/RadioGroup.contract.json +226 -0
  50. package/src/components/ScrollArea/ScrollArea.contract.json +131 -0
  51. package/src/components/Select/Select.contract.json +269 -0
  52. package/src/components/Separator/Separator.contract.json +143 -0
  53. package/src/components/Sidebar/Sidebar.contract.json +258 -0
  54. package/src/components/Skeleton/Skeleton.contract.json +166 -0
  55. package/src/components/Slider/Slider.contract.json +248 -0
  56. package/src/components/Stack/Stack.contract.json +220 -0
  57. package/src/components/Table/Table.contract.json +171 -0
  58. package/src/components/TableOfContents/TableOfContents.contract.json +145 -0
  59. package/src/components/Tabs/Tabs.contract.json +159 -0
  60. package/src/components/Text/Text.contract.json +239 -0
  61. package/src/components/Textarea/Textarea.contract.json +308 -0
  62. package/src/components/Theme/Theme.contract.json +152 -0
  63. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +165 -0
  64. package/src/components/Toast/Toast.contract.json +181 -0
  65. package/src/components/Toggle/Toggle.contract.json +231 -0
  66. package/src/components/ToggleGroup/ToggleGroup.contract.json +206 -0
  67. package/src/components/Tooltip/Tooltip.contract.json +214 -0
  68. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +116 -0
  69. package/src/tokens/_derive.scss +4 -1
@@ -0,0 +1,212 @@
1
+ {
2
+ "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
+ "name": "ColorPicker",
4
+ "description": "Color selection control with hex input and visual picker. Displays a swatch that opens a full color picker on click.",
5
+ "category": "forms",
6
+ "tags": [
7
+ "color",
8
+ "picker",
9
+ "input",
10
+ "hex",
11
+ "swatch",
12
+ "theme"
13
+ ],
14
+ "status": "stable",
15
+ "sourcePath": "src/components/ColorPicker/index.tsx",
16
+ "exportName": "ColorPicker",
17
+ "propsSummary": [
18
+ "label: string",
19
+ "value: string",
20
+ "defaultValue: string (default: #000000)",
21
+ "onChange: function",
22
+ "onValueChange: function",
23
+ "helperText: string",
24
+ "description: string",
25
+ "error: boolean (default: false)",
26
+ "disabled: boolean (default: false)",
27
+ "size: sm|md|lg (default: md)",
28
+ "showInput: boolean (default: true)"
29
+ ],
30
+ "props": {
31
+ "label": {
32
+ "type": "string",
33
+ "description": "Label text above the picker",
34
+ "required": false
35
+ },
36
+ "value": {
37
+ "type": "string",
38
+ "description": "Controlled color value in hex format (#RRGGBB)",
39
+ "required": false
40
+ },
41
+ "defaultValue": {
42
+ "type": "string",
43
+ "description": "Default color for uncontrolled usage",
44
+ "default": "#000000",
45
+ "required": false
46
+ },
47
+ "onChange": {
48
+ "type": "function",
49
+ "description": "Called with new color value when changed",
50
+ "required": false
51
+ },
52
+ "onValueChange": {
53
+ "type": "function",
54
+ "description": "Alias for onChange (Radix convention)",
55
+ "required": false
56
+ },
57
+ "helperText": {
58
+ "type": "string",
59
+ "description": "Helper text below the picker (preferred)",
60
+ "required": false
61
+ },
62
+ "description": {
63
+ "type": "string",
64
+ "description": "Deprecated alias for helperText",
65
+ "required": false
66
+ },
67
+ "error": {
68
+ "type": "boolean",
69
+ "description": "Show error styling",
70
+ "default": "false",
71
+ "required": false
72
+ },
73
+ "disabled": {
74
+ "type": "boolean",
75
+ "description": "Disable the color picker",
76
+ "default": "false",
77
+ "required": false
78
+ },
79
+ "size": {
80
+ "type": "enum",
81
+ "description": "Size variant",
82
+ "default": "md",
83
+ "required": false,
84
+ "values": [
85
+ "sm",
86
+ "md",
87
+ "lg"
88
+ ]
89
+ },
90
+ "showInput": {
91
+ "type": "boolean",
92
+ "description": "Show the hex input field",
93
+ "default": "true",
94
+ "required": false
95
+ }
96
+ },
97
+ "usage": {
98
+ "when": [
99
+ "Theme customization interfaces",
100
+ "Brand color selection",
101
+ "Design tool color inputs",
102
+ "User preference settings for colors"
103
+ ],
104
+ "whenNot": [
105
+ "Predefined color options only (use RadioGroup with swatches)",
106
+ "Simple color display without editing (use a colored Badge)",
107
+ "Color indication only (use semantic color tokens)"
108
+ ],
109
+ "guidelines": [
110
+ "Always provide a label to describe what the color is for",
111
+ "Use helperText to explain color usage or constraints",
112
+ "Consider providing color presets alongside the picker for common choices",
113
+ "Validate hex format (#RRGGBB) on input"
114
+ ],
115
+ "accessibility": [
116
+ "Label is associated with the color input",
117
+ "Swatch button has appropriate aria-label",
118
+ "Color picker popup is keyboard accessible",
119
+ "Hex input allows direct text entry"
120
+ ]
121
+ },
122
+ "examples": [
123
+ {
124
+ "name": "Default",
125
+ "description": "Basic color picker with label",
126
+ "code": "<ColorPicker\n label=\"Brand Color\"\n defaultValue=\"#3b82f6\"\n/>"
127
+ },
128
+ {
129
+ "name": "With Helper Text",
130
+ "description": "Color picker with helper text",
131
+ "code": "<ColorPicker\n label=\"Primary Color\"\n defaultValue=\"#10b981\"\n helperText=\"This color will be used for buttons and links\"\n/>"
132
+ },
133
+ {
134
+ "name": "Controlled",
135
+ "description": "Controlled color picker that logs changes",
136
+ "code": "<ControlledColorPickerDemo />"
137
+ },
138
+ {
139
+ "name": "Multiple Pickers",
140
+ "description": "Multiple color pickers for theme configuration",
141
+ "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', maxWidth: '240px' }}>\n <ColorPicker label=\"Primary\" defaultValue=\"#3b82f6\" />\n <ColorPicker label=\"Success\" defaultValue=\"#22c55e\" />\n <ColorPicker label=\"Warning\" defaultValue=\"#f59e0b\" />\n <ColorPicker label=\"Danger\" defaultValue=\"#ef4444\" />\n</div>"
142
+ },
143
+ {
144
+ "name": "Compact",
145
+ "description": "Small size with swatch only (no input)",
146
+ "code": "<div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <ColorPicker defaultValue=\"#ef4444\" size=\"sm\" showInput={false} />\n <ColorPicker defaultValue=\"#f59e0b\" size=\"sm\" showInput={false} />\n <ColorPicker defaultValue=\"#22c55e\" size=\"sm\" showInput={false} />\n <ColorPicker defaultValue=\"#3b82f6\" size=\"sm\" showInput={false} />\n</div>"
147
+ },
148
+ {
149
+ "name": "Sizes",
150
+ "description": "Different size variants",
151
+ "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', maxWidth: '240px' }}>\n <ColorPicker label=\"Small\" defaultValue=\"#3b82f6\" size=\"sm\" />\n <ColorPicker label=\"Medium (default)\" defaultValue=\"#3b82f6\" size=\"md\" />\n <ColorPicker label=\"Large\" defaultValue=\"#3b82f6\" size=\"lg\" />\n</div>"
152
+ },
153
+ {
154
+ "name": "Error State",
155
+ "description": "Color picker with error styling",
156
+ "code": "<ColorPicker\n label=\"Brand Color\"\n defaultValue=\"#000000\"\n error\n helperText=\"Please select a valid brand color\"\n/>"
157
+ },
158
+ {
159
+ "name": "Disabled",
160
+ "description": "Disabled color picker",
161
+ "code": "<ColorPicker\n label=\"Locked Color\"\n defaultValue=\"#64748b\"\n helperText=\"This color cannot be changed\"\n disabled\n/>"
162
+ }
163
+ ],
164
+ "relations": [
165
+ {
166
+ "component": "Input",
167
+ "relationship": "sibling",
168
+ "note": "ColorPicker is a specialized input for colors"
169
+ },
170
+ {
171
+ "component": "RadioGroup",
172
+ "relationship": "alternative",
173
+ "note": "Use RadioGroup for predefined color choices"
174
+ },
175
+ {
176
+ "component": "Field",
177
+ "relationship": "parent",
178
+ "note": "ColorPicker uses Field internally for structure"
179
+ }
180
+ ],
181
+ "contract": {
182
+ "propsSummary": [
183
+ "value: string - controlled hex color (#RRGGBB)",
184
+ "defaultValue: string - initial color for uncontrolled usage",
185
+ "onChange: (color: string) => void - change handler",
186
+ "label: string - field label",
187
+ "helperText: string - helper text (preferred)",
188
+ "description: string - deprecated alias for helperText",
189
+ "error: boolean - error styling",
190
+ "disabled: boolean - disable interaction",
191
+ "size: sm|md|lg - size variant",
192
+ "showInput: boolean - show hex input field"
193
+ ],
194
+ "a11yRules": [
195
+ "A11Y_LABEL_REQUIRED",
196
+ "A11Y_FOCUS_VISIBLE",
197
+ "A11Y_TARGET_SIZE_MIN"
198
+ ]
199
+ },
200
+ "ai": {
201
+ "compositionPattern": "compound",
202
+ "subComponents": [
203
+ "Root"
204
+ ]
205
+ },
206
+ "provenance": {
207
+ "source": "migrated",
208
+ "verified": false,
209
+ "frameworkSupport": "native",
210
+ "extractedAt": "2026-03-13T23:18:53.238Z"
211
+ }
212
+ }
@@ -0,0 +1,297 @@
1
+ {
2
+ "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
+ "name": "Combobox",
4
+ "description": "Searchable select input that filters a dropdown list of options as you type. Supports single and multiple selection with chips.",
5
+ "category": "forms",
6
+ "tags": [
7
+ "combobox",
8
+ "autocomplete",
9
+ "search",
10
+ "select",
11
+ "typeahead",
12
+ "form",
13
+ "multiselect"
14
+ ],
15
+ "status": "stable",
16
+ "sourcePath": "src/components/Combobox/index.tsx",
17
+ "exportName": "Combobox",
18
+ "propsSummary": [
19
+ "multiple: boolean (default: false)",
20
+ "value: union",
21
+ "defaultValue: union",
22
+ "onValueChange: union",
23
+ "onChange: union",
24
+ "children: node (required)",
25
+ "open: boolean",
26
+ "defaultOpen: boolean",
27
+ "onOpenChange: function",
28
+ "required: boolean",
29
+ "name: string",
30
+ "placeholder: string",
31
+ "autoHighlight: boolean (default: true)",
32
+ "size: sm|md|lg (default: md)",
33
+ "className: string",
34
+ "label: string",
35
+ "helperText: string",
36
+ "error: union",
37
+ "disabled: boolean"
38
+ ],
39
+ "props": {
40
+ "multiple": {
41
+ "type": "boolean",
42
+ "description": "Allow multiple selections with chips",
43
+ "default": "false",
44
+ "required": false
45
+ },
46
+ "value": {
47
+ "type": "union",
48
+ "description": "Controlled selected value (string for single, string[] for multiple)",
49
+ "required": false
50
+ },
51
+ "defaultValue": {
52
+ "type": "union",
53
+ "description": "Default selected value (uncontrolled)",
54
+ "required": false
55
+ },
56
+ "onValueChange": {
57
+ "type": "union",
58
+ "description": "Called when selection changes",
59
+ "required": false
60
+ },
61
+ "onChange": {
62
+ "type": "union",
63
+ "description": "Alias for onValueChange",
64
+ "required": false
65
+ },
66
+ "children": {
67
+ "type": "node",
68
+ "description": "Combobox input and content",
69
+ "required": true
70
+ },
71
+ "open": {
72
+ "type": "boolean",
73
+ "description": "Controlled open state of the dropdown",
74
+ "required": false
75
+ },
76
+ "defaultOpen": {
77
+ "type": "boolean",
78
+ "description": "Initial open state for uncontrolled usage",
79
+ "default": "false",
80
+ "required": false
81
+ },
82
+ "onOpenChange": {
83
+ "type": "function",
84
+ "description": "Called when dropdown open state changes",
85
+ "required": false
86
+ },
87
+ "required": {
88
+ "type": "boolean",
89
+ "description": "",
90
+ "required": false
91
+ },
92
+ "name": {
93
+ "type": "string",
94
+ "description": "",
95
+ "required": false
96
+ },
97
+ "placeholder": {
98
+ "type": "string",
99
+ "description": "Placeholder text for the input",
100
+ "required": false
101
+ },
102
+ "autoHighlight": {
103
+ "type": "boolean",
104
+ "description": "Auto-highlight first matching item while filtering",
105
+ "default": "true",
106
+ "required": false
107
+ },
108
+ "size": {
109
+ "type": "enum",
110
+ "description": "Size variant",
111
+ "default": "md",
112
+ "required": false,
113
+ "values": [
114
+ "sm",
115
+ "md",
116
+ "lg"
117
+ ]
118
+ },
119
+ "className": {
120
+ "type": "string",
121
+ "description": "Wrapper class name",
122
+ "required": false
123
+ },
124
+ "label": {
125
+ "type": "string",
126
+ "description": "Visible label text above the combobox",
127
+ "required": false
128
+ },
129
+ "helperText": {
130
+ "type": "string",
131
+ "description": "Helper text shown below the combobox",
132
+ "required": false
133
+ },
134
+ "error": {
135
+ "type": "union",
136
+ "description": "Show error styling. When a string is provided, it is displayed as an error message.",
137
+ "required": false
138
+ },
139
+ "disabled": {
140
+ "type": "boolean",
141
+ "description": "Disable the combobox",
142
+ "default": "false",
143
+ "required": false
144
+ }
145
+ },
146
+ "usage": {
147
+ "when": [
148
+ "Users need to search/filter through many options",
149
+ "Large option lists where scrolling is impractical",
150
+ "When users might know what they are looking for",
151
+ "Autocomplete or typeahead functionality",
152
+ "Multiple selections from a searchable list"
153
+ ],
154
+ "whenNot": [
155
+ "Few options (under 5) - use Select or RadioGroup",
156
+ "Free-form text with no predefined options - use Input",
157
+ "Non-searchable single selection - use Select",
158
+ "Actions, not selection - use Menu"
159
+ ],
160
+ "guidelines": [
161
+ "Include a placeholder that explains what to search for",
162
+ "Use label prop for accessible field labeling",
163
+ "Use helperText for guidance and error for validation messages",
164
+ "Provide an empty state message when no results match",
165
+ "Group related options with Combobox.Group for large lists",
166
+ "Keep option text concise and searchable",
167
+ "Use multiple prop for multi-select with chip display"
168
+ ],
169
+ "accessibility": [
170
+ "Full keyboard navigation support (arrow keys, enter, escape)",
171
+ "Type-ahead filtering within options",
172
+ "Proper ARIA combobox roles and attributes",
173
+ "Screen reader announcements for filtered results",
174
+ "Chip removal via keyboard in multi-select mode"
175
+ ]
176
+ },
177
+ "examples": [
178
+ {
179
+ "name": "Default",
180
+ "description": "Basic searchable select",
181
+ "code": "<StatefulCombobox placeholder=\"Select a fruit\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"apple\">Apple</Combobox.Item>\n <Combobox.Item value=\"banana\">Banana</Combobox.Item>\n <Combobox.Item value=\"orange\">Orange</Combobox.Item>\n <Combobox.Item value=\"grape\">Grape</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
182
+ },
183
+ {
184
+ "name": "Multiple Selection",
185
+ "description": "Multi-select with chips",
186
+ "code": "<StatefulCombobox multiple placeholder=\"Select fruits...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"apple\">Apple</Combobox.Item>\n <Combobox.Item value=\"banana\">Banana</Combobox.Item>\n <Combobox.Item value=\"orange\">Orange</Combobox.Item>\n <Combobox.Item value=\"grape\">Grape</Combobox.Item>\n <Combobox.Item value=\"mango\">Mango</Combobox.Item>\n <Combobox.Item value=\"kiwi\">Kiwi</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
187
+ },
188
+ {
189
+ "name": "With Label and Helper Text",
190
+ "description": "Combobox with built-in label and helper text",
191
+ "code": "<StatefulCombobox\n label=\"Assignee\"\n placeholder=\"Search assignees...\"\n helperText=\"Type to filter the list of available assignees.\"\n>\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Empty>No matches</Combobox.Empty>\n <Combobox.Item value=\"alice\">Alice Johnson</Combobox.Item>\n <Combobox.Item value=\"bob\">Bob Chen</Combobox.Item>\n <Combobox.Item value=\"carol\">Carol Smith</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
192
+ },
193
+ {
194
+ "name": "Error State",
195
+ "description": "Validation error with message",
196
+ "code": "<Combobox\n label=\"Reviewer\"\n placeholder=\"Search reviewers...\"\n error=\"Please select a reviewer\"\n disabled\n>\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"alice\">Alice</Combobox.Item>\n </Combobox.Content>\n</Combobox>"
197
+ },
198
+ {
199
+ "name": "With Groups",
200
+ "description": "Options organized into groups",
201
+ "code": "<StatefulCombobox placeholder=\"Search countries...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Group>\n <Combobox.GroupLabel>North America</Combobox.GroupLabel>\n <Combobox.Item value=\"us\">United States</Combobox.Item>\n <Combobox.Item value=\"ca\">Canada</Combobox.Item>\n <Combobox.Item value=\"mx\">Mexico</Combobox.Item>\n </Combobox.Group>\n <Combobox.Group>\n <Combobox.GroupLabel>Europe</Combobox.GroupLabel>\n <Combobox.Item value=\"uk\">United Kingdom</Combobox.Item>\n <Combobox.Item value=\"de\">Germany</Combobox.Item>\n <Combobox.Item value=\"fr\">France</Combobox.Item>\n </Combobox.Group>\n </Combobox.Content>\n</StatefulCombobox>"
202
+ },
203
+ {
204
+ "name": "With Empty State",
205
+ "description": "Shows message when no results match",
206
+ "code": "<StatefulCombobox placeholder=\"Search programming languages...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Empty>No results found</Combobox.Empty>\n <Combobox.Item value=\"js\">JavaScript</Combobox.Item>\n <Combobox.Item value=\"ts\">TypeScript</Combobox.Item>\n <Combobox.Item value=\"py\">Python</Combobox.Item>\n <Combobox.Item value=\"rs\">Rust</Combobox.Item>\n <Combobox.Item value=\"go\">Go</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
207
+ },
208
+ {
209
+ "name": "Scrollable List",
210
+ "description": "Long list with scroll hint — shows 4 items with half-peek of the 5th",
211
+ "code": "<StatefulCombobox placeholder=\"Search languages...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Empty>No results found</Combobox.Empty>\n <Combobox.Item value=\"js\">JavaScript</Combobox.Item>\n <Combobox.Item value=\"ts\">TypeScript</Combobox.Item>\n <Combobox.Item value=\"py\">Python</Combobox.Item>\n <Combobox.Item value=\"rs\">Rust</Combobox.Item>\n <Combobox.Item value=\"go\">Go</Combobox.Item>\n <Combobox.Item value=\"rb\">Ruby</Combobox.Item>\n <Combobox.Item value=\"java\">Java</Combobox.Item>\n <Combobox.Item value=\"swift\">Swift</Combobox.Item>\n <Combobox.Item value=\"kt\">Kotlin</Combobox.Item>\n <Combobox.Item value=\"cpp\">C++</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
212
+ },
213
+ {
214
+ "name": "Custom Max Visible Items",
215
+ "description": "Show 6 items before scrolling with half-peek scroll hint",
216
+ "code": "<StatefulCombobox placeholder=\"Search cities...\">\n <Combobox.Input />\n <Combobox.Content maxVisibleItems={6}>\n <Combobox.Empty>No results found</Combobox.Empty>\n <Combobox.Item value=\"nyc\">New York</Combobox.Item>\n <Combobox.Item value=\"lon\">London</Combobox.Item>\n <Combobox.Item value=\"tok\">Tokyo</Combobox.Item>\n <Combobox.Item value=\"par\">Paris</Combobox.Item>\n <Combobox.Item value=\"syd\">Sydney</Combobox.Item>\n <Combobox.Item value=\"ber\">Berlin</Combobox.Item>\n <Combobox.Item value=\"tor\">Toronto</Combobox.Item>\n <Combobox.Item value=\"sin\">Singapore</Combobox.Item>\n <Combobox.Item value=\"dub\">Dubai</Combobox.Item>\n <Combobox.Item value=\"sao\">São Paulo</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
217
+ },
218
+ {
219
+ "name": "Disabled",
220
+ "description": "Disabled combobox",
221
+ "code": "<Combobox disabled placeholder=\"Search...\">\n <Combobox.Input />\n <Combobox.Content>\n <Combobox.Item value=\"1\">Option 1</Combobox.Item>\n </Combobox.Content>\n</Combobox>"
222
+ },
223
+ {
224
+ "name": "Explicit Trigger",
225
+ "description": "Hide the built-in input trigger when rendering a separate Combobox.Trigger",
226
+ "code": "<StatefulCombobox placeholder=\"Search assignees...\">\n <Combobox.Input showTrigger={false} />\n <Combobox.Trigger aria-label=\"Open assignee list\" />\n <Combobox.Content>\n <Combobox.Item value=\"alice\">Alice</Combobox.Item>\n <Combobox.Item value=\"bob\">Bob</Combobox.Item>\n <Combobox.Item value=\"carol\">Carol</Combobox.Item>\n </Combobox.Content>\n</StatefulCombobox>"
227
+ }
228
+ ],
229
+ "relations": [
230
+ {
231
+ "component": "Select",
232
+ "relationship": "alternative",
233
+ "note": "Use Select when search/filtering is not needed"
234
+ },
235
+ {
236
+ "component": "Input",
237
+ "relationship": "sibling",
238
+ "note": "Use Input for free-form text entry"
239
+ },
240
+ {
241
+ "component": "Listbox",
242
+ "relationship": "sibling",
243
+ "note": "Use Listbox for inline option lists"
244
+ }
245
+ ],
246
+ "contract": {
247
+ "propsSummary": [
248
+ "value: string | string[] - controlled selected value",
249
+ "onValueChange: (value) => void - selection handler",
250
+ "onChange: (value) => void - alias for onValueChange",
251
+ "multiple: boolean - enable multi-select with chips",
252
+ "When multiple=true, value/defaultValue must be string[] (single mode uses string|null)",
253
+ "placeholder: string - input placeholder text",
254
+ "label: string - visible label text",
255
+ "helperText: string - helper text below field",
256
+ "error: boolean | string - error styling and message",
257
+ "disabled: boolean - disable combobox",
258
+ "size: sm|md|lg (default: md)",
259
+ "autoHighlight: boolean - auto-highlight first match",
260
+ "Combobox.Input showTrigger: boolean - hide built-in trigger when using Combobox.Trigger explicitly",
261
+ "maxVisibleItems: number - max visible options before scrolling (default 4)"
262
+ ],
263
+ "a11yRules": [
264
+ "A11Y_COMBOBOX_KEYBOARD",
265
+ "A11Y_COMBOBOX_LABEL",
266
+ "A11Y_TARGET_SIZE_MIN"
267
+ ]
268
+ },
269
+ "ai": {
270
+ "compositionPattern": "compound",
271
+ "subComponents": [
272
+ "Input",
273
+ "Trigger",
274
+ "Content",
275
+ "Item",
276
+ "ItemIndicator",
277
+ "Empty",
278
+ "Group",
279
+ "GroupLabel"
280
+ ],
281
+ "requiredChildren": [
282
+ "Input",
283
+ "Content"
284
+ ],
285
+ "commonPatterns": [
286
+ "<Combobox placeholder=\"Search...\"><Combobox.Input /><Combobox.Content><Combobox.Item value=\"opt1\">{label1}</Combobox.Item><Combobox.Item value=\"opt2\">{label2}</Combobox.Item></Combobox.Content></Combobox>",
287
+ "<Combobox multiple placeholder=\"Select items...\"><Combobox.Input /><Combobox.Content><Combobox.Item value=\"opt1\">{label1}</Combobox.Item><Combobox.Item value=\"opt2\">{label2}</Combobox.Item></Combobox.Content></Combobox>",
288
+ "<Combobox placeholder=\"Search...\"><Combobox.Input showTrigger={false} /><Combobox.Trigger aria-label=\"Open\" /><Combobox.Content>...</Combobox.Content></Combobox>"
289
+ ]
290
+ },
291
+ "provenance": {
292
+ "source": "migrated",
293
+ "verified": false,
294
+ "frameworkSupport": "native",
295
+ "extractedAt": "2026-03-13T23:18:53.524Z"
296
+ }
297
+ }