@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,147 @@
1
+ // src/components/sparkline/sparkline.meta.ts
2
+ var sparklineMeta = {
3
+ name: "Sparkline",
4
+ summary: "A word-sized trend with no axes \u2014 a line, a line over a soft fill, or columns \u2014 sized by its container, for stat cards, table cells and sentences. Draws on as it scrolls into view.",
5
+ keywords: [
6
+ "sparkline",
7
+ "trend",
8
+ "mini chart",
9
+ "inline chart",
10
+ "micro chart",
11
+ "kpi",
12
+ "stat"
13
+ ],
14
+ usage: {
15
+ description: "Use Sparkline next to a number to show where it has been \u2014 a KPI's last 30 days in a stat card, a row's trend in a table. It has no axes, tooltip or values to read off; when the reader needs those, use AreaChart or LineChart.",
16
+ bestPractices: [
17
+ {
18
+ guidance: "do",
19
+ description: "Pair it with the current value and its change in text; the sparkline shows only the shape."
20
+ },
21
+ {
22
+ guidance: "do",
23
+ description: "Give it a label that names the measure and the period \u2014 the spoken summary adds the range and latest value."
24
+ },
25
+ {
26
+ guidance: "dont",
27
+ description: "Put two sparklines on one shared axis to compare them \u2014 each scales to its own data; use LineChart."
28
+ },
29
+ {
30
+ guidance: "dont",
31
+ description: "Use it as the only place a number appears; a shape without a value cannot be read off."
32
+ }
33
+ ]
34
+ },
35
+ related: {
36
+ components: [
37
+ "AreaChart",
38
+ "LineChart",
39
+ "Card",
40
+ "Table"
41
+ ]
42
+ },
43
+ status: "beta",
44
+ props: [
45
+ {
46
+ name: "data",
47
+ type: "number[]",
48
+ description: "The values, oldest first."
49
+ },
50
+ {
51
+ name: "label",
52
+ type: "string",
53
+ description: 'What the line tracks ("Revenue, last 30 days"). The spoken summary adds the first and last values, low and high.'
54
+ },
55
+ {
56
+ name: "variant",
57
+ type: '"line" | "area" | "bar"',
58
+ default: '"line"',
59
+ description: "A line, a line over a soft fill, or columns."
60
+ },
61
+ {
62
+ name: "tone",
63
+ type: '"edition" | "collectible" | "standard" | "info" | "warning" | "primary" | "neutral" | "success" | "destructive"',
64
+ default: '"primary"',
65
+ description: "Colour by role."
66
+ },
67
+ {
68
+ name: "className",
69
+ type: "string",
70
+ default: '"h-8 w-24"',
71
+ description: "Sizes it; the drawing stretches to fit."
72
+ },
73
+ {
74
+ name: "animate",
75
+ type: "boolean",
76
+ default: "true",
77
+ description: "Draw on (or rise) when it scrolls into view."
78
+ },
79
+ {
80
+ name: "locale",
81
+ type: "string",
82
+ default: "runtime locale",
83
+ description: "BCP 47 locale for default number and date formatting."
84
+ }
85
+ ],
86
+ variants: {
87
+ variant: [
88
+ "line",
89
+ "area",
90
+ "bar"
91
+ ]
92
+ },
93
+ tokensUsed: [
94
+ "primary",
95
+ "tone-edition",
96
+ "tone-collectible",
97
+ "tone-standard",
98
+ "tone-info",
99
+ "tone-warning",
100
+ "muted-foreground",
101
+ "success",
102
+ "destructive"
103
+ ],
104
+ motion: [
105
+ {
106
+ slot: "arrival",
107
+ recipe: "custom",
108
+ part: "Line / bars",
109
+ why: "Once on screen the line draws on (or the bars rise, in sequence). On the motion tokens; reduced motion shows the finished drawing."
110
+ },
111
+ {
112
+ slot: "response",
113
+ recipe: "none",
114
+ part: "Sparkline",
115
+ why: "Not interactive: it has no tooltip or focus."
116
+ },
117
+ {
118
+ slot: "transition",
119
+ recipe: "none",
120
+ part: "Sparkline",
121
+ why: "New data redraws in place; a word-sized chart animating on every update would distract from the number beside it."
122
+ },
123
+ {
124
+ slot: "activity",
125
+ recipe: "none",
126
+ part: "Sparkline",
127
+ why: "No indeterminate state."
128
+ }
129
+ ],
130
+ a11y: [
131
+ 'Rendered role=img with an aria-label built from `label` and the data: "Revenue, last 30 days: from 120 to 184, low 96, high 190".',
132
+ "It is not focusable and has no tooltip, so the number it accompanies must be in text beside it."
133
+ ],
134
+ examples: [
135
+ {
136
+ label: "In a stat card",
137
+ code: '<Card>\n <CardHeader>\n <CardDescription>Revenue</CardDescription>\n <CardTitle className="text-mono-xl">$18,240</CardTitle>\n <CardAction>\n <Sparkline label="Revenue, last 12 weeks" data={[12, 14, 13, 17, 16, 19, 18, 21, 20, 24, 23, 26]} variant="area" tone="success" />\n </CardAction>\n </CardHeader>\n</Card>'
138
+ },
139
+ {
140
+ label: "Columns in a table cell",
141
+ code: '<Sparkline label="Daily signups, last 14 days" data={[4, 6, 3, 8, 7, 9, 5, 6, 10, 8, 7, 11, 9, 12]} variant="bar" className="h-6 w-20" />'
142
+ }
143
+ ]
144
+ };
145
+ export {
146
+ sparklineMeta
147
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/spinner/index.ts
2
+ import { Spinner } from "./spinner.js";
3
+ import { spinnerMeta } from "./spinner.meta.js";
4
+ export {
5
+ Spinner,
6
+ spinnerMeta
7
+ };
@@ -0,0 +1,59 @@
1
+ // src/components/spinner/spinner.tsx
2
+ import { cn } from "../../lib/cn.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ var RING_SIZE = { sm: "size-3.5", md: "size-4", lg: "size-6" };
5
+ var DOT_SIZE = { sm: "size-1", md: "size-1.5", lg: "size-2" };
6
+ var DOT_DELAYS = ["0ms", "150ms", "300ms"];
7
+ function Spinner({ label = "Loading", appearance = "ring", size = "md", thickness = 2.5, className, ref, ...props }) {
8
+ if (appearance === "dots") {
9
+ return /* @__PURE__ */ jsx("span", { ref, role: "status", "aria-label": label, className: cn("inline-flex items-center gap-1", className), ...props, children: DOT_DELAYS.map((delay) => /* @__PURE__ */ jsx("span", { className: cn("shrink-0 rounded-full bg-current motion-dot-bounce", DOT_SIZE[size]), style: { animationDelay: delay } }, delay)) });
10
+ }
11
+ return /* @__PURE__ */ jsx(
12
+ "span",
13
+ {
14
+ ref,
15
+ role: "status",
16
+ "aria-label": label,
17
+ className: cn("inline-flex items-center justify-center", RING_SIZE[size], className),
18
+ ...props,
19
+ children: /* @__PURE__ */ jsxs(
20
+ "svg",
21
+ {
22
+ viewBox: "0 0 24 24",
23
+ fill: "none",
24
+ "aria-hidden": "true",
25
+ className: "size-full motion-spin",
26
+ children: [
27
+ /* @__PURE__ */ jsx(
28
+ "circle",
29
+ {
30
+ cx: "12",
31
+ cy: "12",
32
+ r: "9",
33
+ stroke: "currentColor",
34
+ strokeWidth: thickness,
35
+ className: "opacity-20"
36
+ }
37
+ ),
38
+ /* @__PURE__ */ jsx(
39
+ "circle",
40
+ {
41
+ cx: "12",
42
+ cy: "12",
43
+ r: "9",
44
+ stroke: "currentColor",
45
+ strokeWidth: thickness,
46
+ strokeLinecap: "round",
47
+ strokeDasharray: "15 42"
48
+ }
49
+ )
50
+ ]
51
+ }
52
+ )
53
+ }
54
+ );
55
+ }
56
+ Spinner.displayName = "Spinner";
57
+ export {
58
+ Spinner
59
+ };
@@ -0,0 +1,118 @@
1
+ // src/components/spinner/spinner.meta.ts
2
+ var spinnerMeta = {
3
+ name: "Spinner",
4
+ summary: "Pure SVG activity indicator. No Base UI, no icon dependency \u2014 a role=status ring (faint track + rounded-cap arc) that inherits the current text color. Size with the size prop (sm / md / lg), color with text-*.",
5
+ status: "stable",
6
+ keywords: [
7
+ "spinner",
8
+ "loading",
9
+ "pending",
10
+ "indeterminate"
11
+ ],
12
+ usage: {
13
+ description: "Use Spinner for short indeterminate waits where the user cannot know exact progress.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use it in compact panels or places where layout is already stable. In a button, use Button's loading prop rather than placing a Spinner by hand \u2014 it disables the button, sets aria-busy and sizes the spinner to the button's icon."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Pair it with accessible loading text when the surrounding label is not enough."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not use Spinner as the only content for long waits or full page loading."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not use it without an accessible name or a nearby status message. A spinning icon is invisible to a screen reader, so the wait is announced as nothing at all."
30
+ }
31
+ ]
32
+ },
33
+ related: {
34
+ components: [
35
+ "Skeleton",
36
+ "Progress"
37
+ ]
38
+ },
39
+ props: [
40
+ {
41
+ name: "label",
42
+ type: "string",
43
+ default: '"Loading"',
44
+ description: "Accessible label announced by screen readers while visible (sets aria-label on the role=status element)."
45
+ },
46
+ {
47
+ name: "appearance",
48
+ type: '"ring" | "dots"',
49
+ default: '"ring"',
50
+ description: "ring is the default indicator; dots are three bouncing dots, softer, for chat and inline text."
51
+ },
52
+ {
53
+ name: "size",
54
+ type: '"sm" | "md" | "lg"',
55
+ default: '"md"',
56
+ description: "One scale for both appearances: ring 14 / 16 / 24px, dots 4 / 6 / 8px."
57
+ },
58
+ {
59
+ name: "className",
60
+ type: "string",
61
+ description: "Color (text-*); the ring's strokes use currentColor, so it follows the text color. Size with the size prop \u2014 a size-* class still overrides the ring for an off-scale context (Button sizes its own spinner this way), but is not the way to pick a size."
62
+ }
63
+ ],
64
+ tokensUsed: ["foreground", "muted-foreground", "primary-foreground"],
65
+ motion: [
66
+ {
67
+ slot: "arrival",
68
+ recipe: "none",
69
+ part: "Root",
70
+ why: "A spinner already signals a wait. Fading it in delays the signal for exactly as long as the user most needs it."
71
+ },
72
+ {
73
+ slot: "response",
74
+ recipe: "none",
75
+ part: "Root",
76
+ why: "It is a status indicator, not a control."
77
+ },
78
+ {
79
+ slot: "transition",
80
+ recipe: "none",
81
+ part: "Root",
82
+ why: "One state. Whatever replaces it on completion owns that change."
83
+ },
84
+ {
85
+ slot: "activity",
86
+ recipe: "motion-spin",
87
+ part: "Root",
88
+ why: "The rotation is the whole component \u2014 it is the only thing distinguishing 'working' from 'frozen'. motion-spin rather than Tailwind's animate-spin because the built-in ignores --motion-scale, so the reduced-motion policy cannot freeze it."
89
+ }
90
+ ],
91
+ a11y: [
92
+ "Wrapped in role=status, a polite live region, with an aria-label (default 'Loading').",
93
+ "Color comes from currentColor; pair with a text-* token for adequate contrast.",
94
+ "Spins with the motion-spin utility, which follows --motion-scale, so it slows and stops with the motion setting and reduced-motion."
95
+ ],
96
+ variants: {
97
+ appearance: ["ring", "dots"],
98
+ size: ["sm", "md", "lg"]
99
+ },
100
+ examples: [
101
+ {
102
+ label: "Dots",
103
+ code: '<Spinner appearance="dots" label="Assistant is typing" className="text-muted-foreground" />'
104
+ },
105
+ { label: "Default", code: "<Spinner />" },
106
+ {
107
+ label: "Sized + tinted",
108
+ code: '<Spinner size="lg" className="text-muted-foreground" />'
109
+ },
110
+ {
111
+ label: "Inside a button (Button owns it \u2014 use loading)",
112
+ code: "<Button loading>Collecting</Button>"
113
+ }
114
+ ]
115
+ };
116
+ export {
117
+ spinnerMeta
118
+ };
@@ -0,0 +1,9 @@
1
+ // src/components/status-bar/index.ts
2
+ import { StatusBar, StatusBarGroup, StatusBarSeparator } from "./status-bar.js";
3
+ import { statusBarMeta } from "./status-bar.meta.js";
4
+ export {
5
+ StatusBar,
6
+ StatusBarGroup,
7
+ StatusBarSeparator,
8
+ statusBarMeta
9
+ };
@@ -0,0 +1,40 @@
1
+ "use client";
2
+
3
+ // src/components/status-bar/status-bar.tsx
4
+ import { cn } from "../../lib/cn.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ function StatusBar({ className, children, ...props }) {
7
+ return /* @__PURE__ */ jsx(
8
+ "footer",
9
+ {
10
+ className: cn(
11
+ "flex h-(--status-bar-height) shrink-0 items-center gap-3 border-t border-hairline bg-panel px-2",
12
+ "text-ui-micro text-muted-foreground",
13
+ className
14
+ ),
15
+ ...props,
16
+ children
17
+ }
18
+ );
19
+ }
20
+ StatusBar.displayName = "StatusBar";
21
+ function StatusBarGroup({ align = "start", className, children, ...props }) {
22
+ return /* @__PURE__ */ jsx(
23
+ "span",
24
+ {
25
+ className: cn("flex items-center gap-3", align === "end" && "ms-auto", className),
26
+ ...props,
27
+ children
28
+ }
29
+ );
30
+ }
31
+ StatusBarGroup.displayName = "StatusBarGroup";
32
+ function StatusBarSeparator({ className, ...props }) {
33
+ return /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("text-hairline-strong", className), ...props, children: "\xB7" });
34
+ }
35
+ StatusBarSeparator.displayName = "StatusBarSeparator";
36
+ export {
37
+ StatusBar,
38
+ StatusBarGroup,
39
+ StatusBarSeparator
40
+ };
@@ -0,0 +1,117 @@
1
+ // src/components/status-bar/status-bar.meta.ts
2
+ var statusBarMeta = {
3
+ name: "StatusBar",
4
+ summary: "The bottom chrome strip of a Workspace: ambient document facts \u2014 dimensions, counts, sync state \u2014 in the micro type tier.",
5
+ keywords: [
6
+ "status bar",
7
+ "status",
8
+ "footer",
9
+ "chrome",
10
+ "workspace",
11
+ "tool",
12
+ "ambient",
13
+ "counts",
14
+ "document"
15
+ ],
16
+ usage: {
17
+ description: "Use StatusBar for the persistent facts about a document that otherwise have nowhere to live: size, counts, selection state, sync or connection status. Everything in it is ambient \u2014 it reports, it does not command. Pair it with Workspace's statusBar slot.",
18
+ bestPractices: [
19
+ {
20
+ guidance: "do",
21
+ description: "Put document-scoped facts here \u2014 dimensions, layer or record counts, saved/sync state \u2014 so panels stop competing for that space."
22
+ },
23
+ {
24
+ guidance: "do",
25
+ description: 'Use StatusBarGroup with align="end" for the trailing cluster, and StatusBarSeparator between related facts.'
26
+ },
27
+ {
28
+ guidance: "do",
29
+ description: "Render numeric facts in the UI num tier so a changing value doesn't shift the strip's layout."
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: "Make it the only route to an action. It's ambient chrome at the micro tier \u2014 anything essential needs a real control elsewhere too."
34
+ },
35
+ {
36
+ guidance: "dont",
37
+ description: "Put zoom here. Anchor zoom to the canvas it acts on, which is where every reference tool puts it."
38
+ },
39
+ {
40
+ guidance: "dont",
41
+ description: "Use it for transient feedback like a save confirmation \u2014 that's Toast. A status bar states what is true, not what just happened."
42
+ },
43
+ {
44
+ guidance: "dont",
45
+ description: "Derive a fact here separately from the surface that shows it, or from something expensive to recompute. The strip re-renders with the document, so read the same value the canvas or panel uses: a status bar that reports max(asset sizes) while the canvas reports something else is a bug types cannot catch, because both are numbers."
46
+ }
47
+ ],
48
+ anatomy: [
49
+ {
50
+ name: "StatusBarGroup",
51
+ required: false,
52
+ description: 'A cluster of items; align="end" pins it to the trailing edge.'
53
+ },
54
+ {
55
+ name: "StatusBarSeparator",
56
+ required: false,
57
+ description: "A decorative dot between related facts; aria-hidden."
58
+ }
59
+ ]
60
+ },
61
+ related: {
62
+ components: ["Workspace", "PanelGroup", "InlineStatus", "Toast", "Banner"]
63
+ },
64
+ status: "stable",
65
+ props: [],
66
+ subcomponents: [
67
+ {
68
+ name: "StatusBarGroup",
69
+ type: "{ align?: 'start' | 'end' }",
70
+ description: "A cluster of status items; `end` pushes it to the trailing edge."
71
+ },
72
+ {
73
+ name: "StatusBarSeparator",
74
+ type: "ComponentProps<'span'>",
75
+ description: "A decorative middle dot between facts. aria-hidden, since order conveys grouping."
76
+ }
77
+ ],
78
+ a11y: [
79
+ "Renders a <footer>, so the strip is a discoverable region rather than an anonymous row of text.",
80
+ "Separators are aria-hidden \u2014 a screen reader announcing 'middle dot' between every fact is noise.",
81
+ "Micro-tier text is small by design; never put information here that exists nowhere else."
82
+ ],
83
+ tokensUsed: ["muted-foreground", "panel", "hairline", "hairline-strong"],
84
+ examples: [
85
+ {
86
+ label: "Document facts with a trailing cluster",
87
+ code: `<StatusBar>
88
+ <span className="text-ui-num">1024 \xD7 768</span>
89
+ <StatusBarSeparator />
90
+ <span>3 layers</span>
91
+ <StatusBarGroup align="end">
92
+ <span>Saved</span>
93
+ </StatusBarGroup>
94
+ </StatusBar>`
95
+ },
96
+ {
97
+ label: "With a warning tone",
98
+ code: `<StatusBar>
99
+ <span>Offline \u2014 edits are queued</span>
100
+ <StatusBarGroup align="end">
101
+ <span className="text-tone-warning">2 unsynced</span>
102
+ </StatusBarGroup>
103
+ </StatusBar>`
104
+ },
105
+ {
106
+ label: "In a Workspace",
107
+ code: `<Workspace statusBar={<StatusBar><span>Connected</span></StatusBar>}>
108
+ <PanelGroup>
109
+ <WorkspaceCanvas />
110
+ </PanelGroup>
111
+ </Workspace>`
112
+ }
113
+ ]
114
+ };
115
+ export {
116
+ statusBarMeta
117
+ };
@@ -0,0 +1,9 @@
1
+ // src/components/status-dot/index.ts
2
+ import { StatusDot } from "./status-dot.js";
3
+ import { statusDotVariants } from "./status-dot.variants.js";
4
+ import { statusDotMeta } from "./status-dot.meta.js";
5
+ export {
6
+ StatusDot,
7
+ statusDotMeta,
8
+ statusDotVariants
9
+ };
@@ -0,0 +1,40 @@
1
+ // src/components/status-dot/status-dot.tsx
2
+ import { cn } from "../../lib/cn.js";
3
+ import { statusDotVariants } from "./status-dot.variants.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function StatusDot({
6
+ tone,
7
+ size,
8
+ pulse = false,
9
+ className,
10
+ ...props
11
+ }) {
12
+ const dot = statusDotVariants({ tone, size });
13
+ if (pulse) {
14
+ return /* @__PURE__ */ jsxs(
15
+ "span",
16
+ {
17
+ "aria-hidden": "true",
18
+ className: cn("relative inline-flex shrink-0", className),
19
+ ...props,
20
+ children: [
21
+ /* @__PURE__ */ jsx(
22
+ "span",
23
+ {
24
+ className: cn(
25
+ dot,
26
+ "absolute inset-0 motion-ping opacity-75"
27
+ )
28
+ }
29
+ ),
30
+ /* @__PURE__ */ jsx("span", { className: cn(dot, "relative") })
31
+ ]
32
+ }
33
+ );
34
+ }
35
+ return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn(dot, className), ...props });
36
+ }
37
+ StatusDot.displayName = "StatusDot";
38
+ export {
39
+ StatusDot
40
+ };
@@ -0,0 +1,113 @@
1
+ // src/components/status-dot/status-dot.meta.ts
2
+ var statusDotMeta = {
3
+ name: "StatusDot",
4
+ summary: "A small colored status dot. Tone variants encode state via semantic tone tokens; sizes scale the diameter. Decorative (aria-hidden) \u2014 pair with text. Optional pulse adds a live ping ring.",
5
+ keywords: [
6
+ "status",
7
+ "dot",
8
+ "presence",
9
+ "health",
10
+ "state",
11
+ "online",
12
+ "live",
13
+ "indicator"
14
+ ],
15
+ usage: {
16
+ description: 'Use StatusDot as a compact visual state cue next to text, avatars, rows, or labels. It is decorative by design, so pair it with visible text or use `<Badge appearance="plain" dot>` when the label and dot should travel together \u2014 that is the labelled status line, not a hand-built row.',
17
+ bestPractices: [
18
+ {
19
+ guidance: "do",
20
+ description: "Place StatusDot beside a readable state label, person name, or row title."
21
+ },
22
+ {
23
+ guidance: "do",
24
+ description: "Use pulse only for live or in-progress states that are actively changing."
25
+ },
26
+ {
27
+ guidance: "dont",
28
+ description: "Use the dot as the only status indicator; it is aria-hidden and color alone is not enough."
29
+ },
30
+ {
31
+ guidance: "dont",
32
+ description: "Mix many dot sizes in the same list. Keep row indicators visually consistent."
33
+ }
34
+ ],
35
+ anatomy: [
36
+ {
37
+ name: "Dot",
38
+ required: true,
39
+ description: "The small tone-colored circle. It is decorative and hidden from assistive tech."
40
+ },
41
+ {
42
+ name: "Pulse ring",
43
+ required: false,
44
+ description: "Optional motion ring for in-progress or live states."
45
+ }
46
+ ]
47
+ },
48
+ related: {
49
+ components: ["Badge", "Avatar", "InlineStatus"],
50
+ patterns: ["DashboardPage", "ListDetailPage"]
51
+ },
52
+ status: "stable",
53
+ props: [
54
+ {
55
+ name: "tone",
56
+ type: '"neutral" | "standard" | "success" | "warning" | "info" | "edition" | "collectible" | "destructive"',
57
+ default: '"neutral"',
58
+ description: "Semantic color of the dot."
59
+ },
60
+ {
61
+ name: "size",
62
+ type: '"sm" | "md" | "lg"',
63
+ default: '"md"',
64
+ description: "Dot diameter."
65
+ },
66
+ {
67
+ name: "pulse",
68
+ type: "boolean",
69
+ default: "false",
70
+ description: "Wrap the dot in an animated ping ring to signal a live state."
71
+ }
72
+ ],
73
+ variants: {
74
+ tone: [
75
+ "neutral",
76
+ "standard",
77
+ "success",
78
+ "warning",
79
+ "info",
80
+ "edition",
81
+ "collectible",
82
+ "destructive"
83
+ ],
84
+ size: ["sm", "md", "lg"]
85
+ },
86
+ tokensUsed: [
87
+ "muted-foreground",
88
+ "tone-standard",
89
+ "success",
90
+ "tone-warning",
91
+ "tone-info",
92
+ "tone-edition",
93
+ "tone-collectible",
94
+ "destructive"
95
+ ],
96
+ a11y: [
97
+ "Rendered aria-hidden \u2014 purely decorative. Convey status in adjacent text, not color alone.",
98
+ "A dot conveys state through colour alone, which fails for colour-blind users and announces as nothing. It must always sit beside text that states the same thing, or carry its own accessible name."
99
+ ],
100
+ examples: [
101
+ {
102
+ label: "Tones",
103
+ code: '<Row gap={2}><StatusDot tone="standard" /><StatusDot tone="info" /><StatusDot tone="warning" /><StatusDot tone="destructive" /></Row>'
104
+ },
105
+ {
106
+ label: "With label \u2014 use Badge",
107
+ code: '<Badge appearance="plain" tone="success" dot pulse>Live</Badge>'
108
+ }
109
+ ]
110
+ };
111
+ export {
112
+ statusDotMeta
113
+ };