ui-lab-registry 0.3.44 → 0.3.46

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 (1317) hide show
  1. package/dist/components/Anchor/examples/index.d.ts +0 -1
  2. package/dist/components/Anchor/examples/index.d.ts.map +1 -1
  3. package/dist/components/Anchor/examples/index.js +1 -1
  4. package/dist/components/Anchor/examples/index.js.map +1 -1
  5. package/dist/components/Anchor/index.d.ts +0 -1
  6. package/dist/components/Anchor/index.d.ts.map +1 -1
  7. package/dist/components/Anchor/index.js +1 -9
  8. package/dist/components/Anchor/index.js.map +1 -1
  9. package/dist/components/Badge/examples/index.d.ts +0 -4
  10. package/dist/components/Badge/examples/index.d.ts.map +1 -1
  11. package/dist/components/Badge/examples/index.js +1 -4
  12. package/dist/components/Badge/examples/index.js.map +1 -1
  13. package/dist/components/Badge/index.d.ts +0 -1
  14. package/dist/components/Badge/index.d.ts.map +1 -1
  15. package/dist/components/Badge/index.js +3 -22
  16. package/dist/components/Badge/index.js.map +1 -1
  17. package/dist/components/Banner/examples/index.d.ts +0 -2
  18. package/dist/components/Banner/examples/index.d.ts.map +1 -1
  19. package/dist/components/Banner/examples/index.js +1 -2
  20. package/dist/components/Banner/examples/index.js.map +1 -1
  21. package/dist/components/Banner/index.d.ts +0 -1
  22. package/dist/components/Banner/index.d.ts.map +1 -1
  23. package/dist/components/Banner/index.js +4 -23
  24. package/dist/components/Banner/index.js.map +1 -1
  25. package/dist/components/Button/examples/index.d.ts +0 -10
  26. package/dist/components/Button/examples/index.d.ts.map +1 -1
  27. package/dist/components/Button/examples/index.js +1 -10
  28. package/dist/components/Button/examples/index.js.map +1 -1
  29. package/dist/components/Button/index.d.ts +0 -1
  30. package/dist/components/Button/index.d.ts.map +1 -1
  31. package/dist/components/Button/index.js +0 -17
  32. package/dist/components/Button/index.js.map +1 -1
  33. package/dist/components/Card/examples/index.d.ts +0 -2
  34. package/dist/components/Card/examples/index.d.ts.map +1 -1
  35. package/dist/components/Card/examples/index.js +1 -2
  36. package/dist/components/Card/examples/index.js.map +1 -1
  37. package/dist/components/Card/index.d.ts +0 -1
  38. package/dist/components/Card/index.d.ts.map +1 -1
  39. package/dist/components/Card/index.js +1 -9
  40. package/dist/components/Card/index.js.map +1 -1
  41. package/dist/components/Checkbox/examples/index.d.ts +0 -4
  42. package/dist/components/Checkbox/examples/index.d.ts.map +1 -1
  43. package/dist/components/Checkbox/examples/index.js +1 -4
  44. package/dist/components/Checkbox/examples/index.js.map +1 -1
  45. package/dist/components/Checkbox/index.d.ts +0 -1
  46. package/dist/components/Checkbox/index.d.ts.map +1 -1
  47. package/dist/components/Checkbox/index.js +1 -22
  48. package/dist/components/Checkbox/index.js.map +1 -1
  49. package/dist/components/Color/examples/index.d.ts +0 -3
  50. package/dist/components/Color/examples/index.d.ts.map +1 -1
  51. package/dist/components/Color/examples/index.js +1 -3
  52. package/dist/components/Color/examples/index.js.map +1 -1
  53. package/dist/components/Color/index.d.ts +0 -1
  54. package/dist/components/Color/index.d.ts.map +1 -1
  55. package/dist/components/Color/index.js +1 -11
  56. package/dist/components/Color/index.js.map +1 -1
  57. package/dist/components/Command/examples/index.d.ts +0 -2
  58. package/dist/components/Command/examples/index.d.ts.map +1 -1
  59. package/dist/components/Command/examples/index.js +1 -2
  60. package/dist/components/Command/examples/index.js.map +1 -1
  61. package/dist/components/Command/index.d.ts +0 -1
  62. package/dist/components/Command/index.d.ts.map +1 -1
  63. package/dist/components/Command/index.js +1 -9
  64. package/dist/components/Command/index.js.map +1 -1
  65. package/dist/components/Confirm/examples/index.d.ts +0 -2
  66. package/dist/components/Confirm/examples/index.d.ts.map +1 -1
  67. package/dist/components/Confirm/examples/index.js +1 -2
  68. package/dist/components/Confirm/examples/index.js.map +1 -1
  69. package/dist/components/Confirm/index.d.ts +0 -1
  70. package/dist/components/Confirm/index.d.ts.map +1 -1
  71. package/dist/components/Confirm/index.js +1 -9
  72. package/dist/components/Confirm/index.js.map +1 -1
  73. package/dist/components/Date/examples/index.d.ts +0 -8
  74. package/dist/components/Date/examples/index.d.ts.map +1 -1
  75. package/dist/components/Date/examples/index.js +1 -8
  76. package/dist/components/Date/examples/index.js.map +1 -1
  77. package/dist/components/Date/index.d.ts.map +1 -1
  78. package/dist/components/Date/index.js +1 -10
  79. package/dist/components/Date/index.js.map +1 -1
  80. package/dist/components/Divider/examples/index.d.ts +0 -2
  81. package/dist/components/Divider/examples/index.d.ts.map +1 -1
  82. package/dist/components/Divider/examples/index.js +1 -2
  83. package/dist/components/Divider/examples/index.js.map +1 -1
  84. package/dist/components/Divider/index.d.ts +0 -1
  85. package/dist/components/Divider/index.d.ts.map +1 -1
  86. package/dist/components/Divider/index.js +1 -14
  87. package/dist/components/Divider/index.js.map +1 -1
  88. package/dist/components/Expand/examples/index.d.ts +0 -2
  89. package/dist/components/Expand/examples/index.d.ts.map +1 -1
  90. package/dist/components/Expand/examples/index.js +1 -2
  91. package/dist/components/Expand/examples/index.js.map +1 -1
  92. package/dist/components/Expand/index.d.ts +0 -1
  93. package/dist/components/Expand/index.d.ts.map +1 -1
  94. package/dist/components/Expand/index.js +0 -9
  95. package/dist/components/Expand/index.js.map +1 -1
  96. package/dist/components/Flex/examples/01-axis-control.d.ts +11 -0
  97. package/dist/components/Flex/examples/01-axis-control.d.ts.map +1 -0
  98. package/dist/components/Flex/examples/01-axis-control.js +149 -0
  99. package/dist/components/Flex/examples/01-axis-control.js.map +1 -0
  100. package/dist/components/Flex/examples/02-wrap-overflow.d.ts +11 -0
  101. package/dist/components/Flex/examples/02-wrap-overflow.d.ts.map +1 -0
  102. package/dist/components/Flex/examples/02-wrap-overflow.js +147 -0
  103. package/dist/components/Flex/examples/02-wrap-overflow.js.map +1 -0
  104. package/dist/components/Flex/examples/03-container-query-reflow.d.ts +11 -0
  105. package/dist/components/Flex/examples/03-container-query-reflow.d.ts.map +1 -0
  106. package/dist/components/Flex/examples/03-container-query-reflow.js +151 -0
  107. package/dist/components/Flex/examples/03-container-query-reflow.js.map +1 -0
  108. package/dist/components/Flex/examples/index.d.ts +6 -2
  109. package/dist/components/Flex/examples/index.d.ts.map +1 -1
  110. package/dist/components/Flex/examples/index.js +6 -2
  111. package/dist/components/Flex/examples/index.js.map +1 -1
  112. package/dist/components/Flex/examples.json +14 -4
  113. package/dist/components/Flex/index.d.ts.map +1 -1
  114. package/dist/components/Flex/index.js +31 -17
  115. package/dist/components/Flex/index.js.map +1 -1
  116. package/dist/components/Frame/examples/index.d.ts +0 -6
  117. package/dist/components/Frame/examples/index.d.ts.map +1 -1
  118. package/dist/components/Frame/examples/index.js +1 -6
  119. package/dist/components/Frame/examples/index.js.map +1 -1
  120. package/dist/components/Frame/index.d.ts +0 -1
  121. package/dist/components/Frame/index.d.ts.map +1 -1
  122. package/dist/components/Frame/index.js +1 -13
  123. package/dist/components/Frame/index.js.map +1 -1
  124. package/dist/components/Gallery/examples/01-grid-composition.d.ts +11 -0
  125. package/dist/components/Gallery/examples/01-grid-composition.d.ts.map +1 -0
  126. package/dist/components/Gallery/examples/01-grid-composition.js +95 -0
  127. package/dist/components/Gallery/examples/01-grid-composition.js.map +1 -0
  128. package/dist/components/Gallery/examples/02-item-orientation.d.ts +11 -0
  129. package/dist/components/Gallery/examples/02-item-orientation.d.ts.map +1 -0
  130. package/dist/components/Gallery/examples/02-item-orientation.js +106 -0
  131. package/dist/components/Gallery/examples/02-item-orientation.js.map +1 -0
  132. package/dist/components/Gallery/examples/03-span-layout.d.ts +11 -0
  133. package/dist/components/Gallery/examples/03-span-layout.d.ts.map +1 -0
  134. package/dist/components/Gallery/examples/03-span-layout.js +95 -0
  135. package/dist/components/Gallery/examples/03-span-layout.js.map +1 -0
  136. package/dist/components/Gallery/examples/index.d.ts +6 -2
  137. package/dist/components/Gallery/examples/index.d.ts.map +1 -1
  138. package/dist/components/Gallery/examples/index.js +6 -2
  139. package/dist/components/Gallery/examples/index.js.map +1 -1
  140. package/dist/components/Gallery/examples.json +14 -4
  141. package/dist/components/Gallery/index.d.ts.map +1 -1
  142. package/dist/components/Gallery/index.js +6 -2
  143. package/dist/components/Gallery/index.js.map +1 -1
  144. package/dist/components/Grid/examples/02-track-placement.d.ts +11 -0
  145. package/dist/components/Grid/examples/02-track-placement.d.ts.map +1 -0
  146. package/dist/components/Grid/examples/02-track-placement.js +181 -0
  147. package/dist/components/Grid/examples/02-track-placement.js.map +1 -0
  148. package/dist/components/Grid/examples/03-editorial-spans.d.ts +11 -0
  149. package/dist/components/Grid/examples/03-editorial-spans.d.ts.map +1 -0
  150. package/dist/components/Grid/examples/03-editorial-spans.js +167 -0
  151. package/dist/components/Grid/examples/03-editorial-spans.js.map +1 -0
  152. package/dist/components/Grid/examples/04-responsive-card-rail.d.ts +11 -0
  153. package/dist/components/Grid/examples/04-responsive-card-rail.d.ts.map +1 -0
  154. package/dist/components/Grid/examples/04-responsive-card-rail.js +126 -0
  155. package/dist/components/Grid/examples/04-responsive-card-rail.js.map +1 -0
  156. package/dist/components/Grid/examples/index.d.ts +6 -2
  157. package/dist/components/Grid/examples/index.d.ts.map +1 -1
  158. package/dist/components/Grid/examples/index.js +6 -2
  159. package/dist/components/Grid/examples/index.js.map +1 -1
  160. package/dist/components/Grid/examples.json +14 -4
  161. package/dist/components/Grid/index.d.ts.map +1 -1
  162. package/dist/components/Grid/index.js +46 -13
  163. package/dist/components/Grid/index.js.map +1 -1
  164. package/dist/components/Group/examples/index.d.ts +0 -2
  165. package/dist/components/Group/examples/index.d.ts.map +1 -1
  166. package/dist/components/Group/examples/index.js +1 -2
  167. package/dist/components/Group/examples/index.js.map +1 -1
  168. package/dist/components/Group/index.d.ts +0 -1
  169. package/dist/components/Group/index.d.ts.map +1 -1
  170. package/dist/components/Group/index.js +0 -8
  171. package/dist/components/Group/index.js.map +1 -1
  172. package/dist/components/Input/examples/index.d.ts +0 -4
  173. package/dist/components/Input/examples/index.d.ts.map +1 -1
  174. package/dist/components/Input/examples/index.js +1 -4
  175. package/dist/components/Input/examples/index.js.map +1 -1
  176. package/dist/components/Input/index.d.ts +0 -1
  177. package/dist/components/Input/index.d.ts.map +1 -1
  178. package/dist/components/Input/index.js +0 -10
  179. package/dist/components/Input/index.js.map +1 -1
  180. package/dist/components/Label/examples/index.d.ts +0 -2
  181. package/dist/components/Label/examples/index.d.ts.map +1 -1
  182. package/dist/components/Label/examples/index.js +1 -2
  183. package/dist/components/Label/examples/index.js.map +1 -1
  184. package/dist/components/Label/index.d.ts +0 -1
  185. package/dist/components/Label/index.d.ts.map +1 -1
  186. package/dist/components/Label/index.js +1 -9
  187. package/dist/components/Label/index.js.map +1 -1
  188. package/dist/components/List/examples/index.d.ts +0 -2
  189. package/dist/components/List/examples/index.d.ts.map +1 -1
  190. package/dist/components/List/examples/index.js +1 -2
  191. package/dist/components/List/examples/index.js.map +1 -1
  192. package/dist/components/List/index.d.ts +0 -1
  193. package/dist/components/List/index.d.ts.map +1 -1
  194. package/dist/components/List/index.js +2 -10
  195. package/dist/components/List/index.js.map +1 -1
  196. package/dist/components/Mask/examples/index.d.ts +0 -4
  197. package/dist/components/Mask/examples/index.d.ts.map +1 -1
  198. package/dist/components/Mask/examples/index.js +1 -4
  199. package/dist/components/Mask/examples/index.js.map +1 -1
  200. package/dist/components/Mask/index.d.ts +0 -1
  201. package/dist/components/Mask/index.d.ts.map +1 -1
  202. package/dist/components/Mask/index.js +1 -11
  203. package/dist/components/Mask/index.js.map +1 -1
  204. package/dist/components/Menu/examples/index.d.ts +0 -4
  205. package/dist/components/Menu/examples/index.d.ts.map +1 -1
  206. package/dist/components/Menu/examples/index.js +1 -4
  207. package/dist/components/Menu/examples/index.js.map +1 -1
  208. package/dist/components/Menu/index.d.ts +0 -1
  209. package/dist/components/Menu/index.d.ts.map +1 -1
  210. package/dist/components/Menu/index.js +1 -11
  211. package/dist/components/Menu/index.js.map +1 -1
  212. package/dist/components/Modal/examples/index.d.ts +0 -4
  213. package/dist/components/Modal/examples/index.d.ts.map +1 -1
  214. package/dist/components/Modal/examples/index.js +1 -4
  215. package/dist/components/Modal/examples/index.js.map +1 -1
  216. package/dist/components/Modal/index.d.ts +0 -1
  217. package/dist/components/Modal/index.d.ts.map +1 -1
  218. package/dist/components/Modal/index.js +1 -9
  219. package/dist/components/Modal/index.js.map +1 -1
  220. package/dist/components/Panel/examples/index.d.ts +1 -0
  221. package/dist/components/Panel/examples/index.d.ts.map +1 -0
  222. package/dist/components/Panel/examples/index.js +2 -0
  223. package/dist/components/Panel/examples/index.js.map +1 -0
  224. package/dist/components/Panel/index.d.ts.map +1 -1
  225. package/dist/components/Panel/index.js +1 -1
  226. package/dist/components/Panel/index.js.map +1 -1
  227. package/dist/components/Path/examples/index.d.ts +0 -2
  228. package/dist/components/Path/examples/index.d.ts.map +1 -1
  229. package/dist/components/Path/examples/index.js +1 -2
  230. package/dist/components/Path/examples/index.js.map +1 -1
  231. package/dist/components/Path/index.d.ts +0 -1
  232. package/dist/components/Path/index.d.ts.map +1 -1
  233. package/dist/components/Path/index.js +8 -16
  234. package/dist/components/Path/index.js.map +1 -1
  235. package/dist/components/Popover/examples/index.d.ts +0 -2
  236. package/dist/components/Popover/examples/index.d.ts.map +1 -1
  237. package/dist/components/Popover/examples/index.js +1 -2
  238. package/dist/components/Popover/examples/index.js.map +1 -1
  239. package/dist/components/Popover/index.d.ts +0 -1
  240. package/dist/components/Popover/index.d.ts.map +1 -1
  241. package/dist/components/Popover/index.js +1 -9
  242. package/dist/components/Popover/index.js.map +1 -1
  243. package/dist/components/Progress/examples/index.d.ts +0 -2
  244. package/dist/components/Progress/examples/index.d.ts.map +1 -1
  245. package/dist/components/Progress/examples/index.js +1 -2
  246. package/dist/components/Progress/examples/index.js.map +1 -1
  247. package/dist/components/Progress/index.d.ts +0 -1
  248. package/dist/components/Progress/index.d.ts.map +1 -1
  249. package/dist/components/Progress/index.js +3 -22
  250. package/dist/components/Progress/index.js.map +1 -1
  251. package/dist/components/Radio/examples/index.d.ts +0 -4
  252. package/dist/components/Radio/examples/index.d.ts.map +1 -1
  253. package/dist/components/Radio/examples/index.js +1 -4
  254. package/dist/components/Radio/examples/index.js.map +1 -1
  255. package/dist/components/Radio/index.d.ts +0 -1
  256. package/dist/components/Radio/index.d.ts.map +1 -1
  257. package/dist/components/Radio/index.js +1 -11
  258. package/dist/components/Radio/index.js.map +1 -1
  259. package/dist/components/Scroll/examples/index.d.ts +0 -2
  260. package/dist/components/Scroll/examples/index.d.ts.map +1 -1
  261. package/dist/components/Scroll/examples/index.js +1 -2
  262. package/dist/components/Scroll/examples/index.js.map +1 -1
  263. package/dist/components/Scroll/index.d.ts +0 -1
  264. package/dist/components/Scroll/index.d.ts.map +1 -1
  265. package/dist/components/Scroll/index.js +1 -9
  266. package/dist/components/Scroll/index.js.map +1 -1
  267. package/dist/components/Select/examples/index.d.ts +0 -4
  268. package/dist/components/Select/examples/index.d.ts.map +1 -1
  269. package/dist/components/Select/examples/index.js +1 -4
  270. package/dist/components/Select/examples/index.js.map +1 -1
  271. package/dist/components/Select/index.d.ts +0 -1
  272. package/dist/components/Select/index.d.ts.map +1 -1
  273. package/dist/components/Select/index.js +1 -11
  274. package/dist/components/Select/index.js.map +1 -1
  275. package/dist/components/Slider/examples/index.d.ts +0 -2
  276. package/dist/components/Slider/examples/index.d.ts.map +1 -1
  277. package/dist/components/Slider/examples/index.js +1 -2
  278. package/dist/components/Slider/examples/index.js.map +1 -1
  279. package/dist/components/Slider/index.d.ts +0 -1
  280. package/dist/components/Slider/index.d.ts.map +1 -1
  281. package/dist/components/Slider/index.js +0 -8
  282. package/dist/components/Slider/index.js.map +1 -1
  283. package/dist/components/Switch/examples/index.d.ts +0 -2
  284. package/dist/components/Switch/examples/index.d.ts.map +1 -1
  285. package/dist/components/Switch/examples/index.js +1 -2
  286. package/dist/components/Switch/examples/index.js.map +1 -1
  287. package/dist/components/Switch/index.d.ts +0 -1
  288. package/dist/components/Switch/index.d.ts.map +1 -1
  289. package/dist/components/Switch/index.js +0 -8
  290. package/dist/components/Switch/index.js.map +1 -1
  291. package/dist/components/Table/examples/index.d.ts +0 -2
  292. package/dist/components/Table/examples/index.d.ts.map +1 -1
  293. package/dist/components/Table/examples/index.js +1 -2
  294. package/dist/components/Table/examples/index.js.map +1 -1
  295. package/dist/components/Table/index.d.ts +0 -1
  296. package/dist/components/Table/index.d.ts.map +1 -1
  297. package/dist/components/Table/index.js +1 -10
  298. package/dist/components/Table/index.js.map +1 -1
  299. package/dist/components/Tabs/examples/index.d.ts +0 -4
  300. package/dist/components/Tabs/examples/index.d.ts.map +1 -1
  301. package/dist/components/Tabs/examples/index.js +1 -4
  302. package/dist/components/Tabs/examples/index.js.map +1 -1
  303. package/dist/components/Tabs/index.d.ts +0 -1
  304. package/dist/components/Tabs/index.d.ts.map +1 -1
  305. package/dist/components/Tabs/index.js +1 -11
  306. package/dist/components/Tabs/index.js.map +1 -1
  307. package/dist/components/Textarea/examples/index.d.ts +0 -2
  308. package/dist/components/Textarea/examples/index.d.ts.map +1 -1
  309. package/dist/components/Textarea/examples/index.js +1 -2
  310. package/dist/components/Textarea/examples/index.js.map +1 -1
  311. package/dist/components/Textarea/index.d.ts +0 -1
  312. package/dist/components/Textarea/index.d.ts.map +1 -1
  313. package/dist/components/Textarea/index.js +1 -9
  314. package/dist/components/Textarea/index.js.map +1 -1
  315. package/dist/components/Toast/examples/index.d.ts +0 -10
  316. package/dist/components/Toast/examples/index.d.ts.map +1 -1
  317. package/dist/components/Toast/examples/index.js +1 -10
  318. package/dist/components/Toast/examples/index.js.map +1 -1
  319. package/dist/components/Toast/index.d.ts +0 -1
  320. package/dist/components/Toast/index.d.ts.map +1 -1
  321. package/dist/components/Toast/index.js +2 -18
  322. package/dist/components/Toast/index.js.map +1 -1
  323. package/dist/components/Tooltip/examples/index.d.ts +0 -2
  324. package/dist/components/Tooltip/examples/index.d.ts.map +1 -1
  325. package/dist/components/Tooltip/examples/index.js +1 -2
  326. package/dist/components/Tooltip/examples/index.js.map +1 -1
  327. package/dist/components/Tooltip/index.d.ts +0 -1
  328. package/dist/components/Tooltip/index.d.ts.map +1 -1
  329. package/dist/components/Tooltip/index.js +1 -9
  330. package/dist/components/Tooltip/index.js.map +1 -1
  331. package/dist/demo-registry.d.ts.map +1 -1
  332. package/dist/demo-registry.js +1 -33
  333. package/dist/demo-registry.js.map +1 -1
  334. package/dist/elements/AI/AIChatInput/index.d.ts +0 -3
  335. package/dist/elements/AI/AIChatInput/index.d.ts.map +1 -1
  336. package/dist/elements/AI/AIChatInput/index.js +0 -2
  337. package/dist/elements/AI/AIChatInput/index.js.map +1 -1
  338. package/dist/elements/AI/ChainOfThought/index.d.ts +0 -3
  339. package/dist/elements/AI/ChainOfThought/index.d.ts.map +1 -1
  340. package/dist/elements/AI/ChainOfThought/index.js +0 -2
  341. package/dist/elements/AI/ChainOfThought/index.js.map +1 -1
  342. package/dist/elements/AI/Chat/index.d.ts +0 -3
  343. package/dist/elements/AI/Chat/index.d.ts.map +1 -1
  344. package/dist/elements/AI/Chat/index.js +0 -2
  345. package/dist/elements/AI/Chat/index.js.map +1 -1
  346. package/dist/elements/Documentation/CopyPage/index.d.ts +0 -3
  347. package/dist/elements/Documentation/CopyPage/index.d.ts.map +1 -1
  348. package/dist/elements/Documentation/CopyPage/index.js +0 -2
  349. package/dist/elements/Documentation/CopyPage/index.js.map +1 -1
  350. package/dist/elements/Documentation/NextArticle/index.d.ts +0 -3
  351. package/dist/elements/Documentation/NextArticle/index.d.ts.map +1 -1
  352. package/dist/elements/Documentation/NextArticle/index.js +0 -2
  353. package/dist/elements/Documentation/NextArticle/index.js.map +1 -1
  354. package/dist/elements/Documentation/TOC/index.d.ts +0 -3
  355. package/dist/elements/Documentation/TOC/index.d.ts.map +1 -1
  356. package/dist/elements/Documentation/TOC/index.js +0 -2
  357. package/dist/elements/Documentation/TOC/index.js.map +1 -1
  358. package/dist/elements/Elements/Carousel/index.d.ts +0 -3
  359. package/dist/elements/Elements/Carousel/index.d.ts.map +1 -1
  360. package/dist/elements/Elements/Carousel/index.js +0 -2
  361. package/dist/elements/Elements/Carousel/index.js.map +1 -1
  362. package/dist/elements/Elements/Rating/index.d.ts +0 -3
  363. package/dist/elements/Elements/Rating/index.d.ts.map +1 -1
  364. package/dist/elements/Elements/Rating/index.js +0 -2
  365. package/dist/elements/Elements/Rating/index.js.map +1 -1
  366. package/dist/elements/Elements/Timeline/index.d.ts +0 -3
  367. package/dist/elements/Elements/Timeline/index.d.ts.map +1 -1
  368. package/dist/elements/Elements/Timeline/index.js +0 -2
  369. package/dist/elements/Elements/Timeline/index.js.map +1 -1
  370. package/dist/elements/Elements/TreeView/index.d.ts +0 -3
  371. package/dist/elements/Elements/TreeView/index.d.ts.map +1 -1
  372. package/dist/elements/Elements/TreeView/index.js +0 -2
  373. package/dist/elements/Elements/TreeView/index.js.map +1 -1
  374. package/dist/elements/Elements/index.d.ts +0 -4
  375. package/dist/elements/Elements/index.d.ts.map +1 -1
  376. package/dist/elements/Elements/index.js +0 -4
  377. package/dist/elements/Elements/index.js.map +1 -1
  378. package/dist/elements/foundation/Header/index.d.ts +0 -3
  379. package/dist/elements/foundation/Header/index.d.ts.map +1 -1
  380. package/dist/elements/foundation/Header/index.js +0 -2
  381. package/dist/elements/foundation/Header/index.js.map +1 -1
  382. package/dist/elements/foundation/Page/index.d.ts +0 -3
  383. package/dist/elements/foundation/Page/index.d.ts.map +1 -1
  384. package/dist/elements/foundation/Page/index.js +0 -2
  385. package/dist/elements/foundation/Page/index.js.map +1 -1
  386. package/dist/elements/foundation/Sidebar/index.d.ts +0 -3
  387. package/dist/elements/foundation/Sidebar/index.d.ts.map +1 -1
  388. package/dist/elements/foundation/Sidebar/index.js +0 -2
  389. package/dist/elements/foundation/Sidebar/index.js.map +1 -1
  390. package/dist/elements/foundation/TestStructure/index.d.ts +19 -0
  391. package/dist/elements/foundation/TestStructure/index.d.ts.map +1 -0
  392. package/dist/elements/foundation/TestStructure/index.js +30 -0
  393. package/dist/elements/foundation/TestStructure/index.js.map +1 -0
  394. package/dist/elements/foundation/TestStructure/manifest.d.ts +8 -0
  395. package/dist/elements/foundation/TestStructure/manifest.d.ts.map +1 -0
  396. package/dist/elements/foundation/TestStructure/manifest.js +7 -0
  397. package/dist/elements/foundation/TestStructure/manifest.js.map +1 -0
  398. package/dist/elements/foundation/TestStructure/variations.json +16 -0
  399. package/dist/elements/foundation/index.d.ts +2 -4
  400. package/dist/elements/foundation/index.d.ts.map +1 -1
  401. package/dist/elements/foundation/index.js +2 -4
  402. package/dist/elements/foundation/index.js.map +1 -1
  403. package/dist/elements/index.d.ts.map +1 -1
  404. package/dist/elements/index.js +2 -0
  405. package/dist/elements/index.js.map +1 -1
  406. package/dist/elements/packages.d.ts.map +1 -1
  407. package/dist/elements/packages.js +1 -59
  408. package/dist/elements/packages.js.map +1 -1
  409. package/dist/generated-data.d.ts.map +1 -1
  410. package/dist/generated-data.js +952 -469
  411. package/dist/generated-data.js.map +1 -1
  412. package/dist/generated-styles.d.ts.map +1 -1
  413. package/dist/generated-styles.js +980 -195
  414. package/dist/generated-styles.js.map +1 -1
  415. package/dist/generated-styles.json +980 -195
  416. package/dist/index.d.ts +1 -3
  417. package/dist/index.d.ts.map +1 -1
  418. package/dist/index.js +0 -2
  419. package/dist/index.js.map +1 -1
  420. package/dist/patterns/data/badge-row/variations/main/index.js +1 -1
  421. package/dist/patterns/data/badge-row/variations/main/index.js.map +1 -1
  422. package/dist/patterns/data/badge-row/variations/mixed/index.js +1 -1
  423. package/dist/patterns/data/badge-row/variations/mixed/index.js.map +1 -1
  424. package/dist/patterns/data/badge-row/variations/outline/index.js +1 -1
  425. package/dist/patterns/data/badge-row/variations/outline/index.js.map +1 -1
  426. package/dist/patterns/data/data-table-row/variations/expandable/index.js +1 -1
  427. package/dist/patterns/data/data-table-row/variations/expandable/index.js.map +1 -1
  428. package/dist/patterns/data/data-table-row/variations/main/index.js +1 -1
  429. package/dist/patterns/data/data-table-row/variations/main/index.js.map +1 -1
  430. package/dist/patterns/data/data-table-row/variations/selectable/index.js +1 -1
  431. package/dist/patterns/data/data-table-row/variations/selectable/index.js.map +1 -1
  432. package/dist/patterns/interaction/tab-content-header/variations/with-badge/index.js +1 -1
  433. package/dist/patterns/interaction/tab-content-header/variations/with-badge/index.js.map +1 -1
  434. package/dist/patterns/layout/split-row/variations/main/index.js +1 -1
  435. package/dist/patterns/layout/split-row/variations/main/index.js.map +1 -1
  436. package/dist/registry.d.ts.map +1 -1
  437. package/dist/registry.js +482 -94
  438. package/dist/registry.js.map +1 -1
  439. package/dist/sections/Hero/index.d.ts +0 -2
  440. package/dist/sections/Hero/index.d.ts.map +1 -1
  441. package/dist/sections/Hero/index.js +0 -2
  442. package/dist/sections/Hero/index.js.map +1 -1
  443. package/dist/types.d.ts +18 -1
  444. package/dist/types.d.ts.map +1 -1
  445. package/dist/utils/load-component-examples.d.ts +4 -7
  446. package/dist/utils/load-component-examples.d.ts.map +1 -1
  447. package/dist/utils/load-component-examples.js +4 -7
  448. package/dist/utils/load-component-examples.js.map +1 -1
  449. package/package.json +5 -5
  450. package/src/components/Anchor/examples/index.ts +1 -1
  451. package/src/components/Anchor/examples.json +19 -4
  452. package/src/components/Anchor/index.tsx +1 -9
  453. package/src/components/Badge/examples/index.ts +1 -5
  454. package/src/components/Badge/examples.json +24 -9
  455. package/src/components/Badge/index.tsx +2 -22
  456. package/src/components/Banner/examples/index.ts +1 -2
  457. package/src/components/Banner/examples.json +24 -4
  458. package/src/components/Banner/index.tsx +3 -23
  459. package/src/components/Button/examples/index.ts +1 -10
  460. package/src/components/Button/index.tsx +0 -18
  461. package/src/components/Card/examples/index.ts +1 -2
  462. package/src/components/Card/examples.json +14 -4
  463. package/src/components/Card/index.tsx +1 -9
  464. package/src/components/Card/metadata.json +42 -0
  465. package/src/components/Checkbox/examples/index.ts +1 -5
  466. package/src/components/Checkbox/examples.json +29 -9
  467. package/src/components/Checkbox/index.tsx +0 -24
  468. package/src/components/Color/examples/index.ts +1 -3
  469. package/src/components/Color/examples.json +18 -8
  470. package/src/components/Color/index.tsx +1 -11
  471. package/src/components/Command/examples/index.ts +1 -2
  472. package/src/components/Command/index.tsx +1 -9
  473. package/src/components/Confirm/examples/index.ts +1 -2
  474. package/src/components/Confirm/index.tsx +1 -9
  475. package/src/components/Date/examples/index.ts +1 -11
  476. package/src/components/Date/index.tsx +1 -11
  477. package/src/components/Divider/examples/index.ts +1 -2
  478. package/src/components/Divider/index.tsx +1 -21
  479. package/src/components/Expand/examples/index.ts +1 -2
  480. package/src/components/Expand/examples.json +34 -4
  481. package/src/components/Expand/index.tsx +0 -11
  482. package/src/components/Flex/examples/01-axis-control.tsx +199 -0
  483. package/src/components/Flex/examples/02-wrap-overflow.tsx +183 -0
  484. package/src/components/Flex/examples/03-container-query-reflow.tsx +198 -0
  485. package/src/components/Flex/examples/index.ts +8 -2
  486. package/src/components/Flex/examples.json +14 -4
  487. package/src/components/Flex/index.tsx +43 -29
  488. package/src/components/Frame/examples/index.ts +1 -6
  489. package/src/components/Frame/index.tsx +1 -13
  490. package/src/components/Gallery/examples/01-grid-composition.tsx +121 -0
  491. package/src/components/Gallery/examples/02-item-orientation.tsx +133 -0
  492. package/src/components/Gallery/examples/03-span-layout.tsx +130 -0
  493. package/src/components/Gallery/examples/index.ts +8 -2
  494. package/src/components/Gallery/examples.json +14 -4
  495. package/src/components/Gallery/index.tsx +6 -2
  496. package/src/components/Grid/examples/02-track-placement.tsx +210 -0
  497. package/src/components/Grid/examples/03-editorial-spans.tsx +196 -0
  498. package/src/components/Grid/examples/04-responsive-card-rail.tsx +153 -0
  499. package/src/components/Grid/examples/index.ts +6 -2
  500. package/src/components/Grid/examples.json +14 -4
  501. package/src/components/Grid/index.tsx +57 -19
  502. package/src/components/Group/examples/index.ts +1 -2
  503. package/src/components/Group/index.tsx +1 -11
  504. package/src/components/Input/examples/index.ts +1 -4
  505. package/src/components/Input/examples.json +30 -0
  506. package/src/components/Input/index.tsx +0 -12
  507. package/src/components/Label/examples/index.ts +1 -2
  508. package/src/components/Label/index.tsx +1 -9
  509. package/src/components/List/examples/index.ts +1 -2
  510. package/src/components/List/examples.json +20 -0
  511. package/src/components/List/index.tsx +2 -12
  512. package/src/components/Mask/examples/index.ts +1 -5
  513. package/src/components/Mask/index.tsx +1 -11
  514. package/src/components/Menu/examples/index.ts +1 -4
  515. package/src/components/Menu/examples.json +20 -0
  516. package/src/components/Menu/index.tsx +1 -11
  517. package/src/components/Modal/examples/index.ts +1 -4
  518. package/src/components/Modal/examples.json +16 -1
  519. package/src/components/Modal/index.tsx +1 -9
  520. package/src/components/Modal/metadata.json +41 -1
  521. package/src/components/Panel/examples/index.ts +1 -0
  522. package/src/components/Panel/examples.json +7 -1
  523. package/src/components/Panel/index.tsx +2 -1
  524. package/src/components/Path/examples/index.ts +1 -2
  525. package/src/components/Path/examples.json +11 -1
  526. package/src/components/Path/index.tsx +12 -20
  527. package/src/components/Popover/examples/index.ts +1 -2
  528. package/src/components/Popover/examples.json +23 -3
  529. package/src/components/Popover/index.tsx +1 -9
  530. package/src/components/Progress/examples/index.ts +1 -2
  531. package/src/components/Progress/examples.json +23 -3
  532. package/src/components/Progress/index.tsx +2 -24
  533. package/src/components/Radio/examples/index.ts +1 -4
  534. package/src/components/Radio/index.tsx +1 -11
  535. package/src/components/Scroll/examples/index.ts +1 -2
  536. package/src/components/Scroll/examples.json +13 -3
  537. package/src/components/Scroll/index.tsx +1 -9
  538. package/src/components/Select/examples/index.ts +1 -4
  539. package/src/components/Select/examples.json +5 -0
  540. package/src/components/Select/index.tsx +1 -11
  541. package/src/components/Slider/examples/index.ts +1 -2
  542. package/src/components/Slider/examples.json +28 -3
  543. package/src/components/Slider/index.tsx +0 -9
  544. package/src/components/Switch/examples/index.ts +1 -2
  545. package/src/components/Switch/examples.json +23 -3
  546. package/src/components/Switch/index.tsx +0 -9
  547. package/src/components/Table/examples/index.ts +1 -2
  548. package/src/components/Table/index.tsx +1 -10
  549. package/src/components/Tabs/examples/index.ts +1 -4
  550. package/src/components/Tabs/examples.json +10 -0
  551. package/src/components/Tabs/index.tsx +1 -11
  552. package/src/components/Textarea/examples/index.ts +1 -2
  553. package/src/components/Textarea/examples.json +23 -3
  554. package/src/components/Textarea/index.tsx +1 -9
  555. package/src/components/Toast/examples/index.ts +1 -10
  556. package/src/components/Toast/index.tsx +2 -21
  557. package/src/components/Tooltip/examples/index.ts +1 -2
  558. package/src/components/Tooltip/index.tsx +1 -9
  559. package/src/demo-registry.ts +1 -31
  560. package/src/elements/AI/AIChatInput/index.tsx +0 -3
  561. package/src/elements/AI/ChainOfThought/index.tsx +0 -3
  562. package/src/elements/AI/Chat/index.tsx +0 -3
  563. package/src/elements/Documentation/CopyPage/index.tsx +0 -3
  564. package/src/elements/Documentation/NextArticle/index.tsx +0 -3
  565. package/src/elements/Documentation/TOC/index.tsx +0 -3
  566. package/src/elements/Elements/Carousel/index.tsx +0 -3
  567. package/src/elements/Elements/Rating/index.tsx +0 -3
  568. package/src/elements/Elements/Timeline/index.tsx +0 -3
  569. package/src/elements/Elements/TreeView/index.tsx +0 -3
  570. package/src/elements/Elements/index.ts +0 -24
  571. package/src/elements/foundation/Header/index.tsx +0 -3
  572. package/src/elements/foundation/Page/index.tsx +0 -3
  573. package/src/elements/foundation/Sidebar/index.tsx +0 -3
  574. package/src/elements/foundation/TestStructure/index.tsx +54 -0
  575. package/src/elements/foundation/TestStructure/manifest.ts +9 -0
  576. package/src/elements/foundation/TestStructure/metadata.json +7 -0
  577. package/src/elements/foundation/TestStructure/variations.json +16 -0
  578. package/src/elements/foundation/index.ts +3 -19
  579. package/src/elements/index.ts +2 -0
  580. package/src/elements/packages.ts +1 -61
  581. package/src/generated-data.ts +952 -469
  582. package/src/generated-styles.ts +980 -195
  583. package/src/index.ts +2 -18
  584. package/src/patterns/data/badge-row/variations/main/index.tsx +1 -1
  585. package/src/patterns/data/badge-row/variations/mixed/index.tsx +1 -1
  586. package/src/patterns/data/badge-row/variations/outline/index.tsx +1 -1
  587. package/src/patterns/data/data-table-row/variations/expandable/index.tsx +1 -1
  588. package/src/patterns/data/data-table-row/variations/main/index.tsx +1 -1
  589. package/src/patterns/data/data-table-row/variations/selectable/index.tsx +1 -1
  590. package/src/patterns/interaction/tab-content-header/variations/with-badge/index.tsx +1 -1
  591. package/src/patterns/layout/split-row/variations/main/index.tsx +1 -1
  592. package/src/registry.ts +482 -94
  593. package/src/sections/Hero/index.tsx +0 -2
  594. package/src/types.ts +20 -1
  595. package/src/utils/load-component-examples.ts +8 -7
  596. package/dist/components/Anchor/examples/01-basic-anchor.d.ts +0 -6
  597. package/dist/components/Anchor/examples/01-basic-anchor.d.ts.map +0 -1
  598. package/dist/components/Anchor/examples/01-basic-anchor.js +0 -10
  599. package/dist/components/Anchor/examples/01-basic-anchor.js.map +0 -1
  600. package/dist/components/Anchor/examples.json +0 -7
  601. package/dist/components/Badge/examples/01-basic-badge.d.ts +0 -6
  602. package/dist/components/Badge/examples/01-basic-badge.d.ts.map +0 -1
  603. package/dist/components/Badge/examples/01-basic-badge.js +0 -10
  604. package/dist/components/Badge/examples/01-basic-badge.js.map +0 -1
  605. package/dist/components/Badge/examples/02-variants-and-sizes.d.ts +0 -6
  606. package/dist/components/Badge/examples/02-variants-and-sizes.d.ts.map +0 -1
  607. package/dist/components/Badge/examples/02-variants-and-sizes.js +0 -10
  608. package/dist/components/Badge/examples/02-variants-and-sizes.js.map +0 -1
  609. package/dist/components/Badge/examples.json +0 -12
  610. package/dist/components/Banner/examples/01-basic-banner.d.ts +0 -6
  611. package/dist/components/Banner/examples/01-basic-banner.d.ts.map +0 -1
  612. package/dist/components/Banner/examples/01-basic-banner.js +0 -10
  613. package/dist/components/Banner/examples/01-basic-banner.js.map +0 -1
  614. package/dist/components/Banner/examples.json +0 -7
  615. package/dist/components/Button/examples/01-variants.d.ts +0 -6
  616. package/dist/components/Button/examples/01-variants.d.ts.map +0 -1
  617. package/dist/components/Button/examples/01-variants.js +0 -10
  618. package/dist/components/Button/examples/01-variants.js.map +0 -1
  619. package/dist/components/Button/examples/02-multi-actions.d.ts +0 -6
  620. package/dist/components/Button/examples/02-multi-actions.d.ts.map +0 -1
  621. package/dist/components/Button/examples/02-multi-actions.js +0 -12
  622. package/dist/components/Button/examples/02-multi-actions.js.map +0 -1
  623. package/dist/components/Button/examples/03-joined-toggle.d.ts +0 -6
  624. package/dist/components/Button/examples/03-joined-toggle.d.ts.map +0 -1
  625. package/dist/components/Button/examples/03-joined-toggle.js +0 -15
  626. package/dist/components/Button/examples/03-joined-toggle.js.map +0 -1
  627. package/dist/components/Button/examples/04-sub-stack-actions.d.ts +0 -6
  628. package/dist/components/Button/examples/04-sub-stack-actions.d.ts.map +0 -1
  629. package/dist/components/Button/examples/04-sub-stack-actions.js +0 -15
  630. package/dist/components/Button/examples/04-sub-stack-actions.js.map +0 -1
  631. package/dist/components/Button/examples/05-split-action-button.d.ts +0 -6
  632. package/dist/components/Button/examples/05-split-action-button.d.ts.map +0 -1
  633. package/dist/components/Button/examples/05-split-action-button.js +0 -57
  634. package/dist/components/Button/examples/05-split-action-button.js.map +0 -1
  635. package/dist/components/Button/examples.json +0 -27
  636. package/dist/components/Card/examples/01-basic-card.d.ts +0 -6
  637. package/dist/components/Card/examples/01-basic-card.d.ts.map +0 -1
  638. package/dist/components/Card/examples/01-basic-card.js +0 -10
  639. package/dist/components/Card/examples/01-basic-card.js.map +0 -1
  640. package/dist/components/Card/examples.json +0 -7
  641. package/dist/components/Checkbox/examples/01-basic-checkbox.d.ts +0 -6
  642. package/dist/components/Checkbox/examples/01-basic-checkbox.d.ts.map +0 -1
  643. package/dist/components/Checkbox/examples/01-basic-checkbox.js +0 -13
  644. package/dist/components/Checkbox/examples/01-basic-checkbox.js.map +0 -1
  645. package/dist/components/Checkbox/examples/02-checkbox-group-with-descriptions.d.ts +0 -6
  646. package/dist/components/Checkbox/examples/02-checkbox-group-with-descriptions.d.ts.map +0 -1
  647. package/dist/components/Checkbox/examples/02-checkbox-group-with-descriptions.js +0 -21
  648. package/dist/components/Checkbox/examples/02-checkbox-group-with-descriptions.js.map +0 -1
  649. package/dist/components/Checkbox/examples.json +0 -12
  650. package/dist/components/Color/examples/01-basic-color.d.ts +0 -6
  651. package/dist/components/Color/examples/01-basic-color.d.ts.map +0 -1
  652. package/dist/components/Color/examples/01-basic-color.js +0 -12
  653. package/dist/components/Color/examples/01-basic-color.js.map +0 -1
  654. package/dist/components/Color/examples/02-opacity-slider.d.ts +0 -6
  655. package/dist/components/Color/examples/02-opacity-slider.d.ts.map +0 -1
  656. package/dist/components/Color/examples/02-opacity-slider.js +0 -12
  657. package/dist/components/Color/examples/02-opacity-slider.js.map +0 -1
  658. package/dist/components/Color/examples/03-format-switching.d.ts +0 -2
  659. package/dist/components/Color/examples/03-format-switching.d.ts.map +0 -1
  660. package/dist/components/Color/examples/03-format-switching.js +0 -16
  661. package/dist/components/Color/examples/03-format-switching.js.map +0 -1
  662. package/dist/components/Color/examples.json +0 -12
  663. package/dist/components/Command/examples/01-basic-command.d.ts +0 -6
  664. package/dist/components/Command/examples/01-basic-command.d.ts.map +0 -1
  665. package/dist/components/Command/examples/01-basic-command.js +0 -36
  666. package/dist/components/Command/examples/01-basic-command.js.map +0 -1
  667. package/dist/components/Command/examples.json +0 -7
  668. package/dist/components/Confirm/examples/01-basic-confirm.d.ts +0 -6
  669. package/dist/components/Confirm/examples/01-basic-confirm.d.ts.map +0 -1
  670. package/dist/components/Confirm/examples/01-basic-confirm.js +0 -10
  671. package/dist/components/Confirm/examples/01-basic-confirm.js.map +0 -1
  672. package/dist/components/Confirm/examples.json +0 -7
  673. package/dist/components/Date/examples/01-basic-date.d.ts +0 -6
  674. package/dist/components/Date/examples/01-basic-date.d.ts.map +0 -1
  675. package/dist/components/Date/examples/01-basic-date.js +0 -12
  676. package/dist/components/Date/examples/01-basic-date.js.map +0 -1
  677. package/dist/components/Date/examples/02-with-disabled-dates.d.ts +0 -6
  678. package/dist/components/Date/examples/02-with-disabled-dates.d.ts.map +0 -1
  679. package/dist/components/Date/examples/02-with-disabled-dates.js +0 -16
  680. package/dist/components/Date/examples/02-with-disabled-dates.js.map +0 -1
  681. package/dist/components/Date/examples/03-controlled-mode.d.ts +0 -6
  682. package/dist/components/Date/examples/03-controlled-mode.d.ts.map +0 -1
  683. package/dist/components/Date/examples/03-controlled-mode.js +0 -28
  684. package/dist/components/Date/examples/03-controlled-mode.js.map +0 -1
  685. package/dist/components/Date/examples/04-date-range.d.ts +0 -6
  686. package/dist/components/Date/examples/04-date-range.d.ts.map +0 -1
  687. package/dist/components/Date/examples/04-date-range.js +0 -40
  688. package/dist/components/Date/examples/04-date-range.js.map +0 -1
  689. package/dist/components/Date/examples.json +0 -1
  690. package/dist/components/Divider/examples/01-basic-divider.d.ts +0 -6
  691. package/dist/components/Divider/examples/01-basic-divider.d.ts.map +0 -1
  692. package/dist/components/Divider/examples/01-basic-divider.js +0 -10
  693. package/dist/components/Divider/examples/01-basic-divider.js.map +0 -1
  694. package/dist/components/Divider/examples/02-pattern-variants.d.ts +0 -6
  695. package/dist/components/Divider/examples/02-pattern-variants.d.ts.map +0 -1
  696. package/dist/components/Divider/examples/02-pattern-variants.js +0 -10
  697. package/dist/components/Divider/examples/02-pattern-variants.js.map +0 -1
  698. package/dist/components/Divider/examples/03-vertical-divider.d.ts +0 -6
  699. package/dist/components/Divider/examples/03-vertical-divider.d.ts.map +0 -1
  700. package/dist/components/Divider/examples/03-vertical-divider.js +0 -10
  701. package/dist/components/Divider/examples/03-vertical-divider.js.map +0 -1
  702. package/dist/components/Divider/examples.json +0 -17
  703. package/dist/components/Expand/examples/01-basic-expand.d.ts +0 -6
  704. package/dist/components/Expand/examples/01-basic-expand.d.ts.map +0 -1
  705. package/dist/components/Expand/examples/01-basic-expand.js +0 -10
  706. package/dist/components/Expand/examples/01-basic-expand.js.map +0 -1
  707. package/dist/components/Expand/examples.json +0 -7
  708. package/dist/components/Flex/examples/01-basic-flex.d.ts +0 -6
  709. package/dist/components/Flex/examples/01-basic-flex.d.ts.map +0 -1
  710. package/dist/components/Flex/examples/01-basic-flex.js +0 -10
  711. package/dist/components/Flex/examples/01-basic-flex.js.map +0 -1
  712. package/dist/components/Frame/examples/01-default-frame.d.ts +0 -7
  713. package/dist/components/Frame/examples/01-default-frame.d.ts.map +0 -1
  714. package/dist/components/Frame/examples/01-default-frame.js +0 -14
  715. package/dist/components/Frame/examples/01-default-frame.js.map +0 -1
  716. package/dist/components/Frame/examples/02-tooltip-example.d.ts +0 -7
  717. package/dist/components/Frame/examples/02-tooltip-example.d.ts.map +0 -1
  718. package/dist/components/Frame/examples/02-tooltip-example.js +0 -13
  719. package/dist/components/Frame/examples/02-tooltip-example.js.map +0 -1
  720. package/dist/components/Frame/examples/03-sidebar-tab.d.ts +0 -7
  721. package/dist/components/Frame/examples/03-sidebar-tab.d.ts.map +0 -1
  722. package/dist/components/Frame/examples/03-sidebar-tab.js +0 -17
  723. package/dist/components/Frame/examples/03-sidebar-tab.js.map +0 -1
  724. package/dist/components/Frame/examples.json +0 -17
  725. package/dist/components/Gallery/examples/01-basic-gallery.d.ts +0 -6
  726. package/dist/components/Gallery/examples/01-basic-gallery.d.ts.map +0 -1
  727. package/dist/components/Gallery/examples/01-basic-gallery.js +0 -10
  728. package/dist/components/Gallery/examples/01-basic-gallery.js.map +0 -1
  729. package/dist/components/Grid/examples/01-basic-grid.d.ts +0 -6
  730. package/dist/components/Grid/examples/01-basic-grid.d.ts.map +0 -1
  731. package/dist/components/Grid/examples/01-basic-grid.js +0 -10
  732. package/dist/components/Grid/examples/01-basic-grid.js.map +0 -1
  733. package/dist/components/Group/examples/01-basic-group.d.ts +0 -6
  734. package/dist/components/Group/examples/01-basic-group.d.ts.map +0 -1
  735. package/dist/components/Group/examples/01-basic-group.js +0 -10
  736. package/dist/components/Group/examples/01-basic-group.js.map +0 -1
  737. package/dist/components/Group/examples.json +0 -7
  738. package/dist/components/Input/examples/01-basic-input.d.ts +0 -6
  739. package/dist/components/Input/examples/01-basic-input.d.ts.map +0 -1
  740. package/dist/components/Input/examples/01-basic-input.js +0 -10
  741. package/dist/components/Input/examples/01-basic-input.js.map +0 -1
  742. package/dist/components/Input/examples/02-validation.d.ts +0 -6
  743. package/dist/components/Input/examples/02-validation.d.ts.map +0 -1
  744. package/dist/components/Input/examples/02-validation.js +0 -11
  745. package/dist/components/Input/examples/02-validation.js.map +0 -1
  746. package/dist/components/Input/examples.json +0 -12
  747. package/dist/components/Label/examples/01-basic-label.d.ts +0 -6
  748. package/dist/components/Label/examples/01-basic-label.d.ts.map +0 -1
  749. package/dist/components/Label/examples/01-basic-label.js +0 -10
  750. package/dist/components/Label/examples/01-basic-label.js.map +0 -1
  751. package/dist/components/Label/examples.json +0 -7
  752. package/dist/components/List/examples/01-basic.d.ts +0 -6
  753. package/dist/components/List/examples/01-basic.d.ts.map +0 -1
  754. package/dist/components/List/examples/01-basic.js +0 -11
  755. package/dist/components/List/examples/01-basic.js.map +0 -1
  756. package/dist/components/List/examples.json +0 -7
  757. package/dist/components/Mask/examples/01-read-more-fade.d.ts +0 -6
  758. package/dist/components/Mask/examples/01-read-more-fade.d.ts.map +0 -1
  759. package/dist/components/Mask/examples/01-read-more-fade.js +0 -10
  760. package/dist/components/Mask/examples/01-read-more-fade.js.map +0 -1
  761. package/dist/components/Mask/examples/02-text-gradient.d.ts +0 -6
  762. package/dist/components/Mask/examples/02-text-gradient.d.ts.map +0 -1
  763. package/dist/components/Mask/examples/02-text-gradient.js +0 -10
  764. package/dist/components/Mask/examples/02-text-gradient.js.map +0 -1
  765. package/dist/components/Mask/examples.json +0 -12
  766. package/dist/components/Menu/examples/01-basic-menu.d.ts +0 -6
  767. package/dist/components/Menu/examples/01-basic-menu.d.ts.map +0 -1
  768. package/dist/components/Menu/examples/01-basic-menu.js +0 -10
  769. package/dist/components/Menu/examples/01-basic-menu.js.map +0 -1
  770. package/dist/components/Menu/examples/02-nested-menu.d.ts +0 -6
  771. package/dist/components/Menu/examples/02-nested-menu.d.ts.map +0 -1
  772. package/dist/components/Menu/examples/02-nested-menu.js +0 -10
  773. package/dist/components/Menu/examples/02-nested-menu.js.map +0 -1
  774. package/dist/components/Menu/examples.json +0 -12
  775. package/dist/components/Modal/examples/01-basic-modal.d.ts +0 -6
  776. package/dist/components/Modal/examples/01-basic-modal.d.ts.map +0 -1
  777. package/dist/components/Modal/examples/01-basic-modal.js +0 -13
  778. package/dist/components/Modal/examples/01-basic-modal.js.map +0 -1
  779. package/dist/components/Modal/examples/02-form-modal.d.ts +0 -6
  780. package/dist/components/Modal/examples/02-form-modal.d.ts.map +0 -1
  781. package/dist/components/Modal/examples/02-form-modal.js +0 -23
  782. package/dist/components/Modal/examples/02-form-modal.js.map +0 -1
  783. package/dist/components/Modal/examples.json +0 -12
  784. package/dist/components/Path/examples/01-basic-breadcrumbs.d.ts +0 -6
  785. package/dist/components/Path/examples/01-basic-breadcrumbs.d.ts.map +0 -1
  786. package/dist/components/Path/examples/01-basic-breadcrumbs.js +0 -10
  787. package/dist/components/Path/examples/01-basic-breadcrumbs.js.map +0 -1
  788. package/dist/components/Path/examples/01-basic-path.d.ts +0 -6
  789. package/dist/components/Path/examples/01-basic-path.d.ts.map +0 -1
  790. package/dist/components/Path/examples/01-basic-path.js +0 -10
  791. package/dist/components/Path/examples/01-basic-path.js.map +0 -1
  792. package/dist/components/Path/examples.json +0 -7
  793. package/dist/components/Popover/examples/01-basic-popover.d.ts +0 -6
  794. package/dist/components/Popover/examples/01-basic-popover.d.ts.map +0 -1
  795. package/dist/components/Popover/examples/01-basic-popover.js +0 -10
  796. package/dist/components/Popover/examples/01-basic-popover.js.map +0 -1
  797. package/dist/components/Popover/examples.json +0 -7
  798. package/dist/components/Progress/examples/01-basic-progress.d.ts +0 -6
  799. package/dist/components/Progress/examples/01-basic-progress.d.ts.map +0 -1
  800. package/dist/components/Progress/examples/01-basic-progress.js +0 -10
  801. package/dist/components/Progress/examples/01-basic-progress.js.map +0 -1
  802. package/dist/components/Progress/examples.json +0 -7
  803. package/dist/components/Radio/examples/01-basic-radio.d.ts +0 -6
  804. package/dist/components/Radio/examples/01-basic-radio.d.ts.map +0 -1
  805. package/dist/components/Radio/examples/01-basic-radio.js +0 -10
  806. package/dist/components/Radio/examples/01-basic-radio.js.map +0 -1
  807. package/dist/components/Radio/examples/02-radio-with-descriptions.d.ts +0 -6
  808. package/dist/components/Radio/examples/02-radio-with-descriptions.d.ts.map +0 -1
  809. package/dist/components/Radio/examples/02-radio-with-descriptions.js +0 -11
  810. package/dist/components/Radio/examples/02-radio-with-descriptions.js.map +0 -1
  811. package/dist/components/Radio/examples.json +0 -12
  812. package/dist/components/Scroll/examples/01-basic-scroll.d.ts +0 -6
  813. package/dist/components/Scroll/examples/01-basic-scroll.d.ts.map +0 -1
  814. package/dist/components/Scroll/examples/01-basic-scroll.js +0 -10
  815. package/dist/components/Scroll/examples/01-basic-scroll.js.map +0 -1
  816. package/dist/components/Scroll/examples.json +0 -7
  817. package/dist/components/Select/examples/01-basic-select.d.ts +0 -6
  818. package/dist/components/Select/examples/01-basic-select.d.ts.map +0 -1
  819. package/dist/components/Select/examples/01-basic-select.js +0 -10
  820. package/dist/components/Select/examples/01-basic-select.js.map +0 -1
  821. package/dist/components/Select/examples/02-searchable-select.d.ts +0 -6
  822. package/dist/components/Select/examples/02-searchable-select.d.ts.map +0 -1
  823. package/dist/components/Select/examples/02-searchable-select.js +0 -38
  824. package/dist/components/Select/examples/02-searchable-select.js.map +0 -1
  825. package/dist/components/Select/examples.json +0 -12
  826. package/dist/components/Slider/examples/01-basic-slider.d.ts +0 -6
  827. package/dist/components/Slider/examples/01-basic-slider.d.ts.map +0 -1
  828. package/dist/components/Slider/examples/01-basic-slider.js +0 -10
  829. package/dist/components/Slider/examples/01-basic-slider.js.map +0 -1
  830. package/dist/components/Slider/examples.json +0 -7
  831. package/dist/components/Switch/examples/01-basic-switch.d.ts +0 -6
  832. package/dist/components/Switch/examples/01-basic-switch.d.ts.map +0 -1
  833. package/dist/components/Switch/examples/01-basic-switch.js +0 -10
  834. package/dist/components/Switch/examples/01-basic-switch.js.map +0 -1
  835. package/dist/components/Switch/examples.json +0 -7
  836. package/dist/components/Table/examples/01-basic-table.d.ts +0 -6
  837. package/dist/components/Table/examples/01-basic-table.d.ts.map +0 -1
  838. package/dist/components/Table/examples/01-basic-table.js +0 -20
  839. package/dist/components/Table/examples/01-basic-table.js.map +0 -1
  840. package/dist/components/Table/examples.json +0 -7
  841. package/dist/components/Tabs/examples/01-basic-tabs.d.ts +0 -6
  842. package/dist/components/Tabs/examples/01-basic-tabs.d.ts.map +0 -1
  843. package/dist/components/Tabs/examples/01-basic-tabs.js +0 -10
  844. package/dist/components/Tabs/examples/01-basic-tabs.js.map +0 -1
  845. package/dist/components/Tabs/examples/02-vertical-tabs.d.ts +0 -6
  846. package/dist/components/Tabs/examples/02-vertical-tabs.d.ts.map +0 -1
  847. package/dist/components/Tabs/examples/02-vertical-tabs.js +0 -11
  848. package/dist/components/Tabs/examples/02-vertical-tabs.js.map +0 -1
  849. package/dist/components/Tabs/examples.json +0 -12
  850. package/dist/components/Textarea/examples/01-basic-textarea.d.ts +0 -6
  851. package/dist/components/Textarea/examples/01-basic-textarea.d.ts.map +0 -1
  852. package/dist/components/Textarea/examples/01-basic-textarea.js +0 -10
  853. package/dist/components/Textarea/examples/01-basic-textarea.js.map +0 -1
  854. package/dist/components/Textarea/examples.json +0 -7
  855. package/dist/components/Toast/examples/01-basic-toast.d.ts +0 -6
  856. package/dist/components/Toast/examples/01-basic-toast.d.ts.map +0 -1
  857. package/dist/components/Toast/examples/01-basic-toast.js +0 -10
  858. package/dist/components/Toast/examples/01-basic-toast.js.map +0 -1
  859. package/dist/components/Toast/examples/02-success-toast.d.ts +0 -6
  860. package/dist/components/Toast/examples/02-success-toast.d.ts.map +0 -1
  861. package/dist/components/Toast/examples/02-success-toast.js +0 -14
  862. package/dist/components/Toast/examples/02-success-toast.js.map +0 -1
  863. package/dist/components/Toast/examples/03-danger-toast.d.ts +0 -6
  864. package/dist/components/Toast/examples/03-danger-toast.d.ts.map +0 -1
  865. package/dist/components/Toast/examples/03-danger-toast.js +0 -14
  866. package/dist/components/Toast/examples/03-danger-toast.js.map +0 -1
  867. package/dist/components/Toast/examples/04-info-toast.d.ts +0 -6
  868. package/dist/components/Toast/examples/04-info-toast.d.ts.map +0 -1
  869. package/dist/components/Toast/examples/04-info-toast.js +0 -14
  870. package/dist/components/Toast/examples/04-info-toast.js.map +0 -1
  871. package/dist/components/Toast/examples/05-warning-toast.d.ts +0 -6
  872. package/dist/components/Toast/examples/05-warning-toast.d.ts.map +0 -1
  873. package/dist/components/Toast/examples/05-warning-toast.js +0 -14
  874. package/dist/components/Toast/examples/05-warning-toast.js.map +0 -1
  875. package/dist/components/Toast/examples.json +0 -27
  876. package/dist/components/Tooltip/examples/01-basic-tooltip.d.ts +0 -6
  877. package/dist/components/Tooltip/examples/01-basic-tooltip.d.ts.map +0 -1
  878. package/dist/components/Tooltip/examples/01-basic-tooltip.js +0 -10
  879. package/dist/components/Tooltip/examples/01-basic-tooltip.js.map +0 -1
  880. package/dist/components/Tooltip/examples.json +0 -7
  881. package/dist/design-tokens/index.d.ts +0 -52
  882. package/dist/design-tokens/index.d.ts.map +0 -1
  883. package/dist/design-tokens/index.js +0 -167
  884. package/dist/design-tokens/index.js.map +0 -1
  885. package/dist/elements/AI/AIChatInput/variations/01-basic/index.d.ts +0 -2
  886. package/dist/elements/AI/AIChatInput/variations/01-basic/index.d.ts.map +0 -1
  887. package/dist/elements/AI/AIChatInput/variations/01-basic/index.js +0 -13
  888. package/dist/elements/AI/AIChatInput/variations/01-basic/index.js.map +0 -1
  889. package/dist/elements/AI/AIChatInput/variations/01-basic/layout/PromptInput.d.ts +0 -9
  890. package/dist/elements/AI/AIChatInput/variations/01-basic/layout/PromptInput.d.ts.map +0 -1
  891. package/dist/elements/AI/AIChatInput/variations/01-basic/layout/PromptInput.js +0 -25
  892. package/dist/elements/AI/AIChatInput/variations/01-basic/layout/PromptInput.js.map +0 -1
  893. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/index.d.ts +0 -2
  894. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/index.d.ts.map +0 -1
  895. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/index.js +0 -25
  896. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/index.js.map +0 -1
  897. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.d.ts +0 -9
  898. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.d.ts.map +0 -1
  899. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.js +0 -25
  900. package/dist/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.js.map +0 -1
  901. package/dist/elements/AI/AIChatInput/variations/index.d.ts +0 -18
  902. package/dist/elements/AI/AIChatInput/variations/index.d.ts.map +0 -1
  903. package/dist/elements/AI/AIChatInput/variations/index.js +0 -14
  904. package/dist/elements/AI/AIChatInput/variations/index.js.map +0 -1
  905. package/dist/elements/AI/ChainOfThought/variations/01-basic/index.d.ts +0 -2
  906. package/dist/elements/AI/ChainOfThought/variations/01-basic/index.d.ts.map +0 -1
  907. package/dist/elements/AI/ChainOfThought/variations/01-basic/index.js +0 -29
  908. package/dist/elements/AI/ChainOfThought/variations/01-basic/index.js.map +0 -1
  909. package/dist/elements/AI/ChainOfThought/variations/01-basic/layout/ThoughtStep.d.ts +0 -8
  910. package/dist/elements/AI/ChainOfThought/variations/01-basic/layout/ThoughtStep.d.ts.map +0 -1
  911. package/dist/elements/AI/ChainOfThought/variations/01-basic/layout/ThoughtStep.js +0 -5
  912. package/dist/elements/AI/ChainOfThought/variations/01-basic/layout/ThoughtStep.js.map +0 -1
  913. package/dist/elements/AI/ChainOfThought/variations/02-with-details/index.d.ts +0 -2
  914. package/dist/elements/AI/ChainOfThought/variations/02-with-details/index.d.ts.map +0 -1
  915. package/dist/elements/AI/ChainOfThought/variations/02-with-details/index.js +0 -61
  916. package/dist/elements/AI/ChainOfThought/variations/02-with-details/index.js.map +0 -1
  917. package/dist/elements/AI/ChainOfThought/variations/02-with-details/layout/ExpandableThoughtStep.d.ts +0 -11
  918. package/dist/elements/AI/ChainOfThought/variations/02-with-details/layout/ExpandableThoughtStep.d.ts.map +0 -1
  919. package/dist/elements/AI/ChainOfThought/variations/02-with-details/layout/ExpandableThoughtStep.js +0 -5
  920. package/dist/elements/AI/ChainOfThought/variations/02-with-details/layout/ExpandableThoughtStep.js.map +0 -1
  921. package/dist/elements/AI/ChainOfThought/variations/index.d.ts +0 -18
  922. package/dist/elements/AI/ChainOfThought/variations/index.d.ts.map +0 -1
  923. package/dist/elements/AI/ChainOfThought/variations/index.js +0 -14
  924. package/dist/elements/AI/ChainOfThought/variations/index.js.map +0 -1
  925. package/dist/elements/AI/Chat/variations/01-basic/index.d.ts +0 -2
  926. package/dist/elements/AI/Chat/variations/01-basic/index.d.ts.map +0 -1
  927. package/dist/elements/AI/Chat/variations/01-basic/index.js +0 -31
  928. package/dist/elements/AI/Chat/variations/01-basic/index.js.map +0 -1
  929. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatContainer.d.ts +0 -7
  930. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatContainer.d.ts.map +0 -1
  931. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatContainer.js +0 -5
  932. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatContainer.js.map +0 -1
  933. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatInput.d.ts +0 -6
  934. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatInput.d.ts.map +0 -1
  935. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatInput.js +0 -14
  936. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatInput.js.map +0 -1
  937. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatMessage.d.ts +0 -7
  938. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatMessage.d.ts.map +0 -1
  939. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatMessage.js +0 -7
  940. package/dist/elements/AI/Chat/variations/01-basic/layout/ChatMessage.js.map +0 -1
  941. package/dist/elements/AI/Chat/variations/02-with-actions/index.d.ts +0 -2
  942. package/dist/elements/AI/Chat/variations/02-with-actions/index.d.ts.map +0 -1
  943. package/dist/elements/AI/Chat/variations/02-with-actions/index.js +0 -39
  944. package/dist/elements/AI/Chat/variations/02-with-actions/index.js.map +0 -1
  945. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatContainerWithActions.d.ts +0 -7
  946. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatContainerWithActions.d.ts.map +0 -1
  947. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatContainerWithActions.js +0 -5
  948. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatContainerWithActions.js.map +0 -1
  949. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatInputWithActions.d.ts +0 -6
  950. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatInputWithActions.d.ts.map +0 -1
  951. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatInputWithActions.js +0 -14
  952. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatInputWithActions.js.map +0 -1
  953. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatMessage.d.ts +0 -7
  954. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatMessage.d.ts.map +0 -1
  955. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatMessage.js +0 -7
  956. package/dist/elements/AI/Chat/variations/02-with-actions/layout/ChatMessage.js.map +0 -1
  957. package/dist/elements/AI/Chat/variations/index.d.ts +0 -18
  958. package/dist/elements/AI/Chat/variations/index.d.ts.map +0 -1
  959. package/dist/elements/AI/Chat/variations/index.js +0 -14
  960. package/dist/elements/AI/Chat/variations/index.js.map +0 -1
  961. package/dist/elements/Documentation/CopyPage/variations/01-basic/index.d.ts +0 -2
  962. package/dist/elements/Documentation/CopyPage/variations/01-basic/index.d.ts.map +0 -1
  963. package/dist/elements/Documentation/CopyPage/variations/01-basic/index.js +0 -7
  964. package/dist/elements/Documentation/CopyPage/variations/01-basic/index.js.map +0 -1
  965. package/dist/elements/Documentation/CopyPage/variations/01-basic/layout/CopyButton.d.ts +0 -2
  966. package/dist/elements/Documentation/CopyPage/variations/01-basic/layout/CopyButton.d.ts.map +0 -1
  967. package/dist/elements/Documentation/CopyPage/variations/01-basic/layout/CopyButton.js +0 -20
  968. package/dist/elements/Documentation/CopyPage/variations/01-basic/layout/CopyButton.js.map +0 -1
  969. package/dist/elements/Documentation/CopyPage/variations/02-with-success/index.d.ts +0 -2
  970. package/dist/elements/Documentation/CopyPage/variations/02-with-success/index.d.ts.map +0 -1
  971. package/dist/elements/Documentation/CopyPage/variations/02-with-success/index.js +0 -13
  972. package/dist/elements/Documentation/CopyPage/variations/02-with-success/index.js.map +0 -1
  973. package/dist/elements/Documentation/CopyPage/variations/02-with-success/layout/CopyButtonWithToast.d.ts +0 -6
  974. package/dist/elements/Documentation/CopyPage/variations/02-with-success/layout/CopyButtonWithToast.d.ts.map +0 -1
  975. package/dist/elements/Documentation/CopyPage/variations/02-with-success/layout/CopyButtonWithToast.js +0 -21
  976. package/dist/elements/Documentation/CopyPage/variations/02-with-success/layout/CopyButtonWithToast.js.map +0 -1
  977. package/dist/elements/Documentation/CopyPage/variations/index.d.ts +0 -18
  978. package/dist/elements/Documentation/CopyPage/variations/index.d.ts.map +0 -1
  979. package/dist/elements/Documentation/CopyPage/variations/index.js +0 -14
  980. package/dist/elements/Documentation/CopyPage/variations/index.js.map +0 -1
  981. package/dist/elements/Documentation/NextArticle/variations/01-basic/index.d.ts +0 -2
  982. package/dist/elements/Documentation/NextArticle/variations/01-basic/index.d.ts.map +0 -1
  983. package/dist/elements/Documentation/NextArticle/variations/01-basic/index.js +0 -19
  984. package/dist/elements/Documentation/NextArticle/variations/01-basic/index.js.map +0 -1
  985. package/dist/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.d.ts +0 -8
  986. package/dist/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.d.ts.map +0 -1
  987. package/dist/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.js +0 -5
  988. package/dist/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.js.map +0 -1
  989. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/index.d.ts +0 -2
  990. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/index.d.ts.map +0 -1
  991. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/index.js +0 -23
  992. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/index.js.map +0 -1
  993. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.d.ts +0 -10
  994. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.d.ts.map +0 -1
  995. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.js +0 -5
  996. package/dist/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.js.map +0 -1
  997. package/dist/elements/Documentation/NextArticle/variations/index.d.ts +0 -18
  998. package/dist/elements/Documentation/NextArticle/variations/index.d.ts.map +0 -1
  999. package/dist/elements/Documentation/NextArticle/variations/index.js +0 -14
  1000. package/dist/elements/Documentation/NextArticle/variations/index.js.map +0 -1
  1001. package/dist/elements/Documentation/TOC/variations/01-basic/index.d.ts +0 -2
  1002. package/dist/elements/Documentation/TOC/variations/01-basic/index.d.ts.map +0 -1
  1003. package/dist/elements/Documentation/TOC/variations/01-basic/index.js +0 -7
  1004. package/dist/elements/Documentation/TOC/variations/01-basic/index.js.map +0 -1
  1005. package/dist/elements/Documentation/TOC/variations/01-basic/layout/TableOfContents.d.ts +0 -11
  1006. package/dist/elements/Documentation/TOC/variations/01-basic/layout/TableOfContents.d.ts.map +0 -1
  1007. package/dist/elements/Documentation/TOC/variations/01-basic/layout/TableOfContents.js +0 -12
  1008. package/dist/elements/Documentation/TOC/variations/01-basic/layout/TableOfContents.js.map +0 -1
  1009. package/dist/elements/Documentation/TOC/variations/02-expanded/index.d.ts +0 -2
  1010. package/dist/elements/Documentation/TOC/variations/02-expanded/index.d.ts.map +0 -1
  1011. package/dist/elements/Documentation/TOC/variations/02-expanded/index.js +0 -9
  1012. package/dist/elements/Documentation/TOC/variations/02-expanded/index.js.map +0 -1
  1013. package/dist/elements/Documentation/TOC/variations/02-expanded/layout/ExpandableTableOfContents.d.ts +0 -6
  1014. package/dist/elements/Documentation/TOC/variations/02-expanded/layout/ExpandableTableOfContents.d.ts.map +0 -1
  1015. package/dist/elements/Documentation/TOC/variations/02-expanded/layout/ExpandableTableOfContents.js +0 -45
  1016. package/dist/elements/Documentation/TOC/variations/02-expanded/layout/ExpandableTableOfContents.js.map +0 -1
  1017. package/dist/elements/Documentation/TOC/variations/index.d.ts +0 -18
  1018. package/dist/elements/Documentation/TOC/variations/index.d.ts.map +0 -1
  1019. package/dist/elements/Documentation/TOC/variations/index.js +0 -14
  1020. package/dist/elements/Documentation/TOC/variations/index.js.map +0 -1
  1021. package/dist/elements/Elements/Carousel/variations/01-basic/index.d.ts +0 -2
  1022. package/dist/elements/Elements/Carousel/variations/01-basic/index.d.ts.map +0 -1
  1023. package/dist/elements/Elements/Carousel/variations/01-basic/index.js +0 -6
  1024. package/dist/elements/Elements/Carousel/variations/01-basic/index.js.map +0 -1
  1025. package/dist/elements/Elements/Carousel/variations/index.d.ts +0 -12
  1026. package/dist/elements/Elements/Carousel/variations/index.d.ts.map +0 -1
  1027. package/dist/elements/Elements/Carousel/variations/index.js +0 -11
  1028. package/dist/elements/Elements/Carousel/variations/index.js.map +0 -1
  1029. package/dist/elements/Elements/Rating/variations/01-basic/index.d.ts +0 -2
  1030. package/dist/elements/Elements/Rating/variations/01-basic/index.d.ts.map +0 -1
  1031. package/dist/elements/Elements/Rating/variations/01-basic/index.js +0 -6
  1032. package/dist/elements/Elements/Rating/variations/01-basic/index.js.map +0 -1
  1033. package/dist/elements/Elements/Rating/variations/index.d.ts +0 -12
  1034. package/dist/elements/Elements/Rating/variations/index.d.ts.map +0 -1
  1035. package/dist/elements/Elements/Rating/variations/index.js +0 -11
  1036. package/dist/elements/Elements/Rating/variations/index.js.map +0 -1
  1037. package/dist/elements/Elements/Timeline/variations/01-basic/index.d.ts +0 -2
  1038. package/dist/elements/Elements/Timeline/variations/01-basic/index.d.ts.map +0 -1
  1039. package/dist/elements/Elements/Timeline/variations/01-basic/index.js +0 -6
  1040. package/dist/elements/Elements/Timeline/variations/01-basic/index.js.map +0 -1
  1041. package/dist/elements/Elements/Timeline/variations/index.d.ts +0 -12
  1042. package/dist/elements/Elements/Timeline/variations/index.d.ts.map +0 -1
  1043. package/dist/elements/Elements/Timeline/variations/index.js +0 -11
  1044. package/dist/elements/Elements/Timeline/variations/index.js.map +0 -1
  1045. package/dist/elements/Elements/TreeView/variations/01-basic/index.d.ts +0 -2
  1046. package/dist/elements/Elements/TreeView/variations/01-basic/index.d.ts.map +0 -1
  1047. package/dist/elements/Elements/TreeView/variations/01-basic/index.js +0 -6
  1048. package/dist/elements/Elements/TreeView/variations/01-basic/index.js.map +0 -1
  1049. package/dist/elements/Elements/TreeView/variations/index.d.ts +0 -12
  1050. package/dist/elements/Elements/TreeView/variations/index.d.ts.map +0 -1
  1051. package/dist/elements/Elements/TreeView/variations/index.js +0 -11
  1052. package/dist/elements/Elements/TreeView/variations/index.js.map +0 -1
  1053. package/dist/elements/foundation/Header/variations/01-basic/index.d.ts +0 -2
  1054. package/dist/elements/foundation/Header/variations/01-basic/index.d.ts.map +0 -1
  1055. package/dist/elements/foundation/Header/variations/01-basic/index.js +0 -7
  1056. package/dist/elements/foundation/Header/variations/01-basic/index.js.map +0 -1
  1057. package/dist/elements/foundation/Header/variations/01-basic/layout/Header.d.ts +0 -6
  1058. package/dist/elements/foundation/Header/variations/01-basic/layout/Header.d.ts.map +0 -1
  1059. package/dist/elements/foundation/Header/variations/01-basic/layout/Header.js +0 -5
  1060. package/dist/elements/foundation/Header/variations/01-basic/layout/Header.js.map +0 -1
  1061. package/dist/elements/foundation/Header/variations/index.d.ts +0 -12
  1062. package/dist/elements/foundation/Header/variations/index.d.ts.map +0 -1
  1063. package/dist/elements/foundation/Header/variations/index.js +0 -11
  1064. package/dist/elements/foundation/Header/variations/index.js.map +0 -1
  1065. package/dist/elements/foundation/Page/variations/01-basic/index.d.ts +0 -2
  1066. package/dist/elements/foundation/Page/variations/01-basic/index.d.ts.map +0 -1
  1067. package/dist/elements/foundation/Page/variations/01-basic/index.js +0 -7
  1068. package/dist/elements/foundation/Page/variations/01-basic/index.js.map +0 -1
  1069. package/dist/elements/foundation/Page/variations/01-basic/layout/Page.d.ts +0 -7
  1070. package/dist/elements/foundation/Page/variations/01-basic/layout/Page.d.ts.map +0 -1
  1071. package/dist/elements/foundation/Page/variations/01-basic/layout/Page.js +0 -5
  1072. package/dist/elements/foundation/Page/variations/01-basic/layout/Page.js.map +0 -1
  1073. package/dist/elements/foundation/Page/variations/index.d.ts +0 -12
  1074. package/dist/elements/foundation/Page/variations/index.d.ts.map +0 -1
  1075. package/dist/elements/foundation/Page/variations/index.js +0 -11
  1076. package/dist/elements/foundation/Page/variations/index.js.map +0 -1
  1077. package/dist/elements/foundation/Sidebar/variations/01-basic/index.d.ts +0 -2
  1078. package/dist/elements/foundation/Sidebar/variations/01-basic/index.d.ts.map +0 -1
  1079. package/dist/elements/foundation/Sidebar/variations/01-basic/index.js +0 -7
  1080. package/dist/elements/foundation/Sidebar/variations/01-basic/index.js.map +0 -1
  1081. package/dist/elements/foundation/Sidebar/variations/01-basic/layout/Sidebar.d.ts +0 -6
  1082. package/dist/elements/foundation/Sidebar/variations/01-basic/layout/Sidebar.d.ts.map +0 -1
  1083. package/dist/elements/foundation/Sidebar/variations/01-basic/layout/Sidebar.js +0 -48
  1084. package/dist/elements/foundation/Sidebar/variations/01-basic/layout/Sidebar.js.map +0 -1
  1085. package/dist/elements/foundation/Sidebar/variations/index.d.ts +0 -12
  1086. package/dist/elements/foundation/Sidebar/variations/index.d.ts.map +0 -1
  1087. package/dist/elements/foundation/Sidebar/variations/index.js +0 -11
  1088. package/dist/elements/foundation/Sidebar/variations/index.js.map +0 -1
  1089. package/dist/generated-controls.d.ts +0 -3
  1090. package/dist/generated-controls.d.ts.map +0 -1
  1091. package/dist/generated-controls.js +0 -161
  1092. package/dist/generated-controls.js.map +0 -1
  1093. package/dist/providers/Theme/examples/01-provider-setup.d.ts +0 -28
  1094. package/dist/providers/Theme/examples/01-provider-setup.d.ts.map +0 -1
  1095. package/dist/providers/Theme/examples/01-provider-setup.js +0 -35
  1096. package/dist/providers/Theme/examples/01-provider-setup.js.map +0 -1
  1097. package/dist/providers/Theme/examples/02-toggle-component.d.ts +0 -32
  1098. package/dist/providers/Theme/examples/02-toggle-component.d.ts.map +0 -1
  1099. package/dist/providers/Theme/examples/02-toggle-component.js +0 -50
  1100. package/dist/providers/Theme/examples/02-toggle-component.js.map +0 -1
  1101. package/dist/providers/Theme/examples/03-advanced-patterns.d.ts +0 -134
  1102. package/dist/providers/Theme/examples/03-advanced-patterns.d.ts.map +0 -1
  1103. package/dist/providers/Theme/examples/03-advanced-patterns.js +0 -134
  1104. package/dist/providers/Theme/examples/03-advanced-patterns.js.map +0 -1
  1105. package/dist/providers/Theme/examples/index.d.ts +0 -4
  1106. package/dist/providers/Theme/examples/index.d.ts.map +0 -1
  1107. package/dist/providers/Theme/examples/index.js +0 -4
  1108. package/dist/providers/Theme/examples/index.js.map +0 -1
  1109. package/dist/sections/CTA/variations/01-banner/index.d.ts +0 -7
  1110. package/dist/sections/CTA/variations/01-banner/index.d.ts.map +0 -1
  1111. package/dist/sections/CTA/variations/01-banner/index.js +0 -13
  1112. package/dist/sections/CTA/variations/01-banner/index.js.map +0 -1
  1113. package/dist/sections/CTA/variations/02-split/index.d.ts +0 -7
  1114. package/dist/sections/CTA/variations/02-split/index.d.ts.map +0 -1
  1115. package/dist/sections/CTA/variations/02-split/index.js +0 -19
  1116. package/dist/sections/CTA/variations/02-split/index.js.map +0 -1
  1117. package/dist/sections/CTA/variations/index.d.ts +0 -13
  1118. package/dist/sections/CTA/variations/index.d.ts.map +0 -1
  1119. package/dist/sections/CTA/variations/index.js +0 -7
  1120. package/dist/sections/CTA/variations/index.js.map +0 -1
  1121. package/dist/sections/Features/variations/01-grid/index.d.ts +0 -7
  1122. package/dist/sections/Features/variations/01-grid/index.d.ts.map +0 -1
  1123. package/dist/sections/Features/variations/01-grid/index.js +0 -47
  1124. package/dist/sections/Features/variations/01-grid/index.js.map +0 -1
  1125. package/dist/sections/Features/variations/02-list/index.d.ts +0 -7
  1126. package/dist/sections/Features/variations/02-list/index.d.ts.map +0 -1
  1127. package/dist/sections/Features/variations/02-list/index.js +0 -52
  1128. package/dist/sections/Features/variations/02-list/index.js.map +0 -1
  1129. package/dist/sections/Features/variations/index.d.ts +0 -13
  1130. package/dist/sections/Features/variations/index.d.ts.map +0 -1
  1131. package/dist/sections/Features/variations/index.js +0 -7
  1132. package/dist/sections/Features/variations/index.js.map +0 -1
  1133. package/dist/sections/Hero/variations/01-simple/index.d.ts +0 -7
  1134. package/dist/sections/Hero/variations/01-simple/index.d.ts.map +0 -1
  1135. package/dist/sections/Hero/variations/01-simple/index.js +0 -12
  1136. package/dist/sections/Hero/variations/01-simple/index.js.map +0 -1
  1137. package/dist/sections/Hero/variations/02-with-cta/index.d.ts +0 -7
  1138. package/dist/sections/Hero/variations/02-with-cta/index.d.ts.map +0 -1
  1139. package/dist/sections/Hero/variations/02-with-cta/index.js +0 -12
  1140. package/dist/sections/Hero/variations/02-with-cta/index.js.map +0 -1
  1141. package/dist/sections/Hero/variations/03-with-stats/index.d.ts +0 -7
  1142. package/dist/sections/Hero/variations/03-with-stats/index.d.ts.map +0 -1
  1143. package/dist/sections/Hero/variations/03-with-stats/index.js +0 -18
  1144. package/dist/sections/Hero/variations/03-with-stats/index.js.map +0 -1
  1145. package/dist/sections/Hero/variations/04-with-features/index.d.ts +0 -7
  1146. package/dist/sections/Hero/variations/04-with-features/index.d.ts.map +0 -1
  1147. package/dist/sections/Hero/variations/04-with-features/index.js +0 -38
  1148. package/dist/sections/Hero/variations/04-with-features/index.js.map +0 -1
  1149. package/dist/sections/Hero/variations/index.d.ts +0 -23
  1150. package/dist/sections/Hero/variations/index.d.ts.map +0 -1
  1151. package/dist/sections/Hero/variations/index.js +0 -11
  1152. package/dist/sections/Hero/variations/index.js.map +0 -1
  1153. package/dist/sections/Pricing/variations/01-cards/index.d.ts +0 -7
  1154. package/dist/sections/Pricing/variations/01-cards/index.d.ts.map +0 -1
  1155. package/dist/sections/Pricing/variations/01-cards/index.js +0 -66
  1156. package/dist/sections/Pricing/variations/01-cards/index.js.map +0 -1
  1157. package/dist/sections/Pricing/variations/02-comparison/index.d.ts +0 -7
  1158. package/dist/sections/Pricing/variations/02-comparison/index.d.ts.map +0 -1
  1159. package/dist/sections/Pricing/variations/02-comparison/index.js +0 -53
  1160. package/dist/sections/Pricing/variations/02-comparison/index.js.map +0 -1
  1161. package/dist/sections/Pricing/variations/index.d.ts +0 -13
  1162. package/dist/sections/Pricing/variations/index.d.ts.map +0 -1
  1163. package/dist/sections/Pricing/variations/index.js +0 -7
  1164. package/dist/sections/Pricing/variations/index.js.map +0 -1
  1165. package/dist/sections/Testimonials/variations/01-cards/index.d.ts +0 -7
  1166. package/dist/sections/Testimonials/variations/01-cards/index.d.ts.map +0 -1
  1167. package/dist/sections/Testimonials/variations/01-cards/index.js +0 -38
  1168. package/dist/sections/Testimonials/variations/01-cards/index.js.map +0 -1
  1169. package/dist/sections/Testimonials/variations/02-featured/index.d.ts +0 -7
  1170. package/dist/sections/Testimonials/variations/02-featured/index.d.ts.map +0 -1
  1171. package/dist/sections/Testimonials/variations/02-featured/index.js +0 -53
  1172. package/dist/sections/Testimonials/variations/02-featured/index.js.map +0 -1
  1173. package/dist/sections/Testimonials/variations/index.d.ts +0 -13
  1174. package/dist/sections/Testimonials/variations/index.d.ts.map +0 -1
  1175. package/dist/sections/Testimonials/variations/index.js +0 -7
  1176. package/dist/sections/Testimonials/variations/index.js.map +0 -1
  1177. package/dist/src/generated-styles.d.ts +0 -7
  1178. package/dist/src/generated-styles.d.ts.map +0 -1
  1179. package/dist/src/generated-styles.js +0 -1360
  1180. package/dist/src/generated-styles.js.map +0 -1
  1181. package/src/components/Anchor/examples/01-basic-anchor.tsx +0 -18
  1182. package/src/components/Badge/examples/01-basic-badge.tsx +0 -11
  1183. package/src/components/Badge/examples/02-variants-and-sizes.tsx +0 -71
  1184. package/src/components/Banner/examples/01-basic-banner.tsx +0 -15
  1185. package/src/components/Button/examples/01-variants.tsx +0 -62
  1186. package/src/components/Button/examples/02-multi-actions.tsx +0 -20
  1187. package/src/components/Button/examples/03-joined-toggle.tsx +0 -32
  1188. package/src/components/Button/examples/04-sub-stack-actions.tsx +0 -29
  1189. package/src/components/Button/examples/05-split-action-button.tsx +0 -96
  1190. package/src/components/Button/examples.json +0 -27
  1191. package/src/components/Card/examples/01-basic-card.tsx +0 -22
  1192. package/src/components/Checkbox/examples/01-basic-checkbox.tsx +0 -21
  1193. package/src/components/Checkbox/examples/02-checkbox-group-with-descriptions.tsx +0 -59
  1194. package/src/components/Color/examples/01-basic-color.tsx +0 -25
  1195. package/src/components/Color/examples/02-opacity-slider.tsx +0 -26
  1196. package/src/components/Color/examples/03-format-switching.tsx +0 -46
  1197. package/src/components/Command/examples/01-basic-command.tsx +0 -79
  1198. package/src/components/Confirm/examples/01-basic-confirm.tsx +0 -20
  1199. package/src/components/Date/examples/01-basic-date.tsx +0 -12
  1200. package/src/components/Date/examples/02-with-disabled-dates.tsx +0 -22
  1201. package/src/components/Date/examples/03-controlled-mode.tsx +0 -46
  1202. package/src/components/Date/examples/04-date-range.tsx +0 -82
  1203. package/src/components/Divider/examples/01-basic-divider.tsx +0 -17
  1204. package/src/components/Divider/examples/02-pattern-variants.tsx +0 -25
  1205. package/src/components/Divider/examples/03-vertical-divider.tsx +0 -21
  1206. package/src/components/Expand/examples/01-basic-expand.tsx +0 -18
  1207. package/src/components/Flex/examples/01-basic-flex.tsx +0 -17
  1208. package/src/components/Frame/examples/01-default-frame.tsx +0 -33
  1209. package/src/components/Frame/examples/02-tooltip-example.tsx +0 -35
  1210. package/src/components/Frame/examples/03-sidebar-tab.tsx +0 -50
  1211. package/src/components/Gallery/examples/01-basic-gallery.tsx +0 -28
  1212. package/src/components/Grid/examples/01-basic-grid.tsx +0 -20
  1213. package/src/components/Group/examples/01-basic-group.tsx +0 -16
  1214. package/src/components/Group/examples/examples.json +0 -10
  1215. package/src/components/Group/examples.json +0 -7
  1216. package/src/components/Input/examples/01-basic-input.tsx +0 -11
  1217. package/src/components/Input/examples/02-validation.tsx +0 -53
  1218. package/src/components/Input/examples/examples.json +0 -16
  1219. package/src/components/Label/examples/01-basic-label.tsx +0 -16
  1220. package/src/components/List/examples/01-basic.tsx +0 -25
  1221. package/src/components/Mask/examples/01-read-more-fade.tsx +0 -33
  1222. package/src/components/Mask/examples/02-text-gradient.tsx +0 -21
  1223. package/src/components/Menu/examples/01-basic-menu.tsx +0 -22
  1224. package/src/components/Menu/examples/02-nested-menu.tsx +0 -49
  1225. package/src/components/Modal/examples/01-basic-modal.tsx +0 -24
  1226. package/src/components/Modal/examples/02-form-modal.tsx +0 -88
  1227. package/src/components/Path/examples/01-basic-path.tsx +0 -17
  1228. package/src/components/Popover/examples/01-basic-popover.tsx +0 -15
  1229. package/src/components/Progress/examples/01-basic-progress.tsx +0 -11
  1230. package/src/components/Radio/examples/01-basic-radio.tsx +0 -13
  1231. package/src/components/Radio/examples/02-radio-with-descriptions.tsx +0 -31
  1232. package/src/components/Radio/examples/examples.json +0 -8
  1233. package/src/components/Scroll/examples/01-basic-scroll.tsx +0 -22
  1234. package/src/components/Select/examples/01-basic-select.tsx +0 -22
  1235. package/src/components/Select/examples/02-searchable-select.tsx +0 -51
  1236. package/src/components/Slider/examples/01-basic-slider.tsx +0 -11
  1237. package/src/components/Switch/examples/01-basic-switch.tsx +0 -11
  1238. package/src/components/Table/examples/01-basic-table.tsx +0 -27
  1239. package/src/components/Tabs/examples/01-basic-tabs.tsx +0 -28
  1240. package/src/components/Tabs/examples/02-vertical-tabs.tsx +0 -103
  1241. package/src/components/Textarea/examples/01-basic-textarea.tsx +0 -16
  1242. package/src/components/Toast/examples/01-basic-toast.tsx +0 -20
  1243. package/src/components/Toast/examples/02-success-toast.tsx +0 -27
  1244. package/src/components/Toast/examples/03-danger-toast.tsx +0 -27
  1245. package/src/components/Toast/examples/04-info-toast.tsx +0 -27
  1246. package/src/components/Toast/examples/05-warning-toast.tsx +0 -27
  1247. package/src/components/Tooltip/examples/01-basic-tooltip.tsx +0 -15
  1248. package/src/design-tokens/index.ts +0 -196
  1249. package/src/dist/generated-styles.json +0 -1358
  1250. package/src/elements/AI/AIChatInput/variations/01-basic/index.tsx +0 -39
  1251. package/src/elements/AI/AIChatInput/variations/01-basic/layout/PromptInput.tsx +0 -58
  1252. package/src/elements/AI/AIChatInput/variations/02-with-suggestions/index.tsx +0 -67
  1253. package/src/elements/AI/AIChatInput/variations/02-with-suggestions/layout/PromptInputWithSuggestions.tsx +0 -63
  1254. package/src/elements/AI/AIChatInput/variations/index.ts +0 -18
  1255. package/src/elements/AI/ChainOfThought/variations/01-basic/index.tsx +0 -49
  1256. package/src/elements/AI/ChainOfThought/variations/01-basic/layout/ThoughtStep.tsx +0 -22
  1257. package/src/elements/AI/ChainOfThought/variations/02-with-details/index.tsx +0 -80
  1258. package/src/elements/AI/ChainOfThought/variations/02-with-details/layout/ExpandableThoughtStep.tsx +0 -48
  1259. package/src/elements/AI/ChainOfThought/variations/index.ts +0 -18
  1260. package/src/elements/AI/Chat/variations/01-basic/index.tsx +0 -54
  1261. package/src/elements/AI/Chat/variations/01-basic/layout/ChatContainer.tsx +0 -13
  1262. package/src/elements/AI/Chat/variations/01-basic/layout/ChatInput.tsx +0 -35
  1263. package/src/elements/AI/Chat/variations/01-basic/layout/ChatMessage.tsx +0 -20
  1264. package/src/elements/AI/Chat/variations/02-with-actions/index.tsx +0 -83
  1265. package/src/elements/AI/Chat/variations/02-with-actions/layout/ChatContainerWithActions.tsx +0 -13
  1266. package/src/elements/AI/Chat/variations/02-with-actions/layout/ChatInputWithActions.tsx +0 -35
  1267. package/src/elements/AI/Chat/variations/02-with-actions/layout/ChatMessage.tsx +0 -20
  1268. package/src/elements/AI/Chat/variations/index.ts +0 -18
  1269. package/src/elements/Documentation/CopyPage/variations/01-basic/index.tsx +0 -55
  1270. package/src/elements/Documentation/CopyPage/variations/01-basic/layout/CopyButton.tsx +0 -30
  1271. package/src/elements/Documentation/CopyPage/variations/02-with-success/index.tsx +0 -63
  1272. package/src/elements/Documentation/CopyPage/variations/02-with-success/layout/CopyButtonWithToast.tsx +0 -33
  1273. package/src/elements/Documentation/CopyPage/variations/index.ts +0 -18
  1274. package/src/elements/Documentation/NextArticle/variations/01-basic/index.tsx +0 -42
  1275. package/src/elements/Documentation/NextArticle/variations/01-basic/layout/NextArticleCard.tsx +0 -27
  1276. package/src/elements/Documentation/NextArticle/variations/02-with-icon/index.tsx +0 -44
  1277. package/src/elements/Documentation/NextArticle/variations/02-with-icon/layout/NextArticleWithIconCard.tsx +0 -34
  1278. package/src/elements/Documentation/NextArticle/variations/index.ts +0 -18
  1279. package/src/elements/Documentation/TOC/variations/01-basic/index.tsx +0 -61
  1280. package/src/elements/Documentation/TOC/variations/01-basic/layout/TableOfContents.tsx +0 -37
  1281. package/src/elements/Documentation/TOC/variations/02-expanded/index.tsx +0 -67
  1282. package/src/elements/Documentation/TOC/variations/02-expanded/layout/ExpandableTableOfContents.tsx +0 -91
  1283. package/src/elements/Documentation/TOC/variations/index.ts +0 -18
  1284. package/src/elements/Elements/Carousel/variations/01-basic/index.tsx +0 -4
  1285. package/src/elements/Elements/Carousel/variations/index.ts +0 -15
  1286. package/src/elements/Elements/Rating/variations/01-basic/index.tsx +0 -4
  1287. package/src/elements/Elements/Rating/variations/index.ts +0 -15
  1288. package/src/elements/Elements/Timeline/variations/01-basic/index.tsx +0 -4
  1289. package/src/elements/Elements/Timeline/variations/index.ts +0 -15
  1290. package/src/elements/Elements/TreeView/variations/01-basic/index.tsx +0 -4
  1291. package/src/elements/Elements/TreeView/variations/index.ts +0 -15
  1292. package/src/elements/foundation/Header/variations/01-basic/index.tsx +0 -46
  1293. package/src/elements/foundation/Header/variations/01-basic/layout/Header.tsx +0 -21
  1294. package/src/elements/foundation/Header/variations/index.ts +0 -15
  1295. package/src/elements/foundation/Page/variations/01-basic/index.tsx +0 -40
  1296. package/src/elements/foundation/Page/variations/01-basic/layout/Page.tsx +0 -29
  1297. package/src/elements/foundation/Page/variations/index.ts +0 -15
  1298. package/src/elements/foundation/Sidebar/variations/01-basic/index.tsx +0 -15
  1299. package/src/elements/foundation/Sidebar/variations/01-basic/layout/Sidebar.tsx +0 -158
  1300. package/src/elements/foundation/Sidebar/variations/index.ts +0 -15
  1301. package/src/sections/CTA/variations/01-banner/index.tsx +0 -52
  1302. package/src/sections/CTA/variations/02-split/index.tsx +0 -90
  1303. package/src/sections/CTA/variations/index.ts +0 -7
  1304. package/src/sections/Features/variations/01-grid/index.tsx +0 -91
  1305. package/src/sections/Features/variations/02-list/index.tsx +0 -124
  1306. package/src/sections/Features/variations/index.ts +0 -7
  1307. package/src/sections/Hero/variations/01-simple/index.tsx +0 -46
  1308. package/src/sections/Hero/variations/02-with-cta/index.tsx +0 -74
  1309. package/src/sections/Hero/variations/03-with-stats/index.tsx +0 -63
  1310. package/src/sections/Hero/variations/04-with-features/index.tsx +0 -87
  1311. package/src/sections/Hero/variations/index.ts +0 -11
  1312. package/src/sections/Pricing/variations/01-cards/index.tsx +0 -153
  1313. package/src/sections/Pricing/variations/02-comparison/index.tsx +0 -150
  1314. package/src/sections/Pricing/variations/index.ts +0 -7
  1315. package/src/sections/Testimonials/variations/01-cards/index.tsx +0 -93
  1316. package/src/sections/Testimonials/variations/02-featured/index.tsx +0 -155
  1317. package/src/sections/Testimonials/variations/index.ts +0 -7
package/dist/registry.js CHANGED
@@ -12,11 +12,27 @@ export const componentRegistry = {
12
12
  relatedComponents: ["popover", "breadcrumbs"],
13
13
  tags: ["navigation", "interactive", "link"],
14
14
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible with focus visible states", "Built on Popover for accessible overlay handling", "Screen reader friendly"] },
15
+ usage: undefined,
15
16
  examples: [
16
17
  {
17
- "title": "Basic Anchor",
18
- "description": "A simple anchor component with custom underline. Hover to see the popover preview.",
19
- "code": "import React from 'react';\nimport { Anchor } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Anchor>\n Learn more about this topic\n <Anchor.Preview>\n <div className=\"text-sm\">Preview content</div>\n </Anchor.Preview>\n </Anchor>\n );\n}"
18
+ "title": "Inline Text",
19
+ "description": "Anchor used inline within a paragraph the primary use case for navigational links.",
20
+ "code": "import { Anchor } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <p className=\"text-sm text-foreground max-w-prose leading-relaxed\">\n Read the{\" \"}\n <Anchor href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a\">\n MDN documentation\n </Anchor>{\" \"}\n for a full reference on anchor semantics, or check the{\" \"}\n <Anchor href=\"https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-in-context.html\">\n WCAG link purpose guidelines\n </Anchor>{\" \"}\n for accessibility requirements.\n </p>\n );\n}"
21
+ },
22
+ {
23
+ "title": "Underline Variants",
24
+ "description": "Three underline styles available via Anchor.Underline: solid (default), dashed, and dotted.",
25
+ "code": "import { Anchor, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex gap=\"lg\" align=\"center\">\n <Anchor href=\"#\">\n Solid\n </Anchor>\n <Anchor href=\"#\">\n <Anchor.Underline variant=\"dashed\" />\n Dashed\n </Anchor>\n <Anchor href=\"#\">\n <Anchor.Underline variant=\"dotted\" />\n Dotted\n </Anchor>\n </Flex>\n );\n}"
26
+ },
27
+ {
28
+ "title": "Preview Tooltip",
29
+ "description": "Hover over the links to see a tooltip preview — composed via the preview prop or Anchor.Preview.",
30
+ "code": "import { Anchor, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex gap=\"lg\" align=\"center\">\n <Anchor\n href=\"https://github.com\"\n preview={\n <span className=\"text-xs text-foreground-400\">github.com</span>\n }\n >\n GitHub\n </Anchor>\n <Anchor href=\"https://vercel.com\">\n <Anchor.Preview>\n <span className=\"text-xs text-foreground-400\">vercel.com</span>\n </Anchor.Preview>\n Vercel\n </Anchor>\n </Flex>\n );\n}"
31
+ },
32
+ {
33
+ "title": "Breadcrumb",
34
+ "description": "Anchor used as navigational crumbs — the last segment is non-interactive text.",
35
+ "code": "import { Anchor, Flex } from 'ui-lab-components';\n\nconst crumbs = [\n { label: 'Home', href: '/' },\n { label: 'Projects', href: '/projects' },\n { label: 'ui-lab', href: '/projects/ui-lab' },\n];\n\nexport default function Example() {\n return (\n <Flex gap=\"xs\" align=\"center\" className=\"text-sm\">\n {crumbs.map((crumb, i) => (\n <span key={crumb.href} className=\"flex items-center gap-xs\">\n {i > 0 && <span className=\"text-foreground-400 mx-1\">/</span>}\n {i < crumbs.length - 1 ? (\n <Anchor href={crumb.href}>{crumb.label}</Anchor>\n ) : (\n <span className=\"text-foreground-400\">{crumb.label}</span>\n )}\n </span>\n ))}\n </Flex>\n );\n}"
20
36
  }
21
37
  ],
22
38
  },
@@ -33,16 +49,32 @@ export const componentRegistry = {
33
49
  relatedComponents: [],
34
50
  tags: ["label", "status", "tag"],
35
51
  accessibility: { "hasAriaSupport": false, "notes": ["Semantic HTML", "Use with proper context"] },
52
+ usage: undefined,
36
53
  examples: [
37
54
  {
38
- "title": "Basic Badge",
39
- "description": "A simple badge with default styling. Use this to display labels, tags, or status indicators in your interface.",
40
- "code": "import React from 'react';\nimport { Badge } from 'ui-lab-components';\n\nexport default function Example() {\n return <Badge>New</Badge>;\n}"
55
+ "title": "Status Labels",
56
+ "description": "Inline status labels alongside text content, such as document or workflow states.",
57
+ "code": "import { Badge, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex gap=\"sm\" align=\"center\" justify=\"center\" wrap=\"wrap\">\n <Badge variant=\"default\">Draft</Badge>\n <Badge variant=\"default\">In Review</Badge>\n <Badge variant=\"default\">Published</Badge>\n <Badge variant=\"default\">Archived</Badge>\n </Flex>\n );\n}"
58
+ },
59
+ {
60
+ "title": "Icon Position",
61
+ "description": "Icons placed on the left or right of the label — left for status/type indicators, right for directional cues.",
62
+ "code": "import { Badge, Flex } from 'ui-lab-components';\nimport { FaCircleCheck, FaTriangleExclamation, FaArrowRight, FaStar } from 'react-icons/fa6';\n\nexport default function Example() {\n return (\n <Flex gap=\"xs\" align=\"center\" justify=\"center\" wrap=\"wrap\">\n <Badge icon={{ left: <FaCircleCheck size={10} /> }}>Verified</Badge>\n <Badge icon={{ left: <FaTriangleExclamation size={10} /> }}>Warning</Badge>\n <Badge icon={{ right: <FaArrowRight size={10} /> }}>Continue</Badge>\n <Badge icon={{ right: <FaStar size={10} /> }}>Featured</Badge>\n </Flex>\n );\n}"
63
+ },
64
+ {
65
+ "title": "Selectable Tags",
66
+ "description": "Icon-prefixed tags that toggle active state, e.g. for filtering or labeling.",
67
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Badge, Flex } from 'ui-lab-components';\nimport { FaTag } from 'react-icons/fa6';\n\nconst tags = ['design', 'frontend', 'api', 'docs'];\n\nexport default function Example() {\n const [active, setActive] = useState<string[]>(['design']);\n\n function toggle(tag: string) {\n setActive((prev) =>\n prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag]\n );\n }\n\n return (\n <Flex gap=\"xs\" align=\"center\" justify=\"center\" wrap=\"wrap\">\n {tags.map((tag) => (\n <Badge\n key={tag}\n icon={<FaTag size={10} />}\n onClick={() => toggle(tag)}\n style={{\n cursor: 'pointer',\n opacity: active.includes(tag) ? 1 : 0.45,\n }}\n >\n {tag}\n </Badge>\n ))}\n </Flex>\n );\n}"
68
+ },
69
+ {
70
+ "title": "Dismissible Tags",
71
+ "description": "Applied label chips in a multi-select input or filter bar that can be individually removed.",
72
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Badge, Flex } from 'ui-lab-components';\n\nconst initial = ['React', 'TypeScript', 'CSS Modules', 'Next.js', 'Radix UI'];\n\nexport default function Example() {\n const [tags, setTags] = useState(initial);\n\n return (\n <Flex gap=\"xs\" align=\"center\" justify=\"center\" wrap=\"wrap\">\n {tags.map((tag) => (\n <Badge\n key={tag}\n dismissible\n onDismiss={() => setTags((prev) => prev.filter((t) => t !== tag))}\n >\n {tag}\n </Badge>\n ))}\n {tags.length === 0 && (\n <span\n className=\"text-sm text-foreground-400 cursor-pointer\"\n onClick={() => setTags(initial)}\n >\n All dismissed — click to reset\n </span>\n )}\n </Flex>\n );\n}"
41
73
  },
42
74
  {
43
- "title": "Badge Variants and Sizes",
44
- "description": "Showcases all available badge variants (default, success, warning, danger, info) and sizes (sm, md, lg). Also demonstrates pill-shaped badges.",
45
- "code": "import React from 'react';\nimport { Badge } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <div className=\"p-4 space-y-8\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Variants</h3>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <Badge variant=\"default\">Default</Badge>\n <Badge variant=\"success\">Success</Badge>\n <Badge variant=\"warning\">Warning</Badge>\n <Badge variant=\"danger\">Danger</Badge>\n <Badge variant=\"info\">Info</Badge>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Sizes</h3>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <Badge size=\"sm\">Small</Badge>\n <Badge size=\"md\">Medium</Badge>\n <Badge size=\"lg\">Large</Badge>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Pill Shape</h3>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <Badge pill variant=\"default\">Default Pill</Badge>\n <Badge pill variant=\"success\">Success Pill</Badge>\n <Badge pill variant=\"warning\">Warning Pill</Badge>\n <Badge pill variant=\"danger\">Danger Pill</Badge>\n <Badge pill variant=\"info\">Info Pill</Badge>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Variants with Sizes</h3>\n <div className=\"space-y-3\">\n <div className=\"flex gap-2 flex-wrap items-center\">\n <Badge variant=\"success\" size=\"sm\">Small Success</Badge>\n <Badge variant=\"success\" size=\"md\">Medium Success</Badge>\n <Badge variant=\"success\" size=\"lg\">Large Success</Badge>\n </div>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <Badge variant=\"danger\" size=\"sm\">Small Danger</Badge>\n <Badge variant=\"danger\" size=\"md\">Medium Danger</Badge>\n <Badge variant=\"danger\" size=\"lg\">Large Danger</Badge>\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">With Count</h3>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <Badge variant=\"default\" count={5} />\n <Badge variant=\"success\" count={12} />\n <Badge variant=\"warning\" count={99} />\n <Badge variant=\"danger\" count={3} pill />\n <Badge variant=\"info\" count={42} pill />\n </div>\n </div>\n </div>\n );\n}"
75
+ "title": "Semantic Colors",
76
+ "description": "Badges styled with design system semantic color tokens for success, warning, danger, info, and accent states.",
77
+ "code": "import { Badge, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex gap=\"sm\" align=\"center\" justify=\"center\" wrap=\"wrap\">\n <Badge className=\"bg-success-500/20 text-success-500 border-none\">Success</Badge>\n <Badge className=\"bg-warning-500/20 text-warning-500 border-none\">Warning</Badge>\n <Badge className=\"bg-danger-500/20 text-danger-500 border-none\">Danger</Badge>\n <Badge className=\"bg-info-500/20 text-info-500 border-none\">Info</Badge>\n <Badge className=\"bg-accent-500/20 text-accent-500 border-none\">Accent</Badge>\n </Flex>\n );\n}"
46
78
  }
47
79
  ],
48
80
  },
@@ -59,11 +91,32 @@ export const componentRegistry = {
59
91
  relatedComponents: ["card", "alert", "badge"],
60
92
  tags: ["notification", "layout", "visual", "full-width"],
61
93
  accessibility: { "hasAriaSupport": true, "notes": ["Supports keyboard navigation for dismiss button", "Semantic HTML structure", "ARIA labels for accessibility", "Focus management for interactive elements"] },
94
+ usage: undefined,
62
95
  examples: [
63
96
  {
64
- "title": "Basic Banner",
65
- "description": "A neutral note banner using background shades instead of semantic colors. The default banner variant for general-purpose messaging.",
66
- "code": "import React from 'react';\nimport { Banner } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Banner variant=\"note\" size=\"md\">\n This is a note banner. Use it for general-purpose messages and information without semantic intent.\n </Banner>\n );\n}"
97
+ "title": "Variants",
98
+ "description": "All five semantic variants: note, info, success, warning, and danger.",
99
+ "code": "import { Banner, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 480 }}>\n <Banner variant=\"note\">\n <Banner.Title>Note</Banner.Title>\n <Banner.Body>This is a general note with supplementary context.</Banner.Body>\n </Banner>\n <Banner variant=\"info\">\n <Banner.Title>Info</Banner.Title>\n <Banner.Body>Your workspace is on the free plan. Upgrade to unlock more seats.</Banner.Body>\n </Banner>\n <Banner variant=\"success\">\n <Banner.Title>Success</Banner.Title>\n <Banner.Body>Your changes have been saved and are now live.</Banner.Body>\n </Banner>\n <Banner variant=\"warning\">\n <Banner.Title>Warning</Banner.Title>\n <Banner.Body>This action cannot be undone. Proceed with caution.</Banner.Body>\n </Banner>\n <Banner variant=\"danger\">\n <Banner.Title>Danger</Banner.Title>\n <Banner.Body>Your account has exceeded its storage limit.</Banner.Body>\n </Banner>\n </Flex>\n );\n}"
100
+ },
101
+ {
102
+ "title": "Dismissible",
103
+ "description": "A banner with a dismiss button. The caller controls what happens after dismissal.",
104
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Banner, Button, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [dismissed, setDismissed] = useState(false);\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 480 }}>\n {!dismissed ? (\n <Banner variant=\"info\" isDismissible onDismiss={() => setDismissed(true)}>\n <Banner.Title>Scheduled maintenance</Banner.Title>\n <Banner.Body>The system will be unavailable on Saturday from 2–4 AM UTC.</Banner.Body>\n </Banner>\n ) : (\n <Flex gap=\"sm\" style={{ alignItems: 'center' }}>\n <span className=\"text-sm text-foreground-400\">Banner dismissed.</span>\n <Button variant=\"ghost\" onClick={() => setDismissed(false)}>\n Restore\n </Button>\n </Flex>\n )}\n </Flex>\n );\n}"
105
+ },
106
+ {
107
+ "title": "Form Feedback",
108
+ "description": "Banners shown conditionally after a form action to relay success or failure.",
109
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Banner, Button, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState(false);\n\n const handleSubmit = () => {\n if (!submitted) {\n setError(true);\n return;\n }\n setError(false);\n };\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 400 }}>\n {error && (\n <Banner variant=\"danger\" isDismissible onDismiss={() => setError(false)}>\n <Banner.Title>Submission failed</Banner.Title>\n <Banner.Body>Please review the form and correct any errors before retrying.</Banner.Body>\n </Banner>\n )}\n {submitted && !error && (\n <Banner variant=\"success\">\n <Banner.Title>Profile updated</Banner.Title>\n <Banner.Body>Your changes have been saved successfully.</Banner.Body>\n </Banner>\n )}\n <Flex gap=\"sm\">\n <Button variant=\"primary\" onClick={() => { setSubmitted(true); setError(false); }}>\n Save changes\n </Button>\n <Button variant=\"secondary\" onClick={() => { setSubmitted(false); handleSubmit(); }}>\n Trigger error\n </Button>\n </Flex>\n </Flex>\n );\n}"
110
+ },
111
+ {
112
+ "title": "Settings Panel",
113
+ "description": "A small warning banner inline with a destructive settings action.",
114
+ "code": "import { Banner, Button, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 420 }}>\n <div>\n <p className=\"text-sm font-semibold text-foreground-100\">API Access</p>\n <p className=\"text-xs text-foreground-400\">Manage keys for external integrations.</p>\n </div>\n <Banner variant=\"warning\">\n <Banner.Body>Regenerating your key will revoke all existing integrations immediately.</Banner.Body>\n </Banner>\n <Button variant=\"secondary\">Regenerate API key</Button>\n </Flex>\n );\n}"
115
+ },
116
+ {
117
+ "title": "Body Only",
118
+ "description": "Single-line banners without a title for compact inline notifications.",
119
+ "code": "import { Banner, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 480 }}>\n <Banner variant=\"info\" isDismissible>\n <Banner.Body>\n Two-factor authentication is not enabled on your account.{' '}\n <a href=\"#\" className=\"underline\">Enable now</a>\n </Banner.Body>\n </Banner>\n <Banner variant=\"success\" isDismissible>\n <Banner.Body>Deployment #142 completed in 38 seconds.</Banner.Body>\n </Banner>\n </Flex>\n );\n}"
67
120
  }
68
121
  ],
69
122
  },
@@ -80,33 +133,8 @@ export const componentRegistry = {
80
133
  relatedComponents: ["group"],
81
134
  tags: ["cta", "interactive", "primary-action"],
82
135
  accessibility: { "hasAriaSupport": true, "notes": ["Supports keyboard navigation", "Screen reader friendly"] },
83
- examples: [
84
- {
85
- "title": "Button Variants",
86
- "description": "All available button variants including primary, default, secondary, outline, and ghost styles.",
87
- "code": "import React from 'react'\nimport { Button } from 'ui-lab-components'\n\nexport default function Example() {\n return (\n <div className=\"p-4 space-y-8\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Primary Variant</h3>\n <div className=\"flex gap-2 flex-wrap\">\n <Button variant=\"primary\">Primary Button</Button>\n <Button variant=\"primary\" disabled>Disabled</Button>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Default Variant</h3>\n <div className=\"flex gap-2 flex-wrap\">\n <Button variant=\"default\">Default Button</Button>\n <Button variant=\"default\" disabled>Disabled</Button>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Secondary Variant</h3>\n <div className=\"flex gap-2 flex-wrap\">\n <Button variant=\"secondary\">Secondary Button</Button>\n <Button variant=\"secondary\" disabled>Disabled</Button>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Outline Variant</h3>\n <div className=\"flex gap-2 flex-wrap\">\n <Button variant=\"outline\">Outline Button</Button>\n <Button variant=\"outline\" disabled>Disabled</Button>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Ghost Variant</h3>\n <div className=\"flex gap-2 flex-wrap\">\n <Button variant=\"ghost\">Ghost Button</Button>\n <Button variant=\"ghost\" disabled>Disabled</Button>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-foreground-200 mb-3\">Sizes</h3>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <Button size=\"sm\">Small</Button>\n <Button size=\"md\">Medium</Button>\n <Button size=\"lg\">Large</Button>\n </div>\n </div>\n </div>\n )\n}"
88
- },
89
- {
90
- "title": "Multiple Actions",
91
- "description": "A primary action button grouped with secondary actions and an options menu.",
92
- "code": "\"use client\";\n\nimport React, { useState } from 'react'\nimport { Button, Flex } from 'ui-lab-components'\nimport { FaEllipsisVertical } from \"react-icons/fa6\";\n\nexport default function Example() {\n return (\n <Flex gap=\"xs\" className=\"w-110 *:not-last:flex-1\">\n <Button size=\"sm\" variant=\"primary\" >Subscribe</Button>\n <Button size=\"sm\" >Message</Button>\n <Button size=\"icon\" variant=\"outline\" icon={<FaEllipsisVertical />} />\n </Flex>\n );\n}"
93
- },
94
- {
95
- "title": "Joined Toggle Buttons",
96
- "description": "Multiple buttons grouped together for view/mode selection with active state indication.",
97
- "code": "\"use client\";\n\nimport React, { useState } from 'react'\nimport { Button, Group, Divider, Input, Flex } from 'ui-lab-components'\nimport { FaList, FaGrip, FaTable, FaPlus } from \"react-icons/fa6\";\nimport { LuSearch } from \"react-icons/lu\";\n\nexport default function Example() {\n const [viewMode, setViewMode] = useState(\"list\");\n return (\n <Flex className=\"w-110\" gap=\"xs\" align=\"center\">\n <Input\n placeholder=\"Search items...\"\n icon={<LuSearch />}\n className=\"w-full\"\n />\n <Group orientation=\"horizontal\" value={viewMode} onChange={setViewMode}>\n <Group.Button size=\"icon\" value=\"list\"><FaList /></Group.Button>\n <Divider orientation=\"vertical\" />\n <Group.Button size=\"icon\" value=\"grid\"><FaGrip /></Group.Button>\n <Divider orientation=\"vertical\" />\n <Group.Button size=\"icon\" value=\"table\"><FaTable /></Group.Button>\n </Group>\n <Button size=\"sm\" icon={{ left: <FaPlus size={12} /> }} >New</Button>\n </Flex>\n );\n}"
98
- },
99
- {
100
- "title": "Sub Stack Actions",
101
- "description": "A collection of buttons and inputs arranged horizontally for grouped actions and filtering.",
102
- "code": "\"use client\";\n\nimport React, { useState } from 'react'\nimport { Button, Group, Input, Badge, Flex } from 'ui-lab-components'\nimport { FaList, FaGrip, FaPlus } from \"react-icons/fa6\";\nimport { LuSearch } from \"react-icons/lu\";\n\nexport default function Example() {\n const [viewMode, setViewMode] = useState(\"list\");\n return (\n <Flex align=\"center\" gap=\"xs\" className=\"w-110\">\n <Group orientation=\"horizontal\" spacing=\"xs\" value={viewMode} onChange={setViewMode}>\n <Group.Button size=\"icon\" value=\"list\"><FaList /></Group.Button>\n <Group.Button size=\"icon\" value=\"grid\"><FaGrip /></Group.Button>\n </Group>\n <Input\n placeholder=\"Search...\"\n icon={<LuSearch />}\n hint={<Badge size=\"sm\" variant=\"secondary\" >Ctrl+K</Badge>}\n />\n <Button size=\"sm\" icon={{ right: <FaPlus size={12} /> }} >Upload</Button>\n </Flex>\n );\n}"
103
- },
104
- {
105
- "title": "Split Action Button",
106
- "description": "A split button for bulk actions with dynamic icons, variants, and async feedback while keeping the primary action easy to repeat.",
107
- "code": "\"use client\";\n\nimport React, { useState } from 'react'\nimport { Button, Divider, Select, Badge, Flex } from 'ui-lab-components'\nimport { FaBox, FaSpinner, FaCheck, FaEllipsisVertical, FaCopy, FaTags, FaTrash } from \"react-icons/fa6\";\n\ntype BulkAction = \"archive\" | \"duplicate\" | \"tag\" | \"delete\";\n\nconst selectedCount: number = 12;\n\nconst bulkActions: Record<BulkAction, {\n label: string;\n loadingLabel: string;\n successLabel: string;\n variant: \"primary\" | \"outline\" | \"danger\";\n icon: React.ReactNode;\n}> = {\n archive: {\n label: \"Archive\",\n loadingLabel: \"Archiving...\",\n successLabel: \"Archived\",\n variant: \"primary\",\n icon: <FaBox />,\n },\n duplicate: {\n label: \"Duplicate\",\n loadingLabel: \"Duplicating...\",\n successLabel: \"Duplicated\",\n variant: \"outline\",\n icon: <FaCopy />,\n },\n tag: {\n label: \"Add Tags\",\n loadingLabel: \"Applying tags...\",\n successLabel: \"Tagged\",\n variant: \"outline\",\n icon: <FaTags />,\n },\n delete: {\n label: \"Delete\",\n loadingLabel: \"Deleting...\",\n successLabel: \"Deleted\",\n variant: \"danger\",\n icon: <FaTrash />,\n },\n};\n\nexport default function Example() {\n const [action, setAction] = useState<BulkAction>(\"archive\");\n const [status, setStatus] = useState<\"idle\" | \"loading\" | \"done\">(\"idle\");\n const cfg = bulkActions[action];\n const itemsLabel = `${selectedCount} ${selectedCount === 1 ? \"item\" : \"items\"}`;\n\n const handleExecute = () => {\n setStatus(\"loading\");\n setTimeout(() => {\n setStatus(\"done\");\n setTimeout(() => setStatus(\"idle\"), 2000);\n }, 1500);\n };\n\n const leftIcon = status === \"loading\" ? <FaSpinner className=\"animate-spin\" /> : status === \"done\" ? <FaCheck /> : cfg.icon;\n const label = status === \"loading\" ? cfg.loadingLabel : status === \"done\" ? cfg.successLabel : `${cfg.label} ${itemsLabel}`;\n\n return (\n <Flex gap=\"xs\" className=\"w-110\" align=\"center\">\n <Badge variant=\"secondary\">{selectedCount} selected</Badge>\n <Select className=\"flex h-10\" selectedKey={action} onSelectionChange={(key) => setAction(key as BulkAction)} isDisabled={status !== \"idle\"}>\n <Button\n onPress={handleExecute}\n variant={cfg.variant}\n size=\"sm\"\n className=\"w-full rounded-none justify-start\"\n isDisabled={status !== \"idle\" || selectedCount === 0}\n icon={leftIcon}\n >\n {label}\n </Button>\n <Divider orientation=\"vertical\" spacing=\"none\" />\n <Select.Trigger aria-label=\"Choose a bulk action\" />\n <Select.Content>\n <Select.Item value=\"archive\" textValue=\"Archive\" icon={<FaBox className=\"h-3 w-3\" />}>Archive</Select.Item>\n <Select.Item value=\"duplicate\" textValue=\"Duplicate\" icon={<FaCopy className=\"h-3 w-3\" />}>Duplicate</Select.Item>\n <Select.Item value=\"tag\" textValue=\"Add Tags\" icon={<FaTags className=\"h-3 w-3\" />}>Add Tags</Select.Item>\n <Select.Item value=\"delete\" textValue=\"Delete\" icon={<FaTrash className=\"h-3 w-3\" />}>Delete</Select.Item>\n </Select.Content>\n </Select>\n <Button size=\"icon\" variant=\"outline\" icon={<FaEllipsisVertical />} aria-label=\"More bulk actions\" />\n </Flex>\n );\n}"
108
- }
109
- ],
136
+ usage: undefined,
137
+ examples: [],
110
138
  },
111
139
  card: {
112
140
  id: "card",
@@ -121,11 +149,22 @@ export const componentRegistry = {
121
149
  relatedComponents: ["modal", "divider"],
122
150
  tags: ["container", "grouping", "layout"],
123
151
  accessibility: { "hasAriaSupport": false, "notes": ["Semantic HTML structure", "Proper heading hierarchy"] },
152
+ usage: { "summary": "Use Card as a top-level surface that groups related content into a single visual panel.", "whenToUse": ["Page sections that need their own surface boundary", "Standalone panels such as summaries, settings sections, and detail blocks", "Collections of related content that benefit from header/body/footer structure"], "whenNotToUse": ["Inside other surfaced overlays like Modal, Popover, Confirm, or Menu", "For simple internal spacing inside an existing surfaced component", "As a generic replacement for every padded container"], "rules": [{ "type": "do", "title": "Reserve Card for top-level surfaces", "description": "Treat Card as the main boundary for a section or standalone block, not as a default inner wrapper." }, { "type": "avoid", "title": "Do not nest Card inside overlay surfaces", "description": "Avoid putting Card inside Modal, Popover, Confirm, or Menu because it creates double-surface chrome and weakens hierarchy.", "relatedComponents": ["modal", "popover", "confirm", "menu"] }, { "type": "prefer", "title": "Prefer layout primitives for internal grouping", "description": "When content already sits inside a surfaced component, use Flex, Grid, Group, or the host component's slots to structure it instead of adding another Card.", "relatedComponents": ["flex", "grid", "group", "modal"] }] },
124
153
  examples: [
125
154
  {
126
- "title": "Basic Card",
127
- "description": "A simple card container with header, body, and footer sections. Use this to group related content in your interface.",
128
- "code": "import { Card } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Card>\n <Card.Header>\n <h3>Card Title</h3>\n </Card.Header>\n <Card.Body>\n <p>This is the card content area where you can place any information or components.</p>\n </Card.Body>\n <Card.Footer>\n <p>Footer content</p>\n </Card.Footer>\n </Card>\n );\n}"
155
+ "title": "Notification Card",
156
+ "description": "A status-driven card with a badge, body copy, and a footer action. Caller controls read state.",
157
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Card, Button, Flex, Badge } from 'ui-lab-components';\n\nexport default function Example() {\n const [read, setRead] = useState(false);\n\n return (\n <Card style={{ width: 360, opacity: read ? 0.6 : 1, transition: 'opacity 0.2s' }}>\n <Card.Header>\n <Flex justify=\"between\" align=\"center\">\n <span className=\"text-sm font-medium text-foreground-100\">Deployment failed</span>\n <Badge variant=\"destructive\">Error</Badge>\n </Flex>\n </Card.Header>\n <Card.Body>\n <p className=\"text-sm text-foreground-400\">\n The production deploy of <span className=\"text-foreground-200\">api-gateway</span> failed at step \"Run tests\". Check the logs for details.\n </p>\n </Card.Body>\n <Card.Footer>\n <Flex justify=\"between\" align=\"center\">\n <span className=\"text-xs text-foreground-500\">2 minutes ago</span>\n <Button size=\"sm\" variant=\"ghost\" onPress={() => setRead(true)}>\n Mark as read\n </Button>\n </Flex>\n </Card.Footer>\n </Card>\n );\n}"
158
+ },
159
+ {
160
+ "title": "Settings Panel",
161
+ "description": "Card used as a settings section with a list of toggle rows and save/cancel actions in the footer.",
162
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Card, Button, Flex, Switch } from 'ui-lab-components';\n\nconst items = [\n { label: 'Email alerts', description: 'Receive alerts via email' },\n { label: 'Push notifications', description: 'Browser push notifications' },\n { label: 'Weekly digest', description: 'Summary sent every Monday' },\n];\n\nexport default function Example() {\n const [enabled, setEnabled] = useState(true);\n\n return (\n <Card style={{ width: 360 }}>\n <Card.Header>\n <span className=\"text-sm font-medium text-foreground-100\">Notifications</span>\n </Card.Header>\n <Card.Body className=\"space-y-4 py-4\">\n {items.map((item) => (\n <Flex key={item.label} justify=\"between\" align=\"center\">\n <div>\n <p className=\"text-sm text-foreground-100\">{item.label}</p>\n <p className=\"text-xs text-foreground-500\">{item.description}</p>\n </div>\n <Switch\n isSelected={enabled}\n onChange={setEnabled}\n aria-label={item.label}\n />\n </Flex>\n ))}\n </Card.Body>\n <Card.Footer>\n <Flex justify=\"end\" gap=\"xs\">\n <Button size=\"sm\" variant=\"ghost\">Cancel</Button>\n <Button size=\"sm\" variant=\"primary\">Save</Button>\n </Flex>\n </Card.Footer>\n </Card>\n );\n}"
163
+ },
164
+ {
165
+ "title": "Task Progress",
166
+ "description": "Card displaying a checklist with a progress bar in the header to summarize completion state.",
167
+ "code": "import { Card, Button, Flex, Progress } from 'ui-lab-components';\n\nconst tasks = [\n { label: 'Design review', done: true },\n { label: 'Write changelog', done: true },\n { label: 'Update docs', done: false },\n { label: 'Deploy to staging', done: false },\n];\n\nconst completed = tasks.filter((t) => t.done).length;\n\nexport default function Example() {\n return (\n <Card style={{ width: 360 }}>\n <Card.Header>\n <Flex justify=\"between\" align=\"center\">\n <span className=\"text-sm font-medium text-foreground-100\">Release v2.4.0</span>\n <span className=\"text-xs text-foreground-500\">{completed}/{tasks.length}</span>\n </Flex>\n <Progress value={(completed / tasks.length) * 100} className=\"mt-2\" />\n </Card.Header>\n <Card.Body className=\"py-3\">\n <ul className=\"space-y-2\">\n {tasks.map((task) => (\n <li key={task.label} className=\"flex items-center gap-2 text-sm\">\n <span className={task.done ? 'text-foreground-500 line-through' : 'text-foreground-200'}>\n {task.label}\n </span>\n </li>\n ))}\n </ul>\n </Card.Body>\n <Card.Footer>\n <Button size=\"sm\" variant=\"outline\" className=\"w-full\">View milestone</Button>\n </Card.Footer>\n </Card>\n );\n}"
129
168
  }
130
169
  ],
131
170
  },
@@ -142,16 +181,37 @@ export const componentRegistry = {
142
181
  relatedComponents: ["radio", "switch", "label"],
143
182
  tags: ["form", "selection", "boolean"],
144
183
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible", "Visual focus indicator", "Works with labels"] },
184
+ usage: undefined,
145
185
  examples: [
146
186
  {
147
- "title": "Basic Checkbox",
148
- "description": "A simple checkbox with a label. Use this as the standard checkbox input in your forms.",
149
- "code": "'use client';\n\nimport React from 'react';\nimport { Checkbox } from 'ui-lab-components';\n\nexport default function Example() {\n const [checked, setChecked] = React.useState(false);\n\n return (\n <Checkbox\n checked={checked}\n onChange={(e) => setChecked(e.target.checked)}\n label=\"Accept terms and conditions\"\n />\n );\n}"
187
+ "title": "Basic States",
188
+ "description": "The default checkbox states: unchecked, checked, disabled, and disabled checked.",
189
+ "code": "import { Checkbox, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 280 }}>\n <Checkbox id=\"basic-unchecked\" label=\"Unchecked\" />\n <Checkbox id=\"basic-checked\" label=\"Checked\" defaultChecked />\n <Checkbox id=\"basic-disabled\" label=\"Disabled\" disabled />\n <Checkbox id=\"basic-disabled-checked\" label=\"Disabled checked\" disabled defaultChecked />\n </Flex>\n );\n}"
190
+ },
191
+ {
192
+ "title": "Helper and Error Text",
193
+ "description": "A labeled checkbox can include supporting text and an invalid state for form feedback.",
194
+ "code": "import { Checkbox, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"lg\" style={{ width: 320 }}>\n <Checkbox\n id=\"helper-release-notes\"\n label=\"Release notes\"\n helper=\"Get a short product update when a new version ships.\"\n defaultChecked\n />\n <Checkbox\n id=\"helper-terms\"\n label=\"Accept terms\"\n helper=\"You must accept the terms before continuing.\"\n helperTextError\n aria-invalid=\"true\"\n />\n </Flex>\n );\n}"
150
195
  },
151
196
  {
152
- "title": "Checkbox Group with Descriptions",
153
- "description": "Multiple checkboxes grouped together as a settings panel. Each checkbox includes a label and helper text for context.",
154
- "code": "'use client';\n\nimport React from 'react';\nimport { Checkbox, Card, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [notifications, setNotifications] = React.useState({\n email: true,\n push: false,\n sms: false,\n marketing: false,\n });\n\n const handleChange = (key: keyof typeof notifications) => (e: React.ChangeEvent<HTMLInputElement>) => {\n setNotifications(prev => ({ ...prev, [key]: e.target.checked }));\n };\n\n return (\n <Card>\n <Card.Header>\n <h3 className=\"text-lg font-medium text-foreground-100\">Notification Preferences</h3>\n <p className=\"text-sm text-foreground-400\">Choose how you want to be notified.</p>\n </Card.Header>\n <Card.Body>\n <Flex direction=\"column\" gap=\"lg\">\n <Checkbox\n checked={notifications.email}\n onChange={handleChange('email')}\n label=\"Email notifications\"\n helperText=\"Receive updates about your account activity via email.\"\n />\n <Checkbox\n checked={notifications.push}\n onChange={handleChange('push')}\n label=\"Push notifications\"\n helperText=\"Get instant alerts on your device for important updates.\"\n />\n <Checkbox\n checked={notifications.sms}\n onChange={handleChange('sms')}\n label=\"SMS notifications\"\n helperText=\"Receive text messages for critical alerts and reminders.\"\n />\n <Checkbox\n checked={notifications.marketing}\n onChange={handleChange('marketing')}\n label=\"Marketing emails\"\n helperText=\"Stay informed about new features, tips, and special offers.\"\n />\n </Flex>\n </Card.Body>\n </Card>\n );\n}"
197
+ "title": "Controlled",
198
+ "description": "Use checked and onChange when checkbox state is owned by the surrounding interface.",
199
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Button, Checkbox, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [checked, setChecked] = useState(true);\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 300 }}>\n <Checkbox\n id=\"controlled-email\"\n label=\"Email notifications\"\n helper={checked ? 'Notifications are enabled.' : 'Notifications are paused.'}\n checked={checked}\n onChange={(event) => setChecked(event.currentTarget.checked)}\n />\n <Button variant=\"secondary\" onClick={() => setChecked((value) => !value)}>\n {checked ? 'Turn off' : 'Turn on'}\n </Button>\n </Flex>\n );\n}"
200
+ },
201
+ {
202
+ "title": "Checkbox Group",
203
+ "description": "Use a small group when a user can select any number of related options.",
204
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Checkbox, Flex } from 'ui-lab-components';\n\nconst subscriptionOptions = [\n 'Product updates',\n 'Security alerts',\n 'Billing reminders',\n];\n\nexport default function Example() {\n const [selected, setSelected] = useState<Set<string>>(\n new Set(['Product updates', 'Security alerts'])\n );\n\n const toggleOption = (option: string) => {\n setSelected((current) => {\n const next = new Set(current);\n next.has(option) ? next.delete(option) : next.add(option);\n return next;\n });\n };\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 300 }}>\n <div>\n <p className=\"text-sm font-medium text-foreground-100\">Subscriptions</p>\n <p className=\"text-xs text-foreground-400\">Choose the emails this workspace receives.</p>\n </div>\n <Flex direction=\"column\" gap=\"sm\">\n {subscriptionOptions.map((option) => (\n <Checkbox\n key={option}\n id={`subscription-${option.toLowerCase().replace(/ /g, '-')}`}\n label={option}\n checked={selected.has(option)}\n onChange={() => toggleOption(option)}\n />\n ))}\n </Flex>\n </Flex>\n );\n}"
205
+ },
206
+ {
207
+ "title": "Indeterminate",
208
+ "description": "A parent checkbox can show partial selection when only some child options are checked.",
209
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Checkbox, Divider, Flex } from 'ui-lab-components';\n\nconst tableColumns = ['Name', 'Email', 'Role', 'Last active'];\n\nexport default function Example() {\n const [visibleColumns, setVisibleColumns] = useState<Set<string>>(\n new Set(['Name', 'Email'])\n );\n\n const allSelected = visibleColumns.size === tableColumns.length;\n const isIndeterminate = visibleColumns.size > 0 && !allSelected;\n\n const toggleAll = () => {\n setVisibleColumns(allSelected ? new Set() : new Set(tableColumns));\n };\n\n const toggleColumn = (column: string) => {\n setVisibleColumns((current) => {\n const next = new Set(current);\n next.has(column) ? next.delete(column) : next.add(column);\n return next;\n });\n };\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 280 }}>\n <Checkbox\n id=\"columns-all\"\n label=\"Show all columns\"\n checked={allSelected}\n isIndeterminate={isIndeterminate}\n onChange={toggleAll}\n />\n <Divider />\n <Flex direction=\"column\" gap=\"sm\" styles={{ root: 'pl-8' }}>\n {tableColumns.map((column) => (\n <Checkbox\n key={column}\n id={`column-${column.toLowerCase().replace(/ /g, '-')}`}\n label={column}\n checked={visibleColumns.has(column)}\n onChange={() => toggleColumn(column)}\n />\n ))}\n </Flex>\n </Flex>\n );\n}"
210
+ },
211
+ {
212
+ "title": "Consent Form",
213
+ "description": "A required checkbox can gate a form action while optional choices remain independent.",
214
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Button, Checkbox, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [accepted, setAccepted] = useState(false);\n const [updates, setUpdates] = useState(false);\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 320 }}>\n <Checkbox\n id=\"consent-terms\"\n label=\"I agree to the terms\"\n helper=\"Required to create a workspace.\"\n checked={accepted}\n onChange={(event) => setAccepted(event.currentTarget.checked)}\n />\n <Checkbox\n id=\"consent-updates\"\n label=\"Send product updates\"\n checked={updates}\n onChange={(event) => setUpdates(event.currentTarget.checked)}\n />\n <Button variant=\"primary\" isDisabled={!accepted} styles={{ root: 'w-full' }}>\n Continue\n </Button>\n </Flex>\n );\n}"
155
215
  }
156
216
  ],
157
217
  },
@@ -169,6 +229,7 @@ export const componentRegistry = {
169
229
  relatedComponents: [],
170
230
  tags: ["code", "syntax-highlighting", "display"],
171
231
  accessibility: { "hasAriaSupport": false, "notes": ["Pre-formatted content", "Copy button is keyboard accessible"] },
232
+ usage: undefined,
172
233
  examples: [],
173
234
  },
174
235
  color: {
@@ -185,16 +246,27 @@ export const componentRegistry = {
185
246
  relatedComponents: ["input", "select"],
186
247
  tags: ["color", "form", "user-input", "interactive"],
187
248
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible sliders", "ARIA labels for color components", "Visual focus indicators", "Screen reader announcements for color values"] },
249
+ usage: undefined,
188
250
  examples: [
189
251
  {
190
- "title": "Basic Color",
191
- "description": "A simple color component with default configuration showing hex format.",
192
- "code": "import React, { useState } from 'react';\nimport { Color } from 'ui-lab-components';\n\nexport default function Example() {\n const [color, setColor] = useState('#FF6B6B');\n\n return (\n <div className=\"p-4 space-y-4\">\n <div>\n <p className=\"text-sm text-foreground-300 mb-3\">Selected color: <code className=\"text-accent-500 font-mono\">{color}</code></p>\n <Color\n value={color}\n onChange={setColor}\n format=\"hex\"\n defaultValue=\"#FF6B6B\"\n />\n </div>\n </div>\n );\n}"
252
+ "title": "Color Trigger",
253
+ "description": "An uncontrolled color picker using Color as the provider and Color.Trigger to open the picker area in a popover.",
254
+ "code": "\"use client\";\n\nimport { Color } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <div className=\"flex items-center justify-center\">\n <Color defaultValue=\"#3b82f6\" size=\"md\">\n <Color.Trigger aria-label=\"Choose color\" />\n </Color>\n </div>\n );\n}"
255
+ },
256
+ {
257
+ "title": "Controlled Color Trigger",
258
+ "description": "A controlled color picker with alpha support, using Color.Trigger to keep the picker area in a popover.",
259
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Color } from 'ui-lab-components';\n\nexport default function Example() {\n const [color, setColor] = useState('#ef4444');\n\n return (\n <div className=\"flex flex-col gap-4 items-center\">\n <Color\n value={color}\n onChange={setColor}\n showOpacity={true}\n size=\"md\"\n >\n <Color.Trigger aria-label=\"Choose accent color\" />\n </Color>\n <div className=\"text-sm text-foreground-400\">\n Selected: {color}\n </div>\n </div>\n );\n}"
193
260
  },
194
261
  {
195
- "title": "Opacity Slider",
196
- "description": "Color picker with opacity/alpha slider enabled for transparent color selection.",
197
- "code": "import React, { useState } from 'react';\nimport { Color } from 'ui-lab-components';\n\nexport default function Example() {\n const [color, setColor] = useState('rgba(106, 90, 205, 0.75)');\n\n return (\n <div className=\"p-4 space-y-4\">\n <div>\n <p className=\"text-sm text-foreground-300 mb-3\">Selected color: <code className=\"text-accent-500 font-mono\">{color}</code></p>\n <Color\n value={color}\n onChange={setColor}\n showOpacity\n format=\"rgb\"\n defaultValue=\"rgba(106, 90, 205, 0.75)\"\n />\n </div>\n </div>\n );\n}"
262
+ "title": "Inline Color Area",
263
+ "description": "Color.Area can be composed directly inside Color when the picker should stay visible.",
264
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Color } from 'ui-lab-components';\n\nexport default function Example() {\n const [color, setColor] = useState('#8b5cf6');\n\n return (\n <div className=\"flex flex-col gap-4 items-center\">\n <Color\n value={color}\n onChange={setColor}\n showPreview={true}\n format=\"hex\"\n size=\"md\"\n >\n <Color.Area />\n </Color>\n </div>\n );\n}"
265
+ },
266
+ {
267
+ "title": "Standalone Color Slider",
268
+ "description": "Color.Slider can be used on its own for hue and opacity control without rendering the full color picker.",
269
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Color } from 'ui-lab-components';\n\nexport default function Example() {\n const [hue, setHue] = useState(215);\n const [opacity, setOpacity] = useState(0.72);\n\n const baseColor = `hsl(${hue} 100% 50%)`;\n const previewColor = `hsl(${hue} 100% 50% / ${opacity})`;\n\n return (\n <div className=\"w-72 space-y-4\">\n <div className=\"flex items-center gap-3\">\n <div\n className=\"h-10 w-10 rounded-sm border border-background-700\"\n style={{ backgroundColor: previewColor }}\n aria-hidden=\"true\"\n />\n <div className=\"min-w-0 flex-1 text-sm text-foreground-300\">\n <div>Hue {Math.round(hue)} deg</div>\n <div>Opacity {Math.round(opacity * 100)}%</div>\n </div>\n </div>\n\n <Color.Slider\n aria-label=\"Accent hue\"\n value={hue}\n onChange={setHue}\n />\n\n <Color.Slider\n type=\"opacity\"\n aria-label=\"Accent opacity\"\n value={opacity}\n onChange={setOpacity}\n color={baseColor}\n />\n </div>\n );\n}"
198
270
  }
199
271
  ],
200
272
  },
@@ -212,6 +284,7 @@ export const componentRegistry = {
212
284
  relatedComponents: ["modal", "input"],
213
285
  tags: ["search", "command", "navigation"],
214
286
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard shortcuts", "Search support", "Focus management"] },
287
+ usage: undefined,
215
288
  examples: [
216
289
  {
217
290
  "title": "Basic Command Palette",
@@ -233,6 +306,7 @@ export const componentRegistry = {
233
306
  relatedComponents: ["modal", "button", "card"],
234
307
  tags: ["dialog", "confirm", "safety"],
235
308
  accessibility: { "hasAriaSupport": true, "notes": ["Focus management", "Clear action buttons", "Alert dialog role"] },
309
+ usage: undefined,
236
310
  examples: [
237
311
  {
238
312
  "title": "Basic Confirm",
@@ -254,6 +328,7 @@ export const componentRegistry = {
254
328
  relatedComponents: ["input", "select"],
255
329
  tags: ["date", "selection", "input", "interactive"],
256
330
  accessibility: { "hasAriaSupport": true, "notes": ["Full keyboard navigation with arrow keys", "Enter/Space to select dates", "PageUp/PageDown for month navigation", "Screen reader friendly with semantic HTML", "Focus management with visible focus ring", "Disabled dates properly announced"] },
331
+ usage: undefined,
257
332
  examples: [],
258
333
  },
259
334
  divider: {
@@ -269,6 +344,7 @@ export const componentRegistry = {
269
344
  relatedComponents: ["card", "modal"],
270
345
  tags: ["separator", "layout", "visual"],
271
346
  accessibility: { "hasAriaSupport": false, "notes": ["Semantic divider element", "Visual separator only"] },
347
+ usage: undefined,
272
348
  examples: [
273
349
  {
274
350
  "title": "Basic Divider",
@@ -300,11 +376,42 @@ export const componentRegistry = {
300
376
  relatedComponents: ["card", "modal"],
301
377
  tags: ["disclosure", "accordion", "collapsible", "expandable"],
302
378
  accessibility: { "hasAriaSupport": true, "notes": ["Full ARIA disclosure pattern support", "Keyboard navigation with Tab and Enter/Space", "Proper button and panel roles", "Screen reader friendly"] },
379
+ usage: undefined,
303
380
  examples: [
304
381
  {
305
- "title": "Basic Expand",
306
- "description": "An expandable/collapsible disclosure component. Use this to show and hide content sections while maintaining accessibility and keyboard support.",
307
- "code": "import React from 'react';\nimport { Expand } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Expand title=\"What is an Expand component?\">\n <p className=\"text-foreground-300\">\n An Expand component is a disclosure widget that expands and collapses content.\n It's built with React Aria for full accessibility support.\n </p>\n </Expand>\n );\n}"
382
+ "title": "Basic",
383
+ "description": "Preset mode using the title prop the simplest way to render a labeled expandable section.",
384
+ "code": "import { Expand } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <div className=\"w-full max-w-sm border border-background-700 rounded-sm divide-y divide-background-700\">\n <Expand title=\"What is UI Lab?\">\n <p className=\"text-sm text-foreground-400 px-3 py-3\">\n UI Lab is a component library built for building beautiful, accessible interfaces with a consistent design system.\n </p>\n </Expand>\n </div>\n );\n}"
385
+ },
386
+ {
387
+ "title": "Accordion",
388
+ "description": "Controlled expand group where only one item can be open at a time.",
389
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Expand } from 'ui-lab-components';\n\nconst items = [\n {\n id: 'shipping',\n title: 'Shipping & Delivery',\n content: 'Standard shipping takes 3–5 business days. Express options are available at checkout for next-day delivery.',\n },\n {\n id: 'returns',\n title: 'Returns & Refunds',\n content: 'Items can be returned within 30 days of purchase. Refunds are processed within 5–7 business days after we receive the item.',\n },\n {\n id: 'warranty',\n title: 'Warranty',\n content: 'All products include a 12-month manufacturer warranty. Extended coverage can be purchased at checkout.',\n },\n];\n\nexport default function Example() {\n const [open, setOpen] = useState<string | null>('shipping');\n\n return (\n <div className=\"w-full max-w-sm border border-background-700 rounded-sm divide-y divide-background-700\">\n {items.map((item) => (\n <Expand\n key={item.id}\n title={item.title}\n isExpanded={open === item.id}\n onExpandedChange={(expanded) => setOpen(expanded ? item.id : null)}\n >\n <p className=\"text-sm text-foreground-400 px-3 py-3\">{item.content}</p>\n </Expand>\n ))}\n </div>\n );\n}"
390
+ },
391
+ {
392
+ "title": "Custom Trigger",
393
+ "description": "Compound mode with a fully composed trigger — custom icon, badge, and layout.",
394
+ "code": "import { Expand, Flex, Badge } from 'ui-lab-components';\nimport { FaUser } from 'react-icons/fa6';\n\nexport default function Example() {\n return (\n <div className=\"w-full max-w-sm border border-background-700 rounded-sm\">\n <Expand>\n <Expand.Trigger>\n <Flex align=\"center\" gap=\"xs\" className=\"flex-1 px-3 py-2.5\">\n <FaUser className=\"text-foreground-400 text-xs shrink-0\" />\n <span className=\"text-sm font-medium\">Account Settings</span>\n <Badge className=\"ml-auto mr-2\">New</Badge>\n </Flex>\n <Expand.Icon />\n </Expand.Trigger>\n <Expand.Divider />\n <Expand.Content>\n <Flex direction=\"column\" gap=\"xs\" className=\"px-3 py-3\">\n <p className=\"text-sm text-foreground-400\">Manage your profile, password, and notification preferences.</p>\n </Flex>\n </Expand.Content>\n </Expand>\n </div>\n );\n}"
395
+ },
396
+ {
397
+ "title": "Reveal Directions",
398
+ "description": "Content can reveal from above or horizontally using the from prop on Expand.Content.",
399
+ "code": "import { Expand, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"lg\" className=\"w-full max-w-sm\">\n <div>\n <p className=\"text-xs text-foreground-500 mb-2 px-1\">from=\"above\"</p>\n <div className=\"border border-background-700 rounded-sm\">\n <Expand title=\"Reveal above\">\n <Expand.Content from=\"above\">\n <p className=\"text-sm text-foreground-400 px-3 py-3\">This content slides in from above the trigger.</p>\n </Expand.Content>\n </Expand>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-foreground-500 mb-2 px-1\">from=\"right\"</p>\n <div className=\"border border-background-700 rounded-sm\">\n <Expand title=\"Reveal right\">\n <Expand.Content from=\"right\">\n <p className=\"text-sm text-foreground-400 px-3 py-3\">Expands horizontally to the right.</p>\n </Expand.Content>\n </Expand>\n </div>\n </div>\n </Flex>\n );\n}"
400
+ },
401
+ {
402
+ "title": "Settings Panel",
403
+ "description": "Grouped settings sections using compound mode with icons, dividers, and a list of rows.",
404
+ "code": "import { Expand, Flex } from 'ui-lab-components';\nimport { FaGear, FaCode } from 'react-icons/fa6';\n\nexport default function Example() {\n return (\n <div className=\"w-full max-w-sm border border-background-700 rounded-sm divide-y divide-background-700\">\n <Expand defaultExpanded>\n <Expand.Trigger>\n <Flex align=\"center\" gap=\"xs\" className=\"flex-1 px-3 py-2.5\">\n <FaGear className=\"text-foreground-400 text-xs\" />\n <span className=\"text-sm font-medium\">General</span>\n </Flex>\n <Expand.Icon />\n </Expand.Trigger>\n <Expand.Divider />\n <Expand.Content>\n <Flex direction=\"column\" className=\"divide-y divide-background-700\">\n {['Language', 'Timezone', 'Date format'].map((setting) => (\n <Flex key={setting} justify=\"between\" align=\"center\" className=\"px-3 py-2.5\">\n <span className=\"text-sm text-foreground-300\">{setting}</span>\n <span className=\"text-xs text-foreground-500\">Auto</span>\n </Flex>\n ))}\n </Flex>\n </Expand.Content>\n </Expand>\n <Expand>\n <Expand.Trigger>\n <Flex align=\"center\" gap=\"xs\" className=\"flex-1 px-3 py-2.5\">\n <FaCode className=\"text-foreground-400 text-xs\" />\n <span className=\"text-sm font-medium\">Developer</span>\n </Flex>\n <Expand.Icon />\n </Expand.Trigger>\n <Expand.Divider />\n <Expand.Content>\n <Flex direction=\"column\" className=\"divide-y divide-background-700\">\n {['API keys', 'Webhooks', 'Debug mode'].map((setting) => (\n <Flex key={setting} justify=\"between\" align=\"center\" className=\"px-3 py-2.5\">\n <span className=\"text-sm text-foreground-300\">{setting}</span>\n <span className=\"text-xs text-foreground-500\">Off</span>\n </Flex>\n ))}\n </Flex>\n </Expand.Content>\n </Expand>\n </div>\n );\n}"
405
+ },
406
+ {
407
+ "title": "Disabled State",
408
+ "description": "An isDisabled section is visually dimmed and blocks interaction.",
409
+ "code": "import { Expand } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <div className=\"w-full max-w-sm border border-background-700 rounded-sm divide-y divide-background-700\">\n <Expand title=\"Available section\">\n <p className=\"text-sm text-foreground-400 px-3 py-3\">This section is accessible and can be expanded.</p>\n </Expand>\n <Expand title=\"Restricted section\" isDisabled>\n <p className=\"text-sm text-foreground-400 px-3 py-3\">This content is not accessible.</p>\n </Expand>\n </div>\n );\n}"
410
+ },
411
+ {
412
+ "title": "Inline Info",
413
+ "description": "A contextual disclosure pattern for surfacing supplementary information inline.",
414
+ "code": "import { Expand, Flex } from 'ui-lab-components';\nimport { FaCircleInfo } from 'react-icons/fa6';\n\nexport default function Example() {\n return (\n <div className=\"w-full max-w-sm rounded-sm border border-background-700 bg-background-900\">\n <Expand>\n <Expand.Trigger>\n <Flex align=\"center\" gap=\"xs\" className=\"flex-1 px-3 py-2.5\">\n <FaCircleInfo className=\"text-foreground-400 text-xs shrink-0\" />\n <span className=\"text-sm font-medium text-foreground-200\">Why do we collect this?</span>\n </Flex>\n <Expand.Icon />\n </Expand.Trigger>\n <Expand.Divider />\n <Expand.Content>\n <p className=\"text-sm text-foreground-400 px-3 py-3 leading-relaxed\">\n We use this information only to verify your identity and improve the service. It is never shared with third parties.\n </p>\n </Expand.Content>\n </Expand>\n </div>\n );\n}"
308
415
  }
309
416
  ],
310
417
  },
@@ -321,11 +428,22 @@ export const componentRegistry = {
321
428
  relatedComponents: ["card", "group", "divider"],
322
429
  tags: ["layout", "flex", "container-queries", "responsive"],
323
430
  accessibility: { "hasAriaSupport": false, "notes": ["Semantic div element with flexbox layout", "No built-in ARIA roles - use for layout purposes", "Compose with accessible child components"] },
431
+ usage: undefined,
324
432
  examples: [
325
433
  {
326
- "title": "Basic Flex",
327
- "description": "A simple flex layout arranging items in a row. Use this component to easily create flexible layouts with consistent spacing.",
328
- "code": "import React from 'react';\nimport { Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex gap=\"md\">\n <div className=\"h-16 w-20 bg-background-800 rounded border border-accent-500/50 flex items-center justify-center\">1</div>\n <div className=\"h-16 w-20 bg-background-800 rounded border border-accent-500/50 flex items-center justify-center\">2</div>\n <div className=\"h-16 w-20 bg-background-800 rounded border border-accent-500/50 flex items-center justify-center\">3</div>\n </Flex>\n );\n}"
434
+ "title": "Axis Control",
435
+ "description": "Interactive demo of Flex direction, justify, align, gap, and wrap across row and column layouts.",
436
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Flex, Frame } from 'ui-lab-components'\nimport type { FlexProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype FlexDirection = NonNullable<FlexProps['direction']>;\ntype FlexJustify = NonNullable<FlexProps['justify']>;\ntype FlexAlign = NonNullable<FlexProps['align']>;\ntype FlexGap = NonNullable<FlexProps['gap']>;\ntype FlexWrap = NonNullable<FlexProps['wrap']>;\n\nconst BASE_CELL_STYLE = {\n '--frame-fill': 'var(--background-900)',\n '--frame-stroke-color': 'var(--background-600)',\n} as React.CSSProperties;\n\nexport const controls: ControlDef[] = [\n {\n name: 'direction',\n label: 'Main Axis',\n type: 'select',\n options: [\n { label: 'Row', value: 'row' },\n { label: 'Column', value: 'column' },\n ],\n defaultValue: 'row',\n },\n {\n name: 'justify',\n label: 'Main-Axis Distribution',\n type: 'select',\n options: [\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n { label: 'Space Between', value: 'between' },\n { label: 'Space Around', value: 'around' },\n { label: 'Space Evenly', value: 'evenly' },\n ],\n defaultValue: 'start',\n },\n {\n name: 'align',\n label: 'Cross-Axis Alignment',\n type: 'select',\n options: [\n { label: 'Stretch', value: 'stretch' },\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n { label: 'Baseline', value: 'baseline' },\n ],\n defaultValue: 'stretch',\n },\n {\n name: 'gap',\n label: 'Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n { label: 'Extra Large', value: 'xl' },\n ],\n defaultValue: 'md',\n },\n {\n name: 'frameCount',\n label: 'Frames',\n type: 'stepper',\n defaultValue: 4,\n min: 4,\n max: 10,\n step: 1,\n },\n {\n name: 'wrap',\n label: 'Overflow Strategy',\n type: 'select',\n options: [\n { label: 'No Wrap', value: 'nowrap' },\n { label: 'Wrap', value: 'wrap' },\n ],\n defaultValue: 'nowrap',\n },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nfunction getDirection(value: unknown): FlexDirection {\n return value === 'column' ? 'column' : 'row';\n}\n\nfunction getJustify(value: unknown): FlexJustify {\n if (value === 'center' || value === 'end' || value === 'between' || value === 'around' || value === 'evenly') return value;\n return 'start';\n}\n\nfunction getAlign(value: unknown): FlexAlign {\n if (value === 'start' || value === 'center' || value === 'end' || value === 'baseline') return value;\n return 'stretch';\n}\n\nfunction getGap(value: unknown): FlexGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getWrap(value: unknown): FlexWrap {\n return value === 'wrap' ? 'wrap' : 'nowrap';\n}\n\nfunction getFrameCount(value: unknown, min: number, max: number, fallback: number) {\n const n = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction FrameCell({ className, style }: { className?: string; style?: React.CSSProperties }) {\n return (\n <Frame pathStroke=\"dashed\" className={className} style={{ ...BASE_CELL_STYLE, ...style }}>\n <div className=\"size-full\" />\n </Frame>\n );\n}\n\nfunction getAxisColumnActionSpecs(frameCount: number) {\n const total = Math.max(frameCount - 2, 1);\n const pattern = [\n { className: 'min-w-[4.75rem] flex-1', style: { width: 'auto', minWidth: '4.75rem', height: '2.75rem' } },\n { className: 'min-w-[5.5rem] flex-1', style: { width: 'auto', minWidth: '5.5rem', height: '2.75rem' } },\n { className: 'min-w-[4rem] flex-1', style: { width: 'auto', minWidth: '4rem', height: '3rem' } },\n ];\n return Array.from({ length: total }, (_, i) => pattern[i % pattern.length]);\n}\n\nfunction getAxisRowGroups(frameCount: number) {\n const groupCount = Math.max(Math.ceil(frameCount / 4), 1);\n return Array.from({ length: groupCount }, (_, gi) => {\n const remaining = frameCount - gi * 4;\n const itemCount = Math.min(Math.max(remaining, 0), 4);\n return { rail: itemCount >= 1, canvas: itemCount >= 2, actionTop: itemCount >= 3, actionBottom: itemCount >= 4 };\n });\n}\n\nexport function renderPreview(props: Record<string, unknown>) {\n const direction = getDirection(props.direction);\n const justify = getJustify(props.justify);\n const align = getAlign(props.align);\n const gap = getGap(props.gap);\n const wrap = getWrap(props.wrap);\n const frameCount = getFrameCount(props.frameCount, 4, 10, 4);\n\n if (direction === 'row') {\n const groups = getAxisRowGroups(frameCount);\n return (\n <Flex direction=\"column\" justify={justify} align={align} gap={gap} wrap=\"nowrap\" className=\"w-full\">\n {groups.map((group, index) => (\n <Flex key={`axis-row-group-${index}`} direction=\"row\" gap=\"md\" align=\"stretch\" className=\"w-full\">\n {group.rail && <FrameCell className=\"shrink-0\" style={{ width: '4.5rem', height: '8.5rem' }} />}\n {group.canvas && <FrameCell className=\"min-w-[11rem] flex-1\" style={{ width: 'auto', minWidth: '11rem', flex: '1.4 1 12rem', height: '8.5rem' }} />}\n {(group.actionTop || group.actionBottom) && (\n <Flex direction=\"column\" gap=\"sm\" className=\"w-[5.5rem] shrink-0\">\n {group.actionTop && <FrameCell className=\"shrink-0\" style={{ width: '5.5rem', height: '4.5rem' }} />}\n {group.actionBottom && <FrameCell className=\"shrink-0\" style={{ width: '5.5rem', height: '3.25rem' }} />}\n </Flex>\n )}\n </Flex>\n ))}\n </Flex>\n );\n }\n\n const actions = getAxisColumnActionSpecs(frameCount);\n return (\n <Flex direction=\"column\" justify={justify} align={align} gap={gap} wrap={wrap} className=\"w-full\">\n <FrameCell className=\"w-full\" style={{ width: '100%', height: '2.75rem' }} />\n <FrameCell className=\"w-full\" style={{ width: '100%', height: '8rem' }} />\n <Flex direction=\"row\" wrap=\"wrap\" gap=\"sm\" className=\"w-full\">\n {actions.map((action, index) => (\n <FrameCell key={`column-action-${index}`} className={action.className} style={action.style as React.CSSProperties} />\n ))}\n </Flex>\n </Flex>\n );\n}\n\nexport default function Example() {\n return renderPreview({ direction: 'row', justify: 'start', align: 'stretch', gap: 'md', wrap: 'nowrap', frameCount: 4 });\n}"
437
+ },
438
+ {
439
+ "title": "Wrap Overflow Into Rows",
440
+ "description": "When wrap=",
441
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Flex, Frame } from 'ui-lab-components'\nimport type { FlexProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype FlexDirection = NonNullable<FlexProps['direction']>;\ntype FlexJustify = NonNullable<FlexProps['justify']>;\ntype FlexAlign = NonNullable<FlexProps['align']>;\ntype FlexGap = NonNullable<FlexProps['gap']>;\ntype FlexWrap = NonNullable<FlexProps['wrap']>;\n\nconst BASE_CELL_STYLE = {\n '--frame-fill': 'var(--background-900)',\n '--frame-stroke-color': 'var(--background-600)',\n} as React.CSSProperties;\n\nexport const controls: ControlDef[] = [\n {\n name: 'direction',\n label: 'Main Axis',\n type: 'select',\n options: [\n { label: 'Row', value: 'row' },\n { label: 'Column', value: 'column' },\n ],\n defaultValue: 'row',\n },\n {\n name: 'justify',\n label: 'Main-Axis Distribution',\n type: 'select',\n options: [\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n { label: 'Space Between', value: 'between' },\n { label: 'Space Around', value: 'around' },\n { label: 'Space Evenly', value: 'evenly' },\n ],\n defaultValue: 'start',\n },\n {\n name: 'align',\n label: 'Cross-Axis Alignment',\n type: 'select',\n options: [\n { label: 'Stretch', value: 'stretch' },\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n { label: 'Baseline', value: 'baseline' },\n ],\n defaultValue: 'stretch',\n },\n {\n name: 'gap',\n label: 'Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n { label: 'Extra Large', value: 'xl' },\n ],\n defaultValue: 'md',\n },\n {\n name: 'frameCount',\n label: 'Frames',\n type: 'stepper',\n defaultValue: 7,\n min: 4,\n max: 12,\n step: 1,\n },\n {\n name: 'wrap',\n label: 'Overflow Strategy',\n type: 'select',\n options: [\n { label: 'No Wrap', value: 'nowrap' },\n { label: 'Wrap', value: 'wrap' },\n ],\n defaultValue: 'wrap',\n },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nfunction getDirection(value: unknown): FlexDirection {\n return value === 'column' ? 'column' : 'row';\n}\n\nfunction getJustify(value: unknown): FlexJustify {\n if (value === 'center' || value === 'end' || value === 'between' || value === 'around' || value === 'evenly') return value;\n return 'start';\n}\n\nfunction getAlign(value: unknown): FlexAlign {\n if (value === 'start' || value === 'center' || value === 'end' || value === 'baseline') return value;\n return 'stretch';\n}\n\nfunction getGap(value: unknown): FlexGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getWrap(value: unknown): FlexWrap {\n return value === 'wrap' ? 'wrap' : 'nowrap';\n}\n\nfunction getFrameCount(value: unknown, min: number, max: number, fallback: number) {\n const n = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction FrameCell({ className, style }: { className?: string; style?: React.CSSProperties }) {\n return (\n <Frame pathStroke=\"dashed\" className={className} style={{ ...BASE_CELL_STYLE, ...style }}>\n <div className=\"size-full\" />\n </Frame>\n );\n}\n\nfunction getToolbarFlowSpecs(direction: FlexDirection, frameCount: number) {\n if (direction === 'column') {\n const pattern = [\n { style: { width: '100%', height: '3.25rem' } },\n { style: { width: '100%', height: '3rem' } },\n { style: { width: '100%', height: '3.25rem' } },\n { style: { width: '100%', height: '2.75rem' } },\n ];\n return Array.from({ length: frameCount }, (_, i) => ({ className: 'w-full', ...pattern[i % pattern.length] }));\n }\n const repeatPattern = [\n { className: 'shrink-0', style: { width: '6rem', height: '3.25rem' } },\n { className: 'shrink-0', style: { width: '6.75rem', height: '3.25rem' } },\n { className: 'shrink-0', style: { width: '5.5rem', height: '3.25rem' } },\n { className: 'shrink-0', style: { width: '6.5rem', height: '3.25rem' } },\n { className: 'shrink-0', style: { width: '4.5rem', height: '3.25rem' } },\n { className: 'shrink-0', style: { width: '5.5rem', height: '3.25rem' } },\n ];\n return [\n { className: 'min-w-[12rem]', style: { width: 'auto', minWidth: '12rem', flex: '1.6 1 14rem', height: '3.25rem' } },\n ...Array.from({ length: Math.max(frameCount - 1, 0) }, (_, i) => repeatPattern[i % repeatPattern.length]),\n ];\n}\n\nexport function renderPreview(props: Record<string, unknown>) {\n const direction = getDirection(props.direction);\n const frameCount = getFrameCount(props.frameCount, 4, 12, 7);\n const specs = getToolbarFlowSpecs(direction, frameCount);\n\n return (\n <Flex\n direction={direction}\n justify={getJustify(props.justify)}\n align={getAlign(props.align)}\n gap={getGap(props.gap)}\n wrap={getWrap(props.wrap)}\n className=\"w-full\"\n >\n {specs.map((spec, index) => (\n <FrameCell key={`${direction}-toolbar-${index}`} className={spec.className} style={spec.style as React.CSSProperties} />\n ))}\n </Flex>\n );\n}\n\nexport default function Example() {\n return renderPreview({ direction: 'row', justify: 'start', align: 'center', gap: 'md', wrap: 'wrap', frameCount: 7 });\n}"
442
+ },
443
+ {
444
+ "title": "Container-Query Reflow",
445
+ "description": "With containerQueryResponsive enabled, the layout reflows based on available container width rather than viewport size.",
446
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Flex, Frame } from 'ui-lab-components'\nimport type { FlexProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype FlexJustify = NonNullable<FlexProps['justify']>;\ntype FlexGap = NonNullable<FlexProps['gap']>;\ntype FlexWrap = NonNullable<FlexProps['wrap']>;\n\nconst BASE_CELL_STYLE = {\n '--frame-fill': 'var(--background-900)',\n '--frame-stroke-color': 'var(--background-600)',\n} as React.CSSProperties;\n\nconst CONTAINER_FLOW_STYLES = `\n .flex-container-flow-avatar {\n width: 5rem;\n min-width: 5rem;\n flex-grow: 0.65;\n flex-shrink: 1;\n }\n\n .flex-container-flow-main {\n width: 15rem;\n min-width: 14rem;\n flex-grow: 2;\n flex-shrink: 1;\n }\n\n .flex-container-flow-sidebar {\n width: 10rem;\n min-width: 10rem;\n flex-grow: 1;\n flex-shrink: 1;\n }\n\n @container flex-parent (width < 400px) {\n .flex-container-flow-avatar,\n .flex-container-flow-main,\n .flex-container-flow-sidebar {\n width: 100%;\n min-width: 0;\n }\n }\n`;\n\nexport const controls: ControlDef[] = [\n {\n name: 'gap',\n label: 'Base Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n { label: 'Extra Large', value: 'xl' },\n ],\n defaultValue: 'md',\n },\n {\n name: 'frameCount',\n label: 'Frames',\n type: 'stepper',\n defaultValue: 5,\n min: 5,\n max: 10,\n step: 1,\n },\n {\n name: 'justify',\n label: 'Main-Axis Distribution',\n type: 'select',\n options: [\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'Space Between', value: 'between' },\n { label: 'Space Around', value: 'around' },\n ],\n defaultValue: 'start',\n },\n {\n name: 'wrap',\n label: 'Overflow Strategy',\n type: 'select',\n options: [\n { label: 'No Wrap', value: 'nowrap' },\n { label: 'Wrap', value: 'wrap' },\n ],\n defaultValue: 'nowrap',\n },\n {\n name: 'containerQueryResponsive',\n label: 'Enable Container Queries',\n type: 'toggle',\n defaultValue: true,\n },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nfunction getJustify(value: unknown): FlexJustify {\n if (value === 'center' || value === 'end' || value === 'between' || value === 'around' || value === 'evenly') return value;\n return 'start';\n}\n\nfunction getGap(value: unknown): FlexGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getWrap(value: unknown): FlexWrap {\n return value === 'wrap' ? 'wrap' : 'nowrap';\n}\n\nfunction getFrameCount(value: unknown, min: number, max: number, fallback: number) {\n const n = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction FrameCell({ className, style }: { className?: string; style?: React.CSSProperties }) {\n return (\n <Frame pathStroke=\"dashed\" className={className} style={{ ...BASE_CELL_STYLE, ...style }}>\n <div className=\"size-full\" />\n </Frame>\n );\n}\n\nfunction getDistribution(frameCount: number) {\n let metadataCount = 2;\n let sidebarCount = 1;\n let remaining = Math.max(frameCount - 5, 0);\n while (remaining > 0) {\n metadataCount += 1;\n remaining -= 1;\n if (remaining > 0) { sidebarCount += 1; remaining -= 1; }\n }\n return { metadataCount, sidebarCount };\n}\n\nconst META_PATTERN = [\n { className: 'min-w-[4.75rem] flex-1', style: { width: 'auto', minWidth: '4.75rem', height: '2.25rem' } },\n { className: 'min-w-[4rem] flex-1', style: { width: 'auto', minWidth: '4rem', height: '2.25rem' } },\n { className: 'min-w-[5.25rem] flex-1', style: { width: 'auto', minWidth: '5.25rem', height: '2.25rem' } },\n];\n\nconst SIDEBAR_PATTERN = [\n { style: { width: '100%', height: '7rem' } },\n { style: { width: '100%', height: '3rem' } },\n { style: { width: '100%', height: '2.5rem' } },\n];\n\nexport function renderPreview(props: Record<string, unknown>) {\n const frameCount = getFrameCount(props.frameCount, 5, 10, 5);\n const { metadataCount, sidebarCount } = getDistribution(frameCount);\n\n return (\n <>\n <style>{CONTAINER_FLOW_STYLES}</style>\n <Flex\n justify={getJustify(props.justify)}\n align=\"stretch\"\n gap={getGap(props.gap)}\n wrap={getWrap(props.wrap)}\n containerQueryResponsive={Boolean(props.containerQueryResponsive)}\n className=\"w-full\"\n >\n <FrameCell className=\"flex-container-flow-avatar\" style={{ height: '7rem' }} />\n <Flex direction=\"column\" gap=\"sm\" className=\"flex-container-flow-main\">\n <FrameCell style={{ width: '100%', height: '4.5rem' }} />\n <Flex gap=\"sm\" wrap=\"wrap\" className=\"w-full\">\n {Array.from({ length: metadataCount }, (_, i) => META_PATTERN[i % META_PATTERN.length]).map((spec, i) => (\n <FrameCell key={`meta-${i}`} className={spec.className} style={spec.style as React.CSSProperties} />\n ))}\n </Flex>\n </Flex>\n <Flex direction=\"column\" gap=\"sm\" className=\"flex-container-flow-sidebar\">\n {Array.from({ length: sidebarCount }, (_, i) => SIDEBAR_PATTERN[i % SIDEBAR_PATTERN.length]).map((spec, i) => (\n <FrameCell key={`sidebar-${i}`} className=\"w-full\" style={spec.style as React.CSSProperties} />\n ))}\n </Flex>\n </Flex>\n </>\n );\n}\n\nexport default function Example() {\n return renderPreview({ gap: 'md', frameCount: 5, justify: 'start', wrap: 'nowrap', containerQueryResponsive: true });\n}"
329
447
  }
330
448
  ],
331
449
  },
@@ -342,6 +460,7 @@ export const componentRegistry = {
342
460
  relatedComponents: ["card", "modal"],
343
461
  tags: ["container", "decorative", "border", "svg", "custom-shapes"],
344
462
  accessibility: { "hasAriaSupport": false, "notes": ["Decorative SVG elements are properly hidden from assistive technology"] },
463
+ usage: undefined,
345
464
  examples: [
346
465
  {
347
466
  "title": "Featured Card Frame",
@@ -373,11 +492,22 @@ export const componentRegistry = {
373
492
  relatedComponents: ["card", "grid"],
374
493
  tags: ["gallery", "grid", "media", "images", "video", "responsive"],
375
494
  accessibility: { "hasAriaSupport": true, "notes": ["Uses React Aria useFocusRing for keyboard focus indication", "Supports both link and button interaction modes", "Proper focus order through natural DOM order", "Hover and focus states for visual feedback"] },
495
+ usage: undefined,
376
496
  examples: [
377
497
  {
378
- "title": "Basic Gallery",
379
- "description": "A simple gallery with multiple items in a grid layout. Use this for displaying collections of images or content.",
380
- "code": "import { Gallery } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Gallery columns={3} gap=\"md\">\n <Gallery.Item>\n <Gallery.View aspectRatio=\"1/1\">\n <div style={{ background: '#e0e0e0', width: '100%', height: '100%' }} />\n </Gallery.View>\n </Gallery.Item>\n <Gallery.Item>\n <Gallery.View aspectRatio=\"1/1\">\n <div style={{ background: '#d0d0d0', width: '100%', height: '100%' }} />\n </Gallery.View>\n </Gallery.Item>\n <Gallery.Item>\n <Gallery.View aspectRatio=\"1/1\">\n <div style={{ background: '#c0c0c0', width: '100%', height: '100%' }} />\n </Gallery.View>\n </Gallery.Item>\n </Gallery>\n );\n}"
498
+ "title": "Grid Composition",
499
+ "description": "Gallery items arranged in a configurable grid with consistent gap and aspect ratio.",
500
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Gallery, Frame } from 'ui-lab-components'\nimport type { GalleryProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype GalleryGap = NonNullable<GalleryProps['gap']>;\ntype ItemTier = 'common' | 'archived' | 'experimental';\n\nconst FRAME_STYLE: Record<ItemTier, React.CSSProperties> = {\n common: { '--frame-fill': 'var(--background-900)', '--frame-stroke-color': 'var(--background-600)' } as React.CSSProperties,\n archived: { '--frame-fill': 'var(--background-950)', '--frame-stroke-color': 'var(--background-700)' } as React.CSSProperties,\n experimental: { '--frame-fill': 'var(--background-950)', '--frame-stroke-color': 'var(--background-800)' } as React.CSSProperties,\n};\n\nexport const controls: ControlDef[] = [\n { name: 'columns', label: 'Columns', type: 'stepper', defaultValue: 3, min: 1, max: 6, step: 1 },\n {\n name: 'gap',\n label: 'Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n { label: 'Extra Large', value: 'xl' },\n ],\n defaultValue: 'md',\n },\n {\n name: 'aspectRatio',\n label: 'Aspect Ratio',\n type: 'select',\n options: [\n { label: '1:1', value: '1/1' },\n { label: '4:3', value: '4/3' },\n { label: '3:4', value: '3/4' },\n { label: '16:9', value: '16/9' },\n ],\n defaultValue: '4/3',\n },\n { name: 'itemCount', label: 'Items', type: 'stepper', defaultValue: 4, min: 4, max: 12, step: 1 },\n { name: 'responsive', label: 'Container-Query Responsive', type: 'toggle', defaultValue: false },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nconst GRID_ITEMS = [\n { id: 'g1', title: 'Brand Kit', description: 'Identity · Updated 2d ago', tier: 'common' as ItemTier },\n { id: 'g2', title: 'Icon Set', description: 'UI Assets · 142 icons', tier: 'common' as ItemTier },\n { id: 'g3', title: 'Type Scale', description: 'Typography · 8 weights', tier: 'common' as ItemTier },\n { id: 'g4', title: 'Color Tokens', description: 'Design System · v3.2', tier: 'common' as ItemTier },\n { id: 'g5', title: 'Grid Spec', description: 'Layout · 12-column', tier: 'common' as ItemTier },\n { id: 'g6', title: 'Motion Guide', description: 'Animation · 24 presets', tier: 'common' as ItemTier },\n { id: 'g7', title: 'Legacy Icons', description: 'Archived · v1.4', tier: 'archived' as ItemTier },\n { id: 'g8', title: 'Old Palette', description: 'Archived · 2021', tier: 'archived' as ItemTier },\n { id: 'g9', title: 'Beta Components', description: 'Archived · Pre-release', tier: 'archived' as ItemTier },\n { id: 'g10', title: 'Prototype A', description: 'Experimental · Do not ship', tier: 'experimental' as ItemTier },\n { id: 'g11', title: 'Prototype B', description: 'Experimental · Internal only', tier: 'experimental' as ItemTier },\n { id: 'g12', title: 'Prototype C', description: 'Experimental · Unreleased', tier: 'experimental' as ItemTier },\n];\n\nfunction getGap(value: unknown): GalleryGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getInt(value: unknown, min: number, max: number, fallback: number) {\n const n = Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction getAspectRatio(value: unknown): string {\n if (typeof value === 'string' && value.includes('/')) return value;\n return '4/3';\n}\n\nfunction itemClassName(tier: ItemTier) {\n if (tier === 'archived') return 'opacity-60';\n if (tier === 'experimental') return 'opacity-35';\n return undefined;\n}\n\nexport function renderPreview(props: Record<string, unknown>) {\n const columns = getInt(props.columns, 1, 6, 3);\n const gap = getGap(props.gap);\n const ratio = getAspectRatio(props.aspectRatio);\n const count = getInt(props.itemCount, 4, 12, 4);\n const responsive = Boolean(props.responsive);\n const items = GRID_ITEMS.slice(0, count);\n const resolvedColumns: GalleryProps['columns'] = responsive ? { sm: 1, md: Math.min(2, columns), lg: columns } : columns;\n\n return (\n <Gallery columns={resolvedColumns} gap={gap} responsive={responsive} className=\"w-full\">\n {items.map((item) => (\n <Gallery.Item key={item.id} className={itemClassName(item.tier)} aria-disabled={item.tier === 'experimental' ? true : undefined}>\n <Gallery.View aspectRatio={ratio}>\n <Frame pathStroke={item.tier === 'experimental' ? 'dotted' : 'dashed'} style={FRAME_STYLE[item.tier]} className=\"w-full h-full\" />\n </Gallery.View>\n <Gallery.Body>\n <span>{item.title}</span>\n <span>{item.description}</span>\n </Gallery.Body>\n </Gallery.Item>\n ))}\n </Gallery>\n );\n}\n\nexport default function Example() {\n return renderPreview({ columns: 3, gap: 'md', aspectRatio: '4/3', itemCount: 4, responsive: false });\n}"
501
+ },
502
+ {
503
+ "title": "Item Orientation",
504
+ "description": "Gallery items can be oriented vertically (stacked view + body) or horizontally (side-by-side view + body).",
505
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Gallery, Frame } from 'ui-lab-components'\nimport type { GalleryProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype GalleryGap = NonNullable<GalleryProps['gap']>;\ntype ItemTier = 'common' | 'archived' | 'experimental';\n\nconst FRAME_STYLE: Record<ItemTier, React.CSSProperties> = {\n common: { '--frame-fill': 'var(--background-900)', '--frame-stroke-color': 'var(--background-600)' } as React.CSSProperties,\n archived: { '--frame-fill': 'var(--background-950)', '--frame-stroke-color': 'var(--background-700)' } as React.CSSProperties,\n experimental: { '--frame-fill': 'var(--background-950)', '--frame-stroke-color': 'var(--background-800)' } as React.CSSProperties,\n};\n\nexport const controls: ControlDef[] = [\n {\n name: 'orientation',\n label: 'Orientation',\n type: 'select',\n options: [\n { label: 'Vertical', value: 'vertical' },\n { label: 'Horizontal', value: 'horizontal' },\n ],\n defaultValue: 'vertical',\n },\n { name: 'columns', label: 'Columns (vertical only)', type: 'stepper', defaultValue: 2, min: 1, max: 4, step: 1 },\n {\n name: 'gap',\n label: 'Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n ],\n defaultValue: 'sm',\n },\n {\n name: 'aspectRatio',\n label: 'View Aspect Ratio (vertical only)',\n type: 'select',\n options: [\n { label: '1:1', value: '1/1' },\n { label: '4:3', value: '4/3' },\n { label: '3:4', value: '3/4' },\n { label: '16:9', value: '16/9' },\n ],\n defaultValue: '4/3',\n },\n { name: 'itemCount', label: 'Items', type: 'stepper', defaultValue: 4, min: 4, max: 12, step: 1 },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nconst ORIENTATION_ITEMS = [\n { id: 'o1', title: 'Waveform Study', description: '12:34 · Electronic', tier: 'common' as ItemTier },\n { id: 'o2', title: 'Threshold', description: '8:02 · Ambient', tier: 'common' as ItemTier },\n { id: 'o3', title: 'Parallel Lines', description: '5:47 · Minimal', tier: 'common' as ItemTier },\n { id: 'o4', title: 'Resonance', description: '9:15 · Drone', tier: 'common' as ItemTier },\n { id: 'o5', title: 'Liminal Space', description: '11:20 · Experimental', tier: 'common' as ItemTier },\n { id: 'o6', title: 'Undertow', description: '7:45 · Ambient', tier: 'common' as ItemTier },\n { id: 'o7', title: 'Archive Vol. I', description: 'Archived · 2019 sessions', tier: 'archived' as ItemTier },\n { id: 'o8', title: 'Archive Vol. II', description: 'Archived · Rough cuts', tier: 'archived' as ItemTier },\n { id: 'o9', title: 'Archive Vol. III', description: 'Archived · Unmixed', tier: 'archived' as ItemTier },\n { id: 'o10', title: 'Session X-01', description: 'Experimental · Unreleased draft', tier: 'experimental' as ItemTier },\n { id: 'o11', title: 'Session X-02', description: 'Experimental · Internal', tier: 'experimental' as ItemTier },\n { id: 'o12', title: 'Session X-03', description: 'Experimental · Do not distribute', tier: 'experimental' as ItemTier },\n];\n\nfunction getGap(value: unknown): GalleryGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getInt(value: unknown, min: number, max: number, fallback: number) {\n const n = Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction getAspectRatio(value: unknown): string {\n if (typeof value === 'string' && value.includes('/')) return value;\n return '4/3';\n}\n\nfunction getOrientation(value: unknown): 'vertical' | 'horizontal' {\n return value === 'horizontal' ? 'horizontal' : 'vertical';\n}\n\nfunction itemClassName(tier: ItemTier) {\n if (tier === 'archived') return 'opacity-60';\n if (tier === 'experimental') return 'opacity-35';\n return undefined;\n}\n\nexport function renderPreview(props: Record<string, unknown>) {\n const orientation = getOrientation(props.orientation);\n const columns = getInt(props.columns, 1, 4, 2);\n const gap = getGap(props.gap);\n const ratio = getAspectRatio(props.aspectRatio);\n const count = getInt(props.itemCount, 4, 12, 4);\n const items = ORIENTATION_ITEMS.slice(0, count);\n const resolvedColumns: GalleryProps['columns'] = orientation === 'horizontal' ? 1 : columns;\n\n return (\n <Gallery columns={resolvedColumns} gap={gap} className=\"w-full\">\n {items.map((item) => (\n <Gallery.Item key={item.id} orientation={orientation} className={itemClassName(item.tier)} aria-disabled={item.tier === 'experimental' ? true : undefined}>\n <Gallery.View aspectRatio={orientation === 'horizontal' ? '1/1' : ratio}>\n <Frame pathStroke={item.tier === 'experimental' ? 'dotted' : 'dashed'} style={FRAME_STYLE[item.tier]} className=\"w-full h-full\" />\n </Gallery.View>\n <Gallery.Body>\n <span>{item.title}</span>\n <span>{item.description}</span>\n </Gallery.Body>\n </Gallery.Item>\n ))}\n </Gallery>\n );\n}\n\nexport default function Example() {\n return renderPreview({ orientation: 'vertical', columns: 2, gap: 'sm', aspectRatio: '4/3', itemCount: 4 });\n}"
506
+ },
507
+ {
508
+ "title": "Span Layout",
509
+ "description": "A featured item spans multiple columns and rows to create an editorial grid layout.",
510
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Gallery, Frame } from 'ui-lab-components'\nimport type { GalleryProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype GalleryGap = NonNullable<GalleryProps['gap']>;\ntype ItemTier = 'common' | 'archived' | 'experimental';\n\nconst FRAME_STYLE: Record<ItemTier, React.CSSProperties> = {\n common: { '--frame-fill': 'var(--background-900)', '--frame-stroke-color': 'var(--background-600)' } as React.CSSProperties,\n archived: { '--frame-fill': 'var(--background-950)', '--frame-stroke-color': 'var(--background-700)' } as React.CSSProperties,\n experimental: { '--frame-fill': 'var(--background-950)', '--frame-stroke-color': 'var(--background-800)' } as React.CSSProperties,\n};\n\nexport const controls: ControlDef[] = [\n { name: 'columns', label: 'Columns', type: 'stepper', defaultValue: 3, min: 2, max: 6, step: 1 },\n {\n name: 'gap',\n label: 'Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n ],\n defaultValue: 'md',\n },\n { name: 'featuredColumnSpan', label: 'Featured Column Span', type: 'stepper', defaultValue: 2, min: 1, max: 4, step: 1 },\n { name: 'featuredRowSpan', label: 'Featured Row Span', type: 'stepper', defaultValue: 2, min: 1, max: 3, step: 1 },\n {\n name: 'featuredAspect',\n label: 'Featured Aspect Ratio',\n type: 'select',\n options: [\n { label: '4:3', value: '4/3' },\n { label: '16:9', value: '16/9' },\n { label: '21:9', value: '21/9' },\n { label: '1:1', value: '1/1' },\n ],\n defaultValue: '16/9',\n },\n { name: 'itemCount', label: 'Items', type: 'stepper', defaultValue: 5, min: 3, max: 12, step: 1 },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nconst SPAN_ITEMS = [\n { id: 's1', title: \"Editor's Pick\", description: 'Featured collection — Spring 2024', tier: 'common' as ItemTier },\n { id: 's2', title: 'Series No. 1', description: 'Monochrome', tier: 'common' as ItemTier },\n { id: 's3', title: 'Series No. 2', description: 'Landscape', tier: 'common' as ItemTier },\n { id: 's4', title: 'Series No. 3', description: 'Portrait', tier: 'common' as ItemTier },\n { id: 's5', title: 'Series No. 4', description: 'Abstract', tier: 'common' as ItemTier },\n { id: 's6', title: 'Series No. 5', description: 'Documentary', tier: 'common' as ItemTier },\n { id: 's7', title: 'Hidden Vol. I', description: 'Archived · Unlisted', tier: 'archived' as ItemTier },\n { id: 's8', title: 'Hidden Vol. II', description: 'Archived · Private', tier: 'archived' as ItemTier },\n { id: 's9', title: 'Hidden Vol. III', description: 'Archived · Limited print', tier: 'archived' as ItemTier },\n { id: 's10', title: 'Vault A', description: 'Experimental · Access restricted', tier: 'experimental' as ItemTier },\n { id: 's11', title: 'Vault B', description: 'Experimental · Internal preview', tier: 'experimental' as ItemTier },\n { id: 's12', title: 'Vault C', description: 'Experimental · Embargoed', tier: 'experimental' as ItemTier },\n];\n\nfunction getGap(value: unknown): GalleryGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getInt(value: unknown, min: number, max: number, fallback: number) {\n const n = Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction getAspectRatio(value: unknown): string {\n if (typeof value === 'string' && value.includes('/')) return value;\n return '4/3';\n}\n\nfunction itemClassName(tier: ItemTier) {\n if (tier === 'archived') return 'opacity-60';\n if (tier === 'experimental') return 'opacity-35';\n return undefined;\n}\n\nexport function renderPreview(props: Record<string, unknown>) {\n const columns = getInt(props.columns, 2, 6, 3);\n const gap = getGap(props.gap);\n const colSpan = Math.min(getInt(props.featuredColumnSpan, 1, 4, 2), columns);\n const rowSpan = getInt(props.featuredRowSpan, 1, 3, 2);\n const featuredRatio = getAspectRatio(props.featuredAspect);\n const count = getInt(props.itemCount, 3, 12, 5);\n const [featured, ...rest] = SPAN_ITEMS.slice(0, count);\n\n return (\n <Gallery columns={columns} gap={gap} className=\"w-full\">\n <Gallery.Item columnSpan={colSpan} rowSpan={rowSpan}>\n <Gallery.View aspectRatio={featuredRatio}>\n <Frame pathStroke=\"dashed\" style={FRAME_STYLE.common} className=\"w-full h-full\" />\n </Gallery.View>\n <Gallery.Body>\n <span>{featured.title}</span>\n <span>{featured.description}</span>\n </Gallery.Body>\n </Gallery.Item>\n {rest.map((item) => (\n <Gallery.Item key={item.id} className={itemClassName(item.tier)} aria-disabled={item.tier === 'experimental' ? true : undefined}>\n <Gallery.View aspectRatio=\"4/3\">\n <Frame pathStroke={item.tier === 'experimental' ? 'dotted' : 'dashed'} style={FRAME_STYLE[item.tier]} className=\"w-full h-full\" />\n </Gallery.View>\n <Gallery.Body>\n <span>{item.title}</span>\n <span>{item.description}</span>\n </Gallery.Body>\n </Gallery.Item>\n ))}\n </Gallery>\n );\n}\n\nexport default function Example() {\n return renderPreview({ columns: 3, gap: 'md', featuredColumnSpan: 2, featuredRowSpan: 2, featuredAspect: '16/9', itemCount: 5 });\n}"
381
511
  }
382
512
  ],
383
513
  },
@@ -394,11 +524,22 @@ export const componentRegistry = {
394
524
  relatedComponents: ["flex", "card", "divider"],
395
525
  tags: ["layout", "grid", "container-queries", "responsive", "columns"],
396
526
  accessibility: { "hasAriaSupport": false, "notes": ["Semantic div element with grid layout", "No built-in ARIA roles - use for layout purposes", "Compose with accessible child components"] },
527
+ usage: undefined,
397
528
  examples: [
398
529
  {
399
- "title": "Basic Grid",
400
- "description": "A simple grid layout with multiple cells. Use this for organizing content in a responsive grid structure.",
401
- "code": "import React from 'react';\nimport { Grid } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Grid columns={3} gap=\"md\">\n <div style={{ padding: '1rem', background: '#e0e0e0' }}>Cell 1</div>\n <div style={{ padding: '1rem', background: '#d0d0d0' }}>Cell 2</div>\n <div style={{ padding: '1rem', background: '#c0c0c0' }}>Cell 3</div>\n <div style={{ padding: '1rem', background: '#b0b0b0' }}>Cell 4</div>\n <div style={{ padding: '1rem', background: '#a0a0a0' }}>Cell 5</div>\n <div style={{ padding: '1rem', background: '#909090' }}>Cell 6</div>\n </Grid>\n );\n}"
530
+ "title": "Track Placement",
531
+ "description": "Adjust columns, gap, alignment, and auto-placement flow to explore the CSS Grid track model.",
532
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Grid, Frame } from 'ui-lab-components'\nimport type { GridProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype GridColumnsValue = '1' | '2' | '3' | '4' | '5' | '6' | 'auto-fit' | 'auto-fill';\ntype GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst BASE_CELL_STYLE = {\n '--frame-fill': 'var(--background-900)',\n '--frame-stroke-color': 'var(--background-600)',\n} as React.CSSProperties;\n\nexport const controls: ControlDef[] = [\n {\n name: 'columns',\n label: 'Columns',\n type: 'select',\n options: [\n { label: '1 Column', value: '1' },\n { label: '2 Columns', value: '2' },\n { label: '3 Columns', value: '3' },\n { label: '4 Columns', value: '4' },\n { label: '5 Columns', value: '5' },\n { label: '6 Columns', value: '6' },\n { label: 'Auto Fit', value: 'auto-fit' },\n { label: 'Auto Fill', value: 'auto-fill' },\n ],\n defaultValue: '3',\n },\n {\n name: 'gap',\n label: 'Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n { label: 'Extra Large', value: 'xl' },\n ],\n defaultValue: 'md',\n },\n {\n name: 'justifyItems',\n label: 'Inline Alignment',\n type: 'select',\n options: [\n { label: 'Stretch', value: 'stretch' },\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n ],\n defaultValue: 'stretch',\n },\n {\n name: 'alignItems',\n label: 'Block Alignment',\n type: 'select',\n options: [\n { label: 'Stretch', value: 'stretch' },\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n { label: 'Baseline', value: 'baseline' },\n ],\n defaultValue: 'stretch',\n },\n {\n name: 'autoFlow',\n label: 'Auto Placement',\n type: 'select',\n options: [\n { label: 'Row', value: 'row' },\n { label: 'Column', value: 'column' },\n { label: 'Row Dense', value: 'row-dense' },\n { label: 'Column Dense', value: 'column-dense' },\n ],\n defaultValue: 'row',\n },\n {\n name: 'frameCount',\n label: 'Panels',\n type: 'stepper',\n defaultValue: 6,\n min: 4,\n max: 12,\n step: 1,\n },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nfunction getColumns(value: unknown): GridColumnsValue {\n if (value === '1' || value === '2' || value === '4' || value === '5' || value === '6' || value === 'auto-fit' || value === 'auto-fill') return value;\n return '3';\n}\n\nfunction toColumns(value: GridColumnsValue): number | 'auto-fit' | 'auto-fill' {\n if (value === 'auto-fit' || value === 'auto-fill') return value;\n return Number(value);\n}\n\nfunction getApproxColumnCount(value: GridColumnsValue) {\n if (value === 'auto-fit' || value === 'auto-fill') return 4;\n return Number(value);\n}\n\nfunction getGap(value: unknown): GridGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getJustifyItems(value: unknown): NonNullable<GridProps['justifyItems']> {\n if (value === 'start' || value === 'center' || value === 'end') return value;\n return 'stretch';\n}\n\nfunction getAlignItems(value: unknown): NonNullable<GridProps['alignItems']> {\n if (value === 'start' || value === 'center' || value === 'end' || value === 'baseline') return value;\n return 'stretch';\n}\n\nfunction getAutoFlow(value: unknown): NonNullable<GridProps['autoFlow']> {\n if (value === 'column' || value === 'row-dense' || value === 'column-dense') return value;\n return 'row';\n}\n\nfunction getFrameCount(value: unknown, min: number, max: number, fallback: number) {\n const n = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction span(trackCount: number, desired: number) {\n return `span ${Math.max(1, Math.min(desired, trackCount))}`;\n}\n\nfunction getSpecs(trackCount: number, frameCount: number) {\n if (trackCount <= 2) {\n const pattern = [{ minHeight: '5rem' }, { minHeight: '3rem' }, { minHeight: '4.5rem' }];\n return [\n { minHeight: '3rem' },\n { minHeight: '8rem' },\n ...Array.from({ length: Math.max(frameCount - 2, 0) }, (_, i) => ({ minHeight: pattern[i % pattern.length].minHeight })),\n ].map(s => ({ style: { width: '100%', ...s } as React.CSSProperties }));\n }\n if (trackCount === 3) {\n const pattern = [\n { width: '100%', minHeight: '6rem', gridColumn: 'span 2' },\n { width: '100%', minHeight: '3rem' },\n { width: '100%', minHeight: '4.5rem' },\n ];\n return [\n { style: { width: '100%', minHeight: '9rem', gridColumn: 'span 1', gridRow: 'span 2' } as React.CSSProperties },\n { style: { width: '100%', minHeight: '5rem', gridColumn: 'span 2' } as React.CSSProperties },\n { style: { width: '100%', minHeight: '3rem' } as React.CSSProperties },\n { style: { width: '100%', minHeight: '3rem' } as React.CSSProperties },\n ...Array.from({ length: Math.max(frameCount - 4, 0) }, (_, i) => ({ style: pattern[i % pattern.length] as React.CSSProperties })),\n ];\n }\n const pattern = [\n { width: '100%', minHeight: '6.5rem', gridColumn: span(trackCount, 2) },\n { width: '100%', minHeight: '3rem' },\n { width: '100%', minHeight: '4rem' },\n { width: '100%', minHeight: '5rem', gridColumn: span(trackCount, 2) },\n ];\n return [\n { style: { width: '100%', minHeight: '10rem', gridRow: 'span 2' } as React.CSSProperties },\n { style: { width: '100%', minHeight: '6rem', gridColumn: span(trackCount - 1, trackCount - 1) } as React.CSSProperties },\n { style: { width: '100%', minHeight: '3rem' } as React.CSSProperties },\n { style: { width: '100%', minHeight: '3rem' } as React.CSSProperties },\n ...Array.from({ length: Math.max(frameCount - 4, 0) }, (_, i) => ({ style: pattern[i % pattern.length] as React.CSSProperties })),\n ];\n}\n\nexport function renderPreview(props: Record<string, unknown>) {\n const columns = getColumns(props.columns);\n const frameCount = getFrameCount(props.frameCount, 4, 12, 6);\n const specs = getSpecs(getApproxColumnCount(columns), frameCount);\n\n return (\n <Grid\n columns={toColumns(columns)}\n gap={getGap(props.gap)}\n justifyItems={getJustifyItems(props.justifyItems)}\n alignItems={getAlignItems(props.alignItems)}\n autoFlow={getAutoFlow(props.autoFlow)}\n className=\"w-full\"\n >\n {specs.map((spec, index) => (\n <Frame key={index} pathStroke=\"dashed\" style={{ ...BASE_CELL_STYLE, ...spec.style }} className=\"w-full h-full\">\n <div className=\"size-full\" />\n </Frame>\n ))}\n </Grid>\n );\n}\n\nexport default function Example() {\n return renderPreview({ columns: '3', gap: 'md', justifyItems: 'stretch', alignItems: 'stretch', autoFlow: 'row', frameCount: 6 });\n}"
533
+ },
534
+ {
535
+ "title": "Editorial Spans",
536
+ "description": "Dense auto-flow grid with mixed column spans for editorial content layouts.",
537
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Grid, Frame } from 'ui-lab-components'\nimport type { GridProps } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype GridColumnsValue = '1' | '2' | '3' | '4' | '5' | '6' | 'auto-fit' | 'auto-fill';\ntype GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst BASE_CELL_STYLE = {\n '--frame-fill': 'var(--background-900)',\n '--frame-stroke-color': 'var(--background-600)',\n} as React.CSSProperties;\n\nexport const controls: ControlDef[] = [\n {\n name: 'columns',\n label: 'Columns',\n type: 'select',\n options: [\n { label: '1 Column', value: '1' },\n { label: '2 Columns', value: '2' },\n { label: '3 Columns', value: '3' },\n { label: '4 Columns', value: '4' },\n { label: '5 Columns', value: '5' },\n { label: '6 Columns', value: '6' },\n { label: 'Auto Fit', value: 'auto-fit' },\n { label: 'Auto Fill', value: 'auto-fill' },\n ],\n defaultValue: '4',\n },\n {\n name: 'gap',\n label: 'Gap Token',\n type: 'select',\n options: [\n { label: 'Extra Small', value: 'xs' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n { label: 'Extra Large', value: 'xl' },\n ],\n defaultValue: 'md',\n },\n {\n name: 'justifyItems',\n label: 'Inline Alignment',\n type: 'select',\n options: [\n { label: 'Stretch', value: 'stretch' },\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n ],\n defaultValue: 'stretch',\n },\n {\n name: 'alignItems',\n label: 'Block Alignment',\n type: 'select',\n options: [\n { label: 'Stretch', value: 'stretch' },\n { label: 'Start', value: 'start' },\n { label: 'Center', value: 'center' },\n { label: 'End', value: 'end' },\n { label: 'Baseline', value: 'baseline' },\n ],\n defaultValue: 'stretch',\n },\n {\n name: 'autoFlow',\n label: 'Auto Placement',\n type: 'select',\n options: [\n { label: 'Row', value: 'row' },\n { label: 'Column', value: 'column' },\n { label: 'Row Dense', value: 'row-dense' },\n { label: 'Column Dense', value: 'column-dense' },\n ],\n defaultValue: 'row-dense',\n },\n {\n name: 'frameCount',\n label: 'Panels',\n type: 'stepper',\n defaultValue: 7,\n min: 5,\n max: 12,\n step: 1,\n },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nfunction getColumns(value: unknown): GridColumnsValue {\n if (value === '1' || value === '2' || value === '4' || value === '5' || value === '6' || value === 'auto-fit' || value === 'auto-fill') return value;\n return '3';\n}\n\nfunction toColumns(value: GridColumnsValue): number | 'auto-fit' | 'auto-fill' {\n if (value === 'auto-fit' || value === 'auto-fill') return value;\n return Number(value);\n}\n\nfunction getApproxColumnCount(value: GridColumnsValue) {\n if (value === 'auto-fit' || value === 'auto-fill') return 4;\n return Number(value);\n}\n\nfunction getGap(value: unknown): GridGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getJustifyItems(value: unknown): NonNullable<GridProps['justifyItems']> {\n if (value === 'start' || value === 'center' || value === 'end') return value;\n return 'stretch';\n}\n\nfunction getAlignItems(value: unknown): NonNullable<GridProps['alignItems']> {\n if (value === 'start' || value === 'center' || value === 'end' || value === 'baseline') return value;\n return 'stretch';\n}\n\nfunction getAutoFlow(value: unknown): NonNullable<GridProps['autoFlow']> {\n if (value === 'column' || value === 'row-dense' || value === 'column-dense') return value;\n return 'row';\n}\n\nfunction getFrameCount(value: unknown, min: number, max: number, fallback: number) {\n const n = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nfunction span(trackCount: number, desired: number) {\n return `span ${Math.max(1, Math.min(desired, trackCount))}`;\n}\n\nfunction getSpecs(trackCount: number, frameCount: number) {\n if (trackCount <= 2) {\n const pattern = [{ minHeight: '4rem' }, { minHeight: '5.5rem' }, { minHeight: '3rem' }];\n return [\n { style: { width: '100%', minHeight: '8rem' } as React.CSSProperties },\n ...Array.from({ length: Math.max(frameCount - 1, 0) }, (_, i) => ({ style: { width: '100%', ...pattern[i % pattern.length] } as React.CSSProperties })),\n ];\n }\n const pattern = [\n { width: '100%', minHeight: '3rem' },\n { width: '100%', minHeight: '6.5rem', gridColumn: span(trackCount, 2) },\n { width: '100%', minHeight: '4rem' },\n { width: '100%', minHeight: '3rem' },\n ];\n return [\n { style: { width: '100%', minHeight: '8rem', gridColumn: span(trackCount, Math.max(trackCount - 1, 2)) } as React.CSSProperties },\n { style: { width: '100%', minHeight: '8rem' } as React.CSSProperties },\n { style: { width: '100%', minHeight: '3rem' } as React.CSSProperties },\n { style: { width: '100%', minHeight: '5rem', gridColumn: span(trackCount, 2) } as React.CSSProperties },\n { style: { width: '100%', minHeight: '5rem' } as React.CSSProperties },\n ...Array.from({ length: Math.max(frameCount - 5, 0) }, (_, i) => ({ style: pattern[i % pattern.length] as React.CSSProperties })),\n ];\n}\n\nexport function renderPreview(props: Record<string, unknown>) {\n const columns = getColumns(props.columns);\n const frameCount = getFrameCount(props.frameCount, 5, 12, 7);\n const specs = getSpecs(getApproxColumnCount(columns), frameCount);\n\n return (\n <Grid\n columns={toColumns(columns)}\n gap={getGap(props.gap)}\n justifyItems={getJustifyItems(props.justifyItems)}\n alignItems={getAlignItems(props.alignItems)}\n autoFlow={getAutoFlow(props.autoFlow)}\n className=\"w-full\"\n >\n {specs.map((spec, index) => (\n <Frame key={index} pathStroke=\"dashed\" style={{ ...BASE_CELL_STYLE, ...spec.style }} className=\"w-full h-full\">\n <div className=\"size-full\" />\n </Frame>\n ))}\n </Grid>\n );\n}\n\nexport default function Example() {\n return renderPreview({ columns: '4', gap: 'md', justifyItems: 'stretch', alignItems: 'stretch', autoFlow: 'row-dense', frameCount: 7 });\n}"
538
+ },
539
+ {
540
+ "title": "Responsive Card Rail",
541
+ "description": "Grid that adapts column count and gap based on container width using responsive prop objects.",
542
+ "code": "\"use client\";\n\nimport React from 'react'\nimport { Grid, Frame } from 'ui-lab-components'\nimport type { ControlDef } from '@/types'\n\ntype GridColumnsValue = '2' | '3' | '4' | 'auto-fit' | 'auto-fill';\ntype GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst BASE_CELL_STYLE = {\n '--frame-fill': 'var(--background-900)',\n '--frame-stroke-color': 'var(--background-600)',\n} as React.CSSProperties;\n\nexport const controls: ControlDef[] = [\n {\n name: 'columns',\n label: 'Columns',\n type: 'select',\n options: [\n { label: '2 Columns', value: '2' },\n { label: '3 Columns', value: '3' },\n { label: '4 Columns', value: '4' },\n { label: 'Auto Fit', value: 'auto-fit' },\n { label: 'Auto Fill', value: 'auto-fill' },\n ],\n defaultValue: '4',\n },\n {\n name: 'gap',\n label: 'Base Gap Token',\n type: 'select',\n options: [\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n { label: 'Extra Large', value: 'xl' },\n ],\n defaultValue: 'md',\n },\n {\n name: 'rowGap',\n label: 'Row Gap',\n type: 'select',\n options: [\n { label: 'Match Gap', value: 'inherit' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n ],\n defaultValue: 'inherit',\n },\n {\n name: 'columnGap',\n label: 'Column Gap',\n type: 'select',\n options: [\n { label: 'Match Gap', value: 'inherit' },\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n ],\n defaultValue: 'inherit',\n },\n {\n name: 'frameCount',\n label: 'Cards',\n type: 'stepper',\n defaultValue: 6,\n min: 4,\n max: 10,\n step: 1,\n },\n {\n name: 'responsive',\n label: 'Enable Responsive Object',\n type: 'toggle',\n defaultValue: true,\n },\n];\n\nexport const previewLayout = 'start' as const;\nexport const resizable = true;\n\nfunction getColumns(value: unknown): GridColumnsValue {\n if (value === '2' || value === '3' || value === 'auto-fit' || value === 'auto-fill') return value;\n return '4';\n}\n\nfunction toColumns(value: GridColumnsValue): number | 'auto-fit' | 'auto-fill' {\n if (value === 'auto-fit' || value === 'auto-fill') return value;\n return Number(value);\n}\n\nfunction getGap(value: unknown): GridGap {\n if (value === 'xs' || value === 'sm' || value === 'lg' || value === 'xl') return value;\n return 'md';\n}\n\nfunction getOptionalGap(value: unknown): GridGap | undefined {\n if (value === 'inherit' || value == null) return undefined;\n return getGap(value);\n}\n\nfunction getFrameCount(value: unknown, min: number, max: number, fallback: number) {\n const n = typeof value === 'number' ? value : Number(value);\n if (Number.isNaN(n)) return fallback;\n return Math.min(max, Math.max(min, Math.round(n)));\n}\n\nconst SPEC_PATTERN = [\n { minHeight: '9rem' },\n { minHeight: '4rem' },\n { minHeight: '3rem' },\n { minHeight: '5rem' },\n { minHeight: '3.5rem' },\n { minHeight: '6rem' },\n];\n\nexport function renderPreview(props: Record<string, unknown>) {\n const columns = getColumns(props.columns);\n const baseColumns = toColumns(columns);\n const gap = getGap(props.gap);\n const responsive = Boolean(props.responsive);\n const frameCount = getFrameCount(props.frameCount, 4, 10, 6);\n const specs = Array.from({ length: frameCount }, (_, i) => SPEC_PATTERN[i % SPEC_PATTERN.length]);\n\n return (\n <Grid\n columns={responsive ? { sm: 1, md: 2, lg: baseColumns } : baseColumns}\n gap={responsive ? { sm: 'sm', md: gap, lg: gap } : gap}\n rowGap={getOptionalGap(props.rowGap)}\n columnGap={getOptionalGap(props.columnGap)}\n responsive={responsive}\n className=\"w-full\"\n >\n {specs.map((spec, index) => (\n <Frame key={index} pathStroke=\"dashed\" style={{ ...BASE_CELL_STYLE, width: '100%', minHeight: spec.minHeight } as React.CSSProperties} className=\"w-full h-full\">\n <div className=\"size-full\" />\n </Frame>\n ))}\n </Grid>\n );\n}\n\nexport default function Example() {\n return renderPreview({ columns: '4', gap: 'md', rowGap: 'inherit', columnGap: 'inherit', frameCount: 6, responsive: true });\n}"
402
543
  }
403
544
  ],
404
545
  },
@@ -416,13 +557,8 @@ export const componentRegistry = {
416
557
  relatedComponents: ["button", "input", "select", "expand"],
417
558
  tags: ["composition", "grouped", "compound", "form"],
418
559
  accessibility: { "hasAriaSupport": true, "notes": ["Uses role=\"group\" for semantic grouping", "Propagates disabled state to children", "Maintains keyboard navigation for all child components"] },
419
- examples: [
420
- {
421
- "title": "Basic Group",
422
- "description": "A simple group container that arranges multiple elements together. Use this to organize related UI elements in a consistent layout.",
423
- "code": "import { Group } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Group>\n <Group.Button>First</Group.Button>\n <Group.Button>Second</Group.Button>\n <Group.Button>Third</Group.Button>\n </Group>\n );\n}"
424
- }
425
- ],
560
+ usage: undefined,
561
+ examples: [],
426
562
  },
427
563
  input: {
428
564
  id: "input",
@@ -437,6 +573,7 @@ export const componentRegistry = {
437
573
  relatedComponents: ["label", "form", "group"],
438
574
  tags: ["form", "text", "user-input"],
439
575
  accessibility: { "hasAriaSupport": true, "notes": ["Works with label elements", "Supports placeholder text", "Keyboard accessible"] },
576
+ usage: undefined,
440
577
  examples: [
441
578
  {
442
579
  "title": "Basic Input",
@@ -447,6 +584,36 @@ export const componentRegistry = {
447
584
  "title": "Validation States",
448
585
  "description": "Input fields with error and success validation states, including helper text for user feedback.",
449
586
  "code": "import React from 'react';\nimport { Input, Label } from 'ui-lab-components';\nimport { FaCircleExclamation, FaCircleCheck } from 'react-icons/fa6';\n\nexport default function Example() {\n return (\n <div className=\"flex flex-col gap-6 w-full max-w-sm\">\n {/* Error State */}\n <div className=\"flex flex-col gap-1.5\">\n <Label error helperText=\"Please enter a valid email address\" helperTextError>\n Email\n </Label>\n <Input\n type=\"email\"\n placeholder=\"Enter your email\"\n error\n defaultValue=\"invalid-email\"\n icon={{ suffix: <FaCircleExclamation className=\"text-danger-600\" size={14} /> }}\n />\n </div>\n\n {/* Success State */}\n <div className=\"flex flex-col gap-1.5\">\n <Label helperText=\"Email address is available\">\n Email\n </Label>\n <Input\n type=\"email\"\n placeholder=\"Enter your email\"\n defaultValue=\"user@example.com\"\n icon={{ suffix: <FaCircleCheck className=\"text-success-600\" size={14} /> }}\n className=\"border-success-600 focus:border-success-600\"\n />\n </div>\n\n {/* Default State with Helper Text */}\n <div className=\"flex flex-col gap-1.5\">\n <Label required helperText=\"We'll never share your email with anyone else.\">\n Email\n </Label>\n <Input\n type=\"email\"\n placeholder=\"Enter your email\"\n />\n </div>\n </div>\n );\n}"
587
+ },
588
+ {
589
+ "title": "Sign In Form",
590
+ "description": "Email and password fields with a password visibility toggle — a common authentication pattern.",
591
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Input, Flex, Button } from \"ui-lab-components\";\nimport { FaEnvelope, FaLock, FaEye, FaEyeSlash } from \"react-icons/fa6\";\n\nexport default function Example() {\n const [showPassword, setShowPassword] = useState(false);\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 320 }}>\n <Input\n type=\"email\"\n icon={<FaEnvelope className=\"w-3.5 h-3.5 text-foreground-400\" />}\n placeholder=\"Email address\"\n autoComplete=\"email\"\n />\n <Input\n type={showPassword ? \"text\" : \"password\"}\n icon={<FaLock className=\"w-3.5 h-3.5 text-foreground-400\" />}\n placeholder=\"Password\"\n autoComplete=\"current-password\"\n actions={[\n {\n icon: showPassword\n ? <FaEyeSlash className=\"w-3.5 h-3.5\" />\n : <FaEye className=\"w-3.5 h-3.5\" />,\n title: showPassword ? \"Hide password\" : \"Show password\",\n onClick: () => setShowPassword((v) => !v),\n },\n ]}\n />\n <Button variant=\"primary\" className=\"w-full mt-1\">Sign in</Button>\n </Flex>\n );\n}"
592
+ },
593
+ {
594
+ "title": "Search",
595
+ "description": "Search input with a keyboard shortcut hint that switches to a clear action once the user types.",
596
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Input, Flex, Badge } from \"ui-lab-components\";\nimport { FaMagnifyingGlass, FaXmark } from \"react-icons/fa6\";\n\nexport default function Example() {\n const [query, setQuery] = useState(\"\");\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 340 }}>\n <Input\n icon={<FaMagnifyingGlass className=\"w-3.5 h-3.5 text-foreground-400\" />}\n placeholder=\"Search components...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n hint={!query ? <Badge>⌘K</Badge> : undefined}\n actions={\n query\n ? [{ icon: <FaXmark className=\"w-3.5 h-3.5\" />, title: \"Clear\", onClick: () => setQuery(\"\") }]\n : []\n }\n />\n </Flex>\n );\n}"
597
+ },
598
+ {
599
+ "title": "User Handle",
600
+ "description": "Editable username field with an inline copy action.",
601
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Input, Flex } from \"ui-lab-components\";\nimport { FaAt, FaCopy, FaCheck } from \"react-icons/fa6\";\n\nexport default function Example() {\n const [handle, setHandle] = useState(\"kyza\");\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 320 }}>\n <Input\n icon={<FaAt className=\"w-3.5 h-3.5 text-foreground-400\" />}\n placeholder=\"username\"\n value={handle}\n onChange={(e) => setHandle(e.target.value)}\n actions={[\n {\n icon: copied\n ? <FaCheck className=\"w-3.5 h-3.5 text-green-500\" />\n : <FaCopy className=\"w-3.5 h-3.5\" />,\n title: copied ? \"Copied!\" : \"Copy handle\",\n onClick: handleCopy,\n },\n ]}\n />\n </Flex>\n );\n}"
602
+ },
603
+ {
604
+ "title": "API Key",
605
+ "description": "Read-only secret field with reveal and copy actions — suitable for credentials and tokens.",
606
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Input, Flex } from \"ui-lab-components\";\nimport { FaKey, FaEye, FaEyeSlash, FaCopy, FaCheck } from \"react-icons/fa6\";\n\nexport default function Example() {\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n const key = \"sk-proj-a8f2c1d9e4b7\";\n\n const handleCopy = () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 360 }}>\n <Input\n type={revealed ? \"text\" : \"password\"}\n icon={<FaKey className=\"w-3.5 h-3.5 text-foreground-400\" />}\n value={key}\n readOnly\n actions={[\n {\n icon: revealed\n ? <FaEyeSlash className=\"w-3.5 h-3.5\" />\n : <FaEye className=\"w-3.5 h-3.5\" />,\n title: revealed ? \"Hide key\" : \"Reveal key\",\n onClick: () => setRevealed((v) => !v),\n },\n {\n icon: copied\n ? <FaCheck className=\"w-3.5 h-3.5 text-green-500\" />\n : <FaCopy className=\"w-3.5 h-3.5\" />,\n title: copied ? \"Copied!\" : \"Copy key\",\n onClick: handleCopy,\n },\n ]}\n />\n </Flex>\n );\n}"
607
+ },
608
+ {
609
+ "title": "URL with Validation",
610
+ "description": "URL field that shows a success or error icon in the suffix slot based on the input value.",
611
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Input, Flex } from \"ui-lab-components\";\nimport { FaLink, FaCircleExclamation, FaCheck } from \"react-icons/fa6\";\n\nexport default function Example() {\n const [url, setUrl] = useState(\"\");\n\n const isValid = url.length === 0 || /^https?:\\/\\/.+\\..+/.test(url);\n const showError = url.length > 0 && !isValid;\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 340 }}>\n <Input\n placeholder=\"https://example.com\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n error={showError}\n icon={{\n prefix: <FaLink className=\"w-3.5 h-3.5 text-foreground-400\" />,\n suffix: showError\n ? <FaCircleExclamation className=\"w-3.5 h-3.5 text-red-500\" />\n : url.length > 0\n ? <FaCheck className=\"w-3.5 h-3.5 text-green-500\" />\n : undefined,\n }}\n />\n </Flex>\n );\n}"
612
+ },
613
+ {
614
+ "title": "Quantity",
615
+ "description": "Number input with native spin controls for selecting a bounded quantity.",
616
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Input, Flex } from \"ui-lab-components\";\n\nexport default function Example() {\n const [qty, setQty] = useState(1);\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 200 }}>\n <Input\n type=\"number\"\n placeholder=\"Qty\"\n value={qty}\n min={1}\n max={99}\n onChange={(e) => setQty(Number(e.target.value))}\n />\n </Flex>\n );\n}"
450
617
  }
451
618
  ],
452
619
  },
@@ -463,6 +630,7 @@ export const componentRegistry = {
463
630
  relatedComponents: ["input", "checkbox", "radio", "switch"],
464
631
  tags: ["form", "text", "accessibility"],
465
632
  accessibility: { "hasAriaSupport": true, "notes": ["Associates with form controls", "Improves accessibility"] },
633
+ usage: undefined,
466
634
  examples: [
467
635
  {
468
636
  "title": "Basic Label",
@@ -485,11 +653,32 @@ export const componentRegistry = {
485
653
  relatedComponents: ["card", "table"],
486
654
  tags: ["list", "items", "collections", "selection", "actions"],
487
655
  accessibility: { "hasAriaSupport": true, "notes": ["Uses list role for semantic structure", "Supports interactive items with keyboard navigation", "Proper ARIA labels for selection states"] },
656
+ usage: undefined,
488
657
  examples: [
489
658
  {
490
659
  "title": "Basic List",
491
660
  "description": "A simple list displaying basic items with selection and interaction support.",
492
661
  "code": "import { List } from 'ui-lab-components';\nimport { Button } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <List aria-label=\"Basic List Example\">\n <List.Header>\n <h2>Items</h2>\n </List.Header>\n <List.Item interactive>Item One</List.Item>\n <List.Item interactive>Item Two</List.Item>\n <List.Item interactive>Item Three</List.Item>\n <List.Footer align=\"center\">\n <Button variant=\"primary\" size=\"sm\">\n Load More\n </Button>\n </List.Footer>\n </List>\n );\n}"
662
+ },
663
+ {
664
+ "title": "Review Queue",
665
+ "description": "A compact checklist for work that can be completed directly from each row.",
666
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { List } from \"ui-lab-components\";\n\nconst reviewItems = [\n { id: \"legal\", title: \"Legal review\", desc: \"Updated retention language\" },\n { id: \"security\", title: \"Security review\", desc: \"New access scopes\" },\n { id: \"billing\", title: \"Billing review\", desc: \"Invoice copy changes\" },\n];\n\nexport default function Example() {\n const [checked, setChecked] = useState(() => new Set([\"legal\"]));\n\n const setItem = (id: string, value: boolean) => {\n setChecked((current) => {\n const next = new Set(current);\n value ? next.add(id) : next.delete(id);\n return next;\n });\n };\n\n const toggleItem = (id: string) => {\n setChecked((current) => {\n const next = new Set(current);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n };\n\n return (\n <List items={reviewItems} spacing=\"sm\" style={{ width: 320 }}>\n {reviewItems.map((item) => (\n <List.Item key={item.id} value={item.id} interactive onClick={() => toggleItem(item.id)}>\n <List.Checkbox\n aria-label={`Mark ${item.title} reviewed`}\n placement=\"start\"\n checked={checked.has(item.id)}\n onCheckedChange={(value) => setItem(item.id, value)}\n />\n <div className=\"min-w-0 flex-1\">\n <List.Title>{item.title}</List.Title>\n <List.Desc>{item.desc}</List.Desc>\n </div>\n </List.Item>\n ))}\n </List>\n );\n}"
667
+ },
668
+ {
669
+ "title": "Notification Rules",
670
+ "description": "Rows can combine a leading checkbox with a trailing Select action.",
671
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { List, Select } from \"ui-lab-components\";\n\nconst notificationItems = [\n { id: \"comments\", title: \"Comments\", desc: \"Replies and mentions\" },\n { id: \"deployments\", title: \"Deployments\", desc: \"Preview and production updates\" },\n { id: \"incidents\", title: \"Incidents\", desc: \"Status changes and postmortems\" },\n];\n\nexport default function Example() {\n const [checked, setChecked] = useState(() => new Set([\"comments\", \"incidents\"]));\n const [delivery, setDelivery] = useState<Record<string, string | number | null>>({\n comments: \"digest\",\n deployments: \"email\",\n incidents: \"push\",\n });\n\n const setItem = (id: string, value: boolean) => {\n setChecked((current) => {\n const next = new Set(current);\n value ? next.add(id) : next.delete(id);\n return next;\n });\n };\n\n const toggleItem = (id: string) => {\n setChecked((current) => {\n const next = new Set(current);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n };\n\n const setDeliveryMode = (id: string, value: string | number | null) => {\n setDelivery((current) => ({ ...current, [id]: value }));\n };\n\n return (\n <List items={notificationItems} spacing=\"sm\" style={{ width: 400 }}>\n {notificationItems.map((item) => (\n <List.Item key={item.id} value={item.id} interactive onClick={() => toggleItem(item.id)}>\n <List.Checkbox\n aria-label={`Enable ${item.title.toLowerCase()} notifications`}\n placement=\"start\"\n checked={checked.has(item.id)}\n onCheckedChange={(value) => setItem(item.id, value)}\n />\n <div className=\"min-w-0 flex-1\">\n <List.Title>{item.title}</List.Title>\n <List.Desc>{item.desc}</List.Desc>\n </div>\n <List.Select\n selectedKey={delivery[item.id]}\n valueLabel={String(delivery[item.id] ?? \"\")}\n isDisabled={!checked.has(item.id)}\n onSelectionChange={(value) => setDeliveryMode(item.id, value)}\n >\n <Select.Trigger>\n <Select.Value placeholder=\"Mode\" />\n </Select.Trigger>\n <Select.Content>\n <Select.List>\n <Select.Item value=\"email\">Email</Select.Item>\n <Select.Item value=\"digest\">Digest</Select.Item>\n <Select.Item value=\"push\">Push</Select.Item>\n </Select.List>\n </Select.Content>\n </List.Select>\n </List.Item>\n ))}\n </List>\n );\n}"
672
+ },
673
+ {
674
+ "title": "Quota Editor",
675
+ "description": "Inline inputs work as row actions without taking over the List primitive.",
676
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { List } from \"ui-lab-components\";\n\nconst quotaItems = [\n { id: \"seats\", title: \"Seats\", desc: \"Maximum workspace members\" },\n { id: \"projects\", title: \"Projects\", desc: \"Active projects per workspace\" },\n { id: \"tokens\", title: \"Tokens\", desc: \"Monthly API token budget\" },\n];\n\nexport default function Example() {\n const [checked, setChecked] = useState(() => new Set([\"seats\", \"projects\"]));\n const [limits, setLimits] = useState<Record<string, string>>({\n seats: \"24\",\n projects: \"12\",\n tokens: \"50000\",\n });\n\n const setItem = (id: string, value: boolean) => {\n setChecked((current) => {\n const next = new Set(current);\n value ? next.add(id) : next.delete(id);\n return next;\n });\n };\n\n const toggleItem = (id: string) => {\n setChecked((current) => {\n const next = new Set(current);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n };\n\n const setLimit = (id: string, value: string) => {\n setLimits((current) => ({ ...current, [id]: value }));\n };\n\n return (\n <List items={quotaItems} spacing=\"sm\" style={{ width: 396 }}>\n {quotaItems.map((item) => (\n <List.Item key={item.id} value={item.id} interactive onClick={() => toggleItem(item.id)}>\n <List.Checkbox\n aria-label={`Enable ${item.title.toLowerCase()} limit`}\n placement=\"start\"\n checked={checked.has(item.id)}\n onCheckedChange={(value) => setItem(item.id, value)}\n />\n <div className=\"min-w-0 flex-1\">\n <List.Title>{item.title}</List.Title>\n <List.Desc>{item.desc}</List.Desc>\n </div>\n <List.Input\n aria-label={`${item.title} limit`}\n type=\"number\"\n value={limits[item.id]}\n disabled={!checked.has(item.id)}\n onChange={(event) => setLimit(item.id, event.currentTarget.value)}\n className=\"w-24\"\n />\n </List.Item>\n ))}\n </List>\n );\n}"
677
+ },
678
+ {
679
+ "title": "Permissions Matrix",
680
+ "description": "A parent checkbox can summarize rows that also expose per-row Select controls.",
681
+ "code": "\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { List, Select } from \"ui-lab-components\";\n\nconst permissionItems = [\n { id: \"members\", title: \"Members\", desc: \"Invite and remove workspace members\" },\n { id: \"billing\", title: \"Billing\", desc: \"Update plan, seats, and invoices\" },\n { id: \"tokens\", title: \"Tokens\", desc: \"Issue scoped API credentials\" },\n];\n\nexport default function Example() {\n const rows = useMemo(() => [{ id: \"all\", title: \"All permissions\" }, ...permissionItems], []);\n const [checked, setChecked] = useState(() => new Set([\"members\", \"tokens\"]));\n const [level, setLevel] = useState<Record<string, string | number | null>>({\n members: \"edit\",\n billing: \"view\",\n tokens: \"edit\",\n });\n const allChecked = checked.size === permissionItems.length;\n const isIndeterminate = checked.size > 0 && !allChecked;\n\n const setItem = (id: string, value: boolean) => {\n setChecked((current) => {\n const next = new Set(current);\n value ? next.add(id) : next.delete(id);\n return next;\n });\n };\n\n const setAll = (value: boolean) => {\n permissionItems.forEach((item) => setItem(item.id, value));\n };\n\n const setPermissionLevel = (id: string, value: string | number | null) => {\n setLevel((current) => ({ ...current, [id]: value }));\n };\n\n return (\n <List items={rows} spacing=\"sm\" style={{ width: 420 }}>\n <List.Item value=\"all\" interactive onClick={() => setAll(!allChecked)}>\n <List.Checkbox\n aria-label=\"Toggle all permissions\"\n placement=\"start\"\n checked={allChecked}\n isIndeterminate={isIndeterminate}\n onCheckedChange={setAll}\n />\n <List.Title>All permissions</List.Title>\n </List.Item>\n <List.Divider />\n {permissionItems.map((item) => (\n <List.Item key={item.id} value={item.id} interactive onClick={() => setItem(item.id, !checked.has(item.id))}>\n <div className=\"w-5 flex-shrink-0\" />\n <List.Checkbox\n aria-label={`Allow ${item.title.toLowerCase()}`}\n placement=\"start\"\n checked={checked.has(item.id)}\n onCheckedChange={(value) => setItem(item.id, value)}\n />\n <div className=\"min-w-0 flex-1\">\n <List.Title>{item.title}</List.Title>\n <List.Desc>{item.desc}</List.Desc>\n </div>\n <List.Select\n selectedKey={level[item.id]}\n valueLabel={String(level[item.id] ?? \"\")}\n isDisabled={!checked.has(item.id)}\n onSelectionChange={(value) => setPermissionLevel(item.id, value)}\n >\n <Select.Trigger>\n <Select.Value placeholder=\"Access\" />\n </Select.Trigger>\n <Select.Content>\n <Select.List>\n <Select.Item value=\"view\">View</Select.Item>\n <Select.Item value=\"edit\">Edit</Select.Item>\n <Select.Item value=\"admin\">Admin</Select.Item>\n </Select.List>\n </Select.Content>\n </List.Select>\n </List.Item>\n ))}\n </List>\n );\n}"
493
682
  }
494
683
  ],
495
684
  },
@@ -507,6 +696,7 @@ export const componentRegistry = {
507
696
  relatedComponents: ["card", "scroll"],
508
697
  tags: ["container", "visual", "effect", "fade"],
509
698
  accessibility: { "hasAriaSupport": false, "notes": ["Visual effect only, does not affect content semantics"] },
699
+ usage: undefined,
510
700
  examples: [
511
701
  {
512
702
  "title": "Mask - Read More Effect",
@@ -534,6 +724,7 @@ export const componentRegistry = {
534
724
  relatedComponents: ["popover"],
535
725
  tags: ["menu", "right-click", "actions"],
536
726
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible", "Menu role", "Focus management"] },
727
+ usage: undefined,
537
728
  examples: [
538
729
  {
539
730
  "title": "Basic Menu",
@@ -544,6 +735,26 @@ export const componentRegistry = {
544
735
  "title": "Nested Menu",
545
736
  "description": "Context menu with submenus for organizing related actions. Hover over items with arrows to reveal nested options.",
546
737
  "code": "import { Menu } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Menu>\n <Menu.Trigger className=\"flex items-center justify-center rounded-md border-2 border-dashed border-background-600 p-12 w-full cursor-context-menu select-none text-foreground-300 hover:border-background-500 transition-colors\">\n Right click here\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item>New File</Menu.Item>\n <Menu.Item>New Folder</Menu.Item>\n <Menu.Separator />\n <Menu.Sub>\n <Menu.SubTrigger>Open with...</Menu.SubTrigger>\n <Menu.SubContent>\n <Menu.Item>VS Code</Menu.Item>\n <Menu.Item>Sublime Text</Menu.Item>\n <Menu.Item>Vim</Menu.Item>\n <Menu.Separator />\n <Menu.Item>Other Application...</Menu.Item>\n </Menu.SubContent>\n </Menu.Sub>\n <Menu.Sub>\n <Menu.SubTrigger>Share</Menu.SubTrigger>\n <Menu.SubContent>\n <Menu.Item>Copy Link</Menu.Item>\n <Menu.Item>Email</Menu.Item>\n <Menu.Sub>\n <Menu.SubTrigger>Social Media</Menu.SubTrigger>\n <Menu.SubContent>\n <Menu.Item>Twitter</Menu.Item>\n <Menu.Item>LinkedIn</Menu.Item>\n <Menu.Item>Facebook</Menu.Item>\n </Menu.SubContent>\n </Menu.Sub>\n </Menu.SubContent>\n </Menu.Sub>\n <Menu.Separator />\n <Menu.Item>Rename</Menu.Item>\n <Menu.Item disabled>Delete</Menu.Item>\n </Menu.Content>\n </Menu>\n );\n}"
738
+ },
739
+ {
740
+ "title": "Toolbar Dropdown",
741
+ "description": "Dropdown menu of actions with keyboard shortcuts and a disabled item.",
742
+ "code": "import { Menu, Button } from \"ui-lab-components\";\nimport { FaChevronDown } from \"react-icons/fa6\";\n\nexport default function Example() {\n return (\n <Menu type=\"pop-over\">\n <Menu.Trigger>\n <Button variant=\"ghost\">\n File <FaChevronDown className=\"w-3 h-3 ml-1\" />\n </Button>\n </Menu.Trigger>\n <Menu.Content align=\"start\">\n <Menu.Item onSelect={() => {}}>\n New file\n <Menu.Shortcut>⌘N</Menu.Shortcut>\n </Menu.Item>\n <Menu.Item onSelect={() => {}}>\n Open…\n <Menu.Shortcut>⌘O</Menu.Shortcut>\n </Menu.Item>\n <Menu.Item onSelect={() => {}}>\n Save\n <Menu.Shortcut>⌘S</Menu.Shortcut>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item disabled>Recent files</Menu.Item>\n </Menu.Content>\n </Menu>\n );\n}"
743
+ },
744
+ {
745
+ "title": "Table Row Actions",
746
+ "description": "Per-row overflow menu in a table, with a destructive action separated from neutral ones.",
747
+ "code": "import { Menu, Button } from \"ui-lab-components\";\nimport { FaEllipsis } from \"react-icons/fa6\";\n\nconst rows = [\n { id: \"doc_1\", name: \"Q3 roadmap\", updated: \"2h ago\" },\n { id: \"doc_2\", name: \"Pricing review\", updated: \"yesterday\" },\n { id: \"doc_3\", name: \"Hiring plan\", updated: \"3 days ago\" },\n];\n\nexport default function Example() {\n return (\n <table className=\"w-full text-sm border-collapse\">\n <thead>\n <tr className=\"border-b border-background-700\">\n <th className=\"text-left py-2 px-3 font-medium text-foreground-200\">Document</th>\n <th className=\"text-left py-2 px-3 font-medium text-foreground-200\">Updated</th>\n <th className=\"py-2 px-3\" />\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.id} className=\"border-b border-background-700 last:border-0\">\n <td className=\"py-2 px-3\">{row.name}</td>\n <td className=\"py-2 px-3 text-foreground-400\">{row.updated}</td>\n <td className=\"py-2 px-3 text-right\">\n <Menu type=\"pop-over\">\n <Menu.Trigger>\n <Button\n icon={<FaEllipsis />}\n size=\"icon\"\n variant=\"ghost\"\n styles=\"p-2\"\n aria-label={`Actions for ${row.name}`}\n />\n </Menu.Trigger>\n <Menu.Content align=\"end\">\n <Menu.Item onSelect={() => {}}>Open</Menu.Item>\n <Menu.Item onSelect={() => {}}>Rename</Menu.Item>\n <Menu.Item onSelect={() => {}}>Duplicate</Menu.Item>\n <Menu.Separator />\n <Menu.Item\n onSelect={() => {}}\n styles={{ root: \"text-destructive\" }}\n >\n Delete\n </Menu.Item>\n </Menu.Content>\n </Menu>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}"
748
+ },
749
+ {
750
+ "title": "Context Menu",
751
+ "description": "Right-click anywhere in the surface to open the menu at the cursor position.",
752
+ "code": "import { Menu } from \"ui-lab-components\";\n\nexport default function Example() {\n return (\n <Menu type=\"context-menu\">\n <Menu.Trigger>\n <div className=\"flex items-center justify-center w-80 h-32 border border-dashed border-background-700 rounded-sm text-sm text-foreground-400 select-none\">\n Right-click anywhere in this area\n </div>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item onSelect={() => {}}>\n Cut\n <Menu.Shortcut>⌘X</Menu.Shortcut>\n </Menu.Item>\n <Menu.Item onSelect={() => {}}>\n Copy\n <Menu.Shortcut>⌘C</Menu.Shortcut>\n </Menu.Item>\n <Menu.Item onSelect={() => {}}>\n Paste\n <Menu.Shortcut>⌘V</Menu.Shortcut>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item onSelect={() => {}} styles={{ root: \"text-destructive\" }}>\n Delete\n </Menu.Item>\n </Menu.Content>\n </Menu>\n );\n}"
753
+ },
754
+ {
755
+ "title": "View Options",
756
+ "description": "Mixed checkbox and radio items for toggling display state and selecting a single density.",
757
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Menu, Button } from \"ui-lab-components\";\n\nexport default function Example() {\n const [showGrid, setShowGrid] = useState(true);\n const [showRulers, setShowRulers] = useState(false);\n const [density, setDensity] = useState(\"comfortable\");\n\n return (\n <Menu type=\"pop-over\">\n <Menu.Trigger>\n <Button>View</Button>\n </Menu.Trigger>\n <Menu.Content align=\"start\">\n <Menu.Label>Display</Menu.Label>\n <Menu.CheckboxItem checked={showGrid} onCheckedChange={setShowGrid}>\n Show grid\n </Menu.CheckboxItem>\n <Menu.CheckboxItem checked={showRulers} onCheckedChange={setShowRulers}>\n Show rulers\n </Menu.CheckboxItem>\n <Menu.Separator />\n <Menu.Label>Density</Menu.Label>\n <Menu.RadioGroup value={density} onValueChange={setDensity}>\n <Menu.RadioItem value=\"compact\">Compact</Menu.RadioItem>\n <Menu.RadioItem value=\"comfortable\">Comfortable</Menu.RadioItem>\n <Menu.RadioItem value=\"spacious\">Spacious</Menu.RadioItem>\n </Menu.RadioGroup>\n </Menu.Content>\n </Menu>\n );\n}"
547
758
  }
548
759
  ],
549
760
  },
@@ -560,6 +771,7 @@ export const componentRegistry = {
560
771
  relatedComponents: ["button", "card"],
561
772
  tags: ["dialog", "overlay", "container"],
562
773
  accessibility: { "hasAriaSupport": true, "notes": ["Focus trap", "Backdrop focus", "Keyboard dismissal", "ARIA dialog role"] },
774
+ usage: { "summary": "Use Modal for short, focused dialog tasks that need a dedicated overlay surface and clear dismissal path.", "whenToUse": ["Interruptive tasks that need focused attention", "Short forms, confirmations, or contextual workflows that should not navigate away", "Situations where the dialog itself should provide the only surfaced container"], "whenNotToUse": ["Long, browse-heavy, or primary page flows", "Cases where inline expansion or a dedicated page would be clearer", "Layouts that require another nested surface just to hold the content"], "rules": [{ "type": "do", "title": "Let Modal be the surface", "description": "Use the modal shell, title, content area, and footer as the dialog structure instead of wrapping the body in another surface component." }, { "type": "avoid", "title": "Avoid nested surfaced containers", "description": "Do not place Card or other panel-like surfaces inside the modal body unless there is a strong semantic need for a distinct sub-region.", "relatedComponents": ["card", "panel", "confirm"] }, { "type": "prefer", "title": "Prefer direct content plus layout primitives", "description": "Arrange modal content with Flex, Grid, Group, and Modal footer slots so the hierarchy stays shallow and the dialog reads as a single unit.", "relatedComponents": ["flex", "grid", "group"] }] },
563
775
  examples: [
564
776
  {
565
777
  "title": "Basic Modal",
@@ -569,7 +781,22 @@ export const componentRegistry = {
569
781
  {
570
782
  "title": "Form Modal",
571
783
  "description": "A modal dialog containing a form for editing user profile settings. Demonstrates using form inputs, labels, and action buttons within a modal.",
572
- "code": "'use client';\n\nimport React from 'react';\nimport { Modal, Button, Input, Label, TextArea, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [isOpen, setIsOpen] = React.useState(false);\n const [formData, setFormData] = React.useState({\n name: 'John Doe',\n email: 'john.doe@example.com',\n bio: 'Software developer passionate about building great user experiences.',\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n // Handle form submission\n setIsOpen(false);\n };\n\n return (\n <>\n <Button onClick={() => setIsOpen(true)}>Edit Profile</Button>\n <Modal isOpen={isOpen} onOpenChange={setIsOpen} size=\"auto\">\n <Modal.Header>Edit Profile</Modal.Header>\n <Modal.Body>\n <form id=\"profile-form\" onSubmit={handleSubmit}>\n <Flex direction=\"column\" gap=\"md\">\n <div>\n <Label htmlFor=\"name\" required>\n Full Name\n </Label>\n <Input\n id=\"name\"\n value={formData.name}\n onChange={(e) =>\n setFormData({ ...formData, name: e.target.value })\n }\n placeholder=\"Enter your name\"\n />\n </div>\n <div>\n <Label htmlFor=\"email\" required>\n Email Address\n </Label>\n <Input\n id=\"email\"\n type=\"email\"\n value={formData.email}\n onChange={(e) =>\n setFormData({ ...formData, email: e.target.value })\n }\n placeholder=\"Enter your email\"\n />\n </div>\n <div>\n <Label htmlFor=\"bio\">Bio</Label>\n <TextArea\n id=\"bio\"\n value={formData.bio}\n onChange={(e) =>\n setFormData({ ...formData, bio: e.target.value })\n }\n placeholder=\"Tell us about yourself\"\n rows={3}\n />\n </div>\n </Flex>\n </form>\n </Modal.Body>\n <Modal.Footer>\n <Flex gap=\"sm\" justify=\"flex-end\">\n <Button variant=\"ghost\" onClick={() => setIsOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"profile-form\">\n Save Changes\n </Button>\n </Flex>\n </Modal.Footer>\n </Modal>\n </>\n );\n}"
784
+ "code": "'use client';\n\nimport React from 'react';\nimport { Modal, Button, Input, Label, TextArea, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [isOpen, setIsOpen] = React.useState(false);\n const [formData, setFormData] = React.useState({\n name: 'John Doe',\n email: 'john.doe@example.com',\n bio: 'Software developer passionate about building great user experiences.',\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n // Handle form submission\n setIsOpen(false);\n };\n\n return (\n <>\n <Button onClick={() => setIsOpen(true)}>Edit Profile</Button>\n <Modal isOpen={isOpen} onOpenChange={setIsOpen} size=\"auto\">\n <Modal.Header>Edit Profile</Modal.Header>\n <Modal.Body>\n <form id=\"profile-form\" onSubmit={handleSubmit}>\n <Flex direction=\"column\" gap=\"md\">\n <div>\n <Label htmlFor=\"name\" required>\n Full Name\n </Label>\n <Input\n id=\"name\"\n value={formData.name}\n onChange={(e) =>\n setFormData({ ...formData, name: e.target.value })\n }\n placeholder=\"Enter your name\"\n />\n </div>\n <div>\n <Label htmlFor=\"email\" required>\n Email Address\n </Label>\n <Input\n id=\"email\"\n type=\"email\"\n value={formData.email}\n onChange={(e) =>\n setFormData({ ...formData, email: e.target.value })\n }\n placeholder=\"Enter your email\"\n />\n </div>\n <div>\n <Label htmlFor=\"bio\">Bio</Label>\n <TextArea\n id=\"bio\"\n value={formData.bio}\n onChange={(e) =>\n setFormData({ ...formData, bio: e.target.value })\n }\n placeholder=\"Tell us about yourself\"\n rows={3}\n />\n </div>\n </Flex>\n </form>\n </Modal.Body>\n <Modal.Footer>\n <Flex gap=\"sm\" justify=\"end\">\n <Button variant=\"ghost\" onClick={() => setIsOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"profile-form\">\n Save Changes\n </Button>\n </Flex>\n </Modal.Footer>\n </Modal>\n </>\n );\n}"
785
+ },
786
+ {
787
+ "title": "Delete Confirmation",
788
+ "description": "Destructive action dialog that blocks the user until they explicitly confirm or cancel.",
789
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Modal, Button } from \"ui-lab-components\";\n\nexport default function Example() {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <>\n <Button variant=\"destructive\" onClick={() => setIsOpen(true)}>\n Delete workspace\n </Button>\n\n <Modal\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n title=\"Delete workspace\"\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setIsOpen(false)}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={() => setIsOpen(false)}>\n Delete\n </Button>\n </>\n }\n >\n <p className=\"text-sm text-foreground-300\">\n This will permanently delete <strong className=\"text-foreground-100\">acme-corp</strong> and all\n its data. This action cannot be undone.\n </p>\n </Modal>\n </>\n );\n}"
790
+ },
791
+ {
792
+ "title": "Create API Key",
793
+ "description": "Form modal with a single required input. The primary action stays disabled until the field has a value.",
794
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Modal, Button, Input, Label } from \"ui-lab-components\";\n\nexport default function Example() {\n const [isOpen, setIsOpen] = useState(false);\n const [name, setName] = useState(\"\");\n\n return (\n <>\n <Button onClick={() => setIsOpen(true)}>New API key</Button>\n\n <Modal\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n title=\"New API key\"\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => setIsOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => setIsOpen(false)}\n isDisabled={!name.trim()}\n >\n Create\n </Button>\n </>\n }\n >\n <div className=\"flex flex-col gap-4 px-6 py-4\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"key-name\">Name</Label>\n <Input\n id=\"key-name\"\n placeholder=\"e.g. CI deploy key\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <p className=\"text-xs text-foreground-400\">\n The key will only be shown once after creation.\n </p>\n </div>\n </Modal>\n </>\n );\n}"
795
+ },
796
+ {
797
+ "title": "Notification Settings",
798
+ "description": "Settings panel using the compound Modal.Header / Modal.Body / Modal.Footer API with toggle rows.",
799
+ "code": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Modal, Button, Switch } from \"ui-lab-components\";\n\nexport default function Example() {\n const [isOpen, setIsOpen] = useState(false);\n const [prefs, setPrefs] = useState({ email: true, push: false, marketing: false });\n\n const toggle = (key: keyof typeof prefs) =>\n setPrefs((p) => ({ ...p, [key]: !p[key] }));\n\n return (\n <>\n <Button variant=\"ghost\" onClick={() => setIsOpen(true)}>\n Notification settings\n </Button>\n\n <Modal isOpen={isOpen} onOpenChange={setIsOpen}>\n <Modal.Header>\n <span className=\"text-sm font-semibold text-foreground-100\">Notification preferences</span>\n </Modal.Header>\n\n <Modal.Body>\n <div className=\"flex flex-col divide-y divide-border px-6\">\n {(\n [\n { key: \"email\", label: \"Email notifications\", description: \"Receive updates and alerts by email\" },\n { key: \"push\", label: \"Push notifications\", description: \"Browser and mobile push alerts\" },\n { key: \"marketing\", label: \"Product updates\", description: \"New features and announcements\" },\n ] as const\n ).map(({ key, label, description }) => (\n <div key={key} className=\"flex items-center justify-between py-4\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-sm text-foreground-100\">{label}</span>\n <span className=\"text-xs text-foreground-400\">{description}</span>\n </div>\n <Switch isSelected={prefs[key]} onChange={() => toggle(key)} />\n </div>\n ))}\n </div>\n </Modal.Body>\n\n <Modal.Footer>\n <Button variant=\"ghost\" onClick={() => setIsOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => setIsOpen(false)}>Save</Button>\n </Modal.Footer>\n </Modal>\n </>\n );\n}"
573
800
  }
574
801
  ],
575
802
  },
@@ -587,6 +814,7 @@ export const componentRegistry = {
587
814
  relatedComponents: ["flex", "card", "grid"],
588
815
  tags: ["container", "layout", "page-wrapper", "responsive", "context"],
589
816
  accessibility: { "hasAriaSupport": true, "notes": ["Uses semantic main role for page structure", "Provides page-level context to child components", "Mobile viewport detection for responsive behavior", "Flexible padding and max-width constraints"] },
817
+ usage: undefined,
590
818
  examples: [],
591
819
  },
592
820
  panel: {
@@ -603,7 +831,14 @@ export const componentRegistry = {
603
831
  relatedComponents: ["page", "grid", "flex"],
604
832
  tags: ["composition", "panel", "regions", "responsive", "sticky"],
605
833
  accessibility: { "hasAriaSupport": true, "notes": ["Uses semantic HTML elements (header, main, footer)", "Provides context to child components", "Supports responsive viewport detection", "Sticky header respects user preferences"] },
606
- examples: [],
834
+ usage: undefined,
835
+ examples: [
836
+ {
837
+ "title": "Sidebar with Toggle",
838
+ "description": "Left sidebar that collapses and expands via a toggle button in the content area.",
839
+ "code": "import { Panel } from \"ui-lab-components\";\n\nexport default function Example() {\n return (\n <Panel style={{ height: \"400px\" }} className=\"w-full border border-background-700 rounded-lg bg-background-900\">\n <Panel.Sidebar side=\"left\" defaultOpen width=\"200px\" collapsedWidth=\"0\">\n </Panel.Sidebar>\n <Panel.Content>\n <Panel.Toggle>\n <button>☰</button>\n </Panel.Toggle>\n </Panel.Content>\n </Panel>\n );\n}"
840
+ }
841
+ ],
607
842
  },
608
843
  path: {
609
844
  id: "path",
@@ -618,11 +853,22 @@ export const componentRegistry = {
618
853
  relatedComponents: [],
619
854
  tags: ["navigation", "path", "hierarchy", "parent-pages"],
620
855
  accessibility: { "hasAriaSupport": true, "notes": ["Uses nav element with landmark role", "Semantic ordered list structure", "Current page marked with aria-current", "Full keyboard navigation support", "Screen reader friendly labels"] },
856
+ usage: undefined,
621
857
  examples: [
622
858
  {
623
859
  "title": "Basic Path",
624
860
  "description": "A simple path navigation showing the current page location. Use this to help users understand their position in the site hierarchy.",
625
- "code": "import { Path, PathItem } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Path>\n <PathItem href=\"/\">Home</PathItem>\n <PathItem href=\"/products\">Products</PathItem>\n <PathItem href=\"/products/electronics\">Electronics</PathItem>\n <PathItem>Laptop</PathItem>\n </Path>\n );\n}"
861
+ "code": "import { Path } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Path>\n <Path.Item href=\"/\">Home</Path.Item>\n <Path.Item href=\"/products\">Products</Path.Item>\n <Path.Item href=\"/products/electronics\">Electronics</Path.Item>\n <Path.Item>Laptop</Path.Item>\n </Path>\n );\n}"
862
+ },
863
+ {
864
+ "title": "Custom Separator",
865
+ "description": "Pass any node via the separator prop to replace the default slash.",
866
+ "code": "import { Path } from \"ui-lab-components\";\nimport { FaChevronRight } from \"react-icons/fa6\";\n\nexport default function Example() {\n return (\n <Path separator={<FaChevronRight className=\"w-3 h-3 text-foreground-400\" />}>\n <Path.Item href=\"/projects\">Projects</Path.Item>\n <Path.Item href=\"/projects/ui-lab\">ui-lab</Path.Item>\n <Path.Item>components</Path.Item>\n </Path>\n );\n}"
867
+ },
868
+ {
869
+ "title": "Collapsed Breadcrumb",
870
+ "description": "Deep paths collapse intermediate crumbs into an ellipsis menu — Path.Item wraps the Menu trigger directly.",
871
+ "code": "import { Path, Menu, Button } from \"ui-lab-components\";\nimport { FaEllipsis } from \"react-icons/fa6\";\n\nconst collapsed = [\n { label: \"Projects\", href: \"/projects\" },\n { label: \"ui-lab\", href: \"/projects/ui-lab\" },\n { label: \"packages\", href: \"/projects/ui-lab/packages\" },\n];\n\nexport default function Example() {\n return (\n <Path>\n <Path.Item href=\"/\">Home</Path.Item>\n <Path.Item>\n <Menu type=\"pop-over\">\n <Menu.Trigger>\n <Button icon={<FaEllipsis />} styles=\"p-2\" size=\"icon\" variant=\"ghost\" aria-label=\"Show collapsed path\" />\n </Menu.Trigger>\n <Menu.Content align=\"start\">\n {collapsed.map((crumb) => (\n <Menu.Item key={crumb.href} onSelect={() => {}}>\n {crumb.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu>\n </Path.Item>\n <Path.Item href=\"/projects/ui-lab/packages/@ui\">@ui</Path.Item>\n <Path.Item>Path.tsx</Path.Item>\n </Path>\n );\n}"
626
872
  }
627
873
  ],
628
874
  },
@@ -639,11 +885,32 @@ export const componentRegistry = {
639
885
  relatedComponents: ["tooltip", "modal"],
640
886
  tags: ["overlay", "content", "information"],
641
887
  accessibility: { "hasAriaSupport": true, "notes": ["Focus management", "Dismissible", "Keyboard support"] },
888
+ usage: undefined,
642
889
  examples: [
643
890
  {
644
- "title": "Basic Popover",
645
- "description": "A simple popover with a trigger button. Use this to display contextual content or actions.",
646
- "code": "import React from 'react';\nimport { Popover, Button } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Popover content={<p className=\"text-sm\">This is popover content. It appears when you click the button.</p>}>\n <Button>Click me</Button>\n </Popover>\n );\n}"
891
+ "title": "Basic",
892
+ "description": "Default popover with a short note and two clear actions.",
893
+ "code": "\"use client\";\n\nimport { Popover, Button } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Popover\n content={\n <div className=\"w-64 space-y-3\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-medium\">Quick note</div>\n <p>A popover works best when it adds one small piece of context, one simple choice, or one short action.</p>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\">\n Dismiss\n </Button>\n <Button size=\"sm\">\n Continue\n </Button>\n </div>\n </div>\n }\n >\n <Button>Show info</Button>\n </Popover>\n );\n}"
894
+ },
895
+ {
896
+ "title": "Toggleable Options",
897
+ "description": "Popover containing a list of toggleable options using List.Item and List.Switch.",
898
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Popover, Button, List } from 'ui-lab-components';\n\nconst toggleableItems = [\n { id: \"notifications\", label: \"Notifications\", desc: \"Push and email alerts\" },\n { id: \"autoSave\", label: \"Auto-save\", desc: \"Save changes automatically\" },\n { id: \"darkMode\", label: \"Dark mode\", desc: \"Use dark color scheme\" },\n];\n\nexport default function Example() {\n const [enabled, setEnabled] = useState<Set<string>>(\n () => new Set([\"notifications\", \"darkMode\"])\n );\n\n const toggle = (id: string) =>\n setEnabled((prev) => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n\n return (\n <Popover\n position=\"bottom\"\n content={\n <List items={toggleableItems} spacing=\"sm\" style={{ width: 280 }}>\n {toggleableItems.map((item) => (\n <List.Item\n key={item.id}\n value={item.id}\n interactive\n onClick={() => toggle(item.id)}\n >\n <div className=\"min-w-0 flex-1\">\n <List.Title>{item.label}</List.Title>\n <List.Desc>{item.desc}</List.Desc>\n </div>\n <List.Switch\n isSelected={enabled.has(item.id)}\n onChange={() => toggle(item.id)}\n aria-label={item.label}\n />\n </List.Item>\n ))}\n </List>\n }\n >\n <Button>Options</Button>\n </Popover>\n );\n}"
899
+ },
900
+ {
901
+ "title": "Table Row Actions",
902
+ "description": "Per-row action menu in a data table, anchored to the overflow button.",
903
+ "code": "\"use client\";\n\nimport { Popover, Button, List } from 'ui-lab-components';\nimport { FaEllipsis } from 'react-icons/fa6';\n\nconst rows = [\n { id: \"usr_1\", name: \"Alice\", role: \"Admin\", status: \"Active\" },\n { id: \"usr_2\", name: \"Bob\", role: \"Member\", status: \"Invited\" },\n { id: \"usr_3\", name: \"Carol\", role: \"Viewer\", status: \"Active\" },\n];\n\nexport default function Example() {\n return (\n <table className=\"w-full text-sm border-collapse\">\n <thead>\n <tr className=\"border-b border-background-700\">\n <th className=\"text-left py-2 px-3 font-medium text-foreground-200\">Name</th>\n <th className=\"text-left py-2 px-3 font-medium text-foreground-200\">Role</th>\n <th className=\"text-left py-2 px-3 font-medium text-foreground-200\">Status</th>\n <th className=\"py-2 px-3\" />\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.id} className=\"border-b border-background-700 last:border-0\">\n <td className=\"py-2 px-3\">{row.name}</td>\n <td className=\"py-2 px-3 text-foreground-200\">{row.role}</td>\n <td className=\"py-2 px-3 text-foreground-200\">{row.status}</td>\n <td className=\"py-2 px-3 text-right\">\n <Popover\n position=\"left\"\n content={\n <List gap=\"sm\" styles={{ root: \"w-full\" }}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n styles={{ root: \"justify-start\" }}\n >\n Edit {row.name}\n </Button>\n <Button\n variant=\"danger\"\n size=\"sm\"\n styles={{ root: \"justify-start\" }}\n >\n Remove {row.name}\n </Button>\n </List>\n }\n >\n <Button icon={<FaEllipsis />} styles=\"p-2\" size=\"icon\" variant=\"ghost\" aria-label={`Row actions for ${row.name}`} />\n </Popover>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}"
904
+ },
905
+ {
906
+ "title": "Input Form",
907
+ "description": "Popover containing a small form with labeled input fields and save/cancel actions.",
908
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Popover, Button, Flex, Label, Input } from 'ui-lab-components';\n\nexport default function Example() {\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n\n return (\n <Popover\n position=\"bottom\"\n content={\n <Flex direction=\"column\" gap=\"sm\" styles={{ root: \"w-80\" }}>\n <Flex direction=\"column\" gap=\"xs\">\n <Label htmlFor=\"contact-name\">Name</Label>\n <Input\n id=\"contact-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName((e.target as HTMLInputElement).value)}\n placeholder=\"Full name\"\n />\n </Flex>\n <Flex direction=\"column\" gap=\"xs\">\n <Label htmlFor=\"contact-email\">Email</Label>\n <Input\n id=\"contact-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail((e.target as HTMLInputElement).value)}\n placeholder=\"name@example.com\"\n />\n </Flex>\n </Flex>\n }\n >\n <Button>Edit contact</Button>\n </Popover>\n );\n}"
909
+ },
910
+ {
911
+ "title": "Arrow & Positions",
912
+ "description": "Directional arrow enabled across all four placement options.",
913
+ "code": "\"use client\";\n\nimport { Popover, Button, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex align=\"center\">\n {([\"top\", \"bottom\", \"left\", \"right\"] as const).map((position) => (\n <Popover\n key={position}\n position={position}\n showArrow\n content={<span className=\"text-sm capitalize\">{position}</span>}\n >\n <Button variant=\"ghost\">\n <span className=\"capitalize\">{position}</span>\n </Button>\n </Popover>\n ))}\n </Flex>\n );\n}"
647
914
  }
648
915
  ],
649
916
  },
@@ -660,11 +927,32 @@ export const componentRegistry = {
660
927
  relatedComponents: ["slider"],
661
928
  tags: ["feedback", "status", "progress"],
662
929
  accessibility: { "hasAriaSupport": true, "notes": ["ARIA progressbar role", "aria-valuenow", "aria-valuemin", "aria-valuemax"] },
930
+ usage: undefined,
663
931
  examples: [
664
932
  {
665
- "title": "Basic Progress",
666
- "description": "A simple progress bar showing completion at 65%. Use this to display task or loading progress in your interface.",
667
- "code": "import React from 'react';\nimport { Progress } from 'ui-lab-components';\n\nexport default function Example() {\n return <Progress value={65} />;\n}"
933
+ "title": "File Upload",
934
+ "description": "Simulated upload progress with a label and live percentage starts on button click.",
935
+ "code": "\"use client\";\n\nimport { useState, useEffect } from 'react';\nimport { Progress, Flex, Button } from 'ui-lab-components';\n\nexport default function Example() {\n const [progress, setProgress] = useState(0);\n const [running, setRunning] = useState(false);\n\n useEffect(() => {\n if (!running) return;\n if (progress >= 100) { setRunning(false); return; }\n const t = setTimeout(() => setProgress((p) => Math.min(p + Math.random() * 12, 100)), 200);\n return () => clearTimeout(t);\n }, [running, progress]);\n\n const reset = () => { setProgress(0); setRunning(false); };\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 340 }}>\n <Flex direction=\"column\" gap=\"xs\">\n <span style={{ fontSize: \"var(--text-sm)\", color: \"var(--foreground-muted)\" }}>\n report-q4-2025.pdf\n </span>\n <Progress value={progress} label=\"Uploading\" showValue />\n </Flex>\n <Flex gap=\"sm\">\n <Button variant=\"primary\" onClick={() => setRunning(true)} disabled={running || progress === 100}>\n {progress === 100 ? \"Done\" : \"Upload\"}\n </Button>\n <Button variant=\"ghost\" onClick={reset}>Reset</Button>\n </Flex>\n </Flex>\n );\n}"
936
+ },
937
+ {
938
+ "title": "Storage Quota",
939
+ "description": "Fixed progress bar showing disk usage relative to a custom max value.",
940
+ "code": "import { Progress, Flex } from 'ui-lab-components';\n\nconst used = 7.4;\nconst total = 10;\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 300 }}>\n <Flex direction=\"column\" gap=\"xs\">\n <Progress value={used} max={total} label=\"Storage\" showValue />\n <span style={{ fontSize: \"var(--text-xs)\", color: \"var(--foreground-muted)\" }}>\n {used} GB of {total} GB used\n </span>\n </Flex>\n </Flex>\n );\n}"
941
+ },
942
+ {
943
+ "title": "Onboarding Steps",
944
+ "description": "Step tracker using value/max to represent wizard completion.",
945
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Progress, Flex, Button } from 'ui-lab-components';\n\nconst steps = [\"Profile\", \"Preferences\", \"Integrations\", \"Invite team\"];\n\nexport default function Example() {\n const [step, setStep] = useState(1);\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 340 }}>\n <Flex direction=\"column\" gap=\"xs\">\n <Progress value={step} max={steps.length} />\n <span style={{ fontSize: \"var(--text-sm)\", color: \"var(--foreground-muted)\" }}>\n Step {step} of {steps.length} — {steps[step - 1]}\n </span>\n </Flex>\n <Flex gap=\"sm\">\n <Button variant=\"ghost\" onClick={() => setStep((s) => Math.max(1, s - 1))} disabled={step === 1}>\n Back\n </Button>\n <Button variant=\"primary\" onClick={() => setStep((s) => Math.min(steps.length, s + 1))} disabled={step === steps.length}>\n Next\n </Button>\n </Flex>\n </Flex>\n );\n}"
946
+ },
947
+ {
948
+ "title": "Indeterminate Loading",
949
+ "description": "Animated bar for unknown-duration operations — switches to complete when done.",
950
+ "code": "\"use client\";\n\nimport { useState, useEffect } from 'react';\nimport { Progress, Flex, Button } from 'ui-lab-components';\n\nexport default function Example() {\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n if (!loading) return;\n const t = setTimeout(() => setLoading(false), 3000);\n return () => clearTimeout(t);\n }, [loading]);\n\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 320 }}>\n <Flex direction=\"column\" gap=\"xs\">\n <span style={{ fontSize: \"var(--text-sm)\", color: \"var(--foreground-muted)\" }}>\n {loading ? \"Fetching results…\" : \"Results loaded\"}\n </span>\n <Progress indeterminate={loading} value={loading ? 0 : 100} />\n </Flex>\n <Button variant=\"ghost\" onClick={() => setLoading(true)} disabled={loading}>\n Reload\n </Button>\n </Flex>\n );\n}"
951
+ },
952
+ {
953
+ "title": "Skill Levels",
954
+ "description": "Stacked progress bars in a profile or stats context with labels and values.",
955
+ "code": "import { Progress, Flex } from 'ui-lab-components';\n\nconst skills = [\n { name: \"TypeScript\", value: 92 },\n { name: \"Rust\", value: 54 },\n { name: \"Go\", value: 38 },\n];\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 300 }}>\n {skills.map((s) => (\n <Progress key={s.name} value={s.value} label={s.name} showValue />\n ))}\n </Flex>\n );\n}"
668
956
  }
669
957
  ],
670
958
  },
@@ -681,6 +969,7 @@ export const componentRegistry = {
681
969
  relatedComponents: ["checkbox", "switch", "label"],
682
970
  tags: ["form", "selection", "single-choice"],
683
971
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible", "Radio group support", "Arrow key navigation"] },
972
+ usage: undefined,
684
973
  examples: [
685
974
  {
686
975
  "title": "Basic Radio",
@@ -707,11 +996,22 @@ export const componentRegistry = {
707
996
  relatedComponents: [],
708
997
  tags: ["scroll", "overflow", "layout", "scrollbar"],
709
998
  accessibility: { "hasAriaSupport": false, "notes": ["Custom scrollbar implementation for visual consistency"] },
999
+ usage: undefined,
710
1000
  examples: [
711
1001
  {
712
- "title": "Basic Scroll",
713
- "description": "A simple scrollable container with fixed height. Use this to display overflow content in a constrained space.",
714
- "code": "import { Scroll } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <div className='overflow-hidden' style={{ height: '200px', width: '300px' }}>\n <Scroll>\n <div>\n <p>This is scrollable content.</p>\n <p>Add more content here to see scrolling in action.</p>\n <p>The Scroll component manages overflow elegantly.</p>\n <p>You can scroll through all of this content.</p>\n <p>Perfect for constrained layouts.</p>\n </div>\n </Scroll>\n </div>\n );\n}"
1002
+ "title": "Log Viewer",
1003
+ "description": "Vertically scrollable log output with fade mask to hint at overflow content.",
1004
+ "code": "import { Scroll } from 'ui-lab-components';\n\nconst LOG_ENTRIES = [\n { level: \"info\", msg: \"Server started on port 3000\" },\n { level: \"info\", msg: \"Connected to database\" },\n { level: \"warn\", msg: \"Slow query detected: users.findAll (342ms)\" },\n { level: \"error\", msg: \"Failed to send email: SMTP timeout\" },\n { level: \"info\", msg: \"Cache warmed: 1,204 keys loaded\" },\n { level: \"info\", msg: \"Background job 'sync-orders' started\" },\n { level: \"warn\", msg: \"Memory usage at 78%\" },\n { level: \"info\", msg: \"Background job 'sync-orders' completed\" },\n { level: \"error\", msg: \"Unhandled rejection: Cannot read property 'id' of undefined\" },\n { level: \"info\", msg: \"Health check passed\" },\n { level: \"warn\", msg: \"Rate limit reached for IP 192.168.1.42\" },\n { level: \"info\", msg: \"User #4821 logged in\" },\n { level: \"info\", msg: \"Deployment complete: v2.14.0\" },\n];\n\nexport default function Example() {\n return (\n <div style={{ width: 480, display: 'flex', flexDirection: 'column', gap: 4 }}>\n <span style={{ fontSize: 11, color: 'var(--color-muted)', textTransform: 'uppercase', letterSpacing: '0.08em' }}>\n Application Logs\n </span>\n <div style={{ border: '1px solid var(--color-border)', borderRadius: 6, background: 'var(--color-background-900)', overflow: 'hidden' }}>\n <Scroll maxHeight=\"200px\" fade-y fadeDistance={8} fadeSize={5}>\n <div style={{ padding: '8px 0' }}>\n {LOG_ENTRIES.map((entry, i) => (\n <div key={i} style={{\n display: 'flex',\n gap: 10,\n padding: '3px 12px',\n fontSize: 12,\n fontFamily: 'var(--font-mono, monospace)',\n color: entry.level === 'error'\n ? 'var(--color-destructive)'\n : entry.level === 'warn'\n ? 'var(--color-warning, var(--color-muted))'\n : 'var(--color-foreground)',\n }}>\n <span style={{ color: 'var(--color-muted)', minWidth: 36 }}>{entry.level}</span>\n <span>{entry.msg}</span>\n </div>\n ))}\n </div>\n </Scroll>\n </div>\n </div>\n );\n}"
1005
+ },
1006
+ {
1007
+ "title": "Settings Panel",
1008
+ "description": "Constrained-height settings list with a custom scrollbar shown on hover.",
1009
+ "code": "import { Scroll } from 'ui-lab-components';\n\nconst SETTINGS_ITEMS = Array.from({ length: 18 }, (_, i) => ({\n label: `Option ${i + 1}`,\n description: `Configure behavior for setting ${i + 1}`,\n}));\n\nexport default function Example() {\n return (\n <div style={{ width: 320, border: '1px solid var(--color-border)', borderRadius: 8, overflow: 'hidden', background: 'var(--color-background)' }}>\n <div style={{ padding: '12px 16px', borderBottom: '1px solid var(--color-border)', fontSize: 13, fontWeight: 500 }}>\n Preferences\n </div>\n <Scroll maxHeight=\"240px\">\n <div style={{ padding: '8px 0' }}>\n {SETTINGS_ITEMS.map((item, i) => (\n <div key={i} style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 16px',\n fontSize: 13,\n borderBottom: i < SETTINGS_ITEMS.length - 1 ? '1px solid var(--color-border)' : undefined,\n }}>\n <div>\n <div style={{ color: 'var(--color-foreground)' }}>{item.label}</div>\n <div style={{ fontSize: 11, color: 'var(--color-muted)', marginTop: 1 }}>{item.description}</div>\n </div>\n </div>\n ))}\n </div>\n </Scroll>\n </div>\n );\n}"
1010
+ },
1011
+ {
1012
+ "title": "Horizontal Tag List",
1013
+ "description": "Horizontally scrollable row of filter tags that overflow their container.",
1014
+ "code": "import { Scroll } from 'ui-lab-components';\n\nconst TAGS = [\n \"authentication\", \"payments\", \"webhooks\", \"analytics\", \"notifications\",\n \"billing\", \"user-management\", \"api-keys\", \"rate-limiting\", \"audit-logs\",\n \"exports\", \"integrations\", \"search\", \"permissions\", \"reports\",\n];\n\nexport default function Example() {\n return (\n <div style={{ width: 420, display: 'flex', flexDirection: 'column', gap: 6 }}>\n <span style={{ fontSize: 12, color: 'var(--color-muted)' }}>Filter by topic</span>\n <Scroll direction=\"horizontal\" maxWidth=\"420px\" hide={false} inline>\n <div style={{ display: 'flex', gap: 6, padding: '2px 0' }}>\n {TAGS.map((tag) => (\n <span key={tag} style={{\n whiteSpace: 'nowrap',\n padding: '3px 10px',\n border: '1px solid var(--color-border)',\n borderRadius: 4,\n fontSize: 12,\n color: 'var(--color-foreground)',\n cursor: 'default',\n background: 'var(--color-background-900)',\n }}>\n {tag}\n </span>\n ))}\n </div>\n </Scroll>\n </div>\n );\n}"
715
1015
  }
716
1016
  ],
717
1017
  },
@@ -729,6 +1029,7 @@ export const componentRegistry = {
729
1029
  relatedComponents: ["input", "label", "form", "group"],
730
1030
  tags: ["form", "dropdown", "selection"],
731
1031
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible", "Screen reader friendly", "ARIA roles included"] },
1032
+ usage: undefined,
732
1033
  examples: [
733
1034
  {
734
1035
  "title": "Basic Select",
@@ -739,6 +1040,11 @@ export const componentRegistry = {
739
1040
  "title": "Searchable Select",
740
1041
  "description": "A filterable select component with search input. Type to filter through a large list of options.",
741
1042
  "code": "import React from 'react';\nimport { Select, Searchable } from 'ui-lab-components';\n\nconst countries = [\n { value: 'us', label: 'United States' },\n { value: 'ca', label: 'Canada' },\n { value: 'mx', label: 'Mexico' },\n { value: 'br', label: 'Brazil' },\n { value: 'ar', label: 'Argentina' },\n { value: 'uk', label: 'United Kingdom' },\n { value: 'fr', label: 'France' },\n { value: 'de', label: 'Germany' },\n { value: 'it', label: 'Italy' },\n { value: 'es', label: 'Spain' },\n { value: 'pt', label: 'Portugal' },\n { value: 'nl', label: 'Netherlands' },\n { value: 'be', label: 'Belgium' },\n { value: 'ch', label: 'Switzerland' },\n { value: 'at', label: 'Austria' },\n { value: 'se', label: 'Sweden' },\n { value: 'no', label: 'Norway' },\n { value: 'dk', label: 'Denmark' },\n { value: 'fi', label: 'Finland' },\n { value: 'pl', label: 'Poland' },\n { value: 'jp', label: 'Japan' },\n { value: 'cn', label: 'China' },\n { value: 'kr', label: 'South Korea' },\n { value: 'in', label: 'India' },\n { value: 'au', label: 'Australia' },\n { value: 'nz', label: 'New Zealand' },\n];\n\nexport default function Example() {\n return (\n <Select>\n <Searchable.Input placeholder=\"Search countries...\" />\n <Searchable.Content searchPlaceholder=\"Type to filter...\">\n {countries.map((country) => (\n <Select.Item key={country.value} value={country.value} textValue={country.label}>\n {country.label}\n </Select.Item>\n ))}\n </Searchable.Content>\n </Select>\n );\n}"
1043
+ },
1044
+ {
1045
+ "title": "Country Selector",
1046
+ "description": "Button trigger reveals a searchable country list with flags and dial codes inside the dropdown content.",
1047
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Select, Searchable } from 'ui-lab-components';\n\nconst countries = [\n { value: \"us\", label: \"United States\", flag: \"🇺🇸\", code: \"+1\" },\n { value: \"gb\", label: \"United Kingdom\", flag: \"🇬🇧\", code: \"+44\" },\n { value: \"de\", label: \"Germany\", flag: \"🇩🇪\", code: \"+49\" },\n { value: \"fr\", label: \"France\", flag: \"🇫🇷\", code: \"+33\" },\n { value: \"jp\", label: \"Japan\", flag: \"🇯🇵\", code: \"+81\" },\n { value: \"kr\", label: \"South Korea\", flag: \"🇰🇷\", code: \"+82\" },\n { value: \"cn\", label: \"China\", flag: \"🇨🇳\", code: \"+86\" },\n { value: \"in\", label: \"India\", flag: \"🇮🇳\", code: \"+91\" },\n { value: \"br\", label: \"Brazil\", flag: \"🇧🇷\", code: \"+55\" },\n { value: \"au\", label: \"Australia\", flag: \"🇦🇺\", code: \"+61\" },\n { value: \"ca\", label: \"Canada\", flag: \"🇨🇦\", code: \"+1\" },\n { value: \"mx\", label: \"Mexico\", flag: \"🇲🇽\", code: \"+52\" },\n];\n\nexport default function Example() {\n const [country, setCountry] = useState<string | number | null>(\"us\");\n const selected = countries.find(c => c.value === country);\n\n return (\n <Select\n selectedKey={country}\n valueLabel={selected?.label}\n onSelectionChange={setCountry}\n className=\"w-72\"\n >\n <Select.Trigger>\n <Select.Value\n placeholder=\"Choose a country...\"\n icon={selected && <span className=\"text-sm\">{selected.flag}</span>}\n />\n </Select.Trigger>\n <Searchable.Content searchPlaceholder=\"Search countries...\">\n {countries.map((c) => (\n <Select.Item key={c.value} value={c.value} textValue={c.label} icon={<span className=\"text-md\">{c.flag}</span>}>\n <div className=\"flex items-center justify-between w-full\">\n <span>{c.label}</span>\n <span className=\"ml-2 text-sm text-foreground-400\">{c.code}</span>\n </div>\n </Select.Item>\n ))}\n </Searchable.Content>\n </Select>\n );\n}"
742
1048
  }
743
1049
  ],
744
1050
  },
@@ -755,11 +1061,37 @@ export const componentRegistry = {
755
1061
  relatedComponents: ["input", "label"],
756
1062
  tags: ["form", "range", "numeric"],
757
1063
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible", "ARIA range role", "Arrow key support"] },
1064
+ usage: undefined,
758
1065
  examples: [
759
1066
  {
760
- "title": "Basic Slider",
761
- "description": "A simple range slider with a default value. Perfect for adjusting values within a range like volume or brightness.",
762
- "code": "import React from 'react';\nimport { Slider } from 'ui-lab-components';\n\nexport default function Example() {\n return <Slider.Root min={0} max={100} defaultValue={[50]} />;\n}"
1067
+ "title": "Volume Control",
1068
+ "description": "Horizontal slider with a label and live numeric readout.",
1069
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Slider } from 'ui-lab-components';\n\nexport default function Example() {\n const [volume, setVolume] = useState(60);\n\n return (\n <div className=\"flex items-center gap-4 w-72\">\n <span className=\"text-sm text-muted-foreground w-16\">Volume</span>\n <Slider\n aria-label=\"Volume\"\n value={volume}\n onValueChange={([v]) => setVolume(v)}\n className=\"flex-1\"\n />\n <span className=\"text-sm tabular-nums w-8 text-right\">{volume}</span>\n </div>\n );\n}"
1070
+ },
1071
+ {
1072
+ "title": "Settings Panel",
1073
+ "description": "Multiple sliders in a settings list with dividers.",
1074
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Slider } from 'ui-lab-components';\n\nexport default function Example() {\n const [brightness, setBrightness] = useState(80);\n const [contrast, setContrast] = useState(50);\n const [saturation, setSaturation] = useState(40);\n\n const settings = [\n { id: \"brightness\", label: \"Brightness\", value: brightness, onChange: (v: number[]) => setBrightness(v[0]) },\n { id: \"contrast\", label: \"Contrast\", value: contrast, onChange: (v: number[]) => setContrast(v[0]) },\n { id: \"saturation\", label: \"Saturation\", value: saturation, onChange: (v: number[]) => setSaturation(v[0]) },\n ];\n\n return (\n <div className=\"w-80 divide-y divide-border divide-background-700\">\n {settings.map(({ id, label, value, onChange }) => (\n <div key={id} className=\"flex items-center gap-4 py-3\">\n <span className=\"text-sm w-24 shrink-0\">{label}</span>\n <Slider aria-label={label} value={value} onValueChange={onChange} className=\"flex-1\" />\n <span className=\"text-sm tabular-nums w-8 text-right text-muted-foreground\">{value}</span>\n </div>\n ))}\n </div>\n );\n}"
1075
+ },
1076
+ {
1077
+ "title": "Price Range",
1078
+ "description": "Range slider with two thumbs for min/max filtering.",
1079
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Slider } from 'ui-lab-components';\n\nexport default function Example() {\n const [range, setRange] = useState([200, 800]);\n\n return (\n <div className=\"w-80 flex flex-col gap-4\">\n <div className=\"flex justify-between text-sm text-muted-foreground\">\n <span>Price range</span>\n <span>${range[0]} – ${range[1]}</span>\n </div>\n <Slider\n aria-label=\"Price range\"\n value={range}\n min={0}\n max={1000}\n step={10}\n onValueChange={setRange}\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>$0</span>\n <span>$1,000</span>\n </div>\n </div>\n );\n}"
1080
+ },
1081
+ {
1082
+ "title": "Step Slider",
1083
+ "description": "Slider constrained to discrete steps with tick labels.",
1084
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Slider } from 'ui-lab-components';\n\nexport default function Example() {\n const [rating, setRating] = useState(3);\n\n return (\n <div className=\"flex flex-col gap-3 w-64\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm\">Quality rating</label>\n <span className=\"text-sm font-medium\">{rating} / 5</span>\n </div>\n <Slider\n aria-label=\"Quality rating\"\n value={rating}\n min={1}\n max={5}\n step={1}\n onValueChange={([v]) => setRating(v)}\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n {[1, 2, 3, 4, 5].map((n) => (\n <span key={n}>{n}</span>\n ))}\n </div>\n </div>\n );\n}"
1085
+ },
1086
+ {
1087
+ "title": "Disabled State",
1088
+ "description": "Active and disabled sliders side by side.",
1089
+ "code": "import { Slider } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <div className=\"flex flex-col gap-4 w-64\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-sm text-muted-foreground w-20\">Active</span>\n <Slider aria-label=\"Active slider\" defaultValue={40} className=\"flex-1\" />\n </div>\n <div className=\"flex items-center gap-4\">\n <span className=\"text-sm text-muted-foreground w-20\">Disabled</span>\n <Slider aria-label=\"Disabled slider\" defaultValue={40} disabled className=\"flex-1\" />\n </div>\n </div>\n );\n}"
1090
+ },
1091
+ {
1092
+ "title": "Vertical Mixer",
1093
+ "description": "Vertical orientation for audio-style channel controls.",
1094
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Slider } from 'ui-lab-components';\n\nexport default function Example() {\n const [channels, setChannels] = useState([70, 50, 80, 40]);\n\n return (\n <div className=\"flex items-end gap-6 h-40\">\n {[\"CH1\", \"CH2\", \"CH3\", \"CH4\"].map((label, i) => (\n <div key={label} className=\"flex flex-col items-center gap-2\">\n <Slider\n aria-label={label}\n value={channels[i]}\n orientation=\"vertical\"\n onValueChange={([v]) => {\n const next = [...channels];\n next[i] = v;\n setChannels(next);\n }}\n style={{ height: 120 }}\n />\n <span className=\"text-xs text-muted-foreground\">{label}</span>\n </div>\n ))}\n </div>\n );\n}"
763
1095
  }
764
1096
  ],
765
1097
  },
@@ -776,11 +1108,32 @@ export const componentRegistry = {
776
1108
  relatedComponents: ["checkbox", "radio", "label"],
777
1109
  tags: ["form", "boolean", "toggle"],
778
1110
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible", "ARIA switch role", "Visual state indication"] },
1111
+ usage: undefined,
779
1112
  examples: [
780
1113
  {
781
- "title": "Basic Switch",
782
- "description": "A simple toggle switch component. Use for binary on/off states like enabling features or toggling settings.",
783
- "code": "import React from 'react';\nimport { Switch } from 'ui-lab-components';\n\nexport default function Example() {\n return <Switch />;\n}"
1114
+ "title": "Inline Form Field",
1115
+ "description": "Switch paired with a label in a horizontal form row.",
1116
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Switch } from 'ui-lab-components';\n\nexport default function Example() {\n const [enabled, setEnabled] = useState(false);\n\n return (\n <div className=\"flex items-center justify-between gap-4 w-64\">\n <label htmlFor=\"marketing\" className=\"text-sm\">\n Marketing emails\n </label>\n <Switch\n id=\"marketing\"\n aria-label=\"Marketing emails\"\n isSelected={enabled}\n onChange={setEnabled}\n />\n </div>\n );\n}"
1117
+ },
1118
+ {
1119
+ "title": "Settings Panel",
1120
+ "description": "A list of toggleable settings with dividers.",
1121
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Switch } from 'ui-lab-components';\n\nexport default function Example() {\n const [notifications, setNotifications] = useState(true);\n const [sounds, setSounds] = useState(false);\n const [badge, setBadge] = useState(true);\n\n const settings = [\n { id: \"notifications\", label: \"Push notifications\", value: notifications, onChange: setNotifications },\n { id: \"sounds\", label: \"Sound effects\", value: sounds, onChange: setSounds },\n { id: \"badge\", label: \"App badge\", value: badge, onChange: setBadge },\n ];\n\n return (\n <div className=\"w-72 divide-y divide-border\">\n {settings.map(({ id, label, value, onChange }) => (\n <div key={id} className=\"flex items-center justify-between py-3\">\n <span className=\"text-sm\">{label}</span>\n <Switch aria-label={label} isSelected={value} onChange={onChange} />\n </div>\n ))}\n </div>\n );\n}"
1122
+ },
1123
+ {
1124
+ "title": "Disabled State",
1125
+ "description": "Switch in both on and off disabled states.",
1126
+ "code": "import { Switch } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <Switch aria-label=\"Off disabled\" isDisabled defaultSelected={false} />\n <span className=\"text-sm text-muted-foreground\">Disabled off</span>\n </div>\n <div className=\"flex items-center gap-3\">\n <Switch aria-label=\"On disabled\" isDisabled defaultSelected={true} />\n <span className=\"text-sm text-muted-foreground\">Disabled on</span>\n </div>\n </div>\n );\n}"
1127
+ },
1128
+ {
1129
+ "title": "Small Size",
1130
+ "description": "Compact switch for dense UIs.",
1131
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Switch } from 'ui-lab-components';\n\nexport default function Example() {\n const [dense, setDense] = useState(false);\n\n return (\n <div className=\"flex items-center gap-2\">\n <Switch\n size=\"sm\"\n aria-label=\"Dense mode\"\n isSelected={dense}\n onChange={setDense}\n />\n <span className=\"text-sm text-muted-foreground\">Dense mode</span>\n </div>\n );\n}"
1132
+ },
1133
+ {
1134
+ "title": "Controlled Toggle",
1135
+ "description": "Fully controlled switch with external state and reset.",
1136
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Switch } from 'ui-lab-components';\n\nexport default function Example() {\n const [active, setActive] = useState(false);\n\n return (\n <div className=\"flex flex-col items-center gap-4\">\n <Switch\n aria-label=\"Feature flag\"\n isSelected={active}\n onChange={setActive}\n />\n <p className=\"text-xs text-muted-foreground\">\n Feature is <strong>{active ? \"enabled\" : \"disabled\"}</strong>\n </p>\n <button\n className=\"text-xs underline text-muted-foreground\"\n onClick={() => setActive(false)}\n >\n Reset\n </button>\n </div>\n );\n}"
784
1137
  }
785
1138
  ],
786
1139
  },
@@ -797,6 +1150,7 @@ export const componentRegistry = {
797
1150
  relatedComponents: ["card"],
798
1151
  tags: ["data", "table", "display"],
799
1152
  accessibility: { "hasAriaSupport": true, "notes": ["Table role", "Header associations", "Keyboard navigation"] },
1153
+ usage: undefined,
800
1154
  examples: [
801
1155
  {
802
1156
  "title": "Basic Table",
@@ -818,6 +1172,7 @@ export const componentRegistry = {
818
1172
  relatedComponents: ["card"],
819
1173
  tags: ["navigation", "organization", "content-switching"],
820
1174
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard navigation", "ARIA tab roles", "Focus management"] },
1175
+ usage: undefined,
821
1176
  examples: [
822
1177
  {
823
1178
  "title": "Basic Tabs",
@@ -828,6 +1183,16 @@ export const componentRegistry = {
828
1183
  "title": "Vertical Tabs (Sidebar)",
829
1184
  "description": "A vertical tab layout ideal for settings pages or sidebar navigation. Tabs are stacked vertically with content panels beside them.",
830
1185
  "code": "import React from 'react';\nimport { Tabs, Card } from 'ui-lab-components';\nimport { User, Settings, Bell, Shield } from 'lucide-react';\n\nexport default function Example() {\n return (\n <div className=\"flex items-center justify-center bg-background-950 p-4 min-h-[400px]\">\n <Card className=\"w-full max-w-2xl\">\n <Tabs default=\"profile\" className=\"flex flex-row\">\n {/* Vertical tab list - styled as sidebar */}\n <Tabs.List\n aria-label=\"Settings sections\"\n className=\"flex-col items-stretch justify-start h-auto w-48 border-r border-background-700 rounded-none bg-transparent p-2\"\n >\n <Tabs.Trigger value=\"profile\" icon={<User className=\"w-4 h-4\" />} className=\"justify-start\">\n Profile\n </Tabs.Trigger>\n <Tabs.Trigger value=\"notifications\" icon={<Bell className=\"w-4 h-4\" />} className=\"justify-start\">\n Notifications\n </Tabs.Trigger>\n <Tabs.Trigger value=\"security\" icon={<Shield className=\"w-4 h-4\" />} className=\"justify-start\">\n Security\n </Tabs.Trigger>\n <Tabs.Trigger value=\"preferences\" icon={<Settings className=\"w-4 h-4\" />} className=\"justify-start\">\n Preferences\n </Tabs.Trigger>\n </Tabs.List>\n\n {/* Content panels */}\n <div className=\"flex-1 p-6\">\n <Tabs.Content value=\"profile\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">Profile Settings</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Manage your personal information and how others see you on the platform.\n </p>\n <div className=\"space-y-3\">\n <div className=\"h-10 w-full bg-background-800 rounded border border-background-700\" />\n <div className=\"h-10 w-full bg-background-800 rounded border border-background-700\" />\n <div className=\"h-10 w-2/3 bg-background-800 rounded border border-background-700\" />\n </div>\n </Tabs.Content>\n\n <Tabs.Content value=\"notifications\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">Notification Preferences</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Control how and when you receive alerts and updates.\n </p>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-5 bg-accent-500 rounded\" />\n <div className=\"h-4 w-32 bg-background-800 rounded\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-5 bg-background-700 rounded\" />\n <div className=\"h-4 w-40 bg-background-800 rounded\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-5 bg-accent-500 rounded\" />\n <div className=\"h-4 w-28 bg-background-800 rounded\" />\n </div>\n </div>\n </Tabs.Content>\n\n <Tabs.Content value=\"security\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">Security Settings</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Protect your account with passwords, two-factor authentication, and more.\n </p>\n <div className=\"space-y-3\">\n <div className=\"p-3 bg-background-800 rounded border border-background-700\">\n <div className=\"h-4 w-24 bg-background-700 rounded mb-2\" />\n <div className=\"h-3 w-48 bg-background-700/50 rounded\" />\n </div>\n <div className=\"p-3 bg-background-800 rounded border border-background-700\">\n <div className=\"h-4 w-32 bg-background-700 rounded mb-2\" />\n <div className=\"h-3 w-40 bg-background-700/50 rounded\" />\n </div>\n </div>\n </Tabs.Content>\n\n <Tabs.Content value=\"preferences\" className=\"mt-0\">\n <h3 className=\"text-lg font-semibold text-foreground-100 mb-2\">General Preferences</h3>\n <p className=\"text-foreground-400 text-sm mb-4\">\n Customize your experience with theme, language, and display options.\n </p>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n <div className=\"h-20 bg-background-800 rounded border border-background-700\" />\n </div>\n </Tabs.Content>\n </div>\n </Tabs>\n </Card>\n </div>\n );\n}"
1186
+ },
1187
+ {
1188
+ "title": "Underline Variant",
1189
+ "description": "Horizontal tabs with underline indicator. Great for documentation sites.",
1190
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Tabs } from 'ui-lab-components';\n\nexport default function Example() {\n const [selected, setSelected] = useState(\"tab1\");\n\n return (\n <Tabs value={selected} onValueChange={setSelected} variant=\"underline\" className=\"w-fit\">\n <Tabs.List aria-label=\"Tab options\">\n <Tabs.Trigger value=\"tab1\">Install</Tabs.Trigger>\n <Tabs.Trigger value=\"tab2\">Usage</Tabs.Trigger>\n <Tabs.Trigger value=\"tab3\">API</Tabs.Trigger>\n </Tabs.List>\n </Tabs>\n );\n}"
1191
+ },
1192
+ {
1193
+ "title": "Vertical Underline",
1194
+ "description": "Vertical tabs with underline variant indicator.",
1195
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { Tabs } from 'ui-lab-components';\n\nexport default function Example() {\n const [selected, setSelected] = useState(\"tab1\");\n\n return (\n <Tabs value={selected} onValueChange={setSelected} variant=\"underline\" orientation=\"vertical\" className=\"flex w-fit gap-4\">\n <Tabs.List aria-label=\"Tab options\" className=\"flex flex-col w-fit\">\n <Tabs.Trigger value=\"tab1\">Profile</Tabs.Trigger>\n <Tabs.Trigger value=\"tab2\">Billing</Tabs.Trigger>\n <Tabs.Trigger value=\"tab3\">Team</Tabs.Trigger>\n </Tabs.List>\n </Tabs>\n );\n}"
831
1196
  }
832
1197
  ],
833
1198
  },
@@ -844,11 +1209,32 @@ export const componentRegistry = {
844
1209
  relatedComponents: ["input", "label", "form"],
845
1210
  tags: ["form", "text", "multi-line"],
846
1211
  accessibility: { "hasAriaSupport": true, "notes": ["Works with label elements", "Resizable option available"] },
1212
+ usage: undefined,
847
1213
  examples: [
848
1214
  {
849
- "title": "Basic TextArea",
850
- "description": "A simple multi-line text input field. Use this for collecting longer text input like comments or descriptions.",
851
- "code": "import React from 'react';\nimport { TextArea } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <TextArea\n placeholder=\"Enter your comments here...\"\n rows={4}\n />\n );\n}"
1215
+ "title": "Feedback Form",
1216
+ "description": "TextArea with a character limit and submit button disabled until the user types.",
1217
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { TextArea, Flex, Button } from 'ui-lab-components';\n\nexport default function Example() {\n const [value, setValue] = useState(\"\");\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 380 }}>\n <TextArea\n placeholder=\"Tell us what you think...\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n showCharacterCount\n maxCharacters={300}\n rows={4}\n />\n <Button variant=\"primary\" disabled={value.trim().length === 0} className=\"self-end\">\n Submit\n </Button>\n </Flex>\n );\n}"
1218
+ },
1219
+ {
1220
+ "title": "Profile Bio",
1221
+ "description": "Fixed-height settings textarea with a 160-character cap and save/clear actions.",
1222
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { TextArea, Flex, Button } from 'ui-lab-components';\n\nexport default function Example() {\n const [bio, setBio] = useState(\"UI designer & developer building minimal tools.\");\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 380 }}>\n <TextArea\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n showCharacterCount\n maxCharacters={160}\n rows={3}\n resizable={false}\n />\n <Flex justify=\"end\" gap=\"sm\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setBio(\"\")}>Clear</Button>\n <Button size=\"sm\" variant=\"primary\">Save</Button>\n </Flex>\n </Flex>\n );\n}"
1223
+ },
1224
+ {
1225
+ "title": "Validation Error",
1226
+ "description": "Error styling triggered when the input is non-empty but below a minimum length.",
1227
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { TextArea, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [value, setValue] = useState(\"\");\n const hasError = value.trim().length > 0 && value.trim().length < 20;\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 380 }}>\n <TextArea\n placeholder=\"Describe the issue in detail...\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n error={hasError}\n rows={4}\n />\n {hasError && (\n <span style={{ fontSize: \"0.75rem\", color: \"var(--color-destructive)\" }}>\n Description must be at least 20 characters.\n </span>\n )}\n </Flex>\n );\n}"
1228
+ },
1229
+ {
1230
+ "title": "Disabled & Read-only",
1231
+ "description": "Side-by-side disabled and read-only states to compare their visual treatment.",
1232
+ "code": "import { TextArea, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n return (\n <Flex direction=\"column\" gap=\"md\" style={{ width: 380 }}>\n <TextArea\n value=\"This field is disabled and cannot be edited.\"\n disabled\n rows={2}\n resizable={false}\n />\n <TextArea\n value=\"This is a read-only note visible to all team members.\"\n readOnly\n rows={2}\n resizable={false}\n />\n </Flex>\n );\n}"
1233
+ },
1234
+ {
1235
+ "title": "Scrollable with maxHeight",
1236
+ "description": "TextArea bounded by a max height — content scrolls once it overflows.",
1237
+ "code": "\"use client\";\n\nimport { useState } from 'react';\nimport { TextArea, Flex } from 'ui-lab-components';\n\nexport default function Example() {\n const [value, setValue] = useState(\n \"Line 1\\nLine 2\\nLine 3\\nLine 4\\nLine 5\\nLine 6\\nLine 7\\nLine 8\"\n );\n\n return (\n <Flex direction=\"column\" gap=\"sm\" style={{ width: 380 }}>\n <TextArea\n value={value}\n onChange={(e) => setValue(e.target.value)}\n maxHeight=\"120px\"\n resizable={false}\n />\n </Flex>\n );\n}"
852
1238
  }
853
1239
  ],
854
1240
  },
@@ -866,6 +1252,7 @@ export const componentRegistry = {
866
1252
  relatedComponents: [],
867
1253
  tags: ["notification", "feedback", "temporary"],
868
1254
  accessibility: { "hasAriaSupport": true, "notes": ["ARIA live regions", "Role=\"status\"", "Auto-dismiss support"] },
1255
+ usage: undefined,
869
1256
  examples: [
870
1257
  {
871
1258
  "title": "Basic Toast",
@@ -907,6 +1294,7 @@ export const componentRegistry = {
907
1294
  relatedComponents: ["popover"],
908
1295
  tags: ["information", "hover", "help-text"],
909
1296
  accessibility: { "hasAriaSupport": true, "notes": ["Keyboard accessible", "ARIA labels", "Focus management"] },
1297
+ usage: undefined,
910
1298
  examples: [
911
1299
  {
912
1300
  "title": "Basic Tooltip",