@sableui/react 0.6.2 → 0.7.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 (642) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +315 -0
  3. package/CONTRIBUTING.md +16 -10
  4. package/DESIGN.md +3 -3
  5. package/README.md +3 -3
  6. package/bin/sable-lint.mjs +18 -0
  7. package/bin/sable.mjs +470 -62
  8. package/dist/blocks/api-keys-block.js +44 -0
  9. package/dist/blocks/api-keys-block.meta.js +21 -0
  10. package/dist/blocks/chat-thread-block.js +17 -0
  11. package/dist/blocks/chat-thread-block.meta.js +20 -0
  12. package/dist/blocks/command-palette-block.js +24 -0
  13. package/dist/blocks/command-palette-block.meta.js +21 -0
  14. package/dist/blocks/cta-band-block.js +27 -0
  15. package/dist/blocks/cta-band-block.meta.js +20 -0
  16. package/dist/blocks/danger-zone-block.js +39 -0
  17. package/dist/blocks/danger-zone-block.meta.js +21 -0
  18. package/dist/blocks/device-comparison-block.js +69 -0
  19. package/dist/blocks/device-comparison-block.meta.js +21 -0
  20. package/dist/blocks/event-card-block.js +40 -0
  21. package/dist/blocks/event-card-block.meta.js +21 -0
  22. package/dist/blocks/faq-block.js +38 -0
  23. package/dist/blocks/faq-block.meta.js +20 -0
  24. package/dist/blocks/feature-grid-block.js +38 -0
  25. package/dist/blocks/feature-grid-block.meta.js +21 -0
  26. package/dist/blocks/feedback-form-block.js +30 -0
  27. package/dist/blocks/feedback-form-block.meta.js +21 -0
  28. package/dist/blocks/goal-progress-block.js +24 -0
  29. package/dist/blocks/goal-progress-block.meta.js +21 -0
  30. package/dist/blocks/hero-block.js +33 -0
  31. package/dist/blocks/hero-block.meta.js +21 -0
  32. package/dist/blocks/index.js +162 -1964
  33. package/dist/blocks/invite-team-block.js +36 -0
  34. package/dist/blocks/invite-team-block.meta.js +20 -0
  35. package/dist/blocks/invoice-history-block.js +41 -0
  36. package/dist/blocks/invoice-history-block.meta.js +21 -0
  37. package/dist/blocks/kpi-sparkline-block.js +29 -0
  38. package/dist/blocks/kpi-sparkline-block.meta.js +20 -0
  39. package/dist/blocks/media-player-block.js +68 -0
  40. package/dist/blocks/media-player-block.meta.js +21 -0
  41. package/dist/blocks/newsletter-block.js +35 -0
  42. package/dist/blocks/newsletter-block.meta.js +21 -0
  43. package/dist/blocks/not-found-block.js +27 -0
  44. package/dist/blocks/not-found-block.meta.js +20 -0
  45. package/dist/blocks/notification-list-block.js +32 -0
  46. package/dist/blocks/notification-list-block.meta.js +21 -0
  47. package/dist/blocks/notification-settings-block.js +25 -0
  48. package/dist/blocks/notification-settings-block.meta.js +20 -0
  49. package/dist/blocks/order-tracking-block.js +26 -0
  50. package/dist/blocks/order-tracking-block.meta.js +20 -0
  51. package/dist/blocks/pricing-card-block.js +46 -0
  52. package/dist/blocks/pricing-card-block.meta.js +21 -0
  53. package/dist/blocks/pricing-table-block.js +88 -0
  54. package/dist/blocks/pricing-table-block.meta.js +20 -0
  55. package/dist/blocks/product-card-block.js +26 -0
  56. package/dist/blocks/product-card-block.meta.js +21 -0
  57. package/dist/blocks/profile-card-block.js +58 -0
  58. package/dist/blocks/profile-card-block.meta.js +21 -0
  59. package/dist/blocks/profile-form-block.js +70 -0
  60. package/dist/blocks/profile-form-block.meta.js +21 -0
  61. package/dist/blocks/revenue-breakdown-block.js +38 -0
  62. package/dist/blocks/revenue-breakdown-block.meta.js +21 -0
  63. package/dist/blocks/sign-in-block.js +38 -0
  64. package/dist/blocks/sign-in-block.meta.js +21 -0
  65. package/dist/blocks/sign-up-block.js +48 -0
  66. package/dist/blocks/sign-up-block.meta.js +21 -0
  67. package/dist/blocks/site-footer-block.js +54 -0
  68. package/dist/blocks/site-footer-block.meta.js +20 -0
  69. package/dist/blocks/stat-row-block.js +28 -0
  70. package/dist/blocks/stat-row-block.meta.js +21 -0
  71. package/dist/blocks/steps-block.js +37 -0
  72. package/dist/blocks/steps-block.meta.js +20 -0
  73. package/dist/blocks/task-list-block.js +52 -0
  74. package/dist/blocks/task-list-block.meta.js +21 -0
  75. package/dist/blocks/team-members-block.js +49 -0
  76. package/dist/blocks/team-members-block.meta.js +21 -0
  77. package/dist/blocks/testimonial-block.js +49 -0
  78. package/dist/blocks/testimonial-block.meta.js +20 -0
  79. package/dist/blocks/traffic-sources-block.js +39 -0
  80. package/dist/blocks/traffic-sources-block.meta.js +21 -0
  81. package/dist/blocks/traffic-trend-block.js +61 -0
  82. package/dist/blocks/traffic-trend-block.meta.js +21 -0
  83. package/dist/blocks/upload-list-block.js +39 -0
  84. package/dist/blocks/upload-list-block.meta.js +21 -0
  85. package/dist/blocks/verify-code-block.js +28 -0
  86. package/dist/blocks/verify-code-block.meta.js +21 -0
  87. package/dist/blocks/wallet-block.js +48 -0
  88. package/dist/blocks/wallet-block.meta.js +21 -0
  89. package/dist/components/accordion/accordion.js +63 -0
  90. package/dist/components/accordion/accordion.meta.js +155 -0
  91. package/dist/components/accordion/index.js +15 -0
  92. package/dist/components/app-header/app-header.js +30 -0
  93. package/dist/components/app-header/app-header.meta.js +88 -0
  94. package/dist/components/app-header/index.js +7 -0
  95. package/dist/components/app-shell/app-shell-dock.js +37 -0
  96. package/dist/components/app-shell/app-shell.js +67 -0
  97. package/dist/components/app-shell/app-shell.meta.js +176 -0
  98. package/dist/components/app-shell/index.js +7 -0
  99. package/dist/components/area-chart/area-chart.js +10 -0
  100. package/dist/components/area-chart/area-chart.meta.js +218 -0
  101. package/dist/components/area-chart/index.js +7 -0
  102. package/dist/components/attachment/attachment.js +176 -0
  103. package/dist/components/attachment/attachment.meta.js +179 -0
  104. package/dist/components/attachment/attachment.variants.js +47 -0
  105. package/dist/components/attachment/index.js +7 -0
  106. package/dist/components/avatar/avatar.js +192 -0
  107. package/dist/components/avatar/avatar.meta.js +233 -0
  108. package/dist/components/avatar/avatar.variants.js +44 -0
  109. package/dist/components/avatar/index.js +22 -0
  110. package/dist/components/badge/badge.js +26 -0
  111. package/dist/components/badge/badge.meta.js +171 -0
  112. package/dist/components/badge/badge.variants.js +103 -0
  113. package/dist/components/badge/index.js +11 -0
  114. package/dist/components/banner/banner.js +76 -0
  115. package/dist/components/banner/banner.meta.js +172 -0
  116. package/dist/components/banner/banner.variants.js +44 -0
  117. package/dist/components/banner/index.js +9 -0
  118. package/dist/components/bar-chart/bar-chart.js +10 -0
  119. package/dist/components/bar-chart/bar-chart.meta.js +245 -0
  120. package/dist/components/bar-chart/index.js +7 -0
  121. package/dist/components/bottom-nav/bottom-nav.js +63 -0
  122. package/dist/components/bottom-nav/bottom-nav.meta.js +95 -0
  123. package/dist/components/bottom-nav/index.js +11 -0
  124. package/dist/components/breadcrumbs/breadcrumbs.js +90 -0
  125. package/dist/components/breadcrumbs/breadcrumbs.meta.js +111 -0
  126. package/dist/components/breadcrumbs/index.js +17 -0
  127. package/dist/components/browser/browser.js +39 -0
  128. package/dist/components/browser/browser.meta.js +80 -0
  129. package/dist/components/browser/index.js +7 -0
  130. package/dist/components/bubble/bubble.js +110 -0
  131. package/dist/components/bubble/bubble.meta.js +158 -0
  132. package/dist/components/bubble/bubble.variants.js +90 -0
  133. package/dist/components/bubble/index.js +13 -0
  134. package/dist/components/button/button.js +87 -0
  135. package/dist/components/button/button.meta.js +302 -0
  136. package/dist/components/button/button.variants.js +137 -0
  137. package/dist/components/button/index.js +9 -0
  138. package/dist/components/calendar/calendar.js +89 -0
  139. package/dist/components/calendar/calendar.meta.js +136 -0
  140. package/dist/components/calendar/index.js +7 -0
  141. package/dist/components/card/card.js +203 -0
  142. package/dist/components/card/card.meta.js +212 -0
  143. package/dist/components/card/index.js +23 -0
  144. package/dist/components/carousel/carousel.js +428 -0
  145. package/dist/components/carousel/carousel.meta.js +100 -0
  146. package/dist/components/carousel/index.js +7 -0
  147. package/dist/components/chat-composer/chat-composer.js +174 -0
  148. package/dist/components/chat-composer/chat-composer.meta.js +241 -0
  149. package/dist/components/chat-composer/chat-composer.variants.js +17 -0
  150. package/dist/components/chat-composer/index.js +7 -0
  151. package/dist/components/checkbox/checkbox-mark.js +28 -0
  152. package/dist/components/checkbox/checkbox.js +30 -0
  153. package/dist/components/checkbox/checkbox.meta.js +127 -0
  154. package/dist/components/checkbox/index.js +7 -0
  155. package/dist/components/checkbox-card/checkbox-card.js +94 -0
  156. package/dist/components/checkbox-card/checkbox-card.meta.js +154 -0
  157. package/dist/components/checkbox-card/checkbox-card.variants.js +43 -0
  158. package/dist/components/checkbox-card/index.js +11 -0
  159. package/dist/components/code/code.js +19 -0
  160. package/dist/components/code/code.meta.js +71 -0
  161. package/dist/components/code/index.js +7 -0
  162. package/dist/components/code-block/code-block.js +84 -0
  163. package/dist/components/code-block/code-block.meta.js +103 -0
  164. package/dist/components/code-block/index.js +8 -0
  165. package/dist/components/collapsible/collapsible.js +38 -0
  166. package/dist/components/collapsible/collapsible.meta.js +117 -0
  167. package/dist/components/collapsible/index.js +15 -0
  168. package/dist/components/color-field/color-field.js +293 -0
  169. package/dist/components/color-field/color-field.meta.js +142 -0
  170. package/dist/components/color-field/color.js +69 -0
  171. package/dist/components/color-field/index.js +15 -0
  172. package/dist/components/combobox/combobox.js +486 -0
  173. package/dist/components/combobox/combobox.meta.js +217 -0
  174. package/dist/components/combobox/index.js +37 -0
  175. package/dist/components/command-menu/command-menu-trigger.js +122 -0
  176. package/dist/components/command-menu/command-menu.js +433 -0
  177. package/dist/components/command-menu/command-menu.meta.js +279 -0
  178. package/dist/components/command-menu/index.js +21 -0
  179. package/dist/components/context-card/context-card.js +62 -0
  180. package/dist/components/context-card/context-card.meta.js +106 -0
  181. package/dist/components/context-card/index.js +17 -0
  182. package/dist/components/context-menu/context-menu.js +92 -0
  183. package/dist/components/context-menu/context-menu.meta.js +138 -0
  184. package/dist/components/context-menu/index.js +23 -0
  185. package/dist/components/data-table/data-table.js +142 -0
  186. package/dist/components/data-table/data-table.meta.js +146 -0
  187. package/dist/components/data-table/index.js +9 -0
  188. package/dist/components/date-picker/date-picker.js +196 -0
  189. package/dist/components/date-picker/date-picker.meta.js +164 -0
  190. package/dist/components/date-picker/index.js +7 -0
  191. package/dist/components/date-tile/date-tile.js +29 -0
  192. package/dist/components/date-tile/date-tile.meta.js +72 -0
  193. package/dist/components/date-tile/index.js +7 -0
  194. package/dist/components/destructive-action-modal/destructive-action-modal.js +130 -0
  195. package/dist/components/destructive-action-modal/destructive-action-modal.meta.js +136 -0
  196. package/dist/components/destructive-action-modal/index.js +9 -0
  197. package/dist/components/dialog/dialog.js +207 -0
  198. package/dist/components/dialog/dialog.meta.js +239 -0
  199. package/dist/components/dialog/index.js +45 -0
  200. package/dist/components/disclosure-picker/disclosure-picker.js +417 -0
  201. package/dist/components/disclosure-picker/disclosure-picker.meta.js +213 -0
  202. package/dist/components/disclosure-picker/index.js +21 -0
  203. package/dist/components/empty-state/empty-state.js +52 -0
  204. package/dist/components/empty-state/empty-state.meta.js +158 -0
  205. package/dist/components/empty-state/index.js +7 -0
  206. package/dist/components/entity/entity.js +70 -0
  207. package/dist/components/entity/entity.meta.js +108 -0
  208. package/dist/components/entity/entity.variants.js +16 -0
  209. package/dist/components/entity/index.js +7 -0
  210. package/dist/components/feedback/feedback.js +93 -0
  211. package/dist/components/feedback/feedback.meta.js +109 -0
  212. package/dist/components/feedback/index.js +7 -0
  213. package/dist/components/fieldset/fieldset.js +80 -0
  214. package/dist/components/fieldset/fieldset.meta.js +160 -0
  215. package/dist/components/fieldset/index.js +17 -0
  216. package/dist/components/file-dropzone/file-dropzone.js +193 -0
  217. package/dist/components/file-dropzone/file-dropzone.meta.js +210 -0
  218. package/dist/components/file-dropzone/file-dropzone.variants.js +26 -0
  219. package/dist/components/file-dropzone/index.js +13 -0
  220. package/dist/components/font-picker/font-picker.js +77 -0
  221. package/dist/components/font-picker/font-picker.meta.js +119 -0
  222. package/dist/components/font-picker/index.js +7 -0
  223. package/dist/components/form/form.js +145 -0
  224. package/dist/components/form/form.meta.js +142 -0
  225. package/dist/components/form/index.js +11 -0
  226. package/dist/components/gliding-highlight/gliding-highlight.js +50 -0
  227. package/dist/components/gliding-highlight/gliding-highlight.meta.js +135 -0
  228. package/dist/components/gliding-highlight/index.js +9 -0
  229. package/dist/components/gradient-art/gradient-art.js +168 -0
  230. package/dist/components/gradient-art/gradient-art.meta.js +81 -0
  231. package/dist/components/gradient-art/index.js +7 -0
  232. package/dist/components/gradient-art/renderer.js +336 -0
  233. package/dist/components/inline-status/index.js +7 -0
  234. package/dist/components/inline-status/inline-status.js +33 -0
  235. package/dist/components/inline-status/inline-status.meta.js +83 -0
  236. package/dist/components/inline-status/inline-status.variants.js +18 -0
  237. package/dist/components/input/index.js +7 -0
  238. package/dist/components/input/input.js +33 -0
  239. package/dist/components/input/input.meta.js +155 -0
  240. package/dist/components/kbd/index.js +8 -0
  241. package/dist/components/kbd/kbd.js +54 -0
  242. package/dist/components/kbd/kbd.meta.js +95 -0
  243. package/dist/components/label/index.js +7 -0
  244. package/dist/components/label/label.js +51 -0
  245. package/dist/components/label/label.meta.js +98 -0
  246. package/dist/components/line-chart/index.js +7 -0
  247. package/dist/components/line-chart/line-chart.js +10 -0
  248. package/dist/components/line-chart/line-chart.meta.js +222 -0
  249. package/dist/components/marker/index.js +7 -0
  250. package/dist/components/marker/marker.js +39 -0
  251. package/dist/components/marker/marker.meta.js +132 -0
  252. package/dist/components/marker/marker.variants.js +25 -0
  253. package/dist/components/marquee/index.js +7 -0
  254. package/dist/components/marquee/marquee.js +146 -0
  255. package/dist/components/marquee/marquee.meta.js +106 -0
  256. package/dist/components/media-image/index.js +7 -0
  257. package/dist/components/media-image/media-image.js +56 -0
  258. package/dist/components/media-image/media-image.meta.js +92 -0
  259. package/dist/components/media-tile/index.js +7 -0
  260. package/dist/components/media-tile/media-tile.js +135 -0
  261. package/dist/components/media-tile/media-tile.meta.js +133 -0
  262. package/dist/components/media-tile/media-tile.variants.js +48 -0
  263. package/dist/components/menu/index.js +33 -0
  264. package/dist/components/menu/menu.js +168 -0
  265. package/dist/components/menu/menu.meta.js +176 -0
  266. package/dist/components/message/index.js +7 -0
  267. package/dist/components/message/message.js +83 -0
  268. package/dist/components/message/message.meta.js +150 -0
  269. package/dist/components/message/message.variants.js +41 -0
  270. package/dist/components/message-scroller/index.js +9 -0
  271. package/dist/components/message-scroller/message-scroller.js +300 -0
  272. package/dist/components/message-scroller/message-scroller.meta.js +172 -0
  273. package/dist/components/meter/index.js +20 -0
  274. package/dist/components/meter/meter.js +112 -0
  275. package/dist/components/meter/meter.meta.js +227 -0
  276. package/dist/components/meter/meter.variants.js +61 -0
  277. package/dist/components/middle-truncate/index.js +7 -0
  278. package/dist/components/middle-truncate/middle-truncate.js +28 -0
  279. package/dist/components/middle-truncate/middle-truncate.meta.js +77 -0
  280. package/dist/components/note/index.js +9 -0
  281. package/dist/components/note/note.js +73 -0
  282. package/dist/components/note/note.meta.js +112 -0
  283. package/dist/components/note/note.variants.js +22 -0
  284. package/dist/components/notification-badge/index.js +15 -0
  285. package/dist/components/notification-badge/notification-badge.js +48 -0
  286. package/dist/components/notification-badge/notification-badge.meta.js +107 -0
  287. package/dist/components/notification-badge/notification-badge.variants.js +57 -0
  288. package/dist/components/number-field/index.js +7 -0
  289. package/dist/components/number-field/number-field.js +70 -0
  290. package/dist/components/number-field/number-field.meta.js +109 -0
  291. package/dist/components/otp-field/index.js +7 -0
  292. package/dist/components/otp-field/otp-field.js +70 -0
  293. package/dist/components/otp-field/otp-field.meta.js +197 -0
  294. package/dist/components/overflow-menu/index.js +7 -0
  295. package/dist/components/overflow-menu/overflow-menu.js +26 -0
  296. package/dist/components/overflow-menu/overflow-menu.meta.js +100 -0
  297. package/dist/components/page-header/index.js +7 -0
  298. package/dist/components/page-header/page-header.js +34 -0
  299. package/dist/components/page-header/page-header.meta.js +104 -0
  300. package/dist/components/page-loader/index.js +7 -0
  301. package/dist/components/page-loader/page-loader.js +37 -0
  302. package/dist/components/page-loader/page-loader.meta.js +85 -0
  303. package/dist/components/pagination/index.js +7 -0
  304. package/dist/components/pagination/pagination.js +105 -0
  305. package/dist/components/pagination/pagination.meta.js +141 -0
  306. package/dist/components/panel-group/index.js +10 -0
  307. package/dist/components/panel-group/panel-group.js +168 -0
  308. package/dist/components/panel-group/panel-group.meta.js +153 -0
  309. package/dist/components/panel-section/index.js +9 -0
  310. package/dist/components/panel-section/panel-section.js +115 -0
  311. package/dist/components/panel-section/panel-section.meta.js +156 -0
  312. package/dist/components/phone/index.js +7 -0
  313. package/dist/components/phone/phone.js +50 -0
  314. package/dist/{chunk-KFZ43RKU.js → components/phone/phone.meta.js} +3 -50
  315. package/dist/{chunk-NEQNXI2G.js → components/phone/status-icons.js} +4 -4
  316. package/dist/components/pie-chart/index.js +7 -0
  317. package/dist/components/pie-chart/pie-chart.js +191 -0
  318. package/dist/components/pie-chart/pie-chart.meta.js +210 -0
  319. package/dist/components/pill/index.js +9 -0
  320. package/dist/components/pill/pill.js +24 -0
  321. package/dist/components/pill/pill.meta.js +108 -0
  322. package/dist/components/pill/pill.variants.js +65 -0
  323. package/dist/components/popover/index.js +23 -0
  324. package/dist/components/popover/popover.js +100 -0
  325. package/dist/components/popover/popover.meta.js +136 -0
  326. package/dist/components/progress/index.js +19 -0
  327. package/dist/components/progress/progress.js +70 -0
  328. package/dist/components/progress/progress.meta.js +171 -0
  329. package/dist/components/progress/progress.variants.js +17 -0
  330. package/dist/components/radar-chart/index.js +7 -0
  331. package/dist/components/radar-chart/radar-chart.js +161 -0
  332. package/dist/components/radar-chart/radar-chart.meta.js +204 -0
  333. package/dist/components/radial-chart/index.js +7 -0
  334. package/dist/components/radial-chart/radial-chart.js +175 -0
  335. package/dist/components/radial-chart/radial-chart.meta.js +216 -0
  336. package/dist/components/radio/index.js +8 -0
  337. package/dist/components/radio/radio.js +39 -0
  338. package/dist/components/radio/radio.meta.js +104 -0
  339. package/dist/components/radio-card/index.js +7 -0
  340. package/dist/components/radio-card/radio-card.js +81 -0
  341. package/dist/components/radio-card/radio-card.meta.js +144 -0
  342. package/dist/components/radio-card/radio-card.variants.js +43 -0
  343. package/dist/components/relative-time/index.js +7 -0
  344. package/dist/components/relative-time/relative-time.js +47 -0
  345. package/dist/components/relative-time/relative-time.meta.js +77 -0
  346. package/dist/components/scroller/index.js +7 -0
  347. package/dist/components/scroller/scroller.js +111 -0
  348. package/dist/components/scroller/scroller.meta.js +118 -0
  349. package/dist/components/scrub-field/index.js +7 -0
  350. package/dist/components/scrub-field/scrub-field.js +124 -0
  351. package/dist/components/scrub-field/scrub-field.meta.js +139 -0
  352. package/dist/components/search-input/index.js +7 -0
  353. package/dist/components/search-input/search-input.js +91 -0
  354. package/dist/components/search-input/search-input.meta.js +129 -0
  355. package/dist/components/section-header/index.js +7 -0
  356. package/dist/components/section-header/section-header.js +39 -0
  357. package/dist/components/section-header/section-header.meta.js +174 -0
  358. package/dist/components/segmented-bar/index.js +14 -0
  359. package/dist/components/segmented-bar/segmented-bar.js +26 -0
  360. package/dist/components/segmented-bar/segmented-bar.meta.js +108 -0
  361. package/dist/components/segmented-bar/segmented-bar.variants.js +39 -0
  362. package/dist/components/select/index.js +25 -0
  363. package/dist/components/select/select.js +191 -0
  364. package/dist/components/select/select.meta.js +189 -0
  365. package/dist/components/separator/index.js +7 -0
  366. package/dist/components/separator/separator.js +42 -0
  367. package/dist/components/separator/separator.meta.js +84 -0
  368. package/dist/components/settings-menu/index.js +11 -0
  369. package/dist/components/settings-menu/settings-menu.js +101 -0
  370. package/dist/components/settings-menu/settings-menu.meta.js +177 -0
  371. package/dist/components/settings-menu/settings-menu.variants.js +15 -0
  372. package/dist/components/sheet/index.js +29 -0
  373. package/dist/components/sheet/sheet.js +121 -0
  374. package/dist/components/sheet/sheet.meta.js +167 -0
  375. package/dist/components/sheet/sheet.variants.js +21 -0
  376. package/dist/components/show-more/index.js +7 -0
  377. package/dist/components/show-more/show-more.js +87 -0
  378. package/dist/components/show-more/show-more.meta.js +79 -0
  379. package/dist/components/side-nav/index.js +13 -0
  380. package/dist/components/side-nav/side-nav.js +75 -0
  381. package/dist/components/side-nav/side-nav.meta.js +139 -0
  382. package/dist/components/side-nav/side-nav.variants.js +34 -0
  383. package/dist/components/sidebar/index.js +21 -0
  384. package/dist/components/sidebar/sidebar.js +196 -0
  385. package/dist/components/sidebar/sidebar.meta.js +118 -0
  386. package/dist/components/skeleton/index.js +7 -0
  387. package/dist/components/skeleton/skeleton.js +16 -0
  388. package/dist/components/skeleton/skeleton.meta.js +90 -0
  389. package/dist/components/slider/index.js +21 -0
  390. package/dist/components/slider/slider.js +115 -0
  391. package/dist/components/slider/slider.meta.js +214 -0
  392. package/dist/components/sparkline/index.js +7 -0
  393. package/dist/components/sparkline/sparkline.js +84 -0
  394. package/dist/components/sparkline/sparkline.meta.js +147 -0
  395. package/dist/components/spinner/index.js +7 -0
  396. package/dist/components/spinner/spinner.js +59 -0
  397. package/dist/components/spinner/spinner.meta.js +118 -0
  398. package/dist/components/status-bar/index.js +9 -0
  399. package/dist/components/status-bar/status-bar.js +40 -0
  400. package/dist/components/status-bar/status-bar.meta.js +117 -0
  401. package/dist/components/status-dot/index.js +9 -0
  402. package/dist/components/status-dot/status-dot.js +40 -0
  403. package/dist/components/status-dot/status-dot.meta.js +113 -0
  404. package/dist/components/status-dot/status-dot.variants.js +28 -0
  405. package/dist/components/stepper/index.js +17 -0
  406. package/dist/components/stepper/stepper.js +161 -0
  407. package/dist/components/stepper/stepper.meta.js +190 -0
  408. package/dist/components/stepper/stepper.variants.js +72 -0
  409. package/dist/components/streaming-text/index.js +7 -0
  410. package/dist/components/streaming-text/streaming-text.js +55 -0
  411. package/dist/components/streaming-text/streaming-text.meta.js +147 -0
  412. package/dist/components/switch/index.js +7 -0
  413. package/dist/components/switch/switch.js +26 -0
  414. package/dist/components/switch/switch.meta.js +133 -0
  415. package/dist/components/table/index.js +23 -0
  416. package/dist/components/table/table.js +117 -0
  417. package/dist/components/table/table.meta.js +143 -0
  418. package/dist/components/tabs/index.js +17 -0
  419. package/dist/components/tabs/tabs.js +58 -0
  420. package/dist/components/tabs/tabs.meta.js +120 -0
  421. package/dist/components/textarea/index.js +7 -0
  422. package/dist/components/textarea/textarea.js +38 -0
  423. package/dist/components/textarea/textarea.meta.js +117 -0
  424. package/dist/components/theme-selector/index.js +11 -0
  425. package/dist/components/theme-selector/theme-selector.js +145 -0
  426. package/dist/components/theme-selector/theme-selector.meta.js +181 -0
  427. package/dist/components/theme-switcher/index.js +7 -0
  428. package/dist/components/theme-switcher/theme-switcher.js +106 -0
  429. package/dist/components/theme-switcher/theme-switcher.meta.js +99 -0
  430. package/dist/components/thinking-orb/index.js +9 -0
  431. package/dist/components/thinking-orb/thinking-orb.js +126 -0
  432. package/dist/components/thinking-orb/thinking-orb.meta.js +142 -0
  433. package/dist/components/thinking-orb/thinking-orb.render.js +252 -0
  434. package/dist/components/toast/index.js +29 -0
  435. package/dist/components/toast/toast.js +254 -0
  436. package/dist/components/toast/toast.meta.js +261 -0
  437. package/dist/components/toggle/index.js +13 -0
  438. package/dist/components/toggle/toggle.js +51 -0
  439. package/dist/components/toggle/toggle.meta.js +129 -0
  440. package/dist/components/toolbar/index.js +27 -0
  441. package/dist/components/toolbar/toolbar.js +80 -0
  442. package/dist/components/toolbar/toolbar.meta.js +272 -0
  443. package/dist/components/toolbar/toolbar.variants.js +16 -0
  444. package/dist/components/tooltip/index.js +21 -0
  445. package/dist/components/tooltip/tooltip.js +74 -0
  446. package/dist/components/tooltip/tooltip.meta.js +156 -0
  447. package/dist/components/tree/index.js +12 -0
  448. package/dist/components/tree/tree.js +364 -0
  449. package/dist/components/tree/tree.meta.js +334 -0
  450. package/dist/components/video/index.js +7 -0
  451. package/dist/components/video/video.js +59 -0
  452. package/dist/components/video/video.meta.js +81 -0
  453. package/dist/components/workspace/index.js +9 -0
  454. package/dist/components/workspace/workspace.js +79 -0
  455. package/dist/components/workspace/workspace.meta.js +183 -0
  456. package/dist/foundations/accessibility.js +107 -0
  457. package/dist/foundations/index.js +25 -792
  458. package/dist/foundations/motion.js +135 -0
  459. package/dist/foundations/scrolling.js +62 -0
  460. package/dist/foundations/shape.js +113 -0
  461. package/dist/foundations/spacing.js +121 -0
  462. package/dist/foundations/surfaces.js +107 -0
  463. package/dist/foundations/types.js +0 -0
  464. package/dist/foundations/typography.js +152 -0
  465. package/dist/icon/Icon.js +30 -0
  466. package/dist/icon/IconProvider.js +27 -0
  467. package/dist/icon/compose.js +13 -0
  468. package/dist/icon/index.d.ts +13 -5
  469. package/dist/icon/index.js +13 -2
  470. package/dist/icon/registry.js +0 -0
  471. package/dist/icon-sets/brands.generated.js +123 -0
  472. package/dist/icon-sets/brands.js +10 -123
  473. package/dist/icon-sets/reicon.d.ts +3 -1
  474. package/dist/icon-sets/reicon.js +209 -1
  475. package/dist/index.d.ts +618 -34
  476. package/dist/index.js +211 -11351
  477. package/dist/ios/chrome.js +36 -0
  478. package/dist/ios/index.js +19 -315
  479. package/dist/ios/liquid-glass.js +103 -0
  480. package/dist/ios/native-app.js +46 -0
  481. package/dist/ios/navigation.js +63 -0
  482. package/dist/ios/phone-frame.js +64 -0
  483. package/dist/ios/preview-theme.js +83 -0
  484. package/dist/ios/preview.js +10 -137
  485. package/dist/ios/sheet.js +85 -0
  486. package/dist/ios/theme.js +19 -0
  487. package/dist/layout/AspectBox.js +27 -0
  488. package/dist/layout/Bleed.js +15 -0
  489. package/dist/layout/Center.js +21 -0
  490. package/dist/layout/Columns.js +70 -0
  491. package/dist/layout/Grid.js +50 -0
  492. package/dist/layout/GridOverlay.js +41 -0
  493. package/dist/layout/Page.js +11 -0
  494. package/dist/layout/Region.js +39 -0
  495. package/dist/layout/Row.js +45 -0
  496. package/dist/layout/SafeArea.js +26 -0
  497. package/dist/layout/Spacer.js +9 -0
  498. package/dist/layout/SplitPane.js +55 -0
  499. package/dist/layout/Stack.js +42 -0
  500. package/dist/layout/_responsive.js +16 -0
  501. package/dist/layout/_safeArea.js +18 -0
  502. package/dist/layout/index.d.ts +30 -8
  503. package/dist/layout/index.js +14 -2
  504. package/dist/lib/anchored-scroll.js +7 -0
  505. package/dist/lib/bleed.js +7 -0
  506. package/dist/lib/chart/cartesian.js +365 -0
  507. package/dist/lib/chart/chart-frame.js +163 -0
  508. package/dist/lib/chart/chart-legend.js +13 -0
  509. package/dist/lib/chart/chart-tooltip.js +38 -0
  510. package/dist/lib/chart/format.js +24 -0
  511. package/dist/lib/chart/geometry.js +114 -0
  512. package/dist/lib/chart/motion.js +34 -0
  513. package/dist/lib/chart/scale.js +72 -0
  514. package/dist/lib/chart/types.js +45 -0
  515. package/dist/lib/chart/use-arrival.js +41 -0
  516. package/dist/{chunk-SRQWQUTW.js → lib/cn.js} +5 -5
  517. package/dist/lib/component-guidance.js +215 -0
  518. package/dist/lib/density.js +54 -0
  519. package/dist/lib/field-shell.js +11 -0
  520. package/dist/lib/glyphs.js +9 -0
  521. package/dist/lib/heading-row.js +36 -0
  522. package/dist/lib/highlight-glide.js +84 -0
  523. package/dist/lib/hit-target.js +5 -0
  524. package/dist/lib/meta.js +0 -0
  525. package/dist/lib/portal-theme-scope.js +74 -0
  526. package/dist/{chunk-FKZXAFIY.js → lib/presentation.js} +8 -3
  527. package/dist/lib/refs.js +14 -0
  528. package/dist/lib/scrub-gesture.js +50 -0
  529. package/dist/lib/segmented.js +13 -0
  530. package/dist/lib/selection-card.js +41 -0
  531. package/dist/lib/status-tone.js +13 -0
  532. package/dist/lib/taxonomy.js +214 -0
  533. package/dist/lib/trim-label.js +20 -0
  534. package/dist/lib/use-copy.js +27 -0
  535. package/dist/lib/use-edge-fade.js +32 -0
  536. package/dist/lib/use-isomorphic-layout-effect.js +8 -0
  537. package/dist/lib/use-resize-observer.js +18 -0
  538. package/dist/lib/use-scroll-activity.js +52 -0
  539. package/dist/lib/use-wheel-to-horizontal.js +65 -0
  540. package/dist/motion/MotionProvider.js +75 -0
  541. package/dist/motion/Presence.js +112 -0
  542. package/dist/motion/Reveal.js +42 -0
  543. package/dist/motion/TextReveal.js +61 -0
  544. package/dist/motion/index.js +24 -0
  545. package/dist/motion/useInView.js +36 -0
  546. package/dist/motion/useReducedMotion.js +25 -0
  547. package/dist/motion/viewTransition.js +47 -0
  548. package/dist/patterns/auth-page.js +90 -0
  549. package/dist/patterns/auth-page.meta.js +27 -0
  550. package/dist/patterns/brand-landing-page.js +341 -0
  551. package/dist/patterns/brand-landing-page.meta.js +28 -0
  552. package/dist/patterns/chat-panel.js +185 -0
  553. package/dist/patterns/chat-panel.meta.js +31 -0
  554. package/dist/patterns/dashboard-page.js +332 -0
  555. package/dist/patterns/dashboard-page.meta.js +29 -0
  556. package/dist/patterns/feed-page.js +205 -0
  557. package/dist/patterns/feed-page.meta.js +25 -0
  558. package/dist/patterns/index.js +34 -2140
  559. package/dist/patterns/landing-page.js +356 -0
  560. package/dist/patterns/landing-page.meta.js +26 -0
  561. package/dist/patterns/list-detail-page.js +373 -0
  562. package/dist/patterns/list-detail-page.meta.js +24 -0
  563. package/dist/patterns/settings-page.js +268 -0
  564. package/dist/patterns/settings-page.meta.js +27 -0
  565. package/dist/presets/index.d.ts +7 -1
  566. package/dist/presets/index.js +53 -185
  567. package/dist/styles.css +118 -3
  568. package/dist/{theme-provider-kQszHYji.d.ts → theme-provider-S0NVJs2Y.d.ts} +6 -1
  569. package/dist/{chunk-NETUFI34.js → themes/_contract.js} +14 -2
  570. package/dist/themes/atelier/index.js +17 -1
  571. package/dist/themes/contrast.js +288 -0
  572. package/dist/themes/ember/ember.css +6 -6
  573. package/dist/themes/ember/index.js +16 -1
  574. package/dist/themes/index.d.ts +1 -1
  575. package/dist/themes/index.js +3 -8
  576. package/dist/themes/meridian/index.js +16 -1
  577. package/dist/themes/poppy/index.js +17 -1
  578. package/dist/themes/prism/index.js +17 -1
  579. package/dist/themes/prism/prism.css +2 -2
  580. package/dist/themes/registry.js +59 -0
  581. package/dist/themes/sable/index.js +16 -1
  582. package/dist/{chunk-EFLC4NA3.js → themes/theme-provider.js} +38 -54
  583. package/dist/themes/verdant/index.js +17 -1
  584. package/llms/blocks/media-player-block.md +20 -7
  585. package/llms/blocks/product-card-block.md +6 -4
  586. package/llms/blocks/task-list-block.md +1 -1
  587. package/llms/blocks/traffic-sources-block.md +1 -1
  588. package/llms/blocks/traffic-trend-block.md +5 -3
  589. package/llms/blocks/verify-code-block.md +1 -1
  590. package/llms/components/app-shell.md +5 -2
  591. package/llms/components/avatar.md +25 -3
  592. package/llms/components/button.md +20 -1
  593. package/llms/components/card.md +1 -1
  594. package/llms/components/disclosure-picker.md +168 -0
  595. package/llms/components/font-picker.md +104 -0
  596. package/llms/components/media-image.md +98 -0
  597. package/llms/components/media-tile.md +143 -0
  598. package/llms/components/page-header.md +6 -5
  599. package/llms/components/pie-chart.md +2 -2
  600. package/llms/components/radial-chart.md +1 -1
  601. package/llms/components/section-header.md +144 -0
  602. package/llms/components/sheet.md +10 -0
  603. package/llms/components/sidebar.md +4 -3
  604. package/llms/components/slider.md +14 -2
  605. package/llms/components/theme-selector.md +44 -4
  606. package/llms/components/tree.md +3 -3
  607. package/llms/layout/grid.md +24 -3
  608. package/llms/layout/region.md +16 -3
  609. package/llms/patterns/dashboard-page.md +3 -6
  610. package/llms/patterns/feed-page.md +4 -4
  611. package/llms/patterns/list-detail-page.md +1 -0
  612. package/llms/patterns/settings-page.md +2 -5
  613. package/llms/reference/utilities.md +84 -4
  614. package/llms/tasks/building-a-page.md +34 -3
  615. package/llms/tasks/converting-an-app.md +14 -4
  616. package/llms/tasks/creating-a-preset.md +4 -1
  617. package/llms/tasks/reviewing-a-design.md +19 -0
  618. package/llms/tasks/using-presets.md +19 -0
  619. package/llms-full.txt +1066 -78
  620. package/llms.txt +26 -9
  621. package/package.json +1 -1
  622. package/registry.json +2342 -164
  623. package/scripts/agent-setup.mjs +90 -0
  624. package/scripts/design-presets.mjs +59 -6
  625. package/scripts/grade.mjs +195 -29
  626. package/scripts/lint-rules.mjs +486 -10
  627. package/scripts/review-evidence.mjs +28 -1
  628. package/skills/sable/SKILL.md +67 -24
  629. package/targets/ios.json +45 -0
  630. package/dist/chunk-3IWZYBGH.js +0 -398
  631. package/dist/chunk-7MG4SHYX.js +0 -15
  632. package/dist/chunk-7QSDYBXO.js +0 -7421
  633. package/dist/chunk-ADLLDWLW.js +0 -15
  634. package/dist/chunk-C4Z3CF54.js +0 -15
  635. package/dist/chunk-EDXLM7YL.js +0 -5078
  636. package/dist/chunk-EHH4MHO6.js +0 -14
  637. package/dist/chunk-K7RUHUGC.js +0 -14
  638. package/dist/chunk-KO3NAEBF.js +0 -15
  639. package/dist/chunk-L4IEIQQA.js +0 -14
  640. package/dist/chunk-QJ6FWTUG.js +0 -40
  641. package/dist/chunk-VVW4UCDI.js +0 -4908
  642. package/dist/chunk-XAZGMY73.js +0 -187
@@ -0,0 +1,174 @@
1
+ "use client";
2
+
3
+ // src/components/chat-composer/chat-composer.tsx
4
+ import { useCallback, useRef, useState } from "react";
5
+ import { Icon } from "../../icon/index.js";
6
+ import { cn } from "../../lib/cn.js";
7
+ import { useTypeTier } from "../../lib/density.js";
8
+ import { setRef } from "../../lib/refs.js";
9
+ import { Button } from "../button/index.js";
10
+ import { Textarea } from "../textarea/index.js";
11
+ import { chatComposerVariants } from "./chat-composer.variants.js";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ function ChatComposer({
14
+ value,
15
+ defaultValue = "",
16
+ onValueChange,
17
+ onSend,
18
+ placeholder = "Send a message\u2026",
19
+ busy = false,
20
+ onStop,
21
+ disabled = false,
22
+ invalid = false,
23
+ attachments,
24
+ leading,
25
+ actions,
26
+ onAttach,
27
+ label = "Message",
28
+ sendLabel = "Send message",
29
+ stopLabel = "Stop generating",
30
+ footer,
31
+ fieldRef,
32
+ className,
33
+ children,
34
+ ...props
35
+ }) {
36
+ const tier = useTypeTier();
37
+ const [internal, setInternal] = useState(defaultValue);
38
+ const isControlled = value !== void 0;
39
+ const text = isControlled ? value : internal;
40
+ const field = useRef(null);
41
+ const setField = useCallback(
42
+ (node) => {
43
+ setRef(fieldRef, node);
44
+ field.current = node;
45
+ },
46
+ [fieldRef]
47
+ );
48
+ const setText = useCallback(
49
+ (next) => {
50
+ if (!isControlled) setInternal(next);
51
+ onValueChange?.(next);
52
+ },
53
+ [isControlled, onValueChange]
54
+ );
55
+ const canSend = text.trim().length > 0 && !busy && !disabled;
56
+ const send = useCallback(() => {
57
+ if (!canSend) return;
58
+ onSend?.(text.trim());
59
+ if (!isControlled) setInternal("");
60
+ }, [canSend, isControlled, onSend, text]);
61
+ const handleSubmit = useCallback(
62
+ (event) => {
63
+ event.preventDefault();
64
+ send();
65
+ },
66
+ [send]
67
+ );
68
+ const handleKeyDown = useCallback(
69
+ (event) => {
70
+ if (event.key !== "Enter") return;
71
+ if (event.nativeEvent.isComposing) return;
72
+ if (event.shiftKey) return;
73
+ event.preventDefault();
74
+ send();
75
+ },
76
+ [send]
77
+ );
78
+ const showStop = busy && Boolean(onStop);
79
+ return /* @__PURE__ */ jsxs(
80
+ "form",
81
+ {
82
+ onSubmit: handleSubmit,
83
+ className: cn(chatComposerVariants({ invalid }), className),
84
+ ...props,
85
+ children: [
86
+ attachments ? (
87
+ // The chips sit p-2 and a 1px border inside this box's corner, so
88
+ // they take its radius less both (never under 4px) — concentric,
89
+ // rather than their own rounded-md bulging against the curve.
90
+ /* @__PURE__ */ jsx(
91
+ "div",
92
+ {
93
+ "data-slot": "chat-composer-attachments",
94
+ className: "flex flex-wrap items-start gap-2 [--attachment-radius:max(--spacing(1),calc(var(--chat-composer-r)-(--spacing(2))-1px))]",
95
+ children: attachments
96
+ }
97
+ )
98
+ ) : null,
99
+ /* @__PURE__ */ jsx(
100
+ Textarea,
101
+ {
102
+ ref: setField,
103
+ autoResize: true,
104
+ rows: 1,
105
+ "aria-label": label,
106
+ "aria-invalid": invalid || void 0,
107
+ disabled,
108
+ placeholder,
109
+ value: text,
110
+ onChange: (event) => setText(event.target.value),
111
+ onKeyDown: handleKeyDown,
112
+ className: cn(
113
+ // Inline padding puts the text on the attach glyph's edge: an
114
+ // icon-sm button centres a 1.125rem glyph in --control-sm.
115
+ "min-h-0 max-h-40 resize-none border-0 bg-transparent px-[calc((var(--control-sm)-1.125rem)/2)] py-1 focus-visible:ring-0",
116
+ // What you type has to match what it becomes: the field and the
117
+ // Bubble it turns into both read `prose`, so the message does not
118
+ // change size the moment it is sent.
119
+ tier.prose
120
+ )
121
+ }
122
+ ),
123
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
124
+ onAttach ? /* @__PURE__ */ jsx(
125
+ Button,
126
+ {
127
+ type: "button",
128
+ variant: "ghost",
129
+ size: "icon-sm",
130
+ "aria-label": "Add attachment",
131
+ disabled,
132
+ onClick: onAttach,
133
+ children: /* @__PURE__ */ jsx(Icon, { name: "plus" })
134
+ }
135
+ ) : null,
136
+ leading,
137
+ /* @__PURE__ */ jsx("div", { className: "flex-1" }),
138
+ actions,
139
+ showStop ? /* @__PURE__ */ jsx(
140
+ Button,
141
+ {
142
+ type: "button",
143
+ variant: "secondary",
144
+ size: "icon-sm",
145
+ "aria-label": stopLabel,
146
+ onClick: onStop,
147
+ children: /* @__PURE__ */ jsx(Icon, { name: "stop", variant: "solid", className: "text-[0.75em]" })
148
+ }
149
+ ) : (
150
+ // Busy without a stop handler: Button's own `loading` swaps the glyph
151
+ // for its Spinner and keeps full colour, rather than a hand-spun icon.
152
+ /* @__PURE__ */ jsx(
153
+ Button,
154
+ {
155
+ type: "submit",
156
+ size: "icon-sm",
157
+ "aria-label": sendLabel,
158
+ disabled: !canSend,
159
+ loading: busy,
160
+ children: /* @__PURE__ */ jsx(Icon, { name: "arrow-up" })
161
+ }
162
+ )
163
+ )
164
+ ] }),
165
+ footer ? /* @__PURE__ */ jsx("p", { className: cn("px-[calc((var(--control-sm)-1.125rem)/2)] text-muted-foreground", tier.secondary), children: footer }) : null,
166
+ children
167
+ ]
168
+ }
169
+ );
170
+ }
171
+ ChatComposer.displayName = "ChatComposer";
172
+ export {
173
+ ChatComposer
174
+ };
@@ -0,0 +1,241 @@
1
+ // src/components/chat-composer/chat-composer.meta.ts
2
+ var chatComposerMeta = {
3
+ name: "ChatComposer",
4
+ summary: "The input half of a conversation: one surface holding attachments, an auto-growing field, and its controls. Enter sends, Shift+Enter breaks the line, and send becomes stop while a reply streams.",
5
+ status: "stable",
6
+ keywords: [
7
+ "chat input",
8
+ "composer",
9
+ "message input",
10
+ "prompt input",
11
+ "send message",
12
+ "ai chat",
13
+ "support chat",
14
+ "textarea"
15
+ ],
16
+ usage: {
17
+ description: "Pairs with MessageScroller to make a working chat. A single surface rather than an input with buttons parked beside it: attachments above, text in the middle, affordances along the bottom. Works controlled or uncontrolled \u2014 uncontrolled is the default because it is what the common case wants, and what lets a hook-free page shell ship a composer that actually types.",
18
+ bestPractices: [
19
+ {
20
+ guidance: "do",
21
+ description: "Pass `busy` while a reply streams, and `onStop` alongside it. Interrupting a long generation is the most common thing a reader wants during one, and the control belongs where their cursor already is."
22
+ },
23
+ {
24
+ guidance: "do",
25
+ description: "Leave it uncontrolled unless you need the text elsewhere \u2014 a slash-command menu, a draft you persist. Uncontrolled clears itself on send; controlled does not."
26
+ },
27
+ {
28
+ guidance: "do",
29
+ description: "Render pending uploads as `<Attachment>` chips in `attachments`, so the file and the message it belongs to stay in one box."
30
+ },
31
+ {
32
+ guidance: "do",
33
+ description: "Put model pickers and tool toggles in `leading`, beside the attach button \u2014 they are composer state, not message content, and belong on the chrome row rather than in the field."
34
+ },
35
+ {
36
+ guidance: "dont",
37
+ description: "Do not clear a controlled composer for the user on send. Only the caller knows whether the send succeeded, and clearing on their behalf loses the message when it did not."
38
+ },
39
+ {
40
+ guidance: "dont",
41
+ description: "Do not add your own Enter-to-send handler on top. The built-in one already guards against firing mid-IME-composition, which is the line hand-rolled chat inputs miss."
42
+ },
43
+ {
44
+ guidance: "do",
45
+ description: 'Building a docked agent panel inside a tool? Wrap the whole conversation \u2014 scroller, messages and composer \u2014 in `<Density value="compact">`. The entire set follows the workspace register from there: prose drops a tier, the rhythm tightens, and the controls come off the compact ladder. Do not hand-size it at the call site.'
46
+ },
47
+ {
48
+ guidance: "dont",
49
+ description: "Do not use it as a general multi-line input. That is `Textarea` \u2014 this one submits on Enter, which is wrong for any field inside a larger form."
50
+ },
51
+ {
52
+ guidance: "dont",
53
+ description: "Do not override the field's type utility to make it match your transcript. The field and `Bubble` both read the same tier already, which is what stops a message changing size the moment it is sent \u2014 overriding one breaks that pairing."
54
+ },
55
+ {
56
+ guidance: "dont",
57
+ description: "Do not remove the height cap to let the field grow without limit. A pasted essay would push the conversation off the screen; past the cap it scrolls."
58
+ }
59
+ ],
60
+ anatomy: [
61
+ {
62
+ name: "Attachments",
63
+ required: false,
64
+ description: "Pending files as chips, above the field, inside the same surface."
65
+ },
66
+ {
67
+ name: "Field",
68
+ required: true,
69
+ description: "An auto-growing Textarea, stripped of its own border and ring \u2014 the surface carries both \u2014 capped before it eats the transcript."
70
+ },
71
+ {
72
+ name: "Controls",
73
+ required: true,
74
+ description: "Attach and any `leading` controls on the left; `actions` and the send/stop button on the right."
75
+ },
76
+ {
77
+ name: "Footer",
78
+ required: false,
79
+ description: "Helper text or a character counter below the controls."
80
+ }
81
+ ]
82
+ },
83
+ related: {
84
+ components: [
85
+ "MessageScroller",
86
+ "Message",
87
+ "Bubble",
88
+ "Attachment",
89
+ "Textarea"
90
+ ],
91
+ patterns: ["ChatPanel"]
92
+ },
93
+ props: [
94
+ {
95
+ name: "value",
96
+ type: "string",
97
+ description: "Controlled value. Omit for an uncontrolled composer that owns its own text."
98
+ },
99
+ {
100
+ name: "defaultValue",
101
+ type: "string",
102
+ default: '""',
103
+ description: "Initial value when uncontrolled."
104
+ },
105
+ {
106
+ name: "onValueChange",
107
+ type: "(value: string) => void",
108
+ description: "Notified on every keystroke. Required when `value` is supplied."
109
+ },
110
+ {
111
+ name: "onSend",
112
+ type: "(value: string) => void",
113
+ description: "Called with the trimmed message. An uncontrolled composer clears itself afterwards; a controlled one is the caller's to clear."
114
+ },
115
+ {
116
+ name: "placeholder",
117
+ type: "string",
118
+ default: '"Send a message\u2026"',
119
+ description: "Placeholder for the field."
120
+ },
121
+ {
122
+ name: "busy",
123
+ type: "boolean",
124
+ default: "false",
125
+ description: "A reply is streaming. Disables send, and swaps it for a stop control when `onStop` is supplied."
126
+ },
127
+ {
128
+ name: "onStop",
129
+ type: "() => void",
130
+ description: "Interrupt the in-flight reply. Supplying it turns send into stop while busy."
131
+ },
132
+ {
133
+ name: "disabled",
134
+ type: "boolean",
135
+ default: "false",
136
+ description: "Block sending entirely \u2014 over a limit, disconnected, read-only thread. Distinct from `busy`, which is temporary and offers a way out (stop)."
137
+ },
138
+ {
139
+ name: "invalid",
140
+ type: "boolean",
141
+ default: "false",
142
+ description: "Mark the current text invalid. Colours the surface border and sets `aria-invalid` on the field."
143
+ },
144
+ {
145
+ name: "attachments",
146
+ type: "ReactNode",
147
+ description: "Attachment chips, shown above the field."
148
+ },
149
+ {
150
+ name: "leading",
151
+ type: "ReactNode",
152
+ description: "Controls on the left of the footer row \u2014 model picker, tool toggles."
153
+ },
154
+ {
155
+ name: "actions",
156
+ type: "ReactNode",
157
+ description: "Extra controls left of the send button."
158
+ },
159
+ {
160
+ name: "onAttach",
161
+ type: "() => void",
162
+ description: "Attach handler. Supplying it renders the built-in attach button."
163
+ },
164
+ {
165
+ name: "label",
166
+ type: "string",
167
+ default: '"Message"',
168
+ description: "Accessible label for the field."
169
+ },
170
+ {
171
+ name: "sendLabel",
172
+ type: "string",
173
+ default: '"Send message"',
174
+ description: "Accessible label for the send button."
175
+ },
176
+ {
177
+ name: "stopLabel",
178
+ type: "string",
179
+ default: '"Stop generating"',
180
+ description: "Accessible label for the stop button."
181
+ },
182
+ {
183
+ name: "footer",
184
+ type: "ReactNode",
185
+ description: "Helper text or counter below the controls."
186
+ },
187
+ {
188
+ name: "fieldRef",
189
+ type: "Ref<HTMLTextAreaElement>",
190
+ description: "Ref to the underlying textarea \u2014 for focusing after a send, or on mount."
191
+ },
192
+ {
193
+ name: "...form props",
194
+ type: 'Omit<ComponentPropsWithRef<"form">, "onSubmit" | "defaultValue">',
195
+ description: "Spread onto the form element. Use `onSend` rather than `onSubmit`."
196
+ }
197
+ ],
198
+ variants: { invalid: ["true", "false"] },
199
+ tokensUsed: [
200
+ "card",
201
+ "input",
202
+ "ring",
203
+ "destructive",
204
+ "foreground",
205
+ "muted-foreground",
206
+ "primary",
207
+ "primary-foreground",
208
+ "secondary",
209
+ "secondary-foreground",
210
+ "accent",
211
+ "accent-foreground"
212
+ ],
213
+ a11y: [
214
+ "A real `<form>`, so the send button is a submit button and the whole thing behaves as one control to assistive tech and to password managers alike.",
215
+ "Enter never submits while an IME composition is open (`isComposing`), so a CJK reader confirming a candidate word does not mail a fragment of their first sentence.",
216
+ "The focus ring is drawn on the surface via `focus-within`, not on the textarea, so the visible focus indicator matches the box a sighted user perceives as the input.",
217
+ "Send is disabled \u2014 not merely styled down \u2014 until there is non-whitespace to send, so the affordance and the behaviour agree for keyboard users.",
218
+ "Icon-only attach, send and stop buttons all carry accessible labels, each overridable for localisation."
219
+ ],
220
+ examples: [
221
+ {
222
+ label: "Uncontrolled \u2014 the common case",
223
+ code: "<ChatComposer onSend={(text) => send(text)} onAttach={pickFile} />"
224
+ },
225
+ {
226
+ label: "Streaming, with a stop control",
227
+ code: '<ChatComposer onSend={send} busy={isStreaming} onStop={stop} placeholder="Ask a follow-up\u2026" />'
228
+ },
229
+ {
230
+ label: "Controlled, with pending attachments",
231
+ code: '<ChatComposer\n value={draft}\n onValueChange={setDraft}\n onSend={(text) => { post(text, files); setDraft("") }}\n onAttach={pickFile}\n attachments={files.map((f) => (<Attachment key={f.id} variant="media" name={f.name} thumbnail={f.url} actions={<Button variant="floating" size="icon-xs" aria-label="Remove" onClick={() => drop(f.id)}><Icon name="xmark" /></Button>} />))}\n footer={`${draft.length} / 4000`}\n invalid={draft.length > 4000}\n/>'
232
+ },
233
+ {
234
+ label: "A working chat, end to end",
235
+ code: '<div className="flex h-128 flex-col gap-3">\n <MessageScroller className="flex-1 min-h-0">\n {messages.map((m) => (<Message key={m.id} messageId={m.id} align={m.mine ? "end" : "start"}><Bubble variant={m.mine ? "primary" : "muted"} align={m.mine ? "end" : "start"}>{m.body}</Bubble></Message>))}\n {streaming ? <Marker icon="spinner" spin shimmer>Thinking\u2026</Marker> : null}\n </MessageScroller>\n <ChatComposer onSend={send} busy={streaming} onStop={stop} />\n</div>'
236
+ }
237
+ ]
238
+ };
239
+ export {
240
+ chatComposerMeta
241
+ };
@@ -0,0 +1,17 @@
1
+ // src/components/chat-composer/chat-composer.variants.ts
2
+ import { cva } from "class-variance-authority";
3
+ var chatComposerVariants = cva(
4
+ "flex w-full flex-col gap-2 border border-input bg-card p-2 motion-interactive focus-within:ring-2 focus-within:ring-ring [--chat-composer-r:var(--chat-composer-radius,var(--card-inner-radius,calc(min(var(--button-radius,9999px),var(--control-sm)/2)+(--spacing(2))+1px)))] rounded-[var(--chat-composer-r)]",
5
+ {
6
+ variants: {
7
+ invalid: {
8
+ true: "border-destructive",
9
+ false: ""
10
+ }
11
+ },
12
+ defaultVariants: { invalid: false }
13
+ }
14
+ );
15
+ export {
16
+ chatComposerVariants
17
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/chat-composer/index.ts
2
+ import { ChatComposer } from "./chat-composer.js";
3
+ import { chatComposerMeta } from "./chat-composer.meta.js";
4
+ export {
5
+ ChatComposer,
6
+ chatComposerMeta
7
+ };
@@ -0,0 +1,28 @@
1
+ // src/components/checkbox/checkbox-mark.tsx
2
+ import { Checkbox as Base } from "@base-ui/react/checkbox";
3
+ import { Icon } from "../../icon/index.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { CHECK_MARK_SIZE } from "../../lib/selection-card.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ function CheckboxMark({ className }) {
8
+ return /* @__PURE__ */ jsx(
9
+ Base.Indicator,
10
+ {
11
+ className: cn(
12
+ "flex items-center justify-center text-current motion-interactive ease-spring data-[starting-style]:scale-0 data-[starting-style]:opacity-0 data-[ending-style]:scale-0 data-[ending-style]:opacity-0",
13
+ className
14
+ ),
15
+ render: (indicatorProps, state) => /* @__PURE__ */ jsx("span", { ...indicatorProps, children: /* @__PURE__ */ jsx(
16
+ Icon,
17
+ {
18
+ name: state.indeterminate ? "minus" : "check",
19
+ className: cn(CHECK_MARK_SIZE, "[&_path]:stroke-current [&_path]:[stroke-width:2] [&_path]:[stroke-linejoin:round] [&_path]:[stroke-linecap:round]")
20
+ }
21
+ ) })
22
+ }
23
+ );
24
+ }
25
+ CheckboxMark.displayName = "CheckboxMark";
26
+ export {
27
+ CheckboxMark
28
+ };
@@ -0,0 +1,30 @@
1
+ // src/components/checkbox/checkbox.tsx
2
+ import { Checkbox as Base } from "@base-ui/react/checkbox";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { CHECK_BOX } from "../../lib/selection-card.js";
5
+ import { CheckboxMark } from "./checkbox-mark.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ function Checkbox({ className, children, ...props }) {
8
+ return /* @__PURE__ */ jsx(
9
+ Base.Root,
10
+ {
11
+ className: cn(
12
+ CHECK_BOX,
13
+ "text-primary-foreground",
14
+ "data-[checked]:border-primary data-[checked]:bg-primary",
15
+ "data-[indeterminate]:border-primary data-[indeterminate]:bg-primary",
16
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
17
+ // Base UI renders the root as a <span>, which `:disabled` never matches —
18
+ // the state is the data attribute, as on Switch.
19
+ "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50",
20
+ className
21
+ ),
22
+ ...props,
23
+ children: children ?? /* @__PURE__ */ jsx(CheckboxMark, {})
24
+ }
25
+ );
26
+ }
27
+ Checkbox.displayName = "Checkbox";
28
+ export {
29
+ Checkbox
30
+ };
@@ -0,0 +1,127 @@
1
+ // src/components/checkbox/checkbox.meta.ts
2
+ var checkboxMeta = {
3
+ name: "Checkbox",
4
+ summary: "Square toggle (18px at rest, on the spacing scale) over Base UI's Checkbox. Checked/indeterminate/disabled states; controlled or uncontrolled; form-ready via the hidden native input.",
5
+ status: "stable",
6
+ keywords: [
7
+ "checkbox",
8
+ "boolean",
9
+ "multi select",
10
+ "form control"
11
+ ],
12
+ usage: {
13
+ description: "Use Checkbox for independent boolean choices or for selecting multiple options in a set.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use Checkbox when each option can be toggled independently."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Attach a visible label that explains the consequence of checking the control."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not use Checkbox for mutually exclusive choices; use Radio or Select instead."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: 'Do not use it without a label or an aria-label. An 18px square with no accessible name is announced as just "checkbox", which tells a screen-reader user nothing about what they are agreeing to.'
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: `Do not phrase the label as a negative, such as "Don't send read receipts". Paired with an unchecked box it becomes a double negative the reader has to solve before they can answer. Label the state being turned on.`
34
+ }
35
+ ]
36
+ },
37
+ related: {
38
+ components: [
39
+ "CheckboxCard",
40
+ "Switch",
41
+ "Radio"
42
+ ]
43
+ },
44
+ props: [
45
+ {
46
+ name: "checked",
47
+ type: "boolean",
48
+ description: "Controlled checked state. Pair with onCheckedChange. Omit for uncontrolled."
49
+ },
50
+ {
51
+ name: "defaultChecked",
52
+ type: "boolean",
53
+ default: "false",
54
+ description: "Initial checked state for an uncontrolled checkbox."
55
+ },
56
+ {
57
+ name: "onCheckedChange",
58
+ type: "(checked: boolean, eventDetails) => void",
59
+ description: "Fires when the checkbox is ticked or unticked. Note: Base UI passes a second eventDetails arg \u2014 not the common (checked) => void, so a single-arg handler must widen its signature."
60
+ },
61
+ {
62
+ name: "indeterminate",
63
+ type: "boolean",
64
+ default: "false",
65
+ description: 'Mixed state (neither checked nor unchecked). Renders a dash instead of the check. For a "select all" box inside a CheckboxGroup, use `parent` instead and the group sets this for you.'
66
+ },
67
+ {
68
+ name: "parent",
69
+ type: "boolean",
70
+ default: "false",
71
+ description: 'Makes this the "select all" box of a CheckboxGroup that has `allValues`. It checks or clears every child, and shows the dash when only some are checked. Only works inside a CheckboxGroup.'
72
+ },
73
+ {
74
+ name: "disabled",
75
+ type: "boolean",
76
+ default: "false",
77
+ description: "Ignores user interaction and dims the control."
78
+ },
79
+ {
80
+ name: "name",
81
+ type: "string",
82
+ description: "Field name for the hidden input on form submit."
83
+ },
84
+ {
85
+ name: "value",
86
+ type: "string",
87
+ description: "Value submitted with the form when checked. Inside a group-owned CheckboxGroup, it is the name the group's value array uses for this checkbox."
88
+ },
89
+ {
90
+ name: "render",
91
+ type: "ReactElement | (props, state) => ReactElement",
92
+ description: "Compose the root with another element through the Base UI render prop."
93
+ }
94
+ ],
95
+ tokensUsed: [
96
+ "card",
97
+ "input",
98
+ "primary",
99
+ "primary-foreground",
100
+ "ring"
101
+ ],
102
+ a11y: [
103
+ "Base UI renders a hidden native <input type=checkbox> for keyboard, focus, and form semantics.",
104
+ "Space toggles; focus-visible draws a 2px ring in the --ring token.",
105
+ "indeterminate sets aria-checked=mixed automatically; a `parent` checkbox in a CheckboxGroup gets aria-checked=mixed and aria-controls for its children from the group.",
106
+ `Label it with Field orientation="horizontal": it wires the label's htmlFor to the checkbox, so the label text joins the click target, and adds the description and error plumbing.`
107
+ ],
108
+ examples: [
109
+ { label: "Default", code: "<Checkbox defaultChecked />" },
110
+ {
111
+ label: "Controlled",
112
+ code: "<Checkbox checked={value} onCheckedChange={setValue} />"
113
+ },
114
+ { label: "Indeterminate", code: "<Checkbox indeterminate />" },
115
+ {
116
+ label: "Select all in a group",
117
+ code: '<CheckboxGroup allValues={["email", "sms"]} defaultValue={["email"]} className="gap-3"><Field label="All channels" orientation="horizontal"><Checkbox parent /></Field><Field label="Email" orientation="horizontal" className="ps-7"><Checkbox value="email" /></Field><Field label="SMS" orientation="horizontal" className="ps-7"><Checkbox value="sms" /></Field></CheckboxGroup>'
118
+ },
119
+ {
120
+ label: "With label",
121
+ code: '<Field label="Remember me" orientation="horizontal"><Checkbox /></Field>'
122
+ }
123
+ ]
124
+ };
125
+ export {
126
+ checkboxMeta
127
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/checkbox/index.ts
2
+ import { Checkbox } from "./checkbox.js";
3
+ import { checkboxMeta } from "./checkbox.meta.js";
4
+ export {
5
+ Checkbox,
6
+ checkboxMeta
7
+ };