@nexus-cross/design-system 1.0.14 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/claude-rules/nexus/CLAUDE.md +85 -0
  2. package/claude-rules/nexus/commands/nexus-audit.md +79 -0
  3. package/claude-rules/nexus/commands/nexus-component-map.md +85 -0
  4. package/claude-rules/nexus/commands/nexus-token-check.md +68 -0
  5. package/claude-rules/nexus/skills/nexus-design-system/SKILL.md +92 -0
  6. package/cursor-rules/nexus-ui-api.mdc +910 -41
  7. package/cursor-rules/nexus-ui-decisions.mdc +263 -0
  8. package/dist/accordion.js +0 -1
  9. package/dist/accordion.mjs +0 -1
  10. package/dist/alert.js +0 -1
  11. package/dist/alert.mjs +0 -1
  12. package/dist/avatar.js +0 -1
  13. package/dist/avatar.mjs +0 -1
  14. package/dist/badge.js +0 -1
  15. package/dist/badge.mjs +0 -1
  16. package/dist/breadcrumb.js +0 -1
  17. package/dist/breadcrumb.mjs +0 -1
  18. package/dist/button.js +0 -1
  19. package/dist/button.mjs +0 -1
  20. package/dist/carousel.js +0 -1
  21. package/dist/carousel.mjs +0 -1
  22. package/dist/checkbox.js +0 -1
  23. package/dist/checkbox.mjs +0 -1
  24. package/dist/chip.js +0 -1
  25. package/dist/chip.mjs +0 -1
  26. package/dist/chunks/chunk-2Z52NPWB.js +78 -0
  27. package/dist/chunks/chunk-3SCSND6S.js +7 -0
  28. package/dist/chunks/chunk-46P52MFM.mjs +56 -0
  29. package/dist/chunks/chunk-AG2UJPFX.mjs +621 -0
  30. package/dist/chunks/{chunk-33UFQJIO.mjs → chunk-BJMXZJWO.mjs} +16 -5
  31. package/dist/chunks/{chunk-YZV6FWE7.js → chunk-JLDQNDFT.js} +16 -5
  32. package/dist/chunks/{chunk-K574BYHQ.js → chunk-K3CK7NTP.js} +22 -4
  33. package/dist/chunks/{chunk-Z4YM7LU3.mjs → chunk-PIGHBDK5.mjs} +22 -4
  34. package/dist/chunks/chunk-QWK4CLS2.mjs +5 -0
  35. package/dist/chunks/chunk-RC2Y4UH7.js +648 -0
  36. package/dist/chunks/{chunk-PEIEVKD5.js → chunk-RCIBLLSF.js} +11 -12
  37. package/dist/chunks/{chunk-K2TBLM3F.mjs → chunk-THBE27U3.mjs} +11 -12
  38. package/dist/client-only.js +0 -1
  39. package/dist/client-only.mjs +0 -1
  40. package/dist/combobox.js +28 -0
  41. package/dist/combobox.mjs +3 -0
  42. package/dist/components/Combobox.d.ts +93 -0
  43. package/dist/components/Combobox.d.ts.map +1 -0
  44. package/dist/components/DataGrid.d.ts +44 -0
  45. package/dist/components/DataGrid.d.ts.map +1 -0
  46. package/dist/components/DataList.d.ts +3 -1
  47. package/dist/components/DataList.d.ts.map +1 -1
  48. package/dist/components/RadioGroup.d.ts +4 -0
  49. package/dist/components/RadioGroup.d.ts.map +1 -1
  50. package/dist/components/ToggleGroup.d.ts +2 -1
  51. package/dist/components/ToggleGroup.d.ts.map +1 -1
  52. package/dist/countdown.js +0 -1
  53. package/dist/countdown.mjs +0 -1
  54. package/dist/counter.js +0 -1
  55. package/dist/counter.mjs +0 -1
  56. package/dist/data-grid.js +14 -0
  57. package/dist/data-grid.mjs +5 -0
  58. package/dist/data-list.js +2 -3
  59. package/dist/data-list.mjs +1 -2
  60. package/dist/date-picker.js +0 -1
  61. package/dist/date-picker.mjs +0 -1
  62. package/dist/divider.js +0 -1
  63. package/dist/divider.mjs +0 -1
  64. package/dist/drawer.js +0 -1
  65. package/dist/drawer.mjs +0 -1
  66. package/dist/dropdown-menu.js +0 -1
  67. package/dist/dropdown-menu.mjs +0 -1
  68. package/dist/ellipsis.js +0 -1
  69. package/dist/ellipsis.mjs +0 -1
  70. package/dist/empty-state.js +0 -1
  71. package/dist/empty-state.mjs +0 -1
  72. package/dist/error-boundary.js +0 -1
  73. package/dist/error-boundary.mjs +0 -1
  74. package/dist/hooks/useCheckDevice.js +0 -1
  75. package/dist/hooks/useCheckDevice.mjs +0 -1
  76. package/dist/hooks/useClickOutside.js +0 -1
  77. package/dist/hooks/useClickOutside.mjs +0 -1
  78. package/dist/hooks/useDraggableBottomSheet.js +0 -1
  79. package/dist/hooks/useDraggableBottomSheet.mjs +0 -1
  80. package/dist/hooks/useDraggableWindow.js +0 -1
  81. package/dist/hooks/useDraggableWindow.mjs +0 -1
  82. package/dist/hooks/useInView.js +0 -1
  83. package/dist/hooks/useInView.mjs +0 -1
  84. package/dist/hooks/useModal.js +0 -1
  85. package/dist/hooks/useModal.mjs +0 -1
  86. package/dist/image-upload.js +0 -1
  87. package/dist/image-upload.mjs +0 -1
  88. package/dist/index.d.ts +4 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +101 -85
  91. package/dist/index.mjs +11 -11
  92. package/dist/infinite-scroll.js +0 -1
  93. package/dist/infinite-scroll.mjs +0 -1
  94. package/dist/marquee.js +0 -1
  95. package/dist/marquee.mjs +0 -1
  96. package/dist/modal/index.js +11 -12
  97. package/dist/modal/index.mjs +2 -3
  98. package/dist/number-input.js +0 -1
  99. package/dist/number-input.mjs +0 -1
  100. package/dist/nx-image.js +0 -1
  101. package/dist/nx-image.mjs +0 -1
  102. package/dist/pagination.js +0 -1
  103. package/dist/pagination.mjs +0 -1
  104. package/dist/popover.js +0 -1
  105. package/dist/popover.mjs +0 -1
  106. package/dist/price-input.js +0 -1
  107. package/dist/price-input.mjs +0 -1
  108. package/dist/progress.js +0 -1
  109. package/dist/progress.mjs +0 -1
  110. package/dist/radio-group.js +5 -6
  111. package/dist/radio-group.mjs +1 -2
  112. package/dist/schemas/_all.json +353 -117
  113. package/dist/schemas/accordion.d.ts.map +1 -1
  114. package/dist/schemas/accordion.json +1 -1
  115. package/dist/schemas/alert.d.ts.map +1 -1
  116. package/dist/schemas/alert.json +1 -1
  117. package/dist/schemas/avatar.d.ts.map +1 -1
  118. package/dist/schemas/avatar.json +1 -1
  119. package/dist/schemas/badge.d.ts.map +1 -1
  120. package/dist/schemas/badge.json +1 -1
  121. package/dist/schemas/breadcrumb.d.ts.map +1 -1
  122. package/dist/schemas/breadcrumb.json +1 -1
  123. package/dist/schemas/button.d.ts.map +1 -1
  124. package/dist/schemas/button.json +1 -1
  125. package/dist/schemas/carousel.d.ts.map +1 -1
  126. package/dist/schemas/carousel.json +1 -1
  127. package/dist/schemas/checkBox.json +1 -1
  128. package/dist/schemas/checkbox.d.ts.map +1 -1
  129. package/dist/schemas/chip.d.ts.map +1 -1
  130. package/dist/schemas/chip.json +1 -1
  131. package/dist/schemas/client-only.d.ts.map +1 -1
  132. package/dist/schemas/clientOnly.json +1 -1
  133. package/dist/schemas/combobox.d.ts +108 -0
  134. package/dist/schemas/combobox.d.ts.map +1 -0
  135. package/dist/schemas/combobox.json +98 -0
  136. package/dist/schemas/comboboxOption.json +35 -0
  137. package/dist/schemas/comboboxOptionDescription.json +20 -0
  138. package/dist/schemas/comboboxOptionMeta.json +20 -0
  139. package/dist/schemas/countdown.d.ts.map +1 -1
  140. package/dist/schemas/countdown.json +1 -1
  141. package/dist/schemas/counter.d.ts.map +1 -1
  142. package/dist/schemas/counter.json +1 -1
  143. package/dist/schemas/data-grid.d.ts +74 -0
  144. package/dist/schemas/data-grid.d.ts.map +1 -0
  145. package/dist/schemas/data-list.d.ts.map +1 -1
  146. package/dist/schemas/dataGrid.json +102 -0
  147. package/dist/schemas/dataList.json +1 -1
  148. package/dist/schemas/date-picker.d.ts.map +1 -1
  149. package/dist/schemas/datePicker.json +1 -1
  150. package/dist/schemas/divider.d.ts.map +1 -1
  151. package/dist/schemas/divider.json +1 -1
  152. package/dist/schemas/drawer.d.ts.map +1 -1
  153. package/dist/schemas/drawer.json +1 -1
  154. package/dist/schemas/dropdown-menu.d.ts.map +1 -1
  155. package/dist/schemas/dropdownMenu.json +1 -1
  156. package/dist/schemas/ellipsis.d.ts.map +1 -1
  157. package/dist/schemas/ellipsis.json +1 -1
  158. package/dist/schemas/empty-state.d.ts.map +1 -1
  159. package/dist/schemas/emptyState.json +1 -1
  160. package/dist/schemas/error-boundary.d.ts.map +1 -1
  161. package/dist/schemas/errorBoundary.json +1 -1
  162. package/dist/schemas/image-upload.d.ts.map +1 -1
  163. package/dist/schemas/imageUpload.json +1 -1
  164. package/dist/schemas/index.d.ts +2 -1
  165. package/dist/schemas/index.d.ts.map +1 -1
  166. package/dist/schemas/infinite-scroll.d.ts.map +1 -1
  167. package/dist/schemas/infiniteScroll.json +1 -1
  168. package/dist/schemas/marquee.d.ts.map +1 -1
  169. package/dist/schemas/marquee.json +1 -1
  170. package/dist/schemas/modal.d.ts.map +1 -1
  171. package/dist/schemas/modalTemplate.json +1 -1
  172. package/dist/schemas/number-input.d.ts.map +1 -1
  173. package/dist/schemas/numberInput.json +1 -1
  174. package/dist/schemas/nx-image.d.ts.map +1 -1
  175. package/dist/schemas/nxImage.json +1 -1
  176. package/dist/schemas/pagination.d.ts.map +1 -1
  177. package/dist/schemas/pagination.json +1 -1
  178. package/dist/schemas/popover.d.ts.map +1 -1
  179. package/dist/schemas/popover.json +1 -1
  180. package/dist/schemas/price-input.d.ts.map +1 -1
  181. package/dist/schemas/priceInput.json +1 -1
  182. package/dist/schemas/progress.d.ts.map +1 -1
  183. package/dist/schemas/progress.json +1 -1
  184. package/dist/schemas/radio-group.d.ts +9 -0
  185. package/dist/schemas/radio-group.d.ts.map +1 -1
  186. package/dist/schemas/radioGroup.json +10 -1
  187. package/dist/schemas/radioItem.json +11 -0
  188. package/dist/schemas/select.d.ts.map +1 -1
  189. package/dist/schemas/select.json +1 -1
  190. package/dist/schemas/skeleton.d.ts.map +1 -1
  191. package/dist/schemas/skeleton.json +1 -1
  192. package/dist/schemas/slider.d.ts.map +1 -1
  193. package/dist/schemas/slider.json +1 -1
  194. package/dist/schemas/spinner.d.ts.map +1 -1
  195. package/dist/schemas/spinner.json +1 -1
  196. package/dist/schemas/stepper.d.ts.map +1 -1
  197. package/dist/schemas/stepper.json +1 -1
  198. package/dist/schemas/switch.d.ts.map +1 -1
  199. package/dist/schemas/switch.json +1 -1
  200. package/dist/schemas/tab.d.ts.map +1 -1
  201. package/dist/schemas/tab.json +1 -1
  202. package/dist/schemas/table.d.ts.map +1 -1
  203. package/dist/schemas/table.json +1 -1
  204. package/dist/schemas/tableRow.json +1 -1
  205. package/dist/schemas/tag-input.d.ts.map +1 -1
  206. package/dist/schemas/tagInput.json +1 -1
  207. package/dist/schemas/tdColumn.json +1 -1
  208. package/dist/schemas/text-area.d.ts.map +1 -1
  209. package/dist/schemas/text-input.d.ts +2 -2
  210. package/dist/schemas/text-input.d.ts.map +1 -1
  211. package/dist/schemas/textArea.json +1 -1
  212. package/dist/schemas/textInput.json +1 -1
  213. package/dist/schemas/toast.d.ts.map +1 -1
  214. package/dist/schemas/toastOptions.json +1 -1
  215. package/dist/schemas/toaster.json +1 -1
  216. package/dist/schemas/toggle-group.d.ts +6 -3
  217. package/dist/schemas/toggle-group.d.ts.map +1 -1
  218. package/dist/schemas/toggleGroup.json +9 -3
  219. package/dist/schemas/tooltip.d.ts.map +1 -1
  220. package/dist/schemas/tooltip.json +1 -1
  221. package/dist/schemas/virtual-scroll.d.ts.map +1 -1
  222. package/dist/schemas/virtualGrid.json +1 -1
  223. package/dist/schemas/virtualList.json +1 -1
  224. package/dist/schemas.js +928 -66
  225. package/dist/schemas.mjs +924 -66
  226. package/dist/select.js +0 -1
  227. package/dist/select.mjs +0 -1
  228. package/dist/skeleton.js +0 -1
  229. package/dist/skeleton.mjs +0 -1
  230. package/dist/slider.js +0 -1
  231. package/dist/slider.mjs +0 -1
  232. package/dist/spinner.js +0 -1
  233. package/dist/spinner.mjs +0 -1
  234. package/dist/stepper.js +0 -1
  235. package/dist/stepper.mjs +0 -1
  236. package/dist/styles/.generated/built.d.ts +1 -1
  237. package/dist/styles/.generated/built.d.ts.map +1 -1
  238. package/dist/styles/layer.js +2 -3
  239. package/dist/styles/layer.mjs +1 -2
  240. package/dist/styles.css +484 -13
  241. package/dist/styles.js +2 -3
  242. package/dist/styles.layered.css +484 -13
  243. package/dist/styles.mjs +1 -2
  244. package/dist/switch.js +0 -1
  245. package/dist/switch.mjs +0 -1
  246. package/dist/tab.js +0 -1
  247. package/dist/tab.mjs +0 -1
  248. package/dist/table.js +0 -1
  249. package/dist/table.mjs +0 -1
  250. package/dist/tag-input.js +0 -1
  251. package/dist/tag-input.mjs +0 -1
  252. package/dist/text-area.js +0 -1
  253. package/dist/text-area.mjs +0 -1
  254. package/dist/text-input.js +0 -1
  255. package/dist/text-input.mjs +0 -1
  256. package/dist/toast.js +0 -1
  257. package/dist/toast.mjs +0 -1
  258. package/dist/toggle-group.js +3 -4
  259. package/dist/toggle-group.mjs +1 -2
  260. package/dist/tooltip.js +0 -1
  261. package/dist/tooltip.mjs +0 -1
  262. package/dist/utils/cn.js +0 -1
  263. package/dist/utils/cn.mjs +0 -1
  264. package/dist/utils/scroll.js +0 -1
  265. package/dist/utils/scroll.mjs +0 -1
  266. package/dist/virtual-scroll.js +0 -1
  267. package/dist/virtual-scroll.mjs +0 -1
  268. package/package.json +14 -8
  269. package/scripts/setup-cursor-rules.cjs +164 -27
  270. package/dist/chunks/chunk-22ULI3BF.js +0 -21
  271. package/dist/chunks/chunk-CVYXRSXT.mjs +0 -8
  272. package/dist/chunks/chunk-I252NERB.mjs +0 -21
  273. package/dist/chunks/chunk-JNMCYWGY.js +0 -10
  274. package/dist/chunks/chunk-LAOQRXCE.js +0 -7
  275. package/dist/chunks/chunk-S6ODYMFP.mjs +0 -5
  276. package/dist/components/ThemeProvider.d.ts +0 -25
  277. package/dist/components/ThemeProvider.d.ts.map +0 -1
  278. package/dist/schemas/theme-provider.d.ts +0 -36
  279. package/dist/schemas/theme-provider.d.ts.map +0 -1
  280. package/dist/schemas/themeProvider.json +0 -65
  281. package/dist/theme-provider.js +0 -15
  282. package/dist/theme-provider.mjs +0 -2
  283. package/dist/chunks/{chunk-CWMLTXOH.mjs → chunk-5ZVPTIL3.mjs} +1 -1
  284. package/dist/chunks/{chunk-HFBTS42N.js → chunk-7F4SOLAC.js} +1 -1
@@ -98,7 +98,7 @@
98
98
  "items"
99
99
  ],
100
100
  "additionalProperties": false,
101
- "description": "Accordion. Supports both items array and composable patterns."
101
+ "description": "Accordion collapsible content sections (FAQ, settings groups).\n\nWHEN TO USE:\n • FAQ, help docs, settings groups\n • Long page where each section is independently scannable\n • Hidden critical info — DO NOT bury what users always need\n • Tab-like content switching → Tab (Accordion is for stacked, not exclusive)\n\ntype=\"single\" + collapsible=true → all-closed allowed (recommended for FAQ).\ntype=\"multiple\" → multiple sections open at once.\n\nANTI-PATTERNS:\n ✗ Hiding the page's primary content inside collapsed Accordion\n ✗ Single-section Accordion (just show the content)\n ✗ Custom toggle div + state — use Accordion (gets a11y, keyboard nav)"
102
102
  }
103
103
  },
104
104
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -147,7 +147,7 @@
147
147
  }
148
148
  },
149
149
  "additionalProperties": false,
150
- "description": "Alert / Banner. Inline notification with icon, title, description."
150
+ "description": "Alert persistent inline notification (banner). Auto icon by variant.\n\nWHEN TO USE:\n • In-page status: form errors, server warnings, info banners, success confirmation\n • Transient toast/snackbar → use a toast library, NOT Alert\n • Modal-blocking error → Modal with semantic=\"danger\"\n • Inline form field error → use error/description prop on TextInput / Select / etc.\n\nvariant maps to semantic colors. closable=true gives users dismiss control. action prop reserved for inline buttons (e.g. \"Retry\").\n\nANTI-PATTERNS:\n ✗ Stacking 5 alerts at top of page (use one with summary)\n ✗ Critical destructive action confirmation in Alert → Modal\n ✗ Wrapping <div className=\"bg-red-100\"> manually → Alert (a11y role + tokens)"
151
151
  }
152
152
  },
153
153
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -202,7 +202,7 @@
202
202
  }
203
203
  },
204
204
  "additionalProperties": false,
205
- "description": "Avatar. Supports image, fallback text, and children."
205
+ "description": "Avatar user/entity profile image with text fallback.\n\nWHEN TO USE:\n • User profiles, comment authors, team member lists, message sender icons\n • Image fails / not provided → fallback (initials or icon) shown automatically\n • Need optimized image (Next.js) → pass <Image> via children, omit src\n • Larger illustration / logo → use NxImage instead\n\nshape=\"square\" for organization/team logos; \"circle\" for people (default).\n\nANTI-PATTERNS:\n ✗ <img> + manual fallback handling → Avatar (handles error)\n ✗ Avatar without alt for screen readers (always set alt or aria-label)\n ✗ Mixing avatar sizes inconsistently in a list — pick one size"
206
206
  }
207
207
  },
208
208
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -278,7 +278,7 @@
278
278
  }
279
279
  },
280
280
  "additionalProperties": false,
281
- "description": "Badge indicator. Dot or count display. Wraps children when provided."
281
+ "description": "Badge — small status / count indicator overlaid on an anchor (icon, avatar, button).\n\nWHEN TO USE:\n • Notification count on bell icon\n • Unread message count on inbox tab\n • Status dot (online/offline) → dot=true\n • Status label with text (e.g. \"PRO\", \"NEW\") → Chip variant=\"accent\"\n • Removable filter token → Chip with onClose\n\ncount={0} hides badge by default; pass showZero=true to keep visible.\n\nANTI-PATTERNS:\n ✗ Using Badge as standalone label without anchor → Chip\n ✗ count > 999 without max → ugly layout; default max=99 (\"99+\")\n ✗ Multiple badges on same anchor (visual noise)"
282
282
  }
283
283
  },
284
284
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -305,7 +305,7 @@
305
305
  }
306
306
  },
307
307
  "additionalProperties": false,
308
- "description": "Breadcrumb navigation (compound component pattern). Use <Breadcrumb.Item> children instead of items array. Each Item can wrap arbitrary ReactNode (Link, Select, plain text, etc.)."
308
+ "description": "Breadcrumb — hierarchical location navigation (Home > Settings > Profile).\n\nWHEN TO USE:\n • Multi-level information architecture (>=3 levels deep)\n • Hierarchical category drill-down (file system, taxonomy)\n • Step-based linear flow → Stepper (not Breadcrumb)\n • Tab switching → Tab\n • Single-level navigation → page title alone\n\nCompound pattern: use <Breadcrumb.Item> children. Each Item wraps any ReactNode (Link, Select, plain text). Use maxItems for long paths (auto-collapse with \"…\").\n\nANTI-PATTERNS:\n ✗ Breadcrumb with 1 level — just show page title\n ✗ Breadcrumb with > 6 visible items → set maxItems\n ✗ Last item as a link (it's the current page; should be plain text)"
309
309
  }
310
310
  },
311
311
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -394,7 +394,7 @@
394
394
  }
395
395
  },
396
396
  "additionalProperties": false,
397
- "description": "Interactive button. semantic(color) x variant(style) 2-axis system. Rendering element changeable via asChild."
397
+ "description": "Interactive button (always prefer over native <button>).\n\nWHEN TO USE: any clickable action — submit, navigate (with asChild), open modal, trigger menu.\n2-axis: semantic (color intent) × variant (visual weight). Use semantic=\"primary\" for the page's main CTA, \"danger\" for destructive actions, \"secondary\" for sub actions, \"normal\" for neutral.\n\nANTI-PATTERNS:\n ✗ <button className=\"bg-blue-500\"> <Button semantic=\"primary\">\n ✗ <a className=\"...\"> styled as button → <Button asChild><a href=\"...\"/></Button>\n ✗ Mixing variants randomly within one row — pick one per visual hierarchy level\n ✗ Using primary + contained for every button → only ONE primary CTA per view\n ✗ <Button className=\"!bg-red-500\"> → <Button semantic=\"danger\"> (no !important)"
398
398
  }
399
399
  },
400
400
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -426,7 +426,7 @@
426
426
  }
427
427
  },
428
428
  "additionalProperties": false,
429
- "description": "Carousel. Based on Embla Carousel. Sub-components: CarouselSlide, CarouselPrev, CarouselNext, CarouselDots."
429
+ "description": "Carousel — horizontal slide gallery. Based on Embla Carousel. Compound: CarouselSlide, CarouselPrev/Next, CarouselDots.\n\nWHEN TO USE:\n • Hero banners, image gallery, product showcase\n • Multi-card horizontal scroll with snap behavior\n • Vertical scrolling list → Marquee or VirtualList (not Carousel)\n • Critical content that must always be visible — Carousel hides slides\n\nopts={{ loop: true, align: 'start' }} for endless loop. Add Embla autoplay plugin for auto-advance.\n\nANTI-PATTERNS:\n ✗ Critical CTA inside non-first slide (users might never scroll)\n ✗ Auto-advance without pause-on-hover (a11y)\n ✗ Manual scroll-snap div → Carousel (gets keyboard nav, indicators)"
430
430
  }
431
431
  },
432
432
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -558,7 +558,7 @@
558
558
  }
559
559
  },
560
560
  "additionalProperties": false,
561
- "description": "Checkbox. Native input-based, supports square/round shapes."
561
+ "description": "Checkbox for multi-select form fields. Native input-based, supports square/round shapes.\n\nWHEN TO USE:\n • Form field with multiple independent options (T&C agreements, multi-select filters submitted later)\n • Tri-state (parent-child selection) — use indeterminate prop\n • Single binary that takes effect immediately → Switch instead\n • Many options with search → Combobox (multiple)\n\nINDETERMINATE: set indeterminate=true when some children are checked, others not. aria-checked becomes \"mixed\" automatically.\n\nANTI-PATTERNS:\n ✗ <CheckBox> for \"Enable dark mode\" toggle → <Switch>\n ✗ Native <input type=\"checkbox\"> + manual styling → <CheckBox>\n ✗ Forgetting indeterminate for \"select all\" parent"
562
562
  }
563
563
  },
564
564
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -613,7 +613,7 @@
613
613
  }
614
614
  },
615
615
  "additionalProperties": false,
616
- "description": "Chip/tag/badge. Close button displayed via onClose prop."
616
+ "description": "Chip — small interactive token for filters, tags, removable selections, status labels.\n\nWHEN TO USE:\n • Filter token / removable selection (set onClose for X button)\n • Tag/category indicator\n • Status indicator with color (variant=\"accent\")\n • Pure count badge Badge instead\n • Toggleable filter → ToggleGroup or Chip with onClick + active state\n\nANTI-PATTERNS:\n ✗ Building dismiss UI manually with custom div + X icon → use onClose prop\n ✗ Using Chip as a primary CTA → Button\n ✗ Using Chip for hover-only labels → Tooltip"
617
617
  }
618
618
  },
619
619
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -632,7 +632,180 @@
632
632
  }
633
633
  },
634
634
  "additionalProperties": false,
635
- "description": "Client-only rendering. Prevents hydration mismatch in SSR environments."
635
+ "description": "ClientOnly — defers children to client-side render, preventing SSR hydration mismatch.\n\nWHEN TO USE:\n • Wrap components that read window/document/localStorage at render time\n • Components depending on browser-only APIs (IntersectionObserver eager init, geolocation)\n • Server-renderable content → DON'T wrap (loses SEO/SSR perf benefits)\n • Conditional based on data → use proper SSR-safe state instead\n\nPass fallback to avoid layout shift during hydration.\n\nANTI-PATTERNS:\n ✗ Wrapping the entire page in ClientOnly (defeats SSR)\n ✗ ClientOnly without fallback for above-the-fold UI (CLS)\n ✗ Using ClientOnly to \"fix\" any hydration warning — root-cause the mismatch first"
636
+ }
637
+ },
638
+ "$schema": "http://json-schema.org/draft-07/schema#"
639
+ },
640
+ "comboboxOption": {
641
+ "$ref": "#/definitions/comboboxOptionPropsSchema",
642
+ "definitions": {
643
+ "comboboxOptionPropsSchema": {
644
+ "type": "object",
645
+ "properties": {
646
+ "value": {
647
+ "type": "string",
648
+ "description": "Unique value (string, required). Duplicate values within one Combobox produce a dev-mode console.error and the duplicate option is dropped."
649
+ },
650
+ "disabled": {
651
+ "type": "boolean",
652
+ "description": "Disable selection. Skipped by keyboard navigation (Arrow Up/Down, Home/End)."
653
+ },
654
+ "textValue": {
655
+ "type": "string",
656
+ "description": "Text used for client-side filtering and the input display when this option is selected. If omitted, derived from `children` (string nodes only; OptionDescription / OptionMeta are excluded). Set this when label contains icons or non-text nodes you still want searchable (e.g. textValue=\"apple 사과 fruit\")."
657
+ },
658
+ "className": {
659
+ "type": "string",
660
+ "description": "Class merged onto the rendered <div role=\"option\">."
661
+ },
662
+ "children": {
663
+ "description": "Label content + optional <Combobox.OptionDescription> / <Combobox.OptionMeta> slots."
664
+ }
665
+ },
666
+ "required": [
667
+ "value"
668
+ ],
669
+ "additionalProperties": false,
670
+ "description": "Single Combobox option. Direct child of <Combobox> only.\n\nWHEN TO USE:\n • One per selectable item; `value` MUST be unique within the Combobox\n • Wrap rich content (icons, badges) directly as children — no escape hatch needed\n • Use textValue when label is non-text (e.g. <Combobox.Option value=\"apple\" textValue=\"사과 apple\">🍎</Combobox.Option>)\n\nANTI-PATTERNS:\n ✗ <Combobox><div><Combobox.Option/></div></Combobox> — Option must be a direct child\n ✗ Same value on two options → dev warning + silent drop; pick unique values\n ✗ Putting label text inside <Combobox.OptionDescription> — that slot is the secondary line below the label"
671
+ }
672
+ },
673
+ "$schema": "http://json-schema.org/draft-07/schema#"
674
+ },
675
+ "comboboxOptionDescription": {
676
+ "$ref": "#/definitions/comboboxOptionDescriptionPropsSchema",
677
+ "definitions": {
678
+ "comboboxOptionDescriptionPropsSchema": {
679
+ "type": "object",
680
+ "properties": {
681
+ "children": {
682
+ "description": "Secondary text below the label (ReactNode)."
683
+ },
684
+ "className": {
685
+ "type": "string",
686
+ "description": "Class for the description node."
687
+ }
688
+ },
689
+ "additionalProperties": false,
690
+ "description": "Secondary text shown below an option label. Use for hints like \"Republic of Korea\" beneath \"한국\". Excluded from textValue-based search."
691
+ }
692
+ },
693
+ "$schema": "http://json-schema.org/draft-07/schema#"
694
+ },
695
+ "comboboxOptionMeta": {
696
+ "$ref": "#/definitions/comboboxOptionMetaPropsSchema",
697
+ "definitions": {
698
+ "comboboxOptionMetaPropsSchema": {
699
+ "type": "object",
700
+ "properties": {
701
+ "children": {
702
+ "description": "Right-aligned meta content (price, badge, shortcut, etc.)."
703
+ },
704
+ "className": {
705
+ "type": "string",
706
+ "description": "Class for the meta slot."
707
+ }
708
+ },
709
+ "additionalProperties": false,
710
+ "description": "Right-aligned slot inside an option. Use for prices, keyboard shortcuts, version tags, status badges. Excluded from textValue-based search."
711
+ }
712
+ },
713
+ "$schema": "http://json-schema.org/draft-07/schema#"
714
+ },
715
+ "combobox": {
716
+ "$ref": "#/definitions/comboboxPropsSchema",
717
+ "definitions": {
718
+ "comboboxPropsSchema": {
719
+ "type": "object",
720
+ "properties": {
721
+ "children": {
722
+ "description": "<Combobox.Option> elements (required). Other children are ignored with a dev-mode warning. Async-search consumers swap this list as `onSearch` results arrive."
723
+ },
724
+ "value": {
725
+ "description": "Selected value. string for single, string[] for multiple"
726
+ },
727
+ "defaultValue": {
728
+ "description": "Initial value (uncontrolled)"
729
+ },
730
+ "onValueChange": {
731
+ "description": "Value change callback. (value: string | string[]) => void"
732
+ },
733
+ "multiple": {
734
+ "type": "boolean",
735
+ "default": false,
736
+ "description": "Multi-select mode. Selected values shown as chips inside input"
737
+ },
738
+ "onSearch": {
739
+ "description": "Async search callback. (query: string) => void. Triggers external data fetching with debounce. When set, the built-in client filter is disabled — render whatever <Combobox.Option> children match the latest results."
740
+ },
741
+ "searchDebounce": {
742
+ "type": "number",
743
+ "default": 250,
744
+ "description": "Debounce delay (ms) before onSearch fires"
745
+ },
746
+ "loading": {
747
+ "type": "boolean",
748
+ "default": false,
749
+ "description": "Externally-controlled loading state. Shows spinner in input suffix and a status row inside the popover."
750
+ },
751
+ "filter": {
752
+ "description": "Custom client-side filter. (option: { value, textValue, disabled }, query: string) => boolean. Default: case-insensitive textValue includes match. Ignored when onSearch is set."
753
+ },
754
+ "placeholder": {
755
+ "type": "string",
756
+ "description": "Input placeholder"
757
+ },
758
+ "emptyMessage": {
759
+ "description": "Message when no options match (string | ReactNode). Default: \"검색 결과 없음\""
760
+ },
761
+ "loadingMessage": {
762
+ "description": "Message during loading state inside popover (string | ReactNode). Default: \"검색 중…\""
763
+ },
764
+ "size": {
765
+ "type": "string",
766
+ "enum": [
767
+ "md",
768
+ "lg",
769
+ "xl"
770
+ ],
771
+ "default": "md",
772
+ "description": "Input size (matches TextInput tokens)"
773
+ },
774
+ "disabled": {
775
+ "type": "boolean",
776
+ "description": "Disabled"
777
+ },
778
+ "error": {
779
+ "type": "boolean",
780
+ "description": "Error state"
781
+ },
782
+ "clearable": {
783
+ "type": "boolean",
784
+ "default": true,
785
+ "description": "Show clear button when value(s) exist"
786
+ },
787
+ "autoOpenOnFocus": {
788
+ "type": "boolean",
789
+ "default": true,
790
+ "description": "Open popover automatically when input gains focus"
791
+ },
792
+ "label": {
793
+ "description": "Field label (ReactNode)"
794
+ },
795
+ "description": {
796
+ "description": "Helper text below input (ReactNode)"
797
+ },
798
+ "className": {
799
+ "type": "string",
800
+ "description": "Wrapper className"
801
+ },
802
+ "popoverClassName": {
803
+ "type": "string",
804
+ "description": "Popover content className"
805
+ }
806
+ },
807
+ "additionalProperties": false,
808
+ "description": "Searchable select with compound option API. Text input + popover listbox. Single/multi-select. Sync (auto-filter) or async (onSearch + loading) modes.\n\nWHEN TO USE:\n • Options ≥ 7, OR labels are long, OR search/filter is needed → Combobox (not Select)\n • Multi-select form field → Combobox with multiple (chips render inside input)\n • Async data from server → set onSearch + loading\nFor ≤7 simple options use Select. For free-text tags use TagInput.\n\nCOMPOUND API:\n <Combobox value={v} onValueChange={setV} placeholder=\"…\">\n <Combobox.Option value=\"kr\">한국</Combobox.Option>\n <Combobox.Option value=\"jp\" disabled>\n 일본\n <Combobox.OptionDescription>품절</Combobox.OptionDescription>\n <Combobox.OptionMeta>JP</Combobox.OptionMeta>\n </Combobox.Option>\n </Combobox>\n\n • <Combobox.Option> requires unique `value` (dev mode warns on duplicates and drops the duplicate)\n • <Combobox.OptionDescription> = secondary line under label\n • <Combobox.OptionMeta> = right-aligned slot (price, shortcut, badge)\n • Both slots are excluded from textValue-based search\n\nASYNC PATTERN:\n <Combobox loading={isFetching} onSearch={(q) => mutate(q)}>\n {results.map((u) => (\n <Combobox.Option key={u.id} value={u.id}>{u.name}\n <Combobox.OptionDescription>{u.email}</Combobox.OptionDescription>\n </Combobox.Option>\n ))}\n </Combobox>\n — onSearch fires after searchDebounce (default 250ms). Do NOT clear input on result update; component preserves user's typing.\n\nIME (Korean/Japanese/Chinese): Enter during composition is ignored automatically — do not add custom keydown handlers.\n\nANTI-PATTERNS:\n ✗ <Select> with 20 options → <Combobox>\n ✗ Manual <input> + dropdown div + filter logic → <Combobox>\n ✗ Passing options through a prop array (legacy API removed) → use <Combobox.Option> children\n ✗ Wrapping options in extra elements (<div><Combobox.Option/></div>) → keep them as direct children\n ✗ Same `value` on two <Combobox.Option> — duplicates are warned + dropped in dev mode\n ✗ Setting value externally to clear input mid-typing → use onValueChange instead"
636
809
  }
637
810
  },
638
811
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -690,7 +863,7 @@
690
863
  "endTimestamp"
691
864
  ],
692
865
  "additionalProperties": false,
693
- "description": "Countdown timer."
866
+ "description": "Countdown — live timer counting down to endTimestamp (Unix ms).\n\nWHEN TO USE:\n • Sale ends in / event starts in / token claim window\n • OTP / verification code expiry\n • Counting up (since X) → not Countdown; use Counter or custom interval\n • Persistent server time → pass server-synced endTimestamp (not Date.now offset)\n\nshowDays=false for short timers (<24h) to declutter. Use render prop for fully custom layouts.\n\nANTI-PATTERNS:\n ✗ Countdown without onEnd handler — UI stuck at 0\n ✗ Countdown across SSR without hydration safety — pass endTimestamp from server\n ✗ Updating endTimestamp every render — causes jitter"
694
867
  }
695
868
  },
696
869
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -750,7 +923,109 @@
750
923
  "endValue"
751
924
  ],
752
925
  "additionalProperties": false,
753
- "description": "Number count animation."
926
+ "description": "Counter animated number tick from startValue to endValue.\n\nWHEN TO USE:\n • Marketing landing — \"10,000+ users\" KPI displays\n • Stat dashboards (animate when value changes)\n • Live tickers / real-time data — re-render plain text instead (Counter is one-shot animation)\n • Currency input / editable number → NumberInput / PriceInput\n\ntriggerOnView=true delays animation until element scrolls into view (good for landing pages).\n\nANTI-PATTERNS:\n ✗ Counter for values that update frequently — animation queue conflicts\n ✗ Long duration on critical numbers (users wait to read)\n ✗ Counter without separator for large numbers (hard to read)"
927
+ }
928
+ },
929
+ "$schema": "http://json-schema.org/draft-07/schema#"
930
+ },
931
+ "dataGrid": {
932
+ "$ref": "#/definitions/dataGridPropsSchema",
933
+ "definitions": {
934
+ "dataGridPropsSchema": {
935
+ "type": "object",
936
+ "properties": {
937
+ "list": {
938
+ "anyOf": [
939
+ {
940
+ "type": "array"
941
+ },
942
+ {
943
+ "type": "null"
944
+ }
945
+ ],
946
+ "description": "Data array to render. null = loading state (required)"
947
+ },
948
+ "columns": {
949
+ "anyOf": [
950
+ {
951
+ "type": "number"
952
+ },
953
+ {
954
+ "type": "object",
955
+ "properties": {
956
+ "base": {
957
+ "type": "number",
958
+ "description": "Default column count (mobile-first)"
959
+ },
960
+ "sm": {
961
+ "type": "number",
962
+ "description": ">= 640px"
963
+ },
964
+ "md": {
965
+ "type": "number",
966
+ "description": ">= 768px"
967
+ },
968
+ "lg": {
969
+ "type": "number",
970
+ "description": ">= 1024px"
971
+ },
972
+ "xl": {
973
+ "type": "number",
974
+ "description": ">= 1280px"
975
+ },
976
+ "2xl": {
977
+ "type": "number",
978
+ "description": ">= 1536px"
979
+ }
980
+ },
981
+ "additionalProperties": false
982
+ }
983
+ ],
984
+ "description": "Column count. number = fixed | { base, sm, md, lg, xl, 2xl } = responsive (required)"
985
+ },
986
+ "gap": {
987
+ "type": [
988
+ "number",
989
+ "string"
990
+ ],
991
+ "description": "Item gap. number = px | string = CSS value"
992
+ },
993
+ "noDataMessage": {
994
+ "description": "Message for empty array (string | ReactElement)"
995
+ },
996
+ "errorFallback": {
997
+ "description": "Fallback on error (ReactNode)"
998
+ },
999
+ "loadingElement": {
1000
+ "description": "Custom loading element (default: Spinner)"
1001
+ },
1002
+ "skeletonElement": {
1003
+ "description": "Skeleton element during loading (ReactElement)"
1004
+ },
1005
+ "skeletonCount": {
1006
+ "type": "number",
1007
+ "default": 3,
1008
+ "description": "Skeleton repeat count"
1009
+ },
1010
+ "loading": {
1011
+ "type": "boolean",
1012
+ "default": false,
1013
+ "description": "Force loading state"
1014
+ },
1015
+ "children": {
1016
+ "description": "Item render function: ({ item, index }) => ReactNode (required)"
1017
+ },
1018
+ "className": {
1019
+ "type": "string",
1020
+ "description": "Root element style"
1021
+ }
1022
+ },
1023
+ "required": [
1024
+ "list",
1025
+ "columns"
1026
+ ],
1027
+ "additionalProperties": false,
1028
+ "description": "DataGrid — card grid version of DataList with responsive columns. Built-in ErrorBoundary, loading/skeleton/empty/error states.\n\nWHEN TO USE:\n • Card grids: products, gallery, team members, posts\n • Need responsive column count → pass { base: 1, sm: 2, lg: 3, xl: 4 }\n • Single column / row layout → DataList\n • Tabular data → table component (not DataGrid)\n • Huge dataset → VirtualGrid\n\nANTI-PATTERNS:\n ✗ Tabular data forced into card grid (use a table)\n ✗ Hardcoded column count for responsive layouts → use responsive object\n ✗ Manual loading/empty handling → DataGrid does it"
754
1029
  }
755
1030
  },
756
1031
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -806,7 +1081,7 @@
806
1081
  "list"
807
1082
  ],
808
1083
  "additionalProperties": false,
809
- "description": "Data list. Automatically handles loading/skeleton/empty/data states based on list. Built-in ErrorBoundary."
1084
+ "description": "DataList — render-prop list that handles loading / skeleton / empty / error / data in one component. Built-in ErrorBoundary.\n\nWHEN TO USE:\n • Any async list (<200 items) — feed, comments, dashboard rows\n • Pass list={null} during loading (auto-shows skeleton/spinner)\n • Pass list=[] for empty state (auto-shows noDataMessage)\n • Card grid → DataGrid (same API + columns prop)\n • Huge dataset → VirtualList\n\nchildren is render fn: ({ item, index }) => ReactNode.\n\nANTI-PATTERNS:\n ✗ Manual if (loading) {...} else if (!data.length) {...} chains → DataList handles all\n ✗ DataList without skeletonElement when component shape is known (use Skeleton)\n ✗ list=undefined (treated as data, not loading) — use null for loading"
810
1085
  }
811
1086
  },
812
1087
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -862,7 +1137,7 @@
862
1137
  }
863
1138
  },
864
1139
  "additionalProperties": false,
865
- "description": "DatePicker. Calendar popup for date selection. Based on react-day-picker."
1140
+ "description": "DatePicker calendar popup for date selection. Based on react-day-picker.\n\nWHEN TO USE:\n • Single date selection: birthday, due date, appointment\n • Date range → use two DatePickers with minDate/maxDate cross-bound\n • Time selection → not yet supported; use TextInput with type=\"time\" + DatePicker combo\n • Quick relative ranges (Today/Last 7 days) → DropdownMenu of preset Buttons + DatePicker for \"Custom\"\n\nminDate/maxDate disable out-of-range dates. locale=\"ko\" for Korean labels.\n\nANTI-PATTERNS:\n ✗ Native <input type=\"date\"> for branded UI (inconsistent across browsers) → DatePicker\n ✗ Free-text date with parsing → DatePicker (consistent UX)\n ✗ DatePicker without minDate for past-date-invalid fields (e.g. booking)"
866
1141
  }
867
1142
  },
868
1143
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -905,7 +1180,7 @@
905
1180
  }
906
1181
  },
907
1182
  "additionalProperties": false,
908
- "description": "Divider. Supports horizontal/vertical, solid/dashed/dotted."
1183
+ "description": "Divider visual separator (horizontal/vertical line).\n\nWHEN TO USE:\n • Separating sections within a card / list\n • Vertical separator between inline items (orientation=\"vertical\")\n • Use color prop sparingly — defaults to border-default token\n • For grouping form sections, prefer larger spacing over Divider\n • Tab/Accordion already provide visual separation — don't add Divider\n\nANTI-PATTERNS:\n ✗ Stacking many Dividers — increase spacing instead\n ✗ Using Divider as decorative line with bright color → use Tailwind border utility on container\n ✗ Inline <hr> with custom CSS → Divider (consistent token)"
909
1184
  }
910
1185
  },
911
1186
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -951,7 +1226,7 @@
951
1226
  }
952
1227
  },
953
1228
  "additionalProperties": false,
954
- "description": "Drawer/bottom sheet. Based on Vaul. Compound component pattern."
1229
+ "description": "Drawer / bottom sheet. Based on Vaul. Compound component pattern.\n\nWHEN TO USE:\n • Side panel for secondary action while user can still see main content (filter panel, item details)\n • Mobile bottom sheet (direction=\"bottom\")\n • Force decision blocking main flow → Modal instead\n • Inline anchor-positioned UI → Popover instead\n\nDIRECTION: bottom (default, mobile-friendly), top, left, right.\ndismissible=true (default) allows swipe/outside-click close. Set false for blocking flows.\n\nANTI-PATTERNS:\n ✗ Drawer for confirmation dialogs → Modal (decision-forcing)\n ✗ Always shouldScaleBackground → only enable for true mobile bottom-sheets\n ✗ Forgetting Drawer.Title → required for screen readers (a11y)"
955
1230
  }
956
1231
  },
957
1232
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1172,7 +1447,7 @@
1172
1447
  "items"
1173
1448
  ],
1174
1449
  "additionalProperties": false,
1175
- "description": "Dropdown menu. Based on Radix DropdownMenu. Action menu for context/more menus."
1450
+ "description": "Dropdown menu — list of actions/commands triggered by a button. Based on Radix DropdownMenu (role=\"menu\" + keyboard nav).\n\nWHEN TO USE:\n • \"More\" / context menu (•••, ⋮)\n • Action lists where each item triggers a function (save, share, delete)\n • Selecting a value (form field) → Select / Combobox (not DropdownMenu)\n • Multi-select toggles → ToggleGroup or CheckBox group\n • Anchored info panel → Popover\n\nUse danger=true on destructive items (Delete) for visual + semantic emphasis.\nUse separator=true to group related actions.\n\nANTI-PATTERNS:\n ✗ DropdownMenu for value selection submitted later → Select / Combobox\n ✗ Custom <div onClick> with isOpen state → DropdownMenu\n ✗ Long form inputs inside menu items → Popover instead"
1176
1451
  }
1177
1452
  },
1178
1453
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1221,7 +1496,7 @@
1221
1496
  }
1222
1497
  },
1223
1498
  "additionalProperties": false,
1224
- "description": "Text ellipsis. Built-in show more/less toggle."
1499
+ "description": "Ellipsis clamp long text to N lines with \"show more / less\" toggle.\n\nWHEN TO USE:\n • Long descriptions in cards, comments, post previews\n • Single-line truncation only → CSS line-clamp utility (lighter)\n • Tooltip on hover for full text → Tooltip + truncate utility\n • Critical content that must be fully readable — don't truncate\n\ntriggerMore/triggerLess accept ReactNode for icons or styled buttons.\n\nANTI-PATTERNS:\n ✗ Ellipsis on titles / labels — confusing UX\n ✗ Always-collapsed (defaultShortened=true) for short text — measurement waste\n ✗ Overriding triggerMore/Less with HTML that breaks accessibility (use button-like)"
1225
1500
  }
1226
1501
  },
1227
1502
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1265,7 +1540,7 @@
1265
1540
  }
1266
1541
  },
1267
1542
  "additionalProperties": false,
1268
- "description": "Empty state placeholder. Shown when data is empty or unavailable."
1543
+ "description": "EmptyState friendly placeholder for empty lists, no search results, first-time setup.\n\nWHEN TO USE:\n • Empty inbox / list / search results\n • First-time use (onboarding nudge with action button)\n • Loading → Skeleton/Spinner (NOT EmptyState)\n • Error → Alert (or pass icon + title to EmptyState only when conceptually \"nothing here\")\n\nDataList/DataGrid have built-in noDataMessage that wraps EmptyState — use that prop instead of conditional rendering.\n\nANTI-PATTERNS:\n ✗ Showing EmptyState during loading (confuses users into thinking data is missing)\n ✗ EmptyState without action when user can fix it (\"Create your first X\" button)\n ✗ Cluttered EmptyState (too much text/multiple CTAs) — keep one primary action"
1269
1544
  }
1270
1545
  },
1271
1546
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1287,7 +1562,7 @@
1287
1562
  }
1288
1563
  },
1289
1564
  "additionalProperties": false,
1290
- "description": "Error boundary. Catches child component render errors and displays fallback UI."
1565
+ "description": "ErrorBoundary catches render-time errors in subtree and shows fallback UI.\n\nWHEN TO USE:\n • Wrap risky areas: third-party widgets, dynamic imports, untrusted content rendering\n • Async errors / promise rejections → NOT caught (use try/catch in handlers)\n • Per-route error wrapping → use framework's error.tsx (Next.js) where possible\n\nDataList / DataGrid have ErrorBoundary built-in — don't double-wrap.\n\nANTI-PATTERNS:\n ✗ ErrorBoundary at app root only — granular boundaries give better UX (one widget fails, page survives)\n ✗ Showing raw Error.message in production (leak risk) — use friendly fallback\n ✗ Forgetting onError logging → silent failures in production"
1291
1566
  }
1292
1567
  },
1293
1568
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1370,7 +1645,7 @@
1370
1645
  }
1371
1646
  },
1372
1647
  "additionalProperties": false,
1373
- "description": "ImageUpload. Drag-and-drop image upload with preview, file validation, and field label/description support."
1648
+ "description": "ImageUpload — drag-and-drop image upload with preview, file-type/size validation, label/description.\n\nWHEN TO USE:\n • Single image upload: avatar, cover, KYC document, post thumbnail\n • Multiple files / non-image → not yet supported; build custom or use a file dropzone\n • Inline image picker without preview → custom <input type=\"file\">\n\naccept whitelist + maxSize together cover validation. onError fires with i18n-ready string.\n\nANTI-PATTERNS:\n ✗ <input type=\"file\"> + manual preview → ImageUpload (handles drag, validation, preview)\n ✗ ImageUpload without onError handler → silent failure on validation reject\n ✗ Storing image as data-URL value (use File via onChange and upload to server)"
1374
1649
  }
1375
1650
  },
1376
1651
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1435,7 +1710,7 @@
1435
1710
  "list"
1436
1711
  ],
1437
1712
  "additionalProperties": false,
1438
- "description": "Infinite scroll. Based on IntersectionObserver."
1713
+ "description": "InfiniteScroll — auto-load more when sentinel enters viewport. Based on IntersectionObserver.\n\nWHEN TO USE:\n • Feeds, social timelines, search-as-you-scroll\n • Continuous browsing where total isn't critical\n • Need jump-to-page → Pagination (not InfiniteScroll)\n • Need to render 1000s of already-loaded items efficiently → VirtualList\n • Combine with VirtualList for huge + paginated data\n\nPass either totalCount or hasMore (not both). handleLoadMore is required.\n\nANTI-PATTERNS:\n ✗ InfiniteScroll without footer/loading element (looks broken at the bottom)\n ✗ InfiniteScroll without debouncing handleLoadMore — duplicate fetches\n ✗ Auto-loading critical actions in footer (links, contact) — they become unreachable"
1439
1714
  }
1440
1715
  },
1441
1716
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1484,7 +1759,7 @@
1484
1759
  }
1485
1760
  },
1486
1761
  "additionalProperties": false,
1487
- "description": "Marquee (scrolling text/elements)."
1762
+ "description": "Marquee — endless scrolling content (logo strip, promo banner, news ticker).\n\nWHEN TO USE:\n • Logo cloud, partner brands strip, social proof\n • Critical info that must be read → not Marquee (auto-scroll hurts a11y)\n • Long static list → VirtualList\n • User-paced gallery → Carousel\n\npauseOnHover=true is recommended whenever content is readable text.\n\nANTI-PATTERNS:\n ✗ Marquee with action buttons inside (hard to click)\n ✗ Fast-speed marquee on important text (unreadable, a11y violation)\n ✗ Multiple Marquees on same page in different directions (visual chaos)"
1488
1763
  }
1489
1764
  },
1490
1765
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1610,7 +1885,7 @@
1610
1885
  }
1611
1886
  },
1612
1887
  "additionalProperties": false,
1613
- "description": "Modal template. All modal components must be wrapped with ModalTemplate."
1888
+ "description": "Modal template. All modal components must be wrapped with ModalTemplate.\n\nWHEN TO USE:\n • Force user decision (delete confirm, submit confirm, blocking dialog)\n • Long form/flow that needs full attention\n • Side panel that doesn't block main flow → Drawer instead\n • Inline contextual UI → Popover instead\n • Short hint → Tooltip instead\n\nPREFERRED API: use modal() / useModal() imperative API rather than mounting <ModalTemplate> directly. modal() handles stacking, focus return, ESC, and background scroll automatically.\n\nANTI-PATTERNS:\n ✗ Custom <div className=\"fixed inset-0\"> → modal() (loses focus trap, a11y)\n ✗ Direct <ModalTemplate> mount in render tree → wrap with modal()\n ✗ Modal with no title for screen readers → always pass title prop\n ✗ Multiple modals stacking confusingly → use isAlone:true to close prior modals"
1614
1889
  }
1615
1890
  },
1616
1891
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1823,7 +2098,7 @@
1823
2098
  }
1824
2099
  },
1825
2100
  "additionalProperties": false,
1826
- "description": "Number input with two variants: basic (chevron arrows) and bind (+/- buttons). Supports label, description, max display (click to fill), accelerated increment on long press. numberInputBind(ref, direction) binds acceleration to external buttons."
2101
+ "description": "Number input with two variants: basic (chevron arrows) and bind (+/- buttons). Supports label, description, max display (click to fill), accelerated increment on long press. numberInputBind(ref, direction) binds acceleration to external buttons.\n\nWHEN TO USE:\n • Any numeric field — quantity, score, age, count\n • Currency with thousand separators → PriceInput instead\n • Date / time → DatePicker instead\n\nANTI-PATTERNS:\n ✗ <TextInput type=\"number\"> → <NumberInput> (loses keyboard ↑↓, step, accelerated long-press, max click)\n ✗ Custom +/- buttons + <input> → variant=\"bind\" (or numberInputBind for external)\n ✗ Manual thousand separators for currency → PriceInput"
1827
2102
  }
1828
2103
  },
1829
2104
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1879,7 +2154,7 @@
1879
2154
  }
1880
2155
  },
1881
2156
  "additionalProperties": false,
1882
- "description": "Enhanced image. Lazy loading, fallback, aspect-ratio support."
2157
+ "description": "NxImage lazy-loaded <img> with fallback, fixed aspect-ratio, object-fit. Always prefer over native <img>.\n\nWHEN TO USE:\n • Content images: covers, banners, illustrations, hero images\n • Profile/user avatar (with text fallback) → Avatar\n • Background image / decorative → CSS bg-image\n • Need Next.js optimization → use next/image directly (NxImage doesn't optimize)\n\naspectRatio reserves space, preventing CLS (layout shift).\n\nANTI-PATTERNS:\n ✗ <img> with manual onError handling → NxImage (built-in fallback)\n ✗ NxImage without alt for content images (a11y violation)\n ✗ NxImage without aspectRatio in fluid layouts → CLS jank"
1883
2158
  }
1884
2159
  },
1885
2160
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1929,7 +2204,7 @@
1929
2204
  "totalPages"
1930
2205
  ],
1931
2206
  "additionalProperties": false,
1932
- "description": "Pagination. Previous/next + page number buttons."
2207
+ "description": "Pagination page-by-page navigation for long datasets.\n\nWHEN TO USE:\n • User needs to jump to specific pages (search results, blog archives)\n • Total count is known and stable\n • Continuous browsing → InfiniteScroll instead\n • Real-time stream → InfiniteScroll\n • Both fit → Pagination is more accessible (keyboard, deep-linkable URL)\n\nANTI-PATTERNS:\n ✗ Pagination with totalPages=1 — hide it\n ✗ Mixing Pagination + InfiniteScroll on same list (confusing)\n ✗ Custom page button divs → Pagination (a11y, edge cases like ellipsis)"
1933
2208
  }
1934
2209
  },
1935
2210
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1996,7 +2271,7 @@
1996
2271
  }
1997
2272
  },
1998
2273
  "additionalProperties": false,
1999
- "description": "Popover. Based on Radix Popover."
2274
+ "description": "Popover — anchor-positioned panel with interactive content. Based on Radix Popover.\n\nWHEN TO USE:\n • Trigger-anchored UI with buttons, inputs, or rich content\n • Filter/option panel near a button (not a full sidebar)\n • Hover-only text hint → Tooltip (lighter)\n • Action menu list → DropdownMenu (gives role=menu, keyboard nav)\n • Decision dialog → Modal\n\nANTI-PATTERNS:\n ✗ Action lists with onClick handlers → DropdownMenu (a11y semantics)\n ✗ Implementing dropdown manually with Popover + custom buttons → DropdownMenu\n ✗ Long forms inside Popover → Drawer or Modal"
2000
2275
  }
2001
2276
  },
2002
2277
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2100,7 +2375,7 @@
2100
2375
  }
2101
2376
  },
2102
2377
  "additionalProperties": false,
2103
- "description": "Price/amount input field with prefix, suffix, balance display, and auto-fill on balance click."
2378
+ "description": "PriceInput — currency / amount input with prefix, suffix, balance display, click-to-fill.\n\nWHEN TO USE:\n • Money / token amounts: payment, transfer, swap, withdraw\n • Need balance hint with auto-fill UX (set balance + onBalanceClick)\n • Pure number (count, age, score) → NumberInput\n • Generic text → TextInput\n\nseparator=true displays commas; onValueChange always returns raw value (no commas). maxBalance auto-applies error styling on overflow.\n\nANTI-PATTERNS:\n ✗ <TextInput type=\"number\"> + manual currency formatting → PriceInput\n ✗ NumberInput for currency (loses prefix/suffix/balance UX)\n ✗ Using string input for amounts then parseFloat — lose precision; use this component"
2104
2379
  }
2105
2380
  },
2106
2381
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2163,7 +2438,7 @@
2163
2438
  }
2164
2439
  },
2165
2440
  "additionalProperties": false,
2166
- "description": "Progress bar. Linear progress indicator with percentage display."
2441
+ "description": "Progress linear progress bar (file upload, multi-step form, loading with known %).\n\nWHEN TO USE:\n • Quantifiable progress (% complete, X of Y)\n • Unknown duration spinner → Spinner\n • Stable component shape during load → Skeleton\n • Step-based navigation → Stepper\n • Indeterminate (loading without %) → set indeterminate=true\n\nvariant follows semantic colors (success when complete, danger on error).\n\nANTI-PATTERNS:\n ✗ Indeterminate Progress for short loads (<1s) — Spinner is lighter\n ✗ Custom <div style={{ width: x% }}> → Progress (a11y, tokens)\n ✗ Progress without label/showValue when % is critical info"
2167
2442
  }
2168
2443
  },
2169
2444
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2195,6 +2470,15 @@
2195
2470
  "default": "md",
2196
2471
  "description": "Size"
2197
2472
  },
2473
+ "variant": {
2474
+ "type": "string",
2475
+ "enum": [
2476
+ "default",
2477
+ "ring"
2478
+ ],
2479
+ "default": "default",
2480
+ "description": "Visual style. default=outline circle with inner dot, ring=thick border replaces dot when checked"
2481
+ },
2198
2482
  "orientation": {
2199
2483
  "type": "string",
2200
2484
  "enum": [
@@ -2231,7 +2515,7 @@
2231
2515
  "name"
2232
2516
  ],
2233
2517
  "additionalProperties": false,
2234
- "description": "Radio group. Used with RadioItem."
2518
+ "description": "Radio group for single-choice form fields. Used with RadioItem.\n\nWHEN TO USE:\n • Form field where user picks ONE of small set (≤4-7) and submits later → RadioGroup\n • All options should be visible at once for comparison → RadioGroup (not Select)\n • Immediate effect on selection (no submit) → ToggleGroup instead\n • Page area switching (tabs) → Tab (not RadioGroup)\n • Many options → Select / Combobox\n\nVARIANTS:\n • variant=\"default\" — outline circle with inner dot when checked (classic)\n • variant=\"ring\" — thick border replaces inner dot when checked (modern, Figma \"ring\" style)\n\nANTI-PATTERNS:\n ✗ Using RadioGroup for tab-like content switching → Tab\n ✗ Using RadioGroup for immediate filters → ToggleGroup\n ✗ Mixing RadioGroup and ToggleGroup in same form → pick one pattern\n ✗ Native <input type=\"radio\"> → RadioItem (gets a11y, focus ring, tokens)"
2235
2519
  }
2236
2520
  },
2237
2521
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2254,9 +2538,20 @@
2254
2538
  ],
2255
2539
  "description": "Size (overrides group)"
2256
2540
  },
2541
+ "variant": {
2542
+ "type": "string",
2543
+ "enum": [
2544
+ "default",
2545
+ "ring"
2546
+ ],
2547
+ "description": "Visual style (overrides group)"
2548
+ },
2257
2549
  "label": {
2258
2550
  "description": "Label text (ReactNode)"
2259
2551
  },
2552
+ "description": {
2553
+ "description": "Help text shown beneath the label (ReactNode)"
2554
+ },
2260
2555
  "children": {
2261
2556
  "description": "Label alternative content (ReactNode)"
2262
2557
  },
@@ -2335,7 +2630,7 @@
2335
2630
  }
2336
2631
  },
2337
2632
  "additionalProperties": false,
2338
- "description": "Dropdown select. Based on Radix Select. Used with SelectItem."
2633
+ "description": "Dropdown select for short option lists. Based on Radix Select. Used with SelectItem.\n\nWHEN TO USE:\n • Options ≤ 7, no search needed → Select\n • Options ≥ 7 OR search needed OR async → Combobox instead\n • Need multi-select → Combobox (multiple)\n • Action menu (save/delete/share) → DropdownMenu (not Select; values vs actions)\n\nANTI-PATTERNS:\n ✗ Select with 20+ options → Combobox\n ✗ Using Select for menu items that trigger functions → DropdownMenu\n ✗ Manual <select> styling → Select gives consistent token styling\n ✗ Wrapping each SelectItem with Tooltip — instead put hint in item label"
2339
2634
  }
2340
2635
  },
2341
2636
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2417,7 +2712,7 @@
2417
2712
  }
2418
2713
  },
2419
2714
  "additionalProperties": false,
2420
- "description": "Skeleton loading placeholder. Size/shape via className. With children, wraps transparently to maintain actual size."
2715
+ "description": "Skeleton loading placeholder. Size/shape via className. With children, wraps transparently to maintain actual size.\n\nWHEN TO USE:\n • Long load with known component shape (cards, lists, profile headers)\n • Reduces perceived wait time when layout is predictable\n • Short loads (<1s) → Spinner\n • Quantifiable progress → Progress\n • DataList/DataGrid loading → set list={null} (uses skeletonElement prop automatically)\n\nGOLDEN RULE: Skeleton must match the real component's shape and size. Mismatch causes layout shift.\n\nANTI-PATTERNS:\n ✗ Generic gray rectangle for everything → match real component shape\n ✗ Skeleton for instant loads (causes flash)\n ✗ Many skeletons of different shapes when component is uniform → use a single skeleton in DataList"
2421
2716
  }
2422
2717
  },
2423
2718
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2495,7 +2790,7 @@
2495
2790
  }
2496
2791
  },
2497
2792
  "additionalProperties": false,
2498
- "description": "Slider / Range input. Based on Radix Slider. Supports single and range mode."
2793
+ "description": "Slider numeric range selector. Based on Radix Slider. Single thumb or range (two thumbs).\n\nWHEN TO USE:\n • Continuous range with visual feedback: volume, brightness, price filter\n • Range filter (min-max) → defaultValue=[20, 80]\n • Precise number entry → NumberInput\n • Discrete few options → ToggleGroup or RadioGroup\n • Boolean → Switch\n\nstep controls increments. onValueCommit fires only after pointer release (good for expensive recomputations).\n\nANTI-PATTERNS:\n ✗ Slider for required precise input (typing 47 is faster than dragging)\n ✗ Long step count without showValue / labels (users have no reference)\n ✗ Calling expensive API on every onValueChange tick → use onValueCommit"
2499
2794
  }
2500
2795
  },
2501
2796
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2529,7 +2824,7 @@
2529
2824
  }
2530
2825
  },
2531
2826
  "additionalProperties": false,
2532
- "description": "Loading indicator. SVG-based. Built-in role=\"status\"."
2827
+ "description": "Loading indicator (spinner). SVG-based. role=\"status\" + aria-label built-in.\n\nWHEN TO USE:\n • Short loads (<1s), inline indicator (button content while submitting)\n • Long loads with known structure → Skeleton (better perceived performance)\n • Quantifiable progress → Progress\n • Page-level loading boundary inside DataList/DataGrid → use their loading prop instead\n\nANTI-PATTERNS:\n ✗ Custom CSS spinning div → Spinner (a11y + tokens)\n ✗ Using Spinner where Skeleton fits (long loads with stable layout)\n ✗ Forgetting aria-label override when meaning differs from \"Loading\""
2533
2828
  }
2534
2829
  },
2535
2830
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2602,7 +2897,7 @@
2602
2897
  "steps"
2603
2898
  ],
2604
2899
  "additionalProperties": false,
2605
- "description": "Stepper. Step-by-step progress indicator."
2900
+ "description": "Stepper — multi-step linear flow indicator (checkout, onboarding, wizard).\n\nWHEN TO USE:\n • Sequential workflow with finite steps (3-7)\n • Show user's current position in flow + completed/upcoming steps\n • Independent navigation between unrelated sections → Tab\n • Continuous % progress → Progress\n • Hierarchy / location → Breadcrumb\n\nstatus=\"error\" highlights the current step with danger color when validation fails.\n\nANTI-PATTERNS:\n ✗ Stepper with 2 steps (use Progress or just navigation)\n ✗ Stepper with 10+ steps (overwhelming) — chunk into sub-flows\n ✗ Letting users skip ahead by clicking future steps (only mark completed → current is allowed)"
2606
2901
  }
2607
2902
  },
2608
2903
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2654,7 +2949,7 @@
2654
2949
  }
2655
2950
  },
2656
2951
  "additionalProperties": false,
2657
- "description": "Toggle switch. Native checkbox-based, role=\"switch\"."
2952
+ "description": "Toggle switch for immediate on/off binary state. Native checkbox-based, role=\"switch\".\n\nWHEN TO USE:\n • Setting that takes effect immediately (notifications on/off, dark mode)\n • Binary state with no submit step\n • Form field submitted later → CheckBox instead (semantics: checkbox is form data)\n • Multiple related options → CheckBox group or ToggleGroup (multiple)\n\nANTI-PATTERNS:\n ✗ <CheckBox> for \"Enable notifications\" toggle → <Switch>\n ✗ <Switch> inside form requiring submit → <CheckBox>\n ✗ Wrapping Switch in <label onClick> manually → use label prop or htmlFor pattern"
2658
2953
  }
2659
2954
  },
2660
2955
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2743,7 +3038,7 @@
2743
3038
  "items"
2744
3039
  ],
2745
3040
  "additionalProperties": false,
2746
- "description": "Tab navigation. line/pill variants."
3041
+ "description": "Tab navigation — switch between content panels (settings sections, profile views).\n\nWHEN TO USE:\n • Page area swap where only one panel is visible at a time\n • Mutually exclusive content with stable section labels\n • Form field selection → RadioGroup (semantics: not navigation)\n • Immediate filter/option toggle → ToggleGroup\n • Stacked collapsible sections → Accordion\n\ndestroyInactive=true unmounts hidden panels (saves memory but loses state).\n\nANTI-PATTERNS:\n ✗ Tab with 1 item — just render the panel\n ✗ Tab with 8+ items — consider sub-routing or DropdownMenu\n ✗ Using Tab for form value selection → RadioGroup\n ✗ Custom <button> + onClick + state → Tab (a11y, keyboard, focus management)"
2747
3042
  }
2748
3043
  },
2749
3044
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2818,7 +3113,7 @@
2818
3113
  "list"
2819
3114
  ],
2820
3115
  "additionalProperties": false,
2821
- "description": "Table. Column definitions via TdColumn, row wrapping via TableRow. Built-in sorting/skeleton loading."
3116
+ "description": "Table — tabular data with sortable columns, skeleton/loading/empty states. Compound: TableRow + TdColumn.\n\nWHEN TO USE:\n • Comparable structured data (financial reports, transaction history, leaderboard)\n • Sortable per-column → enableSorting on TdColumn\n • Card-style entities → DataGrid\n • Single-column read-only list → DataList\n • Huge dataset (>500 rows) → wrap with VirtualList logic or paginate\n\nlist={null} → loading state. list=[] → noDataMsg. children: ({ item, index }) => <TableRow>...</TableRow>.\n\nANTI-PATTERNS:\n ✗ Native <table> + manual loading/empty handling → Table component\n ✗ Forcing card-style data into Table (use DataGrid)\n ✗ Sorting in client when server pagination is in use → server-side sort"
2822
3117
  }
2823
3118
  },
2824
3119
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2850,7 +3145,7 @@
2850
3145
  }
2851
3146
  },
2852
3147
  "additionalProperties": false,
2853
- "description": "Table row. Used inside Table."
3148
+ "description": "TableRow — a single row inside Table. Wraps TdColumn cells.\n\nWHEN TO USE:\n • variant=\"accent\" highlights selected/current row\n • onClick for row-level navigation (e.g. open detail page)\n • Per-row checkbox/action → place inside a TdColumn child"
2854
3149
  }
2855
3150
  },
2856
3151
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2957,7 +3252,7 @@
2957
3252
  "fieldId"
2958
3253
  ],
2959
3254
  "additionalProperties": false,
2960
- "description": "Table cell/column definition. Used inside TableRow."
3255
+ "description": "TdColumn — table cell. Drives both <th> and <td> for the column. Provides sorting, alignment, overflow handling.\n\nWHEN TO USE:\n • textOverflow=\"truncate\" (default) for fixed-width columns; \"wrap\" for narrative\n • align=\"right\" for numeric/currency columns (a11y readability)\n • enableSorting=true when column is sortable; supply order + handleClickSort for controlled sort\n • highlightKey to group columns that highlight together on hover\n\nANTI-PATTERNS:\n ✗ enableSorting without handleClickSort → sort indicator is dead\n ✗ align=\"left\" for currency/number columns\n ✗ Mixing text and numeric in one column without consistent align"
2961
3256
  }
2962
3257
  },
2963
3258
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3027,7 +3322,7 @@
3027
3322
  }
3028
3323
  },
3029
3324
  "additionalProperties": false,
3030
- "description": "Tag input. Enter key to add, Backspace to delete last tag."
3325
+ "description": "TagInput free-form multi-value entry (Enter to add, Backspace to remove last).\n\nWHEN TO USE:\n • Free-form labels: skills, hashtags, email recipients, keywords\n • Predefined options → Combobox with multi-select (NOT TagInput)\n • Single value → TextInput\n • Limited options → Select / RadioGroup / Checkbox\n\nallowDuplicates=false (default) prevents repeats. Use max to cap count.\n\nANTI-PATTERNS:\n ✗ TagInput for predefined taxonomy → Combobox (controlled options)\n ✗ TagInput without max for spam-prone fields\n ✗ Custom comma-split string field → TagInput (proper UX + a11y)"
3031
3326
  }
3032
3327
  },
3033
3328
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3129,7 +3424,7 @@
3129
3424
  }
3130
3425
  },
3131
3426
  "additionalProperties": false,
3132
- "description": "Multi-line text input with label, description, character counter, and resize modes."
3427
+ "description": "Multi-line text input. Always prefer over native <textarea>.\n\nWHEN TO USE:\n • Long-form text — comments, descriptions, memos, bios\n • Single-line input → TextInput\n • Numeric → NumberInput\n\nresize=\"auto\" auto-grows with content (great for chat input). resize=\"none\" locks size for fixed UI.\n\nANTI-PATTERNS:\n ✗ Native <textarea> + custom counter → showCount + maxLength\n ✗ <TextArea> for short labels — use TextInput (smaller affordance)\n ✗ Wrapping with custom <label>/<p> → use built-in label/description props (auto a11y binding)"
3133
3428
  }
3134
3429
  },
3135
3430
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3236,72 +3531,7 @@
3236
3531
  }
3237
3532
  },
3238
3533
  "additionalProperties": false,
3239
- "description": "Text input field. Supports label, description, prefix/suffix icons, clearable, character counter."
3240
- }
3241
- },
3242
- "$schema": "http://json-schema.org/draft-07/schema#"
3243
- },
3244
- "themeProvider": {
3245
- "$ref": "#/definitions/themeProviderPropsSchema",
3246
- "definitions": {
3247
- "themeProviderPropsSchema": {
3248
- "type": "object",
3249
- "properties": {
3250
- "children": {
3251
- "description": "App root element (ReactNode, required)"
3252
- },
3253
- "defaultTheme": {
3254
- "type": "string",
3255
- "description": "Default theme (e.g. \"dark\", \"light\")"
3256
- },
3257
- "storageKey": {
3258
- "type": "string",
3259
- "description": "localStorage storage key (default: \"theme\")"
3260
- },
3261
- "themes": {
3262
- "type": "array",
3263
- "items": {
3264
- "type": "string"
3265
- },
3266
- "description": "Available theme list (default: [\"light\", \"dark\"])"
3267
- },
3268
- "attribute": {
3269
- "anyOf": [
3270
- {
3271
- "type": "string"
3272
- },
3273
- {
3274
- "type": "array",
3275
- "items": {
3276
- "type": "string"
3277
- }
3278
- }
3279
- ],
3280
- "description": "Theme HTML attribute (default: \"data-theme\")"
3281
- },
3282
- "enableSystem": {
3283
- "type": "boolean",
3284
- "description": "Enable system theme detection"
3285
- },
3286
- "disableTransitionOnChange": {
3287
- "type": "boolean",
3288
- "description": "Disable transitions on theme change"
3289
- },
3290
- "forcedTheme": {
3291
- "type": "string",
3292
- "description": "Forced theme (user cannot change)"
3293
- },
3294
- "enableColorScheme": {
3295
- "type": "boolean",
3296
- "description": "Auto-set color-scheme CSS property"
3297
- },
3298
- "nonce": {
3299
- "type": "string",
3300
- "description": "CSP nonce"
3301
- }
3302
- },
3303
- "additionalProperties": false,
3304
- "description": "Theme provider. Based on next-themes. Access theme state via useTheme() hook."
3534
+ "description": "Single-line text input (always prefer over native <input type=\"text\">).\n\nWHEN TO USE: any short text — name, email, search, URL, password.\nUse the built-in label/description props instead of wrapping with your own <label>/<p> tags (auto-binds htmlFor/aria-describedby for accessibility).\nFor numeric input use NumberInput; for currency PriceInput; for long text TextArea; for date DatePicker.\n\nANTI-PATTERNS:\n ✗ <TextInput type=\"number\"> → <NumberInput> (gives unit, step, ↑↓ keys)\n ✗ <label>Email <input ...></label> + <p>helper</p> → <TextInput label=\"Email\" description=\"helper\">\n ✗ Custom red border for error → use error prop (auto aria-invalid + token color)\n ✗ Manual character counter → use showCount + maxLength\n ✗ Manual clear X button → use clearable prop"
3305
3535
  }
3306
3536
  },
3307
3537
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3382,7 +3612,7 @@
3382
3612
  }
3383
3613
  },
3384
3614
  "additionalProperties": false,
3385
- "description": "toast() call options. Used as toast(message, options). Fully customizable via toast.custom(jsx)."
3615
+ "description": "toast() options. Used as toast(message, options) / toast.success / .error / .warning / .info / .promise / .custom(jsx).\n\nWHEN TO USE TOAST:\n • Transient feedback after user action: \"Saved\", \"Copied\", \"Network error\"\n • Persistent in-page banner → Alert\n • Critical destructive confirmation → Modal (toast can be missed)\n • Form field error → use error/description prop on the input\n\nrichColors=true gives strong success/error/warning/info colors. Use action for \"Undo\" patterns.\n\nANTI-PATTERNS:\n ✗ Toast for confirmation that user MUST acknowledge → Modal\n ✗ Stacking many toasts → set visibleToasts on Toaster\n ✗ Long-form content in toast (toast is for short messages)"
3386
3616
  }
3387
3617
  },
3388
3618
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3458,7 +3688,7 @@
3458
3688
  }
3459
3689
  },
3460
3690
  "additionalProperties": false,
3461
- "description": "Toaster config. Place once at app root. Display notifications via toast(). Based on sonner."
3691
+ "description": "Toaster — toast container. Mount ONCE at app root. Then call toast() anywhere. Based on sonner.\n\nWHEN TO USE:\n • Mount in app shell (layout.tsx / _app.tsx) — exactly one instance globally\n • Set position once here; per-toast position only when needed\n • Provide visibleToasts cap to avoid stacking\n\nANTI-PATTERNS:\n ✗ Multiple Toasters across pages — only one global Toaster\n ✗ Mounting Toaster inside conditional render — toasts vanish on remount\n ✗ Forgetting Toaster mount — toast() calls do nothing"
3462
3692
  }
3463
3693
  },
3464
3694
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3523,10 +3753,11 @@
3523
3753
  "enum": [
3524
3754
  "default",
3525
3755
  "primary",
3526
- "secondary"
3756
+ "secondary",
3757
+ "outline"
3527
3758
  ],
3528
3759
  "default": "default",
3529
- "description": "Style variant (default=slider, primary=accent filled, secondary=accent filled)"
3760
+ "description": "Style variant (default=slider, primary/secondary=accent filled, outline=bordered buttons with no background)"
3530
3761
  },
3531
3762
  "size": {
3532
3763
  "type": "string",
@@ -3538,6 +3769,11 @@
3538
3769
  "default": "md",
3539
3770
  "description": "Size"
3540
3771
  },
3772
+ "fullWidth": {
3773
+ "type": "boolean",
3774
+ "default": false,
3775
+ "description": "Stretch the group to parent width and split items equally"
3776
+ },
3541
3777
  "disabled": {
3542
3778
  "type": "boolean",
3543
3779
  "description": "Disable all items"
@@ -3556,7 +3792,7 @@
3556
3792
  "items"
3557
3793
  ],
3558
3794
  "additionalProperties": false,
3559
- "description": "Toggle group / Segment control. Based on Radix ToggleGroup."
3795
+ "description": "Toggle group / Segment control for immediate-effect option selection. Based on Radix ToggleGroup.\n\nWHEN TO USE:\n • Sort order, view mode (grid/list), filter chips — selection takes effect immediately\n • Visual comparison important (icons or short labels)\n • Form field that submits later → RadioGroup or CheckBox instead\n • Page area switching (settings tabs) → Tab instead\n\nVARIANTS:\n • default — slider-style background (sleek)\n • primary / secondary — accent-filled selected state\n • outline — bordered buttons with no background (button-style toolbar)\n\nfullWidth=true distributes items equally across parent width (use with outline variant for button-row look).\n\ntype=\"single\" requires at least one selection by default (required=true). Set required=false to allow deselection.\n\nANTI-PATTERNS:\n ✗ Using ToggleGroup for content tabs → Tab\n ✗ Using ToggleGroup as form field submitted later → RadioGroup (semantics + a11y)\n ✗ Mixing icons and text labels of different sizes — keep visual rhythm consistent"
3560
3796
  }
3561
3797
  },
3562
3798
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3623,7 +3859,7 @@
3623
3859
  }
3624
3860
  },
3625
3861
  "additionalProperties": false,
3626
- "description": "Tooltip. Based on Radix Tooltip. Built-in Provider."
3862
+ "description": "Tooltip — short text hint shown on hover/focus. Based on Radix Tooltip. Provider built-in.\n\nWHEN TO USE:\n • Brief explanation of an icon button or truncated label\n • Hover-only, non-interactive content (text only)\n • Need clickable content inside → Popover (not Tooltip)\n • Action menu → DropdownMenu\n • Force user attention → Modal\n\nANTI-PATTERNS:\n ✗ Buttons/links inside content → use Popover (Tooltip not focusable)\n ✗ Long paragraphs in tooltip → consider Popover or Drawer\n ✗ Tooltip on disabled buttons (won't show in some browsers) — wrap in span instead\n ✗ Critical info only in tooltip — duplicate visible elsewhere for mobile/touch"
3627
3863
  }
3628
3864
  },
3629
3865
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3680,7 +3916,7 @@
3680
3916
  "items"
3681
3917
  ],
3682
3918
  "additionalProperties": false,
3683
- "description": "Virtual scroll list. Based on @tanstack/react-virtual."
3919
+ "description": "VirtualList performant rendering of huge lists (1000+ items). Based on @tanstack/react-virtual.\n\nWHEN TO USE:\n • Large datasets (>200 rows): chat history, transactions, logs, leaderboard\n • Stable item height (or measurable per-item via estimateSize fn)\n • Small list (<100 items) → DataList (much simpler API)\n • Grid layout → VirtualGrid\n • Server-side pagination → InfiniteScroll wrapping plain list\n\nestimateSize is critical — wrong values cause scroll jumps. Pair with onEndReached for server pagination.\n\nANTI-PATTERNS:\n ✗ VirtualList for short lists (DataList is simpler and renders faster)\n ✗ Variable estimateSize for uniform items — use a single number\n ✗ Putting interactive overlays inside virtual rows (mounted/unmounted on scroll)"
3684
3920
  }
3685
3921
  },
3686
3922
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -3742,7 +3978,7 @@
3742
3978
  "columns"
3743
3979
  ],
3744
3980
  "additionalProperties": false,
3745
- "description": "Virtual scroll grid. Based on @tanstack/react-virtual."
3981
+ "description": "VirtualGrid performant grid for huge lists. Based on @tanstack/react-virtual.\n\nWHEN TO USE:\n • Image gallery / card grid with 200+ items\n • Fixed column count (responsive via JS — recompute columns on breakpoint)\n • Small grid → DataGrid (no virtualization, simpler API)\n • Single-column list → VirtualList\n\nANTI-PATTERNS:\n ✗ VirtualGrid with <50 items — DataGrid is simpler\n ✗ Cards with hover-expanding height (breaks virtualization)\n ✗ Forgetting to recompute columns on resize → visible empty space"
3746
3982
  }
3747
3983
  },
3748
3984
  "$schema": "http://json-schema.org/draft-07/schema#"