@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,39 @@
1
+ // src/components/browser/browser.tsx
2
+ import { cn } from "../../lib/cn.js";
3
+ import { Icon } from "../../icon/Icon.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function Browser({ url, className, children, ...props }) {
6
+ return /* @__PURE__ */ jsxs(
7
+ "div",
8
+ {
9
+ className: cn("overflow-hidden rounded-xl border border-border bg-card shadow-sm", className),
10
+ ...props,
11
+ children: [
12
+ /* @__PURE__ */ jsxs("div", { "aria-hidden": true, className: "grid h-11 grid-cols-[1fr_minmax(0,28rem)_1fr] items-center gap-3 border-b border-border px-3", children: [
13
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
14
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
15
+ /* @__PURE__ */ jsx("span", { className: "size-3 rounded-full bg-muted" }),
16
+ /* @__PURE__ */ jsx("span", { className: "size-3 rounded-full bg-muted" }),
17
+ /* @__PURE__ */ jsx("span", { className: "size-3 rounded-full bg-muted" })
18
+ ] }),
19
+ /* @__PURE__ */ jsxs("div", { className: "hidden items-center gap-2.5 text-muted-foreground sm:flex", children: [
20
+ /* @__PURE__ */ jsx(Icon, { name: "chevron-left", className: "text-sm" }),
21
+ /* @__PURE__ */ jsx(Icon, { name: "chevron-right", className: "text-sm opacity-50" }),
22
+ /* @__PURE__ */ jsx(Icon, { name: "refresh", className: "text-sm" })
23
+ ] })
24
+ ] }),
25
+ /* @__PURE__ */ jsxs("div", { className: "flex h-7 min-w-0 items-center justify-center gap-1.5 rounded-md bg-muted px-3 text-muted-foreground", children: [
26
+ url ? /* @__PURE__ */ jsx(Icon, { name: "lock", className: "shrink-0 text-xs" }) : null,
27
+ /* @__PURE__ */ jsx("span", { className: "truncate text-body-sm", children: url ?? "" })
28
+ ] }),
29
+ /* @__PURE__ */ jsx("div", {})
30
+ ] }),
31
+ /* @__PURE__ */ jsx("div", { className: "bg-background", children })
32
+ ]
33
+ }
34
+ );
35
+ }
36
+ Browser.displayName = "Browser";
37
+ export {
38
+ Browser
39
+ };
@@ -0,0 +1,80 @@
1
+ // src/components/browser/browser.meta.ts
2
+ var browserMeta = {
3
+ name: "Browser",
4
+ summary: "A generic, current browser window: one compact toolbar (window controls, back/forward/reload, a centered address field) around page content.",
5
+ status: "stable",
6
+ keywords: [
7
+ "browser",
8
+ "mockup",
9
+ "preview",
10
+ "website"
11
+ ],
12
+ usage: {
13
+ description: "Use Browser to frame a website or product surface preview when the browser chrome is part of the story.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use it for documentation, product examples, and visual previews where the page context matters."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Keep the framed content simple enough to remain legible at the rendered size."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not use Browser for real navigation, real forms, or arbitrary card decoration."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not put a real, working URL in the address pill. It reads as a link, is not one, and invites a click that does nothing."
30
+ }
31
+ ]
32
+ },
33
+ related: {
34
+ components: [
35
+ "Phone",
36
+ "Card"
37
+ ]
38
+ },
39
+ props: [
40
+ {
41
+ name: "url",
42
+ type: "string",
43
+ description: "Address shown in the centered address pill. Omit for a blank pill."
44
+ },
45
+ {
46
+ name: "children",
47
+ type: "ReactNode",
48
+ description: "Page content rendered inside the content region."
49
+ }
50
+ ],
51
+ tokensUsed: ["card", "background", "border", "muted", "muted-foreground"],
52
+ a11y: [
53
+ "Purely presentational chrome; the framed content carries its own semantics.",
54
+ "The toolbar is drawn, not interactive, and hidden from assistive technology; the address is decorative text."
55
+ ],
56
+ examples: [
57
+ {
58
+ label: "Framing a page",
59
+ code: '<Browser url="studio.example/explore"><div className="p-8"><PageHeader title="Explore" description="Trending posts from every chain." /></div></Browser>'
60
+ },
61
+ {
62
+ label: "Mockup, not chrome",
63
+ code: `// Browser is DECORATIVE framing for a screenshot or a demo \u2014 it belongs on a
64
+ // marketing page, never around your actual app.
65
+
66
+ <Region max="wide">
67
+ <Browser url="studio.example">
68
+ <img src="/screenshots/editor.png" alt="The editor" />
69
+ </Browser>
70
+ </Region>
71
+
72
+ // \u2717 Wrapping live UI in it. The frame implies "this is a picture of software";
73
+ // putting real controls inside makes users hunt for a browser that isn't there.
74
+ // \u2717 Using it to fake a URL bar for credibility. Show the real product.`
75
+ }
76
+ ]
77
+ };
78
+ export {
79
+ browserMeta
80
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/browser/index.ts
2
+ import { Browser } from "./browser.js";
3
+ import { browserMeta } from "./browser.meta.js";
4
+ export {
5
+ Browser,
6
+ browserMeta
7
+ };
@@ -0,0 +1,110 @@
1
+ // src/components/bubble/bubble.tsx
2
+ import { cn } from "../../lib/cn.js";
3
+ import { useTypeTier } from "../../lib/density.js";
4
+ import { Pill } from "../pill/pill.js";
5
+ import {
6
+ bubbleTailVariants,
7
+ bubbleReactionsVariants,
8
+ bubbleVariants
9
+ } from "./bubble.variants.js";
10
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
+ function Bubble({
12
+ variant = "muted",
13
+ align = "start",
14
+ tail = true,
15
+ className,
16
+ children,
17
+ ...props
18
+ }) {
19
+ const tier = useTypeTier();
20
+ return /* @__PURE__ */ jsxs(
21
+ "div",
22
+ {
23
+ "data-align": align,
24
+ className: cn(bubbleVariants({ variant, align, tail }), tier.prose, className),
25
+ ...props,
26
+ children: [
27
+ children,
28
+ tail && variant !== "plain" ? /* @__PURE__ */ jsx(BubbleTail, { variant: variant ?? "muted", align: align ?? "start" }) : null
29
+ ]
30
+ }
31
+ );
32
+ }
33
+ var TAIL = {
34
+ roundFill: "M0 0H4.4Q6 0 5.07 1.3L2.45 4.97Q1 7 1 9.5H0Z",
35
+ sharpFill: "M0 0H6L1 7V9.5H0Z",
36
+ roundEdge: "M0 .5H3.43Q5.03 .5 4.1 1.8L1.95 4.81Q.5 6.84 .5 9.34V9.5",
37
+ sharpEdge: "M0 .5H5.03L.5 6.84V9.5"
38
+ };
39
+ var ROUND = "[opacity:sign(var(--radius-sm))]";
40
+ var SHARP = "[opacity:calc(1-sign(var(--radius-sm)))]";
41
+ var TAIL_FILL = { muted: "fill-muted", primary: "fill-primary", outline: "fill-card" };
42
+ function BubbleTail({ variant, align }) {
43
+ const outline = variant === "outline";
44
+ return /* @__PURE__ */ jsxs(
45
+ "svg",
46
+ {
47
+ "aria-hidden": "true",
48
+ focusable: "false",
49
+ viewBox: "0 0 6 9.5",
50
+ className: bubbleTailVariants({ surface: outline ? "outline" : "solid", align }),
51
+ children: [
52
+ /* @__PURE__ */ jsx("path", { d: TAIL.roundFill, className: cn(TAIL_FILL[variant], ROUND) }),
53
+ /* @__PURE__ */ jsx("path", { d: TAIL.sharpFill, className: cn(TAIL_FILL[variant], SHARP) }),
54
+ outline ? /* @__PURE__ */ jsxs(Fragment, { children: [
55
+ /* @__PURE__ */ jsx("path", { d: TAIL.roundEdge, className: cn("fill-none stroke-border", ROUND), strokeWidth: 1 }),
56
+ /* @__PURE__ */ jsx("path", { d: TAIL.sharpEdge, className: cn("fill-none stroke-border", SHARP), strokeWidth: 1 })
57
+ ] }) : null
58
+ ]
59
+ }
60
+ );
61
+ }
62
+ Bubble.displayName = "Bubble";
63
+ function BubbleReactions({
64
+ align = "start",
65
+ className,
66
+ ...props
67
+ }) {
68
+ return /* @__PURE__ */ jsx(
69
+ "div",
70
+ {
71
+ className: cn(bubbleReactionsVariants({ align }), className),
72
+ ...props
73
+ }
74
+ );
75
+ }
76
+ BubbleReactions.displayName = "BubbleReactions";
77
+ function BubbleReaction({
78
+ emoji,
79
+ count,
80
+ active = false,
81
+ className,
82
+ ...props
83
+ }) {
84
+ const tier = useTypeTier();
85
+ return (
86
+ // Pill's own quiet chip: outline (a hairline at rest, a primary tint when
87
+ // it is the reader's) at the xs control height. No overrides — a reaction
88
+ // is a Pill, not a private look built on top of one.
89
+ /* @__PURE__ */ jsxs(
90
+ Pill,
91
+ {
92
+ appearance: "outline",
93
+ size: "sm",
94
+ selected: active,
95
+ className: cn(tier.secondary, className),
96
+ ...props,
97
+ children: [
98
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: emoji }),
99
+ count !== void 0 && count > 1 ? /* @__PURE__ */ jsx("span", { className: "text-mono-caption tabular-nums", children: count }) : null
100
+ ]
101
+ }
102
+ )
103
+ );
104
+ }
105
+ BubbleReaction.displayName = "BubbleReaction";
106
+ export {
107
+ Bubble,
108
+ BubbleReaction,
109
+ BubbleReactions
110
+ };
@@ -0,0 +1,158 @@
1
+ // src/components/bubble/bubble.meta.ts
2
+ var bubbleMeta = {
3
+ name: "Bubble",
4
+ summary: "The surface a message's content sits on: four treatments, an align-aware tail, a readable measure cap, and an optional row of reaction pills.",
5
+ status: "stable",
6
+ keywords: [
7
+ "chat bubble",
8
+ "message bubble",
9
+ "speech bubble",
10
+ "reactions",
11
+ "conversation",
12
+ "messaging",
13
+ "ai chat"
14
+ ],
15
+ usage: {
16
+ description: "The tinted (or untinted) surface a turn's content sits on. Kept separate from Message because the row's layout and the content's surface change independently \u2014 an assistant's markdown answer wants no surface at all in exactly the same row a one-line reply wants a bubble.",
17
+ bestPractices: [
18
+ {
19
+ guidance: "do",
20
+ description: "Use `muted` for the other party and `primary` for the reader's own messages. Two treatments is the whole vocabulary a conversation needs to say who is speaking."
21
+ },
22
+ {
23
+ guidance: "do",
24
+ description: 'Reach for `variant="plain"` for long-form assistant output \u2014 rendered markdown, code blocks, tables. A tinted box around three paragraphs reads as a quote block rather than as a turn, and `plain` drops the measure cap with the surface.'
25
+ },
26
+ {
27
+ guidance: "do",
28
+ description: "Pass the same `align` you gave the enclosing Message, so the tail lands on the speaker's side."
29
+ },
30
+ {
31
+ guidance: "do",
32
+ description: "Set `tail={false}` on the continuation bubbles in a grouped run \u2014 the tail marks where a speaker starts, and repeating it on every line makes a block of one person's messages look like four separate turns."
33
+ },
34
+ {
35
+ guidance: "do",
36
+ description: 'Let the register size it. Inside `<Density value="compact">` a Bubble sets itself in the workspace prose tier automatically \u2014 a docked agent panel needs no per-call-site sizing, and hardcoding one defeats the mechanism.'
37
+ },
38
+ {
39
+ guidance: "dont",
40
+ description: "Do not remove the measure cap to fill a wide window. ~42rem is a reading measure; a bubble spanning a 1600px viewport is a paragraph at 140 characters per line."
41
+ },
42
+ {
43
+ guidance: "dont",
44
+ description: 'Do not put the timestamp or the author name inside the bubble. Those are Message\'s `header` / `footer`, which stay outside the surface and so still work under `variant="plain"`.'
45
+ },
46
+ {
47
+ guidance: "dont",
48
+ description: "Do not use a Bubble for a system note or a streaming status. Those are `Marker`, which is deliberately quieter than the message tier."
49
+ },
50
+ {
51
+ guidance: "dont",
52
+ description: "Do not render reactions as static text. `BubbleReaction` is a toggle and reports `aria-pressed`, which is how a screen-reader user knows whether pressing it adds or removes their own reaction."
53
+ }
54
+ ],
55
+ anatomy: [
56
+ {
57
+ name: "Bubble",
58
+ required: true,
59
+ description: "The surface itself. Holds the variant, the side, and the tail."
60
+ },
61
+ {
62
+ name: "BubbleReactions",
63
+ required: false,
64
+ description: "The row of reaction pills, just under the bubble at the message column's small gap, so it reads as belonging to that message rather than the next row."
65
+ },
66
+ {
67
+ name: "BubbleReaction",
68
+ required: false,
69
+ description: "One reaction pill \u2014 emoji, count (hidden at 1), and pressed state."
70
+ }
71
+ ]
72
+ },
73
+ related: {
74
+ components: ["Message", "MessageScroller", "Marker", "Attachment"]
75
+ },
76
+ props: [
77
+ {
78
+ name: "variant",
79
+ type: '"muted" | "primary" | "outline" | "plain"',
80
+ default: '"muted"',
81
+ description: "Surface treatment. `muted` for the other party, `primary` for the reader's own messages, `outline` for a quieter own-side, `plain` for long-form output that should not sit in a box (also drops the measure cap and padding)."
82
+ },
83
+ {
84
+ name: "align",
85
+ type: '"start" | "end"',
86
+ default: '"start"',
87
+ description: "Which side of the conversation the bubble is on \u2014 puts the tail on the speaker's side. Match it to the enclosing Message."
88
+ },
89
+ {
90
+ name: "tail",
91
+ type: "boolean",
92
+ default: "true",
93
+ description: "Draw the tail: a small ear off the speaker-side top corner, which goes square to meet it. The same 5px in every theme's radius language, flat through fully pilled. The bubble keeps the ear's space either way, so turning it off for the continuation bubbles in a grouped run keeps the run aligned."
94
+ },
95
+ {
96
+ name: "...div props",
97
+ type: 'ComponentPropsWithRef<"div">',
98
+ description: "Spread onto the surface element."
99
+ }
100
+ ],
101
+ subcomponents: [
102
+ {
103
+ name: "BubbleReactions",
104
+ type: '{ align?: "start" | "end" } & ComponentPropsWithRef<"div">',
105
+ description: "Row container for reaction pills. Match `align` to the Bubble so the row hangs off the same edge."
106
+ },
107
+ {
108
+ name: "BubbleReaction",
109
+ type: '{ emoji: ReactNode; count?: number; active?: boolean } & ComponentPropsWithRef<"button">',
110
+ description: 'One reaction pill. A toggle, not a label: `active` drives `aria-pressed` as well as the styling, and `count` is hidden at 1 because the pill already says "one".'
111
+ }
112
+ ],
113
+ variants: {
114
+ variant: ["muted", "primary", "outline", "plain"],
115
+ align: ["start", "end"],
116
+ tail: ["true", "false"]
117
+ },
118
+ tokensUsed: [
119
+ "muted",
120
+ "foreground",
121
+ "primary",
122
+ "primary-foreground",
123
+ "border",
124
+ "card",
125
+ "card-foreground",
126
+ "accent",
127
+ "accent-foreground",
128
+ "muted-foreground",
129
+ "ring"
130
+ ],
131
+ a11y: [
132
+ "The surface is a plain container with no imposed role \u2014 a bubble is presentation, and announcing one as a region would put a landmark around every line of a conversation.",
133
+ "Reaction pills are real buttons reporting `aria-pressed`, so the reader's own reaction is state rather than colour alone; the emoji is hidden from AT and the count is left readable.",
134
+ "`whitespace-pre-wrap` and `break-words` keep pasted logs, long URLs, and hard-wrapped text inside the surface instead of overflowing the conversation.",
135
+ "Every variant meets AA against its own surface, including `primary`, which pairs the primary fill with its paired foreground token rather than a hardcoded white."
136
+ ],
137
+ examples: [
138
+ {
139
+ label: "Two sides",
140
+ code: '<>\n <Message messageId="m1"><Bubble>Did the deploy finish?</Bubble></Message>\n <Message messageId="m2" align="end"><Bubble variant="primary" align="end">Green across the board.</Bubble></Message>\n</>'
141
+ },
142
+ {
143
+ label: "Long-form assistant output",
144
+ code: '<Message messageId="a1" avatar={<Avatar size="sm" fallback="AI" />}>\n <Bubble variant="plain" className="space-y-3">\n <p className="text-body-md text-foreground">Three things changed in this release:</p>\n <CodeBlock code={diff} filename="CHANGELOG.md" />\n </Bubble>\n</Message>'
145
+ },
146
+ {
147
+ label: "With reactions",
148
+ code: '<Message messageId="m3">\n <Bubble>Shipped 0.45.0.</Bubble>\n <BubbleReactions>\n <BubbleReaction emoji="\u{1F389}" count={3} active onClick={() => toggle("\u{1F389}")} />\n <BubbleReaction emoji="\u{1F440}" count={1} onClick={() => toggle("\u{1F440}")} />\n </BubbleReactions>\n</Message>'
149
+ },
150
+ {
151
+ label: "A grouped run drops the repeated tail",
152
+ code: '<>\n <Message messageId="m1" align="end"><Bubble variant="primary" align="end">One more thing.</Bubble></Message>\n <Message messageId="m2" align="end" grouped><Bubble variant="primary" align="end" tail={false}>The staging cert expires Friday.</Bubble></Message>\n</>'
153
+ }
154
+ ]
155
+ };
156
+ export {
157
+ bubbleMeta
158
+ };
@@ -0,0 +1,90 @@
1
+ // src/components/bubble/bubble.variants.ts
2
+ import { cva } from "class-variance-authority";
3
+ var EAR_SPACE = "[--bubble-ear:5px]";
4
+ var bubbleTailVariants = cva(
5
+ "pointer-events-none absolute h-[9.5px] w-[6px] overflow-visible",
6
+ {
7
+ variants: {
8
+ // Its x = 1 is the bubble's outer edge: on a solid bubble that is the
9
+ // padding edge, so the box tucks 1px under it; outline's 1px border puts
10
+ // the outer edge 1px further out, and its top 1px higher.
11
+ surface: {
12
+ solid: "top-0",
13
+ outline: "-top-px"
14
+ },
15
+ // Drawn pointing to the end side; the start tail is its mirror image,
16
+ // and in a right-to-left layout each swaps.
17
+ align: {
18
+ start: "-scale-x-100 rtl:scale-x-100",
19
+ end: "rtl:-scale-x-100"
20
+ }
21
+ },
22
+ compoundVariants: [
23
+ { surface: "solid", align: "start", className: "end-[calc(100%-1px)]" },
24
+ { surface: "solid", align: "end", className: "start-[calc(100%-1px)]" },
25
+ { surface: "outline", align: "start", className: "end-full" },
26
+ { surface: "outline", align: "end", className: "start-full" }
27
+ ]
28
+ }
29
+ );
30
+ var bubbleVariants = cva(
31
+ "relative w-fit max-w-[42rem] whitespace-pre-wrap break-words rounded-lg px-3.5 py-2.5 text-body-md",
32
+ {
33
+ variants: {
34
+ variant: {
35
+ /** The other party. The resting conversational surface. */
36
+ muted: "bg-muted text-foreground",
37
+ /** The reader's own messages. */
38
+ primary: "bg-primary text-primary-foreground",
39
+ /** A quieter own-side or a secondary channel. */
40
+ outline: "border border-border bg-card text-card-foreground",
41
+ /**
42
+ * No surface at all — for long-form assistant output (markdown,
43
+ * code, tables) where a tinted box around three paragraphs reads as
44
+ * a quote block rather than as a turn.
45
+ */
46
+ plain: "max-w-none bg-transparent px-0 py-0 text-foreground"
47
+ },
48
+ align: {
49
+ start: "",
50
+ end: ""
51
+ },
52
+ tail: {
53
+ true: "",
54
+ false: ""
55
+ }
56
+ },
57
+ compoundVariants: [
58
+ { variant: ["muted", "primary", "outline"], className: EAR_SPACE },
59
+ { align: "start", variant: ["muted", "primary", "outline"], className: "ms-(--bubble-ear)" },
60
+ { align: "end", variant: ["muted", "primary", "outline"], className: "me-(--bubble-ear)" },
61
+ // The speaker-side top corner goes square to meet the tail.
62
+ { tail: true, align: "start", variant: ["muted", "primary", "outline"], className: "rounded-ss-none" },
63
+ { tail: true, align: "end", variant: ["muted", "primary", "outline"], className: "rounded-se-none" },
64
+ // A surfaceless bubble has no surface to hang a tail from.
65
+ { variant: "plain", className: "rounded-none" }
66
+ ],
67
+ defaultVariants: {
68
+ variant: "muted",
69
+ align: "start",
70
+ tail: true
71
+ }
72
+ }
73
+ );
74
+ var bubbleReactionsVariants = cva(
75
+ "flex flex-wrap items-center gap-1",
76
+ {
77
+ variants: {
78
+ align: {
79
+ start: "justify-start",
80
+ end: "justify-end"
81
+ }
82
+ },
83
+ defaultVariants: { align: "start" }
84
+ }
85
+ );
86
+ export {
87
+ bubbleReactionsVariants,
88
+ bubbleTailVariants,
89
+ bubbleVariants
90
+ };
@@ -0,0 +1,13 @@
1
+ // src/components/bubble/index.ts
2
+ import {
3
+ Bubble,
4
+ BubbleReaction,
5
+ BubbleReactions
6
+ } from "./bubble.js";
7
+ import { bubbleMeta } from "./bubble.meta.js";
8
+ export {
9
+ Bubble,
10
+ BubbleReaction,
11
+ BubbleReactions,
12
+ bubbleMeta
13
+ };
@@ -0,0 +1,87 @@
1
+ // src/components/button/button.tsx
2
+ import { useContext } from "react";
3
+ import { useRender } from "@base-ui/react/use-render";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { useTypeTier } from "../../lib/density.js";
6
+ import { StackedActionsContext } from "../../lib/presentation.js";
7
+ import { trimLabel } from "../../lib/trim-label.js";
8
+ import { Spinner } from "../spinner/index.js";
9
+ import { buttonVariants } from "./button.variants.js";
10
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
+ var BORDERLESS = /* @__PURE__ */ new Set(["ghost", "link", "on-color-ghost"]);
12
+ var OPTICAL_START = "[--button-ps:calc(var(--button-px)-(--spacing(0.5)))] ps-(--button-ps)";
13
+ var OPTICAL_END = "[--button-pe:calc(var(--button-px)-(--spacing(0.5)))] pe-(--button-pe)";
14
+ var BLEED_CLASS = {
15
+ start: "-ms-(--button-ps,var(--button-px))",
16
+ end: "-me-(--button-pe,var(--button-px))",
17
+ both: "-ms-(--button-ps,var(--button-px)) -me-(--button-pe,var(--button-px))"
18
+ };
19
+ function Button({
20
+ variant,
21
+ size,
22
+ className,
23
+ render,
24
+ ref,
25
+ type,
26
+ loading = false,
27
+ loadingLabel,
28
+ iconStart,
29
+ iconEnd,
30
+ badge,
31
+ bleed,
32
+ disabled,
33
+ children,
34
+ ...props
35
+ }) {
36
+ const tier = useTypeTier();
37
+ const isNativeButton = render === void 0;
38
+ const stacked = useContext(StackedActionsContext) && !String(size ?? "md").startsWith("icon");
39
+ const resolvedSize = stacked ? "cta" : size ?? "md";
40
+ const hasLabel = children != null && children !== false;
41
+ const spinner = /* @__PURE__ */ jsx(Spinner, { className: "size-(--button-icon)", thickness: 2 });
42
+ const start = loading ? spinner : iconStart;
43
+ const iconOnly = String(resolvedSize).startsWith("icon");
44
+ const inner = loading && iconOnly ? spinner : /* @__PURE__ */ jsxs(Fragment, { children: [
45
+ start,
46
+ trimLabel(loading ? loadingLabel ?? children : children),
47
+ iconEnd
48
+ ] });
49
+ const content = badge != null ? /* @__PURE__ */ jsxs("span", { "data-slot": "button-badge-anchor", className: "relative inline-flex items-center gap-(--control-gap)", children: [
50
+ inner,
51
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute -end-1 -top-1 flex", children: badge })
52
+ ] }) : inner;
53
+ const optical = cn(
54
+ start && hasLabel && !iconOnly ? OPTICAL_START : null,
55
+ iconEnd && hasLabel && !iconOnly ? OPTICAL_END : null
56
+ );
57
+ const bleedable = BORDERLESS.has(variant ?? "primary") && !stacked;
58
+ const resolvedBleed = bleedable ? bleed ?? "auto" : void 0;
59
+ return useRender({
60
+ render: render ?? /* @__PURE__ */ jsx("button", { type: type ?? "button" }),
61
+ ref,
62
+ props: {
63
+ ...props,
64
+ className: cn(
65
+ buttonVariants({ variant, size: resolvedSize }),
66
+ stacked ? "w-full" : null,
67
+ tier.action,
68
+ optical,
69
+ resolvedBleed && resolvedBleed !== "auto" && resolvedBleed !== "none" ? BLEED_CLASS[resolvedBleed] : null,
70
+ // Busy is not disabled. Loading sets `disabled` so the action cannot
71
+ // double-fire, but fading it to 50% made a working button read as an
72
+ // unavailable one. It keeps full colour; the spinner says "working".
73
+ loading ? "cursor-progress disabled:opacity-100 aria-disabled:opacity-100" : null,
74
+ className
75
+ ),
76
+ children: content,
77
+ ...resolvedBleed ? { "data-bleed": resolvedBleed } : null,
78
+ ...loading ? { "aria-busy": true } : null,
79
+ ...isNativeButton ? { disabled: disabled || loading } : loading || disabled ? { "aria-disabled": true } : null
80
+ },
81
+ defaultTagName: "button"
82
+ });
83
+ }
84
+ Button.displayName = "Button";
85
+ export {
86
+ Button
87
+ };