@urbint/cl 1.0.1

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 (206) hide show
  1. package/.cursor/rules +313 -0
  2. package/.rnstorybook/index.ts +11 -0
  3. package/.rnstorybook/main.ts +8 -0
  4. package/.rnstorybook/preview.tsx +14 -0
  5. package/.rnstorybook/storybook.requires.ts +49 -0
  6. package/.storybook/main.ts +16 -0
  7. package/.storybook/preview.ts +32 -0
  8. package/.storybook/vitest.setup.ts +7 -0
  9. package/App.tsx +422 -0
  10. package/README.md +229 -0
  11. package/app.json +33 -0
  12. package/assets/adaptive-icon.png +0 -0
  13. package/assets/favicon.png +0 -0
  14. package/assets/icon.png +0 -0
  15. package/assets/splash-icon.png +0 -0
  16. package/babel.config.js +16 -0
  17. package/docs/components/CodeBlock.tsx +80 -0
  18. package/docs/components/PropTable.tsx +93 -0
  19. package/docs/components/Sidebar.tsx +199 -0
  20. package/docs/components/index.ts +8 -0
  21. package/docs/data/colorTokens.ts +70 -0
  22. package/docs/data/componentData.tsx +1685 -0
  23. package/docs/data/index.ts +7 -0
  24. package/docs/index.ts +19 -0
  25. package/docs/navigation.ts +94 -0
  26. package/docs/pages/ColorsPage.tsx +226 -0
  27. package/docs/pages/ComponentPage.tsx +235 -0
  28. package/docs/pages/InstallationPage.tsx +232 -0
  29. package/docs/pages/IntroductionPage.tsx +163 -0
  30. package/docs/pages/ThemingPage.tsx +251 -0
  31. package/docs/pages/index.ts +10 -0
  32. package/docs/theme.ts +64 -0
  33. package/docs/types.ts +54 -0
  34. package/index.ts +8 -0
  35. package/llms.txt +1893 -0
  36. package/mcp-config.example.json +10 -0
  37. package/mcp-server/README.md +192 -0
  38. package/mcp-server/package-lock.json +1707 -0
  39. package/mcp-server/package.json +38 -0
  40. package/mcp-server/src/index.ts +1136 -0
  41. package/mcp-server/src/registry/components.ts +1446 -0
  42. package/mcp-server/src/registry/index.ts +3 -0
  43. package/mcp-server/src/registry/tokens.ts +256 -0
  44. package/mcp-server/tsconfig.json +19 -0
  45. package/package.json +92 -0
  46. package/src/components/Accordion/Accordion.stories.tsx +226 -0
  47. package/src/components/Accordion/Accordion.tsx +255 -0
  48. package/src/components/Accordion/index.ts +12 -0
  49. package/src/components/ActionSheet/ActionSheet.stories.tsx +393 -0
  50. package/src/components/ActionSheet/ActionSheet.tsx +258 -0
  51. package/src/components/ActionSheet/index.ts +2 -0
  52. package/src/components/Alert/Alert.stories.tsx +165 -0
  53. package/src/components/Alert/Alert.tsx +164 -0
  54. package/src/components/Alert/index.ts +2 -0
  55. package/src/components/AlertDialog/AlertDialog.stories.tsx +330 -0
  56. package/src/components/AlertDialog/AlertDialog.tsx +234 -0
  57. package/src/components/AlertDialog/index.ts +2 -0
  58. package/src/components/Avatar/Avatar.stories.tsx +154 -0
  59. package/src/components/Avatar/Avatar.tsx +219 -0
  60. package/src/components/Avatar/index.ts +2 -0
  61. package/src/components/Badge/Badge.stories.tsx +146 -0
  62. package/src/components/Badge/Badge.tsx +125 -0
  63. package/src/components/Badge/index.ts +2 -0
  64. package/src/components/Box/Box.stories.tsx +192 -0
  65. package/src/components/Box/Box.tsx +184 -0
  66. package/src/components/Box/index.ts +2 -0
  67. package/src/components/Button/Button.stories.tsx +157 -0
  68. package/src/components/Button/Button.tsx +180 -0
  69. package/src/components/Button/index.ts +2 -0
  70. package/src/components/Card/Card.stories.tsx +145 -0
  71. package/src/components/Card/Card.tsx +169 -0
  72. package/src/components/Card/index.ts +11 -0
  73. package/src/components/Center/Center.stories.tsx +215 -0
  74. package/src/components/Center/Center.tsx +29 -0
  75. package/src/components/Center/index.ts +2 -0
  76. package/src/components/Checkbox/Checkbox.stories.tsx +94 -0
  77. package/src/components/Checkbox/Checkbox.tsx +242 -0
  78. package/src/components/Checkbox/index.ts +2 -0
  79. package/src/components/DatePicker/DatePicker.stories.tsx +623 -0
  80. package/src/components/DatePicker/DatePicker.tsx +1228 -0
  81. package/src/components/DatePicker/index.ts +8 -0
  82. package/src/components/Divider/Divider.stories.tsx +224 -0
  83. package/src/components/Divider/Divider.tsx +73 -0
  84. package/src/components/Divider/index.ts +2 -0
  85. package/src/components/Drawer/Drawer.stories.tsx +414 -0
  86. package/src/components/Drawer/Drawer.tsx +342 -0
  87. package/src/components/Drawer/index.ts +11 -0
  88. package/src/components/Fab/Fab.stories.tsx +360 -0
  89. package/src/components/Fab/Fab.tsx +185 -0
  90. package/src/components/Fab/index.ts +2 -0
  91. package/src/components/FormControl/FormControl.stories.tsx +276 -0
  92. package/src/components/FormControl/FormControl.tsx +185 -0
  93. package/src/components/FormControl/index.ts +12 -0
  94. package/src/components/Grid/Grid.stories.tsx +244 -0
  95. package/src/components/Grid/Grid.tsx +93 -0
  96. package/src/components/Grid/index.ts +2 -0
  97. package/src/components/HStack/HStack.stories.tsx +230 -0
  98. package/src/components/HStack/HStack.tsx +80 -0
  99. package/src/components/HStack/index.ts +2 -0
  100. package/src/components/Heading/Heading.stories.tsx +111 -0
  101. package/src/components/Heading/Heading.tsx +85 -0
  102. package/src/components/Heading/index.ts +2 -0
  103. package/src/components/Icon/Icon.stories.tsx +320 -0
  104. package/src/components/Icon/Icon.tsx +117 -0
  105. package/src/components/Icon/index.ts +2 -0
  106. package/src/components/Image/Image.stories.tsx +357 -0
  107. package/src/components/Image/Image.tsx +168 -0
  108. package/src/components/Image/index.ts +2 -0
  109. package/src/components/Input/Input.stories.tsx +164 -0
  110. package/src/components/Input/Input.tsx +274 -0
  111. package/src/components/Input/index.ts +2 -0
  112. package/src/components/Link/Link.stories.tsx +187 -0
  113. package/src/components/Link/Link.tsx +104 -0
  114. package/src/components/Link/index.ts +2 -0
  115. package/src/components/Menu/Menu.stories.tsx +363 -0
  116. package/src/components/Menu/Menu.tsx +238 -0
  117. package/src/components/Menu/index.ts +2 -0
  118. package/src/components/Modal/Modal.stories.tsx +156 -0
  119. package/src/components/Modal/Modal.tsx +280 -0
  120. package/src/components/Modal/index.ts +11 -0
  121. package/src/components/Popover/Popover.stories.tsx +330 -0
  122. package/src/components/Popover/Popover.tsx +315 -0
  123. package/src/components/Popover/index.ts +11 -0
  124. package/src/components/Portal/Portal.stories.tsx +376 -0
  125. package/src/components/Portal/Portal.tsx +100 -0
  126. package/src/components/Portal/index.ts +2 -0
  127. package/src/components/Pressable/Pressable.stories.tsx +338 -0
  128. package/src/components/Pressable/Pressable.tsx +71 -0
  129. package/src/components/Pressable/index.ts +2 -0
  130. package/src/components/Progress/Progress.stories.tsx +131 -0
  131. package/src/components/Progress/Progress.tsx +219 -0
  132. package/src/components/Progress/index.ts +2 -0
  133. package/src/components/Radio/Radio.stories.tsx +101 -0
  134. package/src/components/Radio/Radio.tsx +234 -0
  135. package/src/components/Radio/index.ts +2 -0
  136. package/src/components/Select/Select.stories.tsx +908 -0
  137. package/src/components/Select/Select.tsx +659 -0
  138. package/src/components/Select/index.ts +8 -0
  139. package/src/components/Skeleton/Skeleton.stories.tsx +154 -0
  140. package/src/components/Skeleton/Skeleton.tsx +192 -0
  141. package/src/components/Skeleton/index.ts +8 -0
  142. package/src/components/Slider/Slider.stories.tsx +363 -0
  143. package/src/components/Slider/Slider.tsx +209 -0
  144. package/src/components/Slider/index.ts +2 -0
  145. package/src/components/Spinner/Spinner.stories.tsx +108 -0
  146. package/src/components/Spinner/Spinner.tsx +121 -0
  147. package/src/components/Spinner/index.ts +2 -0
  148. package/src/components/Switch/Switch.stories.tsx +116 -0
  149. package/src/components/Switch/Switch.tsx +172 -0
  150. package/src/components/Switch/index.ts +2 -0
  151. package/src/components/Table/Table.stories.tsx +417 -0
  152. package/src/components/Table/Table.tsx +233 -0
  153. package/src/components/Table/index.ts +2 -0
  154. package/src/components/Text/Text.stories.tsx +93 -0
  155. package/src/components/Text/Text.tsx +119 -0
  156. package/src/components/Text/index.ts +2 -0
  157. package/src/components/Textarea/Textarea.stories.tsx +280 -0
  158. package/src/components/Textarea/Textarea.tsx +212 -0
  159. package/src/components/Textarea/index.ts +2 -0
  160. package/src/components/Toast/Toast.stories.tsx +446 -0
  161. package/src/components/Toast/Toast.tsx +221 -0
  162. package/src/components/Toast/index.ts +2 -0
  163. package/src/components/Tooltip/Tooltip.stories.tsx +354 -0
  164. package/src/components/Tooltip/Tooltip.tsx +261 -0
  165. package/src/components/Tooltip/index.ts +2 -0
  166. package/src/components/VStack/VStack.stories.tsx +183 -0
  167. package/src/components/VStack/VStack.tsx +76 -0
  168. package/src/components/VStack/index.ts +2 -0
  169. package/src/components/index.ts +62 -0
  170. package/src/hooks/index.ts +7 -0
  171. package/src/hooks/useControllableState.ts +41 -0
  172. package/src/hooks/useDisclosure.ts +51 -0
  173. package/src/index.ts +22 -0
  174. package/src/stories/Button.stories.tsx +53 -0
  175. package/src/stories/Button.tsx +101 -0
  176. package/src/stories/Configure.mdx +364 -0
  177. package/src/stories/Header.stories.tsx +33 -0
  178. package/src/stories/Header.tsx +75 -0
  179. package/src/stories/Page.stories.tsx +25 -0
  180. package/src/stories/Page.tsx +154 -0
  181. package/src/stories/assets/accessibility.png +0 -0
  182. package/src/stories/assets/accessibility.svg +1 -0
  183. package/src/stories/assets/addon-library.png +0 -0
  184. package/src/stories/assets/assets.png +0 -0
  185. package/src/stories/assets/avif-test-image.avif +0 -0
  186. package/src/stories/assets/context.png +0 -0
  187. package/src/stories/assets/discord.svg +1 -0
  188. package/src/stories/assets/docs.png +0 -0
  189. package/src/stories/assets/figma-plugin.png +0 -0
  190. package/src/stories/assets/github.svg +1 -0
  191. package/src/stories/assets/share.png +0 -0
  192. package/src/stories/assets/styling.png +0 -0
  193. package/src/stories/assets/testing.png +0 -0
  194. package/src/stories/assets/theming.png +0 -0
  195. package/src/stories/assets/tutorials.svg +1 -0
  196. package/src/stories/assets/youtube.svg +1 -0
  197. package/src/styles/index.ts +7 -0
  198. package/src/styles/tokens.ts +318 -0
  199. package/src/styles/unistyles.ts +254 -0
  200. package/src/utils/createContext.tsx +25 -0
  201. package/src/utils/index.ts +7 -0
  202. package/src/utils/mergeRefs.ts +21 -0
  203. package/tsconfig.json +26 -0
  204. package/urbint-cl-1.0.0.tgz +0 -0
  205. package/vitest.config.ts +37 -0
  206. package/vitest.shims.d.ts +1 -0
@@ -0,0 +1,1446 @@
1
+ /**
2
+ * Urbint Component Library - Component Registry
3
+ * Complete metadata for all components in the design system
4
+ */
5
+
6
+ export interface ComponentProp {
7
+ name: string;
8
+ type: string;
9
+ required: boolean;
10
+ default?: string;
11
+ description: string;
12
+ }
13
+
14
+ export interface ComponentExample {
15
+ title: string;
16
+ description?: string;
17
+ code: string;
18
+ }
19
+
20
+ export interface ComponentMetadata {
21
+ name: string;
22
+ displayName: string;
23
+ description: string;
24
+ category: 'layout' | 'typography' | 'form' | 'feedback' | 'data-display' | 'overlay' | 'action' | 'utility';
25
+ importPath: string;
26
+ props: ComponentProp[];
27
+ examples: ComponentExample[];
28
+ relatedComponents?: string[];
29
+ tags: string[];
30
+ }
31
+
32
+ export const componentRegistry: ComponentMetadata[] = [
33
+ // ===== LAYOUT COMPONENTS =====
34
+ {
35
+ name: 'Box',
36
+ displayName: 'Box',
37
+ description: 'The most fundamental layout component. A polymorphic container with style props for padding, margin, colors, shadows, and flexbox.',
38
+ category: 'layout',
39
+ importPath: "import { Box } from '@urbint/cl';",
40
+ props: [
41
+ { name: 'p', type: "SpacingToken | number", required: false, description: "Padding all sides ('xs', 'sm', 'md', 'lg', 'xl', '2xl', etc.)" },
42
+ { name: 'px', type: "SpacingToken | number", required: false, description: 'Horizontal padding' },
43
+ { name: 'py', type: "SpacingToken | number", required: false, description: 'Vertical padding' },
44
+ { name: 'pt', type: "SpacingToken | number", required: false, description: 'Padding top' },
45
+ { name: 'pb', type: "SpacingToken | number", required: false, description: 'Padding bottom' },
46
+ { name: 'pl', type: "SpacingToken | number", required: false, description: 'Padding left' },
47
+ { name: 'pr', type: "SpacingToken | number", required: false, description: 'Padding right' },
48
+ { name: 'm', type: "SpacingToken | number", required: false, description: 'Margin all sides' },
49
+ { name: 'mx', type: "SpacingToken | number", required: false, description: 'Horizontal margin' },
50
+ { name: 'my', type: "SpacingToken | number", required: false, description: 'Vertical margin' },
51
+ { name: 'gap', type: "SpacingToken | number", required: false, description: 'Gap between children' },
52
+ { name: 'bg', type: 'string', required: false, description: 'Background color' },
53
+ { name: 'rounded', type: "'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'", required: false, description: 'Border radius' },
54
+ { name: 'shadow', type: "'5' | '10' | '20' | '30' | '40'", required: false, description: 'Shadow elevation' },
55
+ { name: 'w', type: 'number | string', required: false, description: 'Width' },
56
+ { name: 'h', type: 'number | string', required: false, description: 'Height' },
57
+ { name: 'flex', type: 'number', required: false, description: 'Flex value' },
58
+ { name: 'flexDirection', type: "'row' | 'column'", required: false, description: 'Flex direction' },
59
+ { name: 'alignItems', type: 'FlexAlignType', required: false, description: 'Cross-axis alignment' },
60
+ { name: 'justifyContent', type: 'FlexJustify', required: false, description: 'Main-axis alignment' },
61
+ ],
62
+ examples: [
63
+ {
64
+ title: 'Basic Box with Spacing Tokens',
65
+ code: `<Box p="lg" bg="brand.blue" rounded="md" shadow="10">
66
+ <Text color="white">Content</Text>
67
+ </Box>`
68
+ },
69
+ {
70
+ title: 'Flex Container',
71
+ code: `<Box flexDirection="row" gap="md" alignItems="center">
72
+ <Avatar name="John" />
73
+ <Text>John Doe</Text>
74
+ </Box>`
75
+ }
76
+ ],
77
+ relatedComponents: ['VStack', 'HStack', 'Center'],
78
+ tags: ['container', 'layout', 'spacing', 'flexbox']
79
+ },
80
+
81
+ {
82
+ name: 'HStack',
83
+ displayName: 'HStack',
84
+ description: 'Horizontal stack layout that arranges children in a row with consistent spacing.',
85
+ category: 'layout',
86
+ importPath: "import { HStack } from '@urbint/cl';",
87
+ props: [
88
+ { name: 'space', type: "SpacingToken | number", required: false, default: "'none'", description: "Gap between children ('xs', 'sm', 'md', 'lg', 'xl', etc.)" },
89
+ { name: 'alignItems', type: 'FlexAlignType', required: false, default: "'center'", description: 'Cross-axis alignment' },
90
+ { name: 'justifyContent', type: 'FlexJustify', required: false, default: "'flex-start'", description: 'Main-axis alignment' },
91
+ { name: 'wrap', type: 'boolean', required: false, default: 'false', description: 'Allow wrapping to next line' },
92
+ { name: 'reversed', type: 'boolean', required: false, default: 'false', description: 'Reverse order' },
93
+ { name: 'px', type: "SpacingToken | number", required: false, description: 'Horizontal padding' },
94
+ { name: 'py', type: "SpacingToken | number", required: false, description: 'Vertical padding' },
95
+ ],
96
+ examples: [
97
+ {
98
+ title: 'Basic HStack',
99
+ code: `<HStack space="sm" alignItems="center">
100
+ <Avatar name="John" />
101
+ <Text>John Doe</Text>
102
+ </HStack>`
103
+ },
104
+ {
105
+ title: 'Button Row',
106
+ code: `<HStack space="xl" justifyContent="flex-end">
107
+ <Button variant="ghost">Cancel</Button>
108
+ <Button variant="primary">Submit</Button>
109
+ </HStack>`
110
+ }
111
+ ],
112
+ relatedComponents: ['VStack', 'Box', 'Center'],
113
+ tags: ['horizontal', 'row', 'stack', 'layout', 'spacing']
114
+ },
115
+
116
+ {
117
+ name: 'VStack',
118
+ displayName: 'VStack',
119
+ description: 'Vertical stack layout that arranges children in a column with consistent spacing.',
120
+ category: 'layout',
121
+ importPath: "import { VStack } from '@urbint/cl';",
122
+ props: [
123
+ { name: 'space', type: "SpacingToken | number", required: false, default: "'none'", description: "Gap between children ('xs', 'sm', 'md', 'lg', 'xl', etc.)" },
124
+ { name: 'alignItems', type: 'FlexAlignType', required: false, default: "'stretch'", description: 'Cross-axis alignment' },
125
+ { name: 'justifyContent', type: 'FlexJustify', required: false, default: "'flex-start'", description: 'Main-axis alignment' },
126
+ { name: 'px', type: "SpacingToken | number", required: false, description: 'Horizontal padding' },
127
+ { name: 'py', type: "SpacingToken | number", required: false, description: 'Vertical padding' },
128
+ ],
129
+ examples: [
130
+ {
131
+ title: 'Form Layout',
132
+ code: `<VStack space="lg">
133
+ <Input label="Email" />
134
+ <Input label="Password" isPassword />
135
+ <Button>Sign In</Button>
136
+ </VStack>`
137
+ },
138
+ {
139
+ title: 'Card Content',
140
+ code: `<VStack space="md">
141
+ <Heading as="h2">Title</Heading>
142
+ <Text>Description text here</Text>
143
+ <Button variant="primary">Action</Button>
144
+ </VStack>`
145
+ }
146
+ ],
147
+ relatedComponents: ['HStack', 'Box', 'Center'],
148
+ tags: ['vertical', 'column', 'stack', 'layout', 'spacing']
149
+ },
150
+
151
+ {
152
+ name: 'Center',
153
+ displayName: 'Center',
154
+ description: 'Centers children both horizontally and vertically.',
155
+ category: 'layout',
156
+ importPath: "import { Center } from '@urbint/cl';",
157
+ props: [
158
+ { name: 'h', type: 'number | string', required: false, description: 'Height of the container' },
159
+ { name: 'w', type: 'number | string', required: false, description: 'Width of the container' },
160
+ ],
161
+ examples: [
162
+ {
163
+ title: 'Centered Spinner',
164
+ code: `<Center h={200}>
165
+ <Spinner />
166
+ </Center>`
167
+ }
168
+ ],
169
+ relatedComponents: ['Box', 'VStack', 'HStack'],
170
+ tags: ['center', 'align', 'layout']
171
+ },
172
+
173
+ {
174
+ name: 'Grid',
175
+ displayName: 'Grid',
176
+ description: 'Grid layout for arranging items in rows and columns.',
177
+ category: 'layout',
178
+ importPath: "import { Grid, GridItem } from '@urbint/cl';",
179
+ props: [
180
+ { name: 'columns', type: 'number', required: false, default: '1', description: 'Number of columns' },
181
+ { name: 'gap', type: "SpacingToken | number", required: false, default: "'none'", description: "Gap between items ('xs', 'sm', 'md', 'lg', etc.)" },
182
+ { name: 'rowGap', type: "SpacingToken | number", required: false, description: 'Gap between rows' },
183
+ { name: 'columnGap', type: "SpacingToken | number", required: false, description: 'Gap between columns' },
184
+ ],
185
+ examples: [
186
+ {
187
+ title: 'Three Column Grid',
188
+ code: `<Grid columns={3} gap="lg">
189
+ <GridItem><Card>1</Card></GridItem>
190
+ <GridItem><Card>2</Card></GridItem>
191
+ <GridItem><Card>3</Card></GridItem>
192
+ </Grid>`
193
+ }
194
+ ],
195
+ relatedComponents: ['Box', 'VStack', 'HStack'],
196
+ tags: ['grid', 'columns', 'layout', 'responsive']
197
+ },
198
+
199
+ {
200
+ name: 'Divider',
201
+ displayName: 'Divider',
202
+ description: 'Visual separator between content sections.',
203
+ category: 'layout',
204
+ importPath: "import { Divider } from '@urbint/cl';",
205
+ props: [
206
+ { name: 'orientation', type: "'horizontal' | 'vertical'", required: false, default: "'horizontal'", description: 'Direction of the divider' },
207
+ { name: 'thickness', type: 'number', required: false, default: '1', description: 'Line thickness in pixels' },
208
+ { name: 'color', type: 'string', required: false, default: 'border.disabled', description: 'Divider color' },
209
+ ],
210
+ examples: [
211
+ {
212
+ title: 'Horizontal Divider',
213
+ code: `<VStack>
214
+ <Text>Above</Text>
215
+ <Divider />
216
+ <Text>Below</Text>
217
+ </VStack>`
218
+ },
219
+ {
220
+ title: 'Vertical Divider',
221
+ code: `<HStack>
222
+ <Text>Left</Text>
223
+ <Divider orientation="vertical" />
224
+ <Text>Right</Text>
225
+ </HStack>`
226
+ }
227
+ ],
228
+ relatedComponents: ['VStack', 'HStack'],
229
+ tags: ['separator', 'line', 'divider']
230
+ },
231
+
232
+ // ===== TYPOGRAPHY COMPONENTS =====
233
+ {
234
+ name: 'Text',
235
+ displayName: 'Text',
236
+ description: 'Primary text component with variants for body, caption, label, and small text.',
237
+ category: 'typography',
238
+ importPath: "import { Text } from '@urbint/cl';",
239
+ props: [
240
+ { name: 'variant', type: "'body' | 'caption' | 'label' | 'small'", required: false, default: "'body'", description: 'Text style variant' },
241
+ { name: 'weight', type: "'regular' | 'medium' | 'semiBold' | 'bold'", required: false, default: "'regular'", description: 'Font weight' },
242
+ { name: 'color', type: 'string', required: false, default: 'text.primary', description: 'Text color' },
243
+ { name: 'align', type: "'left' | 'center' | 'right'", required: false, default: "'left'", description: 'Text alignment' },
244
+ { name: 'numberOfLines', type: 'number', required: false, description: 'Maximum number of lines' },
245
+ ],
246
+ examples: [
247
+ {
248
+ title: 'Text Variants',
249
+ code: `<VStack space="sm">
250
+ <Text variant="body">Regular body text</Text>
251
+ <Text variant="caption" color="text.secondary">Secondary caption</Text>
252
+ <Text variant="label" weight="semiBold">Label text</Text>
253
+ <Text variant="small">Small text</Text>
254
+ </VStack>`
255
+ }
256
+ ],
257
+ relatedComponents: ['Heading', 'Link'],
258
+ tags: ['text', 'typography', 'paragraph', 'body']
259
+ },
260
+
261
+ {
262
+ name: 'Heading',
263
+ displayName: 'Heading',
264
+ description: 'Semantic heading component for titles (h1-h4).',
265
+ category: 'typography',
266
+ importPath: "import { Heading } from '@urbint/cl';",
267
+ props: [
268
+ { name: 'as', type: "'h1' | 'h2' | 'h3' | 'h4'", required: false, default: "'h2'", description: 'Heading level' },
269
+ { name: 'color', type: 'string', required: false, default: 'text.primary', description: 'Heading color' },
270
+ { name: 'align', type: "'left' | 'center' | 'right'", required: false, default: "'left'", description: 'Text alignment' },
271
+ ],
272
+ examples: [
273
+ {
274
+ title: 'Heading Levels',
275
+ code: `<VStack space="md">
276
+ <Heading as="h1">Page Title (h1)</Heading>
277
+ <Heading as="h2">Section Title (h2)</Heading>
278
+ <Heading as="h3">Subsection (h3)</Heading>
279
+ <Heading as="h4">Minor Heading (h4)</Heading>
280
+ </VStack>`
281
+ }
282
+ ],
283
+ relatedComponents: ['Text', 'Link'],
284
+ tags: ['heading', 'title', 'typography', 'h1', 'h2', 'h3', 'h4']
285
+ },
286
+
287
+ {
288
+ name: 'Link',
289
+ displayName: 'Link',
290
+ description: 'Interactive text link for navigation.',
291
+ category: 'typography',
292
+ importPath: "import { Link } from '@urbint/cl';",
293
+ props: [
294
+ { name: 'href', type: 'string', required: false, description: 'URL to navigate to' },
295
+ { name: 'onPress', type: '() => void', required: false, description: 'Press handler for custom navigation' },
296
+ { name: 'isExternal', type: 'boolean', required: false, default: 'false', description: 'Open in new tab/window' },
297
+ { name: 'color', type: 'string', required: false, default: 'brand.blue', description: 'Link color' },
298
+ ],
299
+ examples: [
300
+ {
301
+ title: 'Link Types',
302
+ code: `<VStack space="sm">
303
+ <Link href="/about">Internal Link</Link>
304
+ <Link href="https://example.com" isExternal>External Link</Link>
305
+ <Link onPress={() => navigate('/home')}>Custom Navigation</Link>
306
+ </VStack>`
307
+ }
308
+ ],
309
+ relatedComponents: ['Text', 'Button'],
310
+ tags: ['link', 'navigation', 'anchor', 'url']
311
+ },
312
+
313
+ // ===== FORM COMPONENTS =====
314
+ {
315
+ name: 'Button',
316
+ displayName: 'Button',
317
+ description: 'Primary action component with multiple variants and states.',
318
+ category: 'form',
319
+ importPath: "import { Button } from '@urbint/cl';",
320
+ props: [
321
+ { name: 'variant', type: "'primary' | 'secondary' | 'ghost' | 'danger' | 'outline'", required: false, default: "'primary'", description: 'Button style variant' },
322
+ { name: 'size', type: "'sm' | 'md' | 'lg'", required: false, default: "'md'", description: 'Button size' },
323
+ { name: 'isLoading', type: 'boolean', required: false, default: 'false', description: 'Show loading spinner' },
324
+ { name: 'isDisabled', type: 'boolean', required: false, default: 'false', description: 'Disable the button' },
325
+ { name: 'leftIcon', type: 'ReactNode', required: false, description: 'Icon before text' },
326
+ { name: 'rightIcon', type: 'ReactNode', required: false, description: 'Icon after text' },
327
+ { name: 'onPress', type: '() => void', required: false, description: 'Press handler' },
328
+ ],
329
+ examples: [
330
+ {
331
+ title: 'Button Variants',
332
+ code: `<HStack space="md">
333
+ <Button variant="primary">Primary</Button>
334
+ <Button variant="secondary">Secondary</Button>
335
+ <Button variant="ghost">Ghost</Button>
336
+ <Button variant="danger">Danger</Button>
337
+ <Button variant="outline">Outline</Button>
338
+ </HStack>`
339
+ },
340
+ {
341
+ title: 'Button with Icon',
342
+ code: `<Button leftIcon={<Icon name="plus" />}>
343
+ Add Item
344
+ </Button>`
345
+ },
346
+ {
347
+ title: 'Loading Button',
348
+ code: `<Button isLoading>
349
+ Saving...
350
+ </Button>`
351
+ }
352
+ ],
353
+ relatedComponents: ['Pressable', 'Link', 'Fab'],
354
+ tags: ['button', 'action', 'submit', 'click', 'form']
355
+ },
356
+
357
+ {
358
+ name: 'Input',
359
+ displayName: 'Input',
360
+ description: 'Text input field with label, validation, and icon support.',
361
+ category: 'form',
362
+ importPath: "import { Input } from '@urbint/cl';",
363
+ props: [
364
+ { name: 'label', type: 'string', required: false, description: 'Input label text' },
365
+ { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text' },
366
+ { name: 'value', type: 'string', required: false, description: 'Controlled input value' },
367
+ { name: 'onChange', type: '(value: string) => void', required: false, description: 'Change handler' },
368
+ { name: 'isInvalid', type: 'boolean', required: false, default: 'false', description: 'Show error state' },
369
+ { name: 'errorMessage', type: 'string', required: false, description: 'Error message to display' },
370
+ { name: 'isDisabled', type: 'boolean', required: false, default: 'false', description: 'Disable the input' },
371
+ { name: 'isPassword', type: 'boolean', required: false, default: 'false', description: 'Password input type' },
372
+ { name: 'leftElement', type: 'ReactNode', required: false, description: 'Left icon or element' },
373
+ { name: 'rightElement', type: 'ReactNode', required: false, description: 'Right icon or element' },
374
+ { name: 'showFocusBorder', type: 'boolean', required: false, default: 'false', description: 'Show border highlight on focus' },
375
+ ],
376
+ examples: [
377
+ {
378
+ title: 'Basic Input',
379
+ code: `<Input
380
+ label="Email"
381
+ placeholder="Enter your email"
382
+ value={email}
383
+ onChange={setEmail}
384
+ />`
385
+ },
386
+ {
387
+ title: 'Password Input',
388
+ code: `<Input
389
+ label="Password"
390
+ isPassword
391
+ placeholder="Enter password"
392
+ />`
393
+ },
394
+ {
395
+ title: 'Input with Error',
396
+ code: `<Input
397
+ label="Username"
398
+ isInvalid
399
+ errorMessage="Username is already taken"
400
+ />`
401
+ },
402
+ {
403
+ title: 'Search Input',
404
+ code: `<Input
405
+ leftElement={<Icon name="search" />}
406
+ placeholder="Search..."
407
+ />`
408
+ }
409
+ ],
410
+ relatedComponents: ['Textarea', 'FormControl', 'Select'],
411
+ tags: ['input', 'text', 'form', 'field', 'textfield']
412
+ },
413
+
414
+ {
415
+ name: 'Select',
416
+ displayName: 'Select',
417
+ description: 'Dropdown selection with single/multi-select and searchable modes.',
418
+ category: 'form',
419
+ importPath: "import { Select } from '@urbint/cl';",
420
+ props: [
421
+ { name: 'label', type: 'string', required: false, description: 'Select label' },
422
+ { name: 'placeholder', type: 'string', required: false, default: "'Select an option'", description: 'Placeholder text' },
423
+ { name: 'options', type: 'SelectOption[]', required: true, description: 'Array of options' },
424
+ { name: 'value', type: 'string | string[]', required: false, description: 'Selected value(s)' },
425
+ { name: 'defaultValue', type: 'string | string[]', required: false, description: 'Default selected value(s)' },
426
+ { name: 'onChange', type: '(value: string | string[]) => void', required: false, description: 'Change handler' },
427
+ { name: 'isDisabled', type: 'boolean', required: false, default: 'false', description: 'Disable select' },
428
+ { name: 'isMultiple', type: 'boolean', required: false, default: 'false', description: 'Enable multiple selection' },
429
+ { name: 'isSearchable', type: 'boolean', required: false, default: 'false', description: 'Enable search/filter' },
430
+ { name: 'searchPlaceholder', type: 'string', required: false, default: "'Search...'", description: 'Search input placeholder' },
431
+ { name: 'noResultsText', type: 'string', required: false, default: "'No results found'", description: 'Text when no options match' },
432
+ { name: 'size', type: "'sm' | 'md' | 'lg'", required: false, default: "'md'", description: 'Select size' },
433
+ { name: 'variant', type: "'outline' | 'filled'", required: false, default: "'outline'", description: 'Select variant' },
434
+ ],
435
+ examples: [
436
+ {
437
+ title: 'Basic Select',
438
+ code: `<Select
439
+ label="Country"
440
+ placeholder="Select country"
441
+ options={[
442
+ { value: 'us', label: 'United States' },
443
+ { value: 'uk', label: 'United Kingdom' },
444
+ { value: 'ca', label: 'Canada' },
445
+ ]}
446
+ value={country}
447
+ onChange={setCountry}
448
+ />`
449
+ },
450
+ {
451
+ title: 'Multi-Select',
452
+ code: `<Select
453
+ label="Technologies"
454
+ isMultiple
455
+ options={[
456
+ { value: 'react', label: 'React' },
457
+ { value: 'vue', label: 'Vue' },
458
+ { value: 'angular', label: 'Angular' },
459
+ ]}
460
+ value={selectedTechs}
461
+ onChange={setSelectedTechs}
462
+ />`
463
+ },
464
+ {
465
+ title: 'Searchable Select',
466
+ code: `<Select
467
+ label="Country"
468
+ isSearchable
469
+ searchPlaceholder="Type to search..."
470
+ options={countryOptions}
471
+ />`
472
+ }
473
+ ],
474
+ relatedComponents: ['Input', 'Checkbox', 'Radio'],
475
+ tags: ['select', 'dropdown', 'picker', 'form', 'multiselect', 'searchable']
476
+ },
477
+
478
+ {
479
+ name: 'DatePicker',
480
+ displayName: 'DatePicker',
481
+ description: 'Date and time picker with date-only, time-only, and datetime modes.',
482
+ category: 'form',
483
+ importPath: "import { DatePicker } from '@urbint/cl';",
484
+ props: [
485
+ { name: 'mode', type: "'date' | 'time' | 'datetime'", required: false, default: "'date'", description: 'Picker mode' },
486
+ { name: 'value', type: 'Date', required: false, description: 'Controlled value' },
487
+ { name: 'defaultValue', type: 'Date', required: false, description: 'Default value' },
488
+ { name: 'onChange', type: '(date: Date) => void', required: false, description: 'Change handler' },
489
+ { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text' },
490
+ { name: 'label', type: 'string', required: false, description: 'Label text' },
491
+ { name: 'minDate', type: 'Date', required: false, description: 'Minimum selectable date' },
492
+ { name: 'maxDate', type: 'Date', required: false, description: 'Maximum selectable date' },
493
+ { name: 'isDisabled', type: 'boolean', required: false, default: 'false', description: 'Disable picker' },
494
+ { name: 'isInvalid', type: 'boolean', required: false, default: 'false', description: 'Error state' },
495
+ { name: 'errorMessage', type: 'string', required: false, description: 'Error message' },
496
+ { name: 'use24HourFormat', type: 'boolean', required: false, default: 'false', description: 'Use 24-hour time format' },
497
+ { name: 'firstDayOfWeek', type: '0 | 1', required: false, default: '0', description: 'First day (0=Sunday, 1=Monday)' },
498
+ { name: 'showNowButton', type: 'boolean', required: false, default: 'true', description: 'Show "Now" button in time modes' },
499
+ ],
500
+ examples: [
501
+ {
502
+ title: 'Date Picker',
503
+ code: `<DatePicker
504
+ label="Date of Birth"
505
+ mode="date"
506
+ placeholder="Select date"
507
+ value={date}
508
+ onChange={setDate}
509
+ />`
510
+ },
511
+ {
512
+ title: 'Time Picker',
513
+ code: `<DatePicker
514
+ label="Appointment Time"
515
+ mode="time"
516
+ placeholder="Select time"
517
+ use24HourFormat={false}
518
+ />`
519
+ },
520
+ {
521
+ title: 'DateTime Picker',
522
+ code: `<DatePicker
523
+ label="Event Start"
524
+ mode="datetime"
525
+ placeholder="Select date & time"
526
+ showNowButton={true}
527
+ />`
528
+ },
529
+ {
530
+ title: 'With Min/Max Date',
531
+ code: `<DatePicker
532
+ label="Future Date"
533
+ mode="date"
534
+ minDate={new Date()}
535
+ maxDate={new Date(2026, 11, 31)}
536
+ />`
537
+ }
538
+ ],
539
+ relatedComponents: ['Input', 'Select', 'FormControl'],
540
+ tags: ['date', 'time', 'datetime', 'picker', 'calendar', 'form']
541
+ },
542
+
543
+ {
544
+ name: 'Checkbox',
545
+ displayName: 'Checkbox',
546
+ description: 'Boolean selection control for single or multiple options.',
547
+ category: 'form',
548
+ importPath: "import { Checkbox } from '@urbint/cl';",
549
+ props: [
550
+ { name: 'label', type: 'string', required: false, description: 'Checkbox label' },
551
+ { name: 'isChecked', type: 'boolean', required: false, description: 'Controlled checked state' },
552
+ { name: 'defaultChecked', type: 'boolean', required: false, default: 'false', description: 'Initial checked state' },
553
+ { name: 'onChange', type: '(checked: boolean) => void', required: false, description: 'Change handler' },
554
+ { name: 'isDisabled', type: 'boolean', required: false, default: 'false', description: 'Disable checkbox' },
555
+ { name: 'isIndeterminate', type: 'boolean', required: false, default: 'false', description: 'Partial selection state' },
556
+ ],
557
+ examples: [
558
+ {
559
+ title: 'Basic Checkbox',
560
+ code: `<Checkbox
561
+ label="I accept the terms"
562
+ isChecked={accepted}
563
+ onChange={setAccepted}
564
+ />`
565
+ },
566
+ {
567
+ title: 'Checkbox States',
568
+ code: `<VStack space="sm">
569
+ <Checkbox label="Default" />
570
+ <Checkbox label="Checked" defaultChecked />
571
+ <Checkbox label="Disabled" isDisabled />
572
+ <Checkbox label="Indeterminate" isIndeterminate />
573
+ </VStack>`
574
+ }
575
+ ],
576
+ relatedComponents: ['Radio', 'Switch', 'FormControl'],
577
+ tags: ['checkbox', 'toggle', 'boolean', 'form', 'selection']
578
+ },
579
+
580
+ {
581
+ name: 'Radio',
582
+ displayName: 'Radio & RadioGroup',
583
+ description: 'Single selection from a group of options.',
584
+ category: 'form',
585
+ importPath: "import { Radio, RadioGroup } from '@urbint/cl';",
586
+ props: [
587
+ { name: 'label', type: 'string', required: false, description: 'Group label (RadioGroup)' },
588
+ { name: 'value', type: 'string', required: false, description: 'Selected value (RadioGroup)' },
589
+ { name: 'onChange', type: '(value: string) => void', required: false, description: 'Change handler (RadioGroup)' },
590
+ ],
591
+ examples: [
592
+ {
593
+ title: 'Radio Group',
594
+ code: `<RadioGroup
595
+ label="Select size"
596
+ value={size}
597
+ onChange={setSize}
598
+ >
599
+ <Radio value="sm" label="Small" />
600
+ <Radio value="md" label="Medium" />
601
+ <Radio value="lg" label="Large" />
602
+ </RadioGroup>`
603
+ }
604
+ ],
605
+ relatedComponents: ['Checkbox', 'Select', 'FormControl'],
606
+ tags: ['radio', 'selection', 'single', 'form', 'option']
607
+ },
608
+
609
+ {
610
+ name: 'Switch',
611
+ displayName: 'Switch',
612
+ description: 'Toggle switch for binary on/off states.',
613
+ category: 'form',
614
+ importPath: "import { Switch } from '@urbint/cl';",
615
+ props: [
616
+ { name: 'label', type: 'string', required: false, description: 'Switch label' },
617
+ { name: 'isChecked', type: 'boolean', required: false, description: 'Controlled state' },
618
+ { name: 'defaultChecked', type: 'boolean', required: false, default: 'false', description: 'Initial state' },
619
+ { name: 'onChange', type: '(checked: boolean) => void', required: false, description: 'Change handler' },
620
+ { name: 'colorScheme', type: "'primary' | 'success' | 'danger'", required: false, default: "'primary'", description: 'Active color' },
621
+ { name: 'isDisabled', type: 'boolean', required: false, default: 'false', description: 'Disable switch' },
622
+ ],
623
+ examples: [
624
+ {
625
+ title: 'Basic Switch',
626
+ code: `<Switch
627
+ label="Enable notifications"
628
+ isChecked={enabled}
629
+ onChange={setEnabled}
630
+ />`
631
+ },
632
+ {
633
+ title: 'Color Schemes',
634
+ code: `<VStack space="md">
635
+ <Switch label="Primary" colorScheme="primary" defaultChecked />
636
+ <Switch label="Success" colorScheme="success" defaultChecked />
637
+ <Switch label="Danger" colorScheme="danger" defaultChecked />
638
+ </VStack>`
639
+ }
640
+ ],
641
+ relatedComponents: ['Checkbox', 'Radio'],
642
+ tags: ['switch', 'toggle', 'boolean', 'form', 'on-off']
643
+ },
644
+
645
+ {
646
+ name: 'Textarea',
647
+ displayName: 'Textarea',
648
+ description: 'Multi-line text input field.',
649
+ category: 'form',
650
+ importPath: "import { Textarea } from '@urbint/cl';",
651
+ props: [
652
+ { name: 'label', type: 'string', required: false, description: 'Textarea label' },
653
+ { name: 'placeholder', type: 'string', required: false, description: 'Placeholder text' },
654
+ { name: 'rows', type: 'number', required: false, default: '4', description: 'Visible rows' },
655
+ { name: 'maxLength', type: 'number', required: false, description: 'Maximum characters' },
656
+ { name: 'showCount', type: 'boolean', required: false, default: 'false', description: 'Show character count' },
657
+ { name: 'value', type: 'string', required: false, description: 'Controlled value' },
658
+ { name: 'onChange', type: '(value: string) => void', required: false, description: 'Change handler' },
659
+ ],
660
+ examples: [
661
+ {
662
+ title: 'Basic Textarea',
663
+ code: `<Textarea
664
+ label="Description"
665
+ placeholder="Enter description..."
666
+ rows={4}
667
+ value={description}
668
+ onChange={setDescription}
669
+ />`
670
+ },
671
+ {
672
+ title: 'With Character Count',
673
+ code: `<Textarea
674
+ label="Notes"
675
+ maxLength={500}
676
+ showCount
677
+ />`
678
+ }
679
+ ],
680
+ relatedComponents: ['Input', 'FormControl'],
681
+ tags: ['textarea', 'multiline', 'text', 'form']
682
+ },
683
+
684
+ {
685
+ name: 'Slider',
686
+ displayName: 'Slider',
687
+ description: 'Range value selector for numeric inputs.',
688
+ category: 'form',
689
+ importPath: "import { Slider } from '@urbint/cl';",
690
+ props: [
691
+ { name: 'label', type: 'string', required: false, description: 'Slider label' },
692
+ { name: 'value', type: 'number', required: false, description: 'Current value' },
693
+ { name: 'onChange', type: '(value: number) => void', required: false, description: 'Change handler' },
694
+ { name: 'min', type: 'number', required: false, default: '0', description: 'Minimum value' },
695
+ { name: 'max', type: 'number', required: false, default: '100', description: 'Maximum value' },
696
+ { name: 'step', type: 'number', required: false, default: '1', description: 'Step increment' },
697
+ { name: 'showValue', type: 'boolean', required: false, default: 'false', description: 'Show current value' },
698
+ ],
699
+ examples: [
700
+ {
701
+ title: 'Volume Slider',
702
+ code: `<Slider
703
+ label="Volume"
704
+ value={volume}
705
+ onChange={setVolume}
706
+ min={0}
707
+ max={100}
708
+ showValue
709
+ />`
710
+ }
711
+ ],
712
+ relatedComponents: ['Input', 'FormControl'],
713
+ tags: ['slider', 'range', 'numeric', 'form']
714
+ },
715
+
716
+ {
717
+ name: 'FormControl',
718
+ displayName: 'FormControl',
719
+ description: 'Wrapper for form elements with label, helper text, and error handling.',
720
+ category: 'form',
721
+ importPath: "import { FormControl } from '@urbint/cl';",
722
+ props: [
723
+ { name: 'label', type: 'string', required: false, description: 'Form field label' },
724
+ { name: 'helperText', type: 'string', required: false, description: 'Helper text below field' },
725
+ { name: 'errorMessage', type: 'string', required: false, description: 'Error message to display' },
726
+ { name: 'isRequired', type: 'boolean', required: false, default: 'false', description: 'Show required indicator' },
727
+ { name: 'isInvalid', type: 'boolean', required: false, default: 'false', description: 'Error state' },
728
+ ],
729
+ examples: [
730
+ {
731
+ title: 'FormControl with Input',
732
+ code: `<FormControl
733
+ label="Email"
734
+ helperText="We'll never share your email"
735
+ isRequired
736
+ >
737
+ <Input placeholder="Enter email" />
738
+ </FormControl>`
739
+ },
740
+ {
741
+ title: 'FormControl with Error',
742
+ code: `<FormControl
743
+ label="Password"
744
+ isInvalid
745
+ errorMessage="Password must be at least 8 characters"
746
+ >
747
+ <Input isPassword />
748
+ </FormControl>`
749
+ }
750
+ ],
751
+ relatedComponents: ['Input', 'Select', 'Textarea', 'Checkbox'],
752
+ tags: ['form', 'control', 'label', 'validation', 'error']
753
+ },
754
+
755
+ // ===== FEEDBACK COMPONENTS =====
756
+ {
757
+ name: 'Alert',
758
+ displayName: 'Alert',
759
+ description: 'Status messages for info, success, warning, and error states.',
760
+ category: 'feedback',
761
+ importPath: "import { Alert } from '@urbint/cl';",
762
+ props: [
763
+ { name: 'status', type: "'info' | 'success' | 'warning' | 'error'", required: false, default: "'info'", description: 'Alert type' },
764
+ { name: 'title', type: 'string', required: true, description: 'Alert title' },
765
+ { name: 'description', type: 'string', required: false, description: 'Alert description' },
766
+ { name: 'isClosable', type: 'boolean', required: false, default: 'false', description: 'Show close button' },
767
+ { name: 'onClose', type: '() => void', required: false, description: 'Close handler' },
768
+ ],
769
+ examples: [
770
+ {
771
+ title: 'Alert Statuses',
772
+ code: `<VStack space="md">
773
+ <Alert status="info" title="Update available" description="A new version is ready." />
774
+ <Alert status="success" title="Saved!" />
775
+ <Alert status="warning" title="Warning" description="Please review before continuing." />
776
+ <Alert status="error" title="Error" description="Something went wrong." isClosable />
777
+ </VStack>`
778
+ }
779
+ ],
780
+ relatedComponents: ['Toast'],
781
+ tags: ['alert', 'message', 'notification', 'status', 'feedback']
782
+ },
783
+
784
+ {
785
+ name: 'Toast',
786
+ displayName: 'Toast',
787
+ description: 'Non-blocking notification messages.',
788
+ category: 'feedback',
789
+ importPath: "import { useToast, ToastProvider } from '@urbint/cl';",
790
+ props: [
791
+ { name: 'title', type: 'string', required: true, description: 'Toast title' },
792
+ { name: 'description', type: 'string', required: false, description: 'Toast description' },
793
+ { name: 'status', type: "'info' | 'success' | 'warning' | 'error'", required: false, default: "'info'", description: 'Toast type' },
794
+ { name: 'duration', type: 'number', required: false, default: '5000', description: 'Auto-dismiss duration (ms)' },
795
+ { name: 'position', type: "'top' | 'bottom'", required: false, default: "'top'", description: 'Screen position' },
796
+ ],
797
+ examples: [
798
+ {
799
+ title: 'Using Toast',
800
+ code: `// Wrap app with ToastProvider
801
+ <ToastProvider>
802
+ <App />
803
+ </ToastProvider>
804
+
805
+ // Use in components
806
+ function MyComponent() {
807
+ const toast = useToast();
808
+
809
+ const handleSave = () => {
810
+ toast.show({
811
+ title: 'Saved successfully',
812
+ status: 'success',
813
+ duration: 3000,
814
+ });
815
+ };
816
+ }`
817
+ }
818
+ ],
819
+ relatedComponents: ['Alert'],
820
+ tags: ['toast', 'notification', 'snackbar', 'message', 'feedback']
821
+ },
822
+
823
+ {
824
+ name: 'Progress',
825
+ displayName: 'Progress',
826
+ description: 'Progress indicator in linear or circular variant.',
827
+ category: 'feedback',
828
+ importPath: "import { Progress } from '@urbint/cl';",
829
+ props: [
830
+ { name: 'value', type: 'number', required: false, description: 'Progress value 0-100' },
831
+ { name: 'variant', type: "'linear' | 'circular'", required: false, default: "'linear'", description: 'Progress style' },
832
+ { name: 'size', type: "'sm' | 'md' | 'lg'", required: false, default: "'md'", description: 'Progress size' },
833
+ { name: 'colorScheme', type: "'primary' | 'success' | 'warning'", required: false, default: "'primary'", description: 'Color' },
834
+ { name: 'showLabel', type: 'boolean', required: false, default: 'false', description: 'Show percentage label' },
835
+ { name: 'isIndeterminate', type: 'boolean', required: false, default: 'false', description: 'Indeterminate mode' },
836
+ ],
837
+ examples: [
838
+ {
839
+ title: 'Progress Variants',
840
+ code: `<VStack space="md">
841
+ <Progress value={75} />
842
+ <Progress value={50} variant="circular" showLabel />
843
+ <Progress isIndeterminate />
844
+ </VStack>`
845
+ }
846
+ ],
847
+ relatedComponents: ['Spinner', 'Skeleton'],
848
+ tags: ['progress', 'loading', 'percentage', 'feedback']
849
+ },
850
+
851
+ {
852
+ name: 'Spinner',
853
+ displayName: 'Spinner',
854
+ description: 'Loading spinner indicator.',
855
+ category: 'feedback',
856
+ importPath: "import { Spinner } from '@urbint/cl';",
857
+ props: [
858
+ { name: 'size', type: "'xs' | 'sm' | 'md' | 'lg' | 'xl'", required: false, default: "'md'", description: 'Spinner size' },
859
+ { name: 'color', type: 'string', required: false, default: 'brand.blue', description: 'Spinner color' },
860
+ { name: 'label', type: 'string', required: false, default: "'Loading'", description: 'Accessibility label' },
861
+ ],
862
+ examples: [
863
+ {
864
+ title: 'Spinner Sizes',
865
+ code: `<HStack space="lg">
866
+ <Spinner size="xs" />
867
+ <Spinner size="sm" />
868
+ <Spinner size="md" />
869
+ <Spinner size="lg" />
870
+ <Spinner size="xl" />
871
+ </HStack>`
872
+ }
873
+ ],
874
+ relatedComponents: ['Progress', 'Skeleton'],
875
+ tags: ['spinner', 'loading', 'indicator', 'feedback']
876
+ },
877
+
878
+ {
879
+ name: 'Skeleton',
880
+ displayName: 'Skeleton',
881
+ description: 'Loading placeholder with optional animation.',
882
+ category: 'feedback',
883
+ importPath: "import { Skeleton, SkeletonText, SkeletonCircle } from '@urbint/cl';",
884
+ props: [
885
+ { name: 'width', type: "number | string", required: false, default: "'100%'", description: 'Skeleton width' },
886
+ { name: 'height', type: 'number', required: false, default: '16', description: 'Skeleton height' },
887
+ { name: 'animation', type: "'pulse' | 'wave' | 'none'", required: false, default: "'pulse'", description: 'Animation type' },
888
+ ],
889
+ examples: [
890
+ {
891
+ title: 'Skeleton Loading State',
892
+ code: `<HStack space="md">
893
+ <SkeletonCircle size={48} />
894
+ <VStack space="sm" flex={1}>
895
+ <Skeleton height={16} width="70%" />
896
+ <Skeleton height={14} width="40%" />
897
+ </VStack>
898
+ </HStack>`
899
+ }
900
+ ],
901
+ relatedComponents: ['Spinner', 'Progress'],
902
+ tags: ['skeleton', 'loading', 'placeholder', 'feedback']
903
+ },
904
+
905
+ // ===== DATA DISPLAY COMPONENTS =====
906
+ {
907
+ name: 'Avatar',
908
+ displayName: 'Avatar',
909
+ description: 'User profile image with fallback to initials.',
910
+ category: 'data-display',
911
+ importPath: "import { Avatar, AvatarGroup } from '@urbint/cl';",
912
+ props: [
913
+ { name: 'src', type: 'string', required: false, description: 'Image URL' },
914
+ { name: 'name', type: 'string', required: false, description: 'Name for generating initials' },
915
+ { name: 'size', type: "'xs' | 'sm' | 'md' | 'lg' | 'xl'", required: false, default: "'md'", description: 'Avatar size' },
916
+ { name: 'showBadge', type: 'boolean', required: false, default: 'false', description: 'Show status badge' },
917
+ { name: 'badgeColor', type: 'string', required: false, default: 'success', description: 'Badge color' },
918
+ ],
919
+ examples: [
920
+ {
921
+ title: 'Avatar Variants',
922
+ code: `<HStack space="md">
923
+ <Avatar name="John Doe" />
924
+ <Avatar src="https://example.com/avatar.jpg" name="Jane" />
925
+ <Avatar name="Bob Smith" size="lg" showBadge />
926
+ </HStack>`
927
+ },
928
+ {
929
+ title: 'Avatar Group',
930
+ code: `<AvatarGroup max={3}>
931
+ <Avatar name="John" />
932
+ <Avatar name="Jane" />
933
+ <Avatar name="Bob" />
934
+ <Avatar name="Alice" />
935
+ </AvatarGroup>`
936
+ }
937
+ ],
938
+ relatedComponents: ['Image', 'Badge'],
939
+ tags: ['avatar', 'profile', 'user', 'image']
940
+ },
941
+
942
+ {
943
+ name: 'Badge',
944
+ displayName: 'Badge',
945
+ description: 'Status indicator labels with color variants.',
946
+ category: 'data-display',
947
+ importPath: "import { Badge } from '@urbint/cl';",
948
+ props: [
949
+ { name: 'variant', type: "'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'blue' | 'purple'", required: false, default: "'gray'", description: 'Badge color' },
950
+ { name: 'size', type: "'sm' | 'md'", required: false, default: "'md'", description: 'Badge size' },
951
+ ],
952
+ examples: [
953
+ {
954
+ title: 'Badge Variants',
955
+ code: `<HStack space="sm">
956
+ <Badge variant="gray">Default</Badge>
957
+ <Badge variant="red">Critical</Badge>
958
+ <Badge variant="orange">Warning</Badge>
959
+ <Badge variant="yellow">Pending</Badge>
960
+ <Badge variant="green">Active</Badge>
961
+ <Badge variant="blue">Info</Badge>
962
+ <Badge variant="purple">New</Badge>
963
+ </HStack>`
964
+ }
965
+ ],
966
+ relatedComponents: ['Avatar', 'Card'],
967
+ tags: ['badge', 'tag', 'status', 'label']
968
+ },
969
+
970
+ {
971
+ name: 'Card',
972
+ displayName: 'Card',
973
+ description: 'Content container with header, body, and footer sections.',
974
+ category: 'data-display',
975
+ importPath: "import { Card, CardHeader, CardBody, CardFooter } from '@urbint/cl';",
976
+ props: [
977
+ { name: 'variant', type: "'elevated' | 'outline' | 'filled'", required: false, default: "'elevated'", description: 'Card style' },
978
+ { name: 'padding', type: "'none' | 'sm' | 'md' | 'lg'", required: false, default: "'md'", description: 'Internal padding' },
979
+ { name: 'shadow', type: "'5' | '10' | '20' | '30' | '40'", required: false, default: "'20'", description: 'Shadow elevation' },
980
+ { name: 'isPressable', type: 'boolean', required: false, default: 'false', description: 'Make card tappable' },
981
+ { name: 'onPress', type: '() => void', required: false, description: 'Press handler' },
982
+ ],
983
+ examples: [
984
+ {
985
+ title: 'Full Card',
986
+ code: `<Card variant="elevated">
987
+ <CardHeader>
988
+ <Heading as="h3">Card Title</Heading>
989
+ </CardHeader>
990
+ <CardBody>
991
+ <Text>Card content goes here.</Text>
992
+ </CardBody>
993
+ <CardFooter>
994
+ <Button variant="ghost">Cancel</Button>
995
+ <Button>Submit</Button>
996
+ </CardFooter>
997
+ </Card>`
998
+ }
999
+ ],
1000
+ relatedComponents: ['Box', 'Modal'],
1001
+ tags: ['card', 'container', 'panel', 'surface']
1002
+ },
1003
+
1004
+ {
1005
+ name: 'Table',
1006
+ displayName: 'Table',
1007
+ description: 'Data table with header and body rows.',
1008
+ category: 'data-display',
1009
+ importPath: "import { Table, TableHead, TableBody, TableRow, TableCell } from '@urbint/cl';",
1010
+ props: [],
1011
+ examples: [
1012
+ {
1013
+ title: 'Basic Table',
1014
+ code: `<Table>
1015
+ <TableHead>
1016
+ <TableRow>
1017
+ <TableCell isHeader>Name</TableCell>
1018
+ <TableCell isHeader>Status</TableCell>
1019
+ <TableCell isHeader>Role</TableCell>
1020
+ </TableRow>
1021
+ </TableHead>
1022
+ <TableBody>
1023
+ <TableRow>
1024
+ <TableCell>John Doe</TableCell>
1025
+ <TableCell><Badge variant="green">Active</Badge></TableCell>
1026
+ <TableCell>Admin</TableCell>
1027
+ </TableRow>
1028
+ </TableBody>
1029
+ </Table>`
1030
+ }
1031
+ ],
1032
+ relatedComponents: ['Card'],
1033
+ tags: ['table', 'data', 'grid', 'rows', 'columns']
1034
+ },
1035
+
1036
+ {
1037
+ name: 'Icon',
1038
+ displayName: 'Icon',
1039
+ description: 'SVG icon component with size and color props.',
1040
+ category: 'data-display',
1041
+ importPath: "import { Icon } from '@urbint/cl';",
1042
+ props: [
1043
+ { name: 'name', type: 'IconName', required: true, description: 'Icon name' },
1044
+ { name: 'size', type: "'xs' | 'sm' | 'md' | 'lg' | 'xl'", required: false, default: "'md'", description: 'Icon size' },
1045
+ { name: 'color', type: 'string', required: false, default: 'text.primary', description: 'Icon color' },
1046
+ ],
1047
+ examples: [
1048
+ {
1049
+ title: 'Common Icons',
1050
+ code: `<HStack space="md">
1051
+ <Icon name="check" />
1052
+ <Icon name="close" color="error" />
1053
+ <Icon name="search" size="lg" />
1054
+ <Icon name="user" />
1055
+ <Icon name="settings" />
1056
+ </HStack>`
1057
+ }
1058
+ ],
1059
+ relatedComponents: ['Button'],
1060
+ tags: ['icon', 'svg', 'symbol', 'graphic']
1061
+ },
1062
+
1063
+ // ===== OVERLAY COMPONENTS =====
1064
+ {
1065
+ name: 'Modal',
1066
+ displayName: 'Modal',
1067
+ description: 'Dialog overlay for important content.',
1068
+ category: 'overlay',
1069
+ importPath: "import { Modal, ModalHeader, ModalBody, ModalFooter, useDisclosure } from '@urbint/cl';",
1070
+ props: [
1071
+ { name: 'isOpen', type: 'boolean', required: true, description: 'Open state' },
1072
+ { name: 'onClose', type: '() => void', required: true, description: 'Close handler' },
1073
+ { name: 'size', type: "'sm' | 'md' | 'lg' | 'xl' | 'full'", required: false, default: "'md'", description: 'Modal size' },
1074
+ { name: 'closeOnOverlayClick', type: 'boolean', required: false, default: 'true', description: 'Close on backdrop click' },
1075
+ ],
1076
+ examples: [
1077
+ {
1078
+ title: 'Basic Modal',
1079
+ code: `function MyComponent() {
1080
+ const { isOpen, onOpen, onClose } = useDisclosure();
1081
+
1082
+ return (
1083
+ <>
1084
+ <Button onPress={onOpen}>Open Modal</Button>
1085
+
1086
+ <Modal isOpen={isOpen} onClose={onClose} size="md">
1087
+ <ModalHeader>Modal Title</ModalHeader>
1088
+ <ModalBody>
1089
+ <Text>Modal content goes here.</Text>
1090
+ </ModalBody>
1091
+ <ModalFooter>
1092
+ <Button variant="ghost" onPress={onClose}>Cancel</Button>
1093
+ <Button>Confirm</Button>
1094
+ </ModalFooter>
1095
+ </Modal>
1096
+ </>
1097
+ );
1098
+ }`
1099
+ }
1100
+ ],
1101
+ relatedComponents: ['AlertDialog', 'Drawer', 'useDisclosure'],
1102
+ tags: ['modal', 'dialog', 'popup', 'overlay']
1103
+ },
1104
+
1105
+ {
1106
+ name: 'Drawer',
1107
+ displayName: 'Drawer',
1108
+ description: 'Slide-out panel from any edge of the screen.',
1109
+ category: 'overlay',
1110
+ importPath: "import { Drawer, DrawerHeader, DrawerBody, DrawerFooter, useDisclosure } from '@urbint/cl';",
1111
+ props: [
1112
+ { name: 'isOpen', type: 'boolean', required: true, description: 'Open state' },
1113
+ { name: 'onClose', type: '() => void', required: true, description: 'Close handler' },
1114
+ { name: 'title', type: 'string', required: false, description: 'Drawer title' },
1115
+ { name: 'placement', type: "'left' | 'right' | 'top' | 'bottom'", required: false, default: "'right'", description: 'Position' },
1116
+ { name: 'size', type: "'sm' | 'md' | 'lg' | 'full'", required: false, default: "'md'", description: 'Drawer size' },
1117
+ ],
1118
+ examples: [
1119
+ {
1120
+ title: 'Navigation Drawer',
1121
+ code: `function MyComponent() {
1122
+ const { isOpen, onOpen, onClose } = useDisclosure();
1123
+
1124
+ return (
1125
+ <>
1126
+ <Button onPress={onOpen}>Open Menu</Button>
1127
+
1128
+ <Drawer isOpen={isOpen} onClose={onClose} title="Menu" placement="left">
1129
+ <DrawerBody>
1130
+ <VStack space="md">
1131
+ <Link>Profile</Link>
1132
+ <Link>Settings</Link>
1133
+ <Link>Logout</Link>
1134
+ </VStack>
1135
+ </DrawerBody>
1136
+ </Drawer>
1137
+ </>
1138
+ );
1139
+ }`
1140
+ }
1141
+ ],
1142
+ relatedComponents: ['Modal', 'ActionSheet', 'useDisclosure'],
1143
+ tags: ['drawer', 'sidebar', 'panel', 'navigation', 'overlay']
1144
+ },
1145
+
1146
+ {
1147
+ name: 'AlertDialog',
1148
+ displayName: 'AlertDialog',
1149
+ description: 'Confirmation dialog for destructive actions.',
1150
+ category: 'overlay',
1151
+ importPath: "import { AlertDialog, useDisclosure } from '@urbint/cl';",
1152
+ props: [
1153
+ { name: 'isOpen', type: 'boolean', required: true, description: 'Open state' },
1154
+ { name: 'onClose', type: '() => void', required: true, description: 'Close handler' },
1155
+ { name: 'onConfirm', type: '() => void', required: true, description: 'Confirm handler' },
1156
+ { name: 'title', type: 'string', required: true, description: 'Dialog title' },
1157
+ { name: 'description', type: 'string', required: false, description: 'Dialog description' },
1158
+ { name: 'confirmLabel', type: 'string', required: false, default: "'Confirm'", description: 'Confirm button text' },
1159
+ { name: 'confirmVariant', type: 'ButtonVariant', required: false, default: "'primary'", description: 'Confirm button style' },
1160
+ ],
1161
+ examples: [
1162
+ {
1163
+ title: 'Delete Confirmation',
1164
+ code: `function DeleteButton() {
1165
+ const { isOpen, onOpen, onClose } = useDisclosure();
1166
+
1167
+ return (
1168
+ <>
1169
+ <Button variant="danger" onPress={onOpen}>Delete</Button>
1170
+
1171
+ <AlertDialog
1172
+ isOpen={isOpen}
1173
+ onClose={onClose}
1174
+ onConfirm={handleDelete}
1175
+ title="Delete Item?"
1176
+ description="This action cannot be undone."
1177
+ confirmLabel="Delete"
1178
+ confirmVariant="danger"
1179
+ />
1180
+ </>
1181
+ );
1182
+ }`
1183
+ }
1184
+ ],
1185
+ relatedComponents: ['Modal', 'useDisclosure'],
1186
+ tags: ['alert', 'confirm', 'dialog', 'destructive', 'overlay']
1187
+ },
1188
+
1189
+ {
1190
+ name: 'Popover',
1191
+ displayName: 'Popover',
1192
+ description: 'Floating content attached to a trigger element.',
1193
+ category: 'overlay',
1194
+ importPath: "import { Popover, PopoverTrigger, PopoverContent } from '@urbint/cl';",
1195
+ props: [
1196
+ { name: 'placement', type: "'top' | 'bottom' | 'left' | 'right'", required: false, default: "'bottom'", description: 'Position relative to trigger' },
1197
+ { name: 'isOpen', type: 'boolean', required: false, description: 'Controlled open state' },
1198
+ { name: 'onClose', type: '() => void', required: false, description: 'Close handler' },
1199
+ ],
1200
+ examples: [
1201
+ {
1202
+ title: 'Basic Popover',
1203
+ code: `<Popover placement="bottom">
1204
+ <PopoverTrigger>
1205
+ <Button>Open Popover</Button>
1206
+ </PopoverTrigger>
1207
+ <PopoverContent>
1208
+ <Text>Popover content here</Text>
1209
+ </PopoverContent>
1210
+ </Popover>`
1211
+ }
1212
+ ],
1213
+ relatedComponents: ['Tooltip', 'Menu'],
1214
+ tags: ['popover', 'floating', 'dropdown', 'overlay']
1215
+ },
1216
+
1217
+ {
1218
+ name: 'Tooltip',
1219
+ displayName: 'Tooltip',
1220
+ description: 'Hover hints for additional information.',
1221
+ category: 'overlay',
1222
+ importPath: "import { Tooltip } from '@urbint/cl';",
1223
+ props: [
1224
+ { name: 'label', type: 'string', required: true, description: 'Tooltip text' },
1225
+ { name: 'placement', type: "'top' | 'bottom' | 'left' | 'right'", required: false, default: "'top'", description: 'Position' },
1226
+ { name: 'hasArrow', type: 'boolean', required: false, default: 'true', description: 'Show arrow pointer' },
1227
+ ],
1228
+ examples: [
1229
+ {
1230
+ title: 'Basic Tooltip',
1231
+ code: `<Tooltip label="This is a helpful tip">
1232
+ <Button>Hover me</Button>
1233
+ </Tooltip>`
1234
+ }
1235
+ ],
1236
+ relatedComponents: ['Popover'],
1237
+ tags: ['tooltip', 'hint', 'help', 'hover']
1238
+ },
1239
+
1240
+ {
1241
+ name: 'Menu',
1242
+ displayName: 'Menu',
1243
+ description: 'Dropdown menu with action items.',
1244
+ category: 'overlay',
1245
+ importPath: "import { Menu, MenuTrigger, MenuContent, MenuItem } from '@urbint/cl';",
1246
+ props: [],
1247
+ examples: [
1248
+ {
1249
+ title: 'Action Menu',
1250
+ code: `<Menu>
1251
+ <MenuTrigger>
1252
+ <Button rightIcon={<Icon name="chevron-down" />}>Options</Button>
1253
+ </MenuTrigger>
1254
+ <MenuContent>
1255
+ <MenuItem onPress={handleEdit}>Edit</MenuItem>
1256
+ <MenuItem onPress={handleDuplicate}>Duplicate</MenuItem>
1257
+ <MenuItem onPress={handleDelete} isDestructive>Delete</MenuItem>
1258
+ </MenuContent>
1259
+ </Menu>`
1260
+ }
1261
+ ],
1262
+ relatedComponents: ['Popover', 'Select'],
1263
+ tags: ['menu', 'dropdown', 'actions', 'context']
1264
+ },
1265
+
1266
+ {
1267
+ name: 'ActionSheet',
1268
+ displayName: 'ActionSheet',
1269
+ description: 'Bottom sheet for mobile action selection.',
1270
+ category: 'overlay',
1271
+ importPath: "import { ActionSheet, useDisclosure } from '@urbint/cl';",
1272
+ props: [
1273
+ { name: 'isOpen', type: 'boolean', required: true, description: 'Open state' },
1274
+ { name: 'onClose', type: '() => void', required: true, description: 'Close handler' },
1275
+ { name: 'actions', type: 'ActionItem[]', required: true, description: 'Array of action items' },
1276
+ ],
1277
+ examples: [
1278
+ {
1279
+ title: 'Action Sheet',
1280
+ code: `function MyComponent() {
1281
+ const { isOpen, onOpen, onClose } = useDisclosure();
1282
+
1283
+ return (
1284
+ <>
1285
+ <Button onPress={onOpen}>Show Actions</Button>
1286
+
1287
+ <ActionSheet
1288
+ isOpen={isOpen}
1289
+ onClose={onClose}
1290
+ actions={[
1291
+ { label: 'Edit', onPress: handleEdit },
1292
+ { label: 'Share', onPress: handleShare },
1293
+ { label: 'Delete', onPress: handleDelete, isDestructive: true },
1294
+ ]}
1295
+ />
1296
+ </>
1297
+ );
1298
+ }`
1299
+ }
1300
+ ],
1301
+ relatedComponents: ['Modal', 'Drawer'],
1302
+ tags: ['actionsheet', 'bottom-sheet', 'mobile', 'actions']
1303
+ },
1304
+
1305
+ // ===== ACTION COMPONENTS =====
1306
+ {
1307
+ name: 'Pressable',
1308
+ displayName: 'Pressable',
1309
+ description: 'Base pressable component with press feedback.',
1310
+ category: 'action',
1311
+ importPath: "import { Pressable } from '@urbint/cl';",
1312
+ props: [
1313
+ { name: 'onPress', type: '() => void', required: false, description: 'Press handler' },
1314
+ { name: 'onLongPress', type: '() => void', required: false, description: 'Long press handler' },
1315
+ { name: 'isDisabled', type: 'boolean', required: false, default: 'false', description: 'Disable press' },
1316
+ ],
1317
+ examples: [
1318
+ {
1319
+ title: 'Pressable Card',
1320
+ code: `<Pressable onPress={handlePress} onLongPress={handleLongPress}>
1321
+ <Card>
1322
+ <Text>Tap me</Text>
1323
+ </Card>
1324
+ </Pressable>`
1325
+ }
1326
+ ],
1327
+ relatedComponents: ['Button', 'Link'],
1328
+ tags: ['pressable', 'touchable', 'interactive', 'click']
1329
+ },
1330
+
1331
+ {
1332
+ name: 'Fab',
1333
+ displayName: 'Fab',
1334
+ description: 'Floating action button for primary actions.',
1335
+ category: 'action',
1336
+ importPath: "import { Fab } from '@urbint/cl';",
1337
+ props: [
1338
+ { name: 'icon', type: 'ReactNode', required: true, description: 'FAB icon' },
1339
+ { name: 'label', type: 'string', required: false, description: 'Extended FAB text' },
1340
+ { name: 'position', type: "'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'", required: false, default: "'bottom-right'", description: 'Screen position' },
1341
+ { name: 'size', type: "'sm' | 'md' | 'lg'", required: false, default: "'md'", description: 'FAB size' },
1342
+ { name: 'onPress', type: '() => void', required: false, description: 'Press handler' },
1343
+ ],
1344
+ examples: [
1345
+ {
1346
+ title: 'Floating Action Button',
1347
+ code: `<Fab
1348
+ icon={<Icon name="plus" color="white" />}
1349
+ onPress={handleAdd}
1350
+ position="bottom-right"
1351
+ />`
1352
+ },
1353
+ {
1354
+ title: 'Extended FAB',
1355
+ code: `<Fab
1356
+ icon={<Icon name="plus" />}
1357
+ label="Add Item"
1358
+ position="bottom-right"
1359
+ />`
1360
+ }
1361
+ ],
1362
+ relatedComponents: ['Button'],
1363
+ tags: ['fab', 'floating', 'action', 'button', 'primary']
1364
+ },
1365
+
1366
+ {
1367
+ name: 'Accordion',
1368
+ displayName: 'Accordion',
1369
+ description: 'Expandable content sections.',
1370
+ category: 'action',
1371
+ importPath: "import { Accordion, AccordionItem, AccordionButton, AccordionPanel } from '@urbint/cl';",
1372
+ props: [
1373
+ { name: 'defaultIndex', type: 'string[]', required: false, default: '[]', description: 'Initially expanded items' },
1374
+ { name: 'allowMultiple', type: 'boolean', required: false, default: 'false', description: 'Allow multiple open sections' },
1375
+ { name: 'onChange', type: '(index: string[]) => void', required: false, description: 'Change handler' },
1376
+ ],
1377
+ examples: [
1378
+ {
1379
+ title: 'FAQ Accordion',
1380
+ code: `<Accordion defaultIndex={['faq-1']} allowMultiple>
1381
+ <AccordionItem value="faq-1">
1382
+ <AccordionButton>What is Urbint CL?</AccordionButton>
1383
+ <AccordionPanel>
1384
+ <Text>Enterprise-ready React Native component library.</Text>
1385
+ </AccordionPanel>
1386
+ </AccordionItem>
1387
+ <AccordionItem value="faq-2">
1388
+ <AccordionButton>How do I install it?</AccordionButton>
1389
+ <AccordionPanel>
1390
+ <Text>npm install @urbint/cl</Text>
1391
+ </AccordionPanel>
1392
+ </AccordionItem>
1393
+ </Accordion>`
1394
+ }
1395
+ ],
1396
+ relatedComponents: ['Card'],
1397
+ tags: ['accordion', 'collapsible', 'expand', 'faq']
1398
+ },
1399
+
1400
+ // ===== UTILITY COMPONENTS =====
1401
+ {
1402
+ name: 'Portal',
1403
+ displayName: 'Portal',
1404
+ description: 'Render children outside the parent component hierarchy.',
1405
+ category: 'utility',
1406
+ importPath: "import { Portal } from '@urbint/cl';",
1407
+ props: [],
1408
+ examples: [
1409
+ {
1410
+ title: 'Portal Usage',
1411
+ code: `<Portal>
1412
+ <Modal>...</Modal>
1413
+ </Portal>`
1414
+ }
1415
+ ],
1416
+ relatedComponents: ['Modal', 'Drawer'],
1417
+ tags: ['portal', 'render', 'utility']
1418
+ },
1419
+ ];
1420
+
1421
+ // Helper functions for component lookup
1422
+ export function getComponentByName(name: string): ComponentMetadata | undefined {
1423
+ return componentRegistry.find(
1424
+ (c) => c.name.toLowerCase() === name.toLowerCase()
1425
+ );
1426
+ }
1427
+
1428
+ export function getComponentsByCategory(category: ComponentMetadata['category']): ComponentMetadata[] {
1429
+ return componentRegistry.filter((c) => c.category === category);
1430
+ }
1431
+
1432
+ export function searchComponents(query: string): ComponentMetadata[] {
1433
+ const lowerQuery = query.toLowerCase();
1434
+ return componentRegistry.filter(
1435
+ (c) =>
1436
+ c.name.toLowerCase().includes(lowerQuery) ||
1437
+ c.displayName.toLowerCase().includes(lowerQuery) ||
1438
+ c.description.toLowerCase().includes(lowerQuery) ||
1439
+ c.tags.some((tag) => tag.toLowerCase().includes(lowerQuery))
1440
+ );
1441
+ }
1442
+
1443
+ export function getAllCategories(): ComponentMetadata['category'][] {
1444
+ return ['layout', 'typography', 'form', 'feedback', 'data-display', 'overlay', 'action', 'utility'];
1445
+ }
1446
+