@sableui/react 0.6.1 → 0.7.0

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 (633) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +285 -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 +200 -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 +33 -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 +611 -33
  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 +25 -6
  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 +19 -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 +210 -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.js +43 -185
  566. package/dist/styles.css +118 -3
  567. package/dist/{theme-provider-kQszHYji.d.ts → theme-provider-S0NVJs2Y.d.ts} +6 -1
  568. package/dist/{chunk-NETUFI34.js → themes/_contract.js} +14 -2
  569. package/dist/themes/atelier/index.js +17 -1
  570. package/dist/themes/contrast.js +288 -0
  571. package/dist/themes/ember/ember.css +6 -6
  572. package/dist/themes/ember/index.js +16 -1
  573. package/dist/themes/index.d.ts +1 -1
  574. package/dist/themes/index.js +3 -8
  575. package/dist/themes/meridian/index.js +16 -1
  576. package/dist/themes/poppy/index.js +17 -1
  577. package/dist/themes/prism/index.js +17 -1
  578. package/dist/themes/prism/prism.css +2 -2
  579. package/dist/themes/registry.js +59 -0
  580. package/dist/themes/sable/index.js +16 -1
  581. package/dist/{chunk-EFLC4NA3.js → themes/theme-provider.js} +38 -54
  582. package/dist/themes/verdant/index.js +17 -1
  583. package/llms/blocks/media-player-block.md +20 -7
  584. package/llms/blocks/product-card-block.md +6 -4
  585. package/llms/blocks/task-list-block.md +1 -1
  586. package/llms/blocks/verify-code-block.md +1 -1
  587. package/llms/components/app-shell.md +5 -2
  588. package/llms/components/avatar.md +25 -3
  589. package/llms/components/button.md +20 -1
  590. package/llms/components/card.md +1 -1
  591. package/llms/components/disclosure-picker.md +168 -0
  592. package/llms/components/font-picker.md +104 -0
  593. package/llms/components/media-image.md +98 -0
  594. package/llms/components/media-tile.md +143 -0
  595. package/llms/components/page-header.md +6 -5
  596. package/llms/components/section-header.md +144 -0
  597. package/llms/components/sheet.md +10 -0
  598. package/llms/components/sidebar.md +4 -3
  599. package/llms/components/slider.md +14 -2
  600. package/llms/components/theme-selector.md +44 -4
  601. package/llms/components/tree.md +3 -3
  602. package/llms/layout/grid.md +24 -3
  603. package/llms/patterns/dashboard-page.md +3 -6
  604. package/llms/patterns/feed-page.md +4 -4
  605. package/llms/patterns/list-detail-page.md +1 -0
  606. package/llms/patterns/settings-page.md +2 -5
  607. package/llms/reference/utilities.md +84 -4
  608. package/llms/tasks/converting-an-app.md +14 -4
  609. package/llms/tasks/reviewing-a-design.md +15 -0
  610. package/llms-full.txt +981 -65
  611. package/llms.txt +27 -10
  612. package/package.json +1 -1
  613. package/registry.json +2324 -171
  614. package/scripts/agent-setup.mjs +90 -0
  615. package/scripts/design-presets.mjs +46 -4
  616. package/scripts/grade.mjs +195 -29
  617. package/scripts/lint-rules.mjs +486 -10
  618. package/scripts/review-evidence.mjs +28 -1
  619. package/skills/sable/SKILL.md +56 -22
  620. package/targets/ios.json +45 -0
  621. package/dist/chunk-3IWZYBGH.js +0 -398
  622. package/dist/chunk-7MG4SHYX.js +0 -15
  623. package/dist/chunk-7QSDYBXO.js +0 -7421
  624. package/dist/chunk-ADLLDWLW.js +0 -15
  625. package/dist/chunk-C4Z3CF54.js +0 -15
  626. package/dist/chunk-EDXLM7YL.js +0 -5078
  627. package/dist/chunk-EHH4MHO6.js +0 -14
  628. package/dist/chunk-K7RUHUGC.js +0 -14
  629. package/dist/chunk-KO3NAEBF.js +0 -15
  630. package/dist/chunk-L4IEIQQA.js +0 -14
  631. package/dist/chunk-QJ6FWTUG.js +0 -40
  632. package/dist/chunk-VVW4UCDI.js +0 -4908
  633. package/dist/chunk-XAZGMY73.js +0 -187
@@ -0,0 +1,28 @@
1
+ // src/components/status-dot/status-dot.variants.ts
2
+ import { cva } from "class-variance-authority";
3
+ var statusDotVariants = cva("inline-block shrink-0 rounded-full", {
4
+ variants: {
5
+ tone: {
6
+ neutral: "bg-muted-foreground",
7
+ standard: "bg-tone-standard",
8
+ success: "bg-success",
9
+ warning: "bg-tone-warning",
10
+ info: "bg-tone-info",
11
+ edition: "bg-tone-edition",
12
+ collectible: "bg-tone-collectible",
13
+ destructive: "bg-destructive"
14
+ },
15
+ size: {
16
+ sm: "size-1.5",
17
+ md: "size-2",
18
+ lg: "size-2.5"
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ tone: "neutral",
23
+ size: "md"
24
+ }
25
+ });
26
+ export {
27
+ statusDotVariants
28
+ };
@@ -0,0 +1,17 @@
1
+ // src/components/stepper/index.ts
2
+ import {
3
+ Stepper,
4
+ StepperItem
5
+ } from "./stepper.js";
6
+ import {
7
+ stepperConnectorVariants,
8
+ stepperIndicatorVariants
9
+ } from "./stepper.variants.js";
10
+ import { stepperMeta } from "./stepper.meta.js";
11
+ export {
12
+ Stepper,
13
+ StepperItem,
14
+ stepperConnectorVariants,
15
+ stepperIndicatorVariants,
16
+ stepperMeta
17
+ };
@@ -0,0 +1,161 @@
1
+ // src/components/stepper/stepper.tsx
2
+ import {
3
+ Children,
4
+ createContext,
5
+ isValidElement,
6
+ useContext
7
+ } from "react";
8
+ import { Icon } from "../../icon/index.js";
9
+ import { cn } from "../../lib/cn.js";
10
+ import { useTypeTier } from "../../lib/density.js";
11
+ import {
12
+ stepperConnectorVariants,
13
+ stepperDotConnectorVariants,
14
+ stepperDotVariants,
15
+ stepperIndicatorVariants
16
+ } from "./stepper.variants.js";
17
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
18
+ var DEFAULT_STATUS_LABELS = {
19
+ complete: "Completed",
20
+ current: "Current step",
21
+ upcoming: "Not started",
22
+ error: "Needs attention"
23
+ };
24
+ var StepContext = createContext(null);
25
+ function Stepper({
26
+ current = 0,
27
+ orientation = "horizontal",
28
+ indicator = "number",
29
+ statusLabels,
30
+ className,
31
+ children,
32
+ ...props
33
+ }) {
34
+ const items = Children.toArray(children).filter(isValidElement);
35
+ const labels = { ...DEFAULT_STATUS_LABELS, ...statusLabels };
36
+ return /* @__PURE__ */ jsx(
37
+ "ol",
38
+ {
39
+ "data-orientation": orientation,
40
+ className: cn(
41
+ // isolate: the indicators' z-10 (above the connector) stays inside the
42
+ // stepper instead of rising over sticky headers and nav bars.
43
+ "isolate flex w-full",
44
+ orientation === "horizontal" ? "flex-row items-start gap-3" : "flex-col",
45
+ className
46
+ ),
47
+ ...props,
48
+ children: items.map((child, index) => /* @__PURE__ */ jsx(
49
+ StepContext.Provider,
50
+ {
51
+ value: {
52
+ index,
53
+ count: items.length,
54
+ current,
55
+ orientation,
56
+ indicator,
57
+ statusLabels: labels
58
+ },
59
+ children: child
60
+ },
61
+ child.key ?? index
62
+ ))
63
+ }
64
+ );
65
+ }
66
+ Stepper.displayName = "Stepper";
67
+ function StepperItem({
68
+ title,
69
+ description,
70
+ status: statusProp,
71
+ onSelect,
72
+ className,
73
+ ...props
74
+ }) {
75
+ const ctx = useContext(StepContext);
76
+ const tier = useTypeTier();
77
+ const index = ctx?.index ?? 0;
78
+ const count = ctx?.count ?? 1;
79
+ const orientation = ctx?.orientation ?? "horizontal";
80
+ const dot = (ctx?.indicator ?? "number") === "dot";
81
+ const current = ctx?.current ?? 0;
82
+ const status = statusProp ?? (index < current ? "complete" : index === current ? "current" : "upcoming");
83
+ const isLast = index === count - 1;
84
+ const isCurrent = index === current;
85
+ const statusLabel = (ctx?.statusLabels ?? DEFAULT_STATUS_LABELS)[status];
86
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
87
+ dot ? (
88
+ // One title line tall (the step carries the title's type), so the dot
89
+ // centres on the title's first line at any density.
90
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "relative z-10 flex h-[1lh] shrink-0 items-center", children: /* @__PURE__ */ jsx("span", { className: stepperDotVariants({ status }) }) })
91
+ ) : /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: stepperIndicatorVariants({ status }), children: status === "complete" ? /* @__PURE__ */ jsx(Icon, { name: "check", className: "text-sm" }) : status === "error" ? /* @__PURE__ */ jsx(Icon, { name: "warning", className: "text-sm" }) : index + 1 }),
92
+ /* @__PURE__ */ jsxs(
93
+ "span",
94
+ {
95
+ className: cn(
96
+ "flex min-w-0 flex-col gap-0.5 text-start",
97
+ !dot && "min-h-(--control-xs) justify-center"
98
+ ),
99
+ children: [
100
+ /* @__PURE__ */ jsxs(
101
+ "span",
102
+ {
103
+ className: cn(
104
+ tier.control,
105
+ "underline-offset-2 motion-interactive group-hover/step:underline",
106
+ status === "upcoming" && "text-muted-foreground",
107
+ status === "error" && "text-destructive",
108
+ (status === "complete" || status === "current") && "text-foreground"
109
+ ),
110
+ children: [
111
+ title,
112
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: ` (${statusLabel})` })
113
+ ]
114
+ }
115
+ ),
116
+ description ? /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground", tier.secondary), children: description }) : null
117
+ ]
118
+ }
119
+ )
120
+ ] });
121
+ return /* @__PURE__ */ jsxs(
122
+ "li",
123
+ {
124
+ "aria-current": isCurrent ? "step" : void 0,
125
+ "data-status": status,
126
+ className: cn(
127
+ orientation === "horizontal" ? cn("flex min-w-0 items-start gap-3", isLast ? "flex-none" : "flex-1") : cn("relative", !isLast && "pb-6"),
128
+ // The dot and its line are measured in the title's `lh` and `em`.
129
+ dot && tier.control,
130
+ className
131
+ ),
132
+ ...props,
133
+ children: [
134
+ onSelect ? /* @__PURE__ */ jsx(
135
+ "button",
136
+ {
137
+ type: "button",
138
+ onClick: onSelect,
139
+ className: "group/step flex min-w-0 items-start gap-3 rounded-sm motion-interactive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
140
+ children: body
141
+ }
142
+ ) : /* @__PURE__ */ jsx("div", { className: "flex min-w-0 items-start gap-3", children: body }),
143
+ isLast ? null : /* @__PURE__ */ jsx(
144
+ "span",
145
+ {
146
+ "aria-hidden": "true",
147
+ className: (dot ? stepperDotConnectorVariants : stepperConnectorVariants)({
148
+ orientation,
149
+ filled: status === "complete"
150
+ })
151
+ }
152
+ )
153
+ ]
154
+ }
155
+ );
156
+ }
157
+ StepperItem.displayName = "StepperItem";
158
+ export {
159
+ Stepper,
160
+ StepperItem
161
+ };
@@ -0,0 +1,190 @@
1
+ // src/components/stepper/stepper.meta.ts
2
+ var stepperMeta = {
3
+ name: "Stepper",
4
+ summary: 'Where the user is in a multi-step flow \u2014 an ordered list of numbered steps, horizontal or vertical, each complete, current, upcoming or in error, with aria-current="step" on the current one. `indicator="dot"` turns it into a timeline of events (an order\'s delivery) with dots instead of numbers.',
5
+ status: "stable",
6
+ keywords: [
7
+ "stepper",
8
+ "steps",
9
+ "wizard",
10
+ "multi-step form",
11
+ "checkout steps",
12
+ "onboarding progress",
13
+ "progress steps",
14
+ "timeline"
15
+ ],
16
+ usage: {
17
+ description: "Use Stepper above or beside a flow that is split into a known, small number of named steps \u2014 checkout, onboarding, an import wizard \u2014 so the user can see how far they have come and what is left. It reports position; the flow's own Back and Continue buttons move it.",
18
+ bestPractices: [
19
+ {
20
+ guidance: "do",
21
+ description: 'Drive it from one number (`current`) and override a single step\'s `status` only for what a number cannot say \u2014 a completed step that now needs attention is `status="error"`.'
22
+ },
23
+ {
24
+ guidance: "do",
25
+ description: 'Name steps with a word or two ("Shipping", "Payment"). Go vertical when steps need a description or there are more than five; horizontal titles truncate first.'
26
+ },
27
+ {
28
+ guidance: "do",
29
+ description: "Give completed steps `onSelect` only when going back to edit them actually works, and keep the user's later answers when they do."
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: "Do not use Stepper for a task with unknown length or for a percentage. That is Progress; a stepper promises a fixed set of named stops."
34
+ },
35
+ {
36
+ guidance: "dont",
37
+ description: "Do not use it as navigation between independent sections. Sections the user can visit in any order are Tabs; a stepper implies each step depends on the one before."
38
+ },
39
+ {
40
+ guidance: "dont",
41
+ description: "Do not make upcoming steps pressable to skip ahead. A step that looks reachable but is not is worse than one that is plainly locked."
42
+ }
43
+ ],
44
+ anatomy: [
45
+ {
46
+ name: "Stepper",
47
+ required: true,
48
+ description: "The ordered list. Takes `current` and `orientation`, and an aria-label naming the flow."
49
+ },
50
+ {
51
+ name: "StepperItem",
52
+ required: true,
53
+ description: 'One step: a numbered disc (a check when complete, a warning mark on error) \u2014 or, with `indicator="dot"`, a dot centred on the title\'s first line \u2014 a title, and an optional description.'
54
+ },
55
+ {
56
+ name: "Connector",
57
+ required: false,
58
+ description: "The line to the next step, filled once this step is complete. Drawn automatically between items."
59
+ }
60
+ ]
61
+ },
62
+ related: {
63
+ components: ["Progress", "Tabs", "Form", "Button"]
64
+ },
65
+ props: [
66
+ {
67
+ name: "current",
68
+ type: "number",
69
+ default: "0",
70
+ description: "Zero-based index of the current step. Earlier steps derive complete, later ones upcoming."
71
+ },
72
+ {
73
+ name: "orientation",
74
+ type: '"horizontal" | "vertical"',
75
+ default: '"horizontal"',
76
+ description: "Horizontal for a short flow across the top of a form; vertical for long flows, narrow columns or steps with descriptions."
77
+ },
78
+ {
79
+ name: "indicator",
80
+ type: '"number" | "dot"',
81
+ default: '"number"',
82
+ description: "`number` for a flow the user moves through; `dot` for a timeline of events (delivery tracking, a document's history) where the position number adds nothing. The dot centres on the title's first line and scales with its type at every density."
83
+ },
84
+ {
85
+ name: "statusLabels",
86
+ type: "Partial<Record<StepStatus, string>>",
87
+ description: "Screen-reader status words appended to each title (Completed, Current step, Not started, Needs attention). Override to localize."
88
+ },
89
+ {
90
+ name: "aria-label",
91
+ type: "string",
92
+ description: 'Names the flow ("Checkout progress"). Every Stepper needs one.'
93
+ }
94
+ ],
95
+ subcomponents: [
96
+ {
97
+ name: "StepperItem",
98
+ type: "{ title: ReactNode; description?: ReactNode; status?: StepStatus; onSelect?: () => void } + li props",
99
+ description: "One step. `status` overrides the derived state; `onSelect` makes the disc and title a button for returning to the step."
100
+ }
101
+ ],
102
+ variants: {
103
+ orientation: ["horizontal", "vertical"],
104
+ indicator: ["number", "dot"],
105
+ status: ["complete", "current", "upcoming", "error"]
106
+ },
107
+ tokensUsed: [
108
+ "primary",
109
+ "primary-foreground",
110
+ "background",
111
+ "foreground",
112
+ "muted-foreground",
113
+ "border-strong",
114
+ "destructive",
115
+ "destructive-foreground",
116
+ "ring"
117
+ ],
118
+ motion: [
119
+ {
120
+ slot: "arrival",
121
+ recipe: "none",
122
+ part: "Stepper",
123
+ why: "The stepper frames the flow and is on screen before any step is. Animating it in would compete with the step content, which is what changed."
124
+ },
125
+ {
126
+ slot: "response",
127
+ recipe: "motion-interactive",
128
+ part: "StepperItem",
129
+ why: "Only steps with onSelect respond, and the eased underline is what tells a returning user that this completed step can be reopened while the upcoming ones cannot."
130
+ },
131
+ {
132
+ slot: "transition",
133
+ recipe: "motion-interactive",
134
+ part: "Indicator",
135
+ why: "When the user continues, the disc they leave fills and its connector darkens. Easing the colour makes that read as one step completing rather than the whole bar re-rendering."
136
+ },
137
+ {
138
+ slot: "activity",
139
+ recipe: "none",
140
+ part: "Stepper",
141
+ why: "A step is a place, not a process. Saving or validating between steps belongs on the Continue button's loading state; a pulsing disc would suggest the step itself is busy."
142
+ }
143
+ ],
144
+ a11y: [
145
+ "Renders an ordered list, so assistive tech announces the step count and each step's position.",
146
+ 'The current step carries aria-current="step"; every title also gets a visually hidden status word (Completed, Not started, Needs attention), so state never depends on colour or the disc glyph.',
147
+ "Discs and connectors are aria-hidden \u2014 the number is already the list position.",
148
+ "Steps with onSelect render as native buttons with a visible focus ring; steps without it are not focusable."
149
+ ],
150
+ examples: [
151
+ {
152
+ label: "Checkout",
153
+ code: `<Stepper current={1} aria-label="Checkout progress">
154
+ <StepperItem title="Cart" />
155
+ <StepperItem title="Shipping" />
156
+ <StepperItem title="Payment" />
157
+ <StepperItem title="Review" />
158
+ </Stepper>`
159
+ },
160
+ {
161
+ label: "Vertical with descriptions",
162
+ code: `<Stepper orientation="vertical" current={2} aria-label="Workspace setup">
163
+ <StepperItem title="Create account" description="Email verified" />
164
+ <StepperItem title="Invite team" description="3 people invited" />
165
+ <StepperItem title="Connect data" description="Choose a source to import from" />
166
+ <StepperItem title="Launch" />
167
+ </Stepper>`
168
+ },
169
+ {
170
+ label: "Delivery timeline (dots)",
171
+ code: `<Stepper orientation="vertical" indicator="dot" current={2} aria-label="Delivery status">
172
+ <StepperItem title="Order placed" description="Oct 9, 10:14 AM" />
173
+ <StepperItem title="Printed and packed" description="Oct 10, 4:02 PM" />
174
+ <StepperItem title="Out for delivery" description="Arriving today by 6 PM" />
175
+ <StepperItem title="Delivered" />
176
+ </Stepper>`
177
+ },
178
+ {
179
+ label: "A completed step with an error",
180
+ code: `<Stepper current={2} aria-label="Checkout progress">
181
+ <StepperItem title="Cart" onSelect={() => console.log("cart")} />
182
+ <StepperItem title="Shipping" status="error" description="Address needs a postcode" onSelect={() => console.log("shipping")} />
183
+ <StepperItem title="Payment" />
184
+ </Stepper>`
185
+ }
186
+ ]
187
+ };
188
+ export {
189
+ stepperMeta
190
+ };
@@ -0,0 +1,72 @@
1
+ // src/components/stepper/stepper.variants.ts
2
+ import { cva } from "class-variance-authority";
3
+ var stepperIndicatorVariants = cva(
4
+ "relative z-10 flex size-(--control-xs) shrink-0 items-center justify-center rounded-full border text-label-sm motion-interactive",
5
+ {
6
+ variants: {
7
+ status: {
8
+ complete: "border-primary bg-primary text-primary-foreground",
9
+ current: "border-2 border-primary bg-[var(--sable-surface-bg,var(--background))] text-primary",
10
+ upcoming: "border-border-strong bg-[var(--sable-surface-bg,var(--background))] text-muted-foreground",
11
+ error: "border-destructive bg-destructive text-destructive-foreground"
12
+ }
13
+ },
14
+ defaultVariants: {
15
+ status: "upcoming"
16
+ }
17
+ }
18
+ );
19
+ var stepperDotVariants = cva(
20
+ "size-[0.75em] shrink-0 rounded-full motion-interactive",
21
+ {
22
+ variants: {
23
+ status: {
24
+ complete: "bg-primary",
25
+ current: "bg-[var(--sable-surface-bg,var(--background))] ring-[0.1875em] ring-primary ring-inset",
26
+ upcoming: "bg-border-strong",
27
+ error: "bg-destructive"
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ status: "upcoming"
32
+ }
33
+ }
34
+ );
35
+ var stepperDotConnectorVariants = cva("shrink-0 rounded-full motion-interactive", {
36
+ variants: {
37
+ orientation: {
38
+ horizontal: "mt-[calc(0.5lh_-_1px)] h-0.5 min-w-4 flex-1",
39
+ vertical: "absolute start-[0.375em] top-[0.5lh] -bottom-[0.5lh] w-0.5 -translate-x-1/2 rtl:translate-x-1/2"
40
+ },
41
+ filled: {
42
+ true: "bg-primary",
43
+ false: "bg-border-strong"
44
+ }
45
+ },
46
+ defaultVariants: {
47
+ orientation: "horizontal",
48
+ filled: false
49
+ }
50
+ });
51
+ var stepperConnectorVariants = cva("shrink-0 rounded-full motion-interactive", {
52
+ variants: {
53
+ orientation: {
54
+ horizontal: "mt-[calc(var(--control-xs)/2)] h-px min-w-4 flex-1",
55
+ vertical: "absolute start-[calc(var(--control-xs)/2_-_0.5px)] top-[calc(var(--control-xs)_+_--spacing(1))] bottom-1 w-px"
56
+ },
57
+ filled: {
58
+ true: "bg-primary",
59
+ false: "bg-border-strong"
60
+ }
61
+ },
62
+ defaultVariants: {
63
+ orientation: "horizontal",
64
+ filled: false
65
+ }
66
+ });
67
+ export {
68
+ stepperConnectorVariants,
69
+ stepperDotConnectorVariants,
70
+ stepperDotVariants,
71
+ stepperIndicatorVariants
72
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/streaming-text/index.ts
2
+ import { StreamingText } from "./streaming-text.js";
3
+ import { streamingTextMeta } from "./streaming-text.meta.js";
4
+ export {
5
+ StreamingText,
6
+ streamingTextMeta
7
+ };
@@ -0,0 +1,55 @@
1
+ "use client";
2
+
3
+ // src/components/streaming-text/streaming-text.tsx
4
+ import { cn } from "../../lib/cn.js";
5
+ import { useMotion } from "../../motion/MotionProvider.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ function StreamingText({
8
+ text,
9
+ streaming = false,
10
+ as,
11
+ split = "word",
12
+ caret = true,
13
+ className,
14
+ ...props
15
+ }) {
16
+ const Comp = as ?? "p";
17
+ const { enabled } = useMotion();
18
+ const units = split === "char" ? Array.from(text) : text.split(/(\s+)/).filter(Boolean);
19
+ const last = units.length - 1;
20
+ return /* @__PURE__ */ jsxs(
21
+ Comp,
22
+ {
23
+ "aria-busy": streaming || void 0,
24
+ className: cn("text-body-md text-foreground", className),
25
+ ...props,
26
+ children: [
27
+ units.map((unit, i) => /* @__PURE__ */ jsx(
28
+ "span",
29
+ {
30
+ className: cn(
31
+ enabled && "motion-stream-in",
32
+ // Only the newest unit, and only mid-stream. Softening a run that
33
+ // has stopped growing would leave the answer permanently out of
34
+ // focus at its own last word.
35
+ enabled && streaming && i === last && "stream-tail"
36
+ ),
37
+ children: unit
38
+ },
39
+ i
40
+ )),
41
+ streaming && caret ? /* @__PURE__ */ jsx(
42
+ "span",
43
+ {
44
+ "aria-hidden": true,
45
+ "data-streaming": "true",
46
+ className: "ml-0.5 inline-block h-[1em] w-[2px] translate-y-[0.15em] rounded-full bg-foreground align-baseline motion-caret"
47
+ }
48
+ ) : null
49
+ ]
50
+ }
51
+ );
52
+ }
53
+ export {
54
+ StreamingText
55
+ };
@@ -0,0 +1,147 @@
1
+ // src/components/streaming-text/streaming-text.meta.ts
2
+ var streamingTextMeta = {
3
+ name: "StreamingText",
4
+ summary: "Prose arriving from a live source, a token at a time. Each token resolves out of blur, the trailing edge stays soft while more is coming, and a steady caret marks the write head.",
5
+ status: "stable",
6
+ keywords: [
7
+ "streaming",
8
+ "stream",
9
+ "tokens",
10
+ "typewriter",
11
+ "generation",
12
+ "assistant",
13
+ "llm",
14
+ "caret",
15
+ "incremental"
16
+ ],
17
+ usage: {
18
+ description: "Use StreamingText for text whose final length is unknown while it renders \u2014 a model's answer, a live transcript, a log line being written. It is the counterpart to ThinkingOrb and Spinner: those cover the wait BEFORE the first token, this covers the arrival of the tokens themselves.",
19
+ bestPractices: [
20
+ {
21
+ guidance: "do",
22
+ description: "Grow `text` and let the component do the rest. It assumes an append-only string and keys units by index, so React mounts only the new spans \u2014 re-rendering a longer string animates what was added and leaves what the reader has already read alone."
23
+ },
24
+ {
25
+ guidance: "do",
26
+ description: "Drop `streaming` to false the moment the source closes. That is what removes the caret and the softened tail, and their disappearance is the only signal the reader gets that the answer is complete."
27
+ },
28
+ {
29
+ guidance: "do",
30
+ description: "Turn `caret` off when something adjacent already reports the wait \u2014 a spinner in the message header, a status row beneath. Two indicators for one wait read as two things happening."
31
+ },
32
+ {
33
+ guidance: "dont",
34
+ description: "Do not use it for text that is already complete. Staging known text on scroll is TextReveal (a `motion` export, not a component folder), which computes a stagger from the full string; StreamingText cannot, because nothing here knows the length. Using it for static prose animates the whole paragraph on every mount and says 'still generating' about something that finished."
35
+ },
36
+ {
37
+ guidance: "dont",
38
+ description: "Do not wrap it in an aria-live region. Every token would be announced, which is unusable; the component sets `aria-busy` instead. Announce once when the turn settles, from whatever owns the turn."
39
+ },
40
+ {
41
+ guidance: "dont",
42
+ description: 'Do not pass `split="char"` for paragraph-length text. It is one element per character \u2014 thousands of nodes for an answer, each with its own animation \u2014 and word-splitting is indistinguishable at prose reading speed. Reserve it for a headline-length string.'
43
+ }
44
+ ],
45
+ anatomy: [
46
+ {
47
+ name: "Container",
48
+ required: true,
49
+ description: "The paragraph (or `as` element). Carries `aria-busy` while output is incomplete."
50
+ },
51
+ {
52
+ name: "Unit",
53
+ required: true,
54
+ description: "One word or character. Animates once on mount and never again; the newest one carries the softened tail while streaming."
55
+ },
56
+ {
57
+ name: "Caret",
58
+ required: false,
59
+ description: "The write head, shown while streaming. Steady rather than blinking \u2014 see `motion-caret`."
60
+ }
61
+ ]
62
+ },
63
+ related: {
64
+ components: ["ThinkingOrb", "Message", "Bubble"]
65
+ },
66
+ props: [
67
+ {
68
+ name: "text",
69
+ type: "string",
70
+ description: "The text received so far. Assumed append-only: the component keys units by index precisely so a grown string mounts only its new spans."
71
+ },
72
+ {
73
+ name: "streaming",
74
+ type: "boolean",
75
+ default: "false",
76
+ description: "Whether more is still coming. Drives the caret, the softened trailing edge, and `aria-busy`."
77
+ },
78
+ {
79
+ name: "as",
80
+ type: "ElementType",
81
+ default: '"p"',
82
+ description: "Render container element."
83
+ },
84
+ {
85
+ name: "split",
86
+ type: '"word" | "char"',
87
+ default: '"word"',
88
+ description: "Split granularity. `char` is one element per character \u2014 short strings only."
89
+ },
90
+ {
91
+ name: "caret",
92
+ type: "boolean",
93
+ default: "true",
94
+ description: "Show the caret while streaming. Turn it off when something adjacent already reports the wait."
95
+ }
96
+ ],
97
+ tokensUsed: ["foreground"],
98
+ motion: [
99
+ {
100
+ slot: "arrival",
101
+ recipe: "motion-stream-in",
102
+ part: "Unit",
103
+ why: "Each token resolves out of blur rather than fading. A fade makes every word a separate event; blur reads as the word coming into focus, so a paragraph arrives as one sentence being written instead of a queue of arrivals."
104
+ },
105
+ {
106
+ slot: "response",
107
+ recipe: "none",
108
+ part: "Container",
109
+ why: "It is prose, not a control. Selecting and copying it is the only interaction, and both are native."
110
+ },
111
+ {
112
+ slot: "transition",
113
+ recipe: "none",
114
+ part: "Container",
115
+ why: "There is no state to move between \u2014 streaming to complete is marked by the caret and tail leaving, not by the text changing. Animating the whole paragraph on completion would re-stage text the reader already read."
116
+ },
117
+ {
118
+ slot: "activity",
119
+ recipe: "motion-caret",
120
+ part: "Caret",
121
+ why: 'The caret is the write head, and it is deliberately STEADY (`data-streaming="true"` suppresses the blink). A blink during arrival puts two rhythms on screen \u2014 text advancing at one rate, a caret flashing at another \u2014 and the flashing one carries no information the moving text has not already given.'
122
+ }
123
+ ],
124
+ a11y: [
125
+ "The text is real text in the accessibility tree: units are ordinary spans, not aria-hidden fragments, so a screen reader concatenates them into the sentence.",
126
+ "`aria-busy` is set on the container while `streaming` is true, marking the output incomplete without announcing each token.",
127
+ "The caret is `aria-hidden` \u2014 it is a rendering of the write head, and a screen reader has no use for it.",
128
+ "Under reduced motion or with MotionProvider off, no unit animates and no tail is softened; text simply appears as it arrives."
129
+ ],
130
+ examples: [
131
+ {
132
+ label: "Streaming an answer",
133
+ code: "<StreamingText text={answer} streaming={pending} />"
134
+ },
135
+ {
136
+ label: "Inside a message, with the wait reported elsewhere",
137
+ code: '<Message role="assistant"><StreamingText text={answer} streaming={pending} caret={false} /></Message>'
138
+ },
139
+ {
140
+ label: "A headline resolving character by character",
141
+ code: '<StreamingText as="h2" split="char" className="text-heading-2" text={headline} streaming={pending} />'
142
+ }
143
+ ]
144
+ };
145
+ export {
146
+ streamingTextMeta
147
+ };