@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,171 @@
1
+ // src/components/badge/badge.meta.ts
2
+ var badgeMeta = {
3
+ name: "Badge",
4
+ summary: "Compact static label, set on two axes: appearance (soft, outline, solid, overlay on media, plain text) and tone (neutral or a semantic tone). An optional leading icon, or a status dot (with pulse) for state.",
5
+ keywords: [
6
+ "badge",
7
+ "tag",
8
+ "label",
9
+ "status",
10
+ "metadata",
11
+ "chip",
12
+ "pill",
13
+ "tone",
14
+ "category"
15
+ ],
16
+ usage: {
17
+ description: 'Use Badge for any short static label: metadata, categories, tone-coded labels, a label on artwork (appearance="overlay"), or a status line (appearance="plain" with dot). Use Pill for a chip someone clicks, NotificationBadge for an unread count on an icon, and Banner or Toast for messages that need attention.',
18
+ bestPractices: [
19
+ {
20
+ guidance: "do",
21
+ description: "Keep badge text short: one to three words or a compact count."
22
+ },
23
+ {
24
+ guidance: "do",
25
+ description: "Use tone variants when the badge carries meaning, such as success, warning, destructive, edition, or collectible."
26
+ },
27
+ {
28
+ guidance: "do",
29
+ description: "Pair icons with text; the icon reinforces meaning but should not be the only cue."
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: "Use a Badge as a button. If it triggers an action, use Button, Toggle, or a menu item."
34
+ },
35
+ {
36
+ guidance: "do",
37
+ description: "Choose appearance and tone separately: appearance is how loud it is (soft by default, solid for emphasis, overlay on images, plain for a status line); tone is what it means."
38
+ },
39
+ {
40
+ guidance: "dont",
41
+ description: "Stack many loud tone badges in one row; too many semantic colors compete with the actual content."
42
+ }
43
+ ],
44
+ anatomy: [
45
+ {
46
+ name: "Container",
47
+ required: true,
48
+ description: "The compact pill surface carrying the tone or neutral treatment."
49
+ },
50
+ {
51
+ name: "Label",
52
+ required: true,
53
+ description: "Short visible text that names the category, state, role, or metadata value."
54
+ },
55
+ {
56
+ name: "Icon",
57
+ required: false,
58
+ description: "Optional leading Icon used to reinforce the label."
59
+ }
60
+ ]
61
+ },
62
+ related: {
63
+ components: ["Pill", "StatusDot", "NotificationBadge", "Banner", "Toast"],
64
+ patterns: ["DashboardPage", "ListDetailPage"]
65
+ },
66
+ status: "stable",
67
+ props: [
68
+ {
69
+ name: "appearance",
70
+ type: '"soft" | "outline" | "solid" | "overlay" | "plain"',
71
+ default: '"soft"',
72
+ description: "How it is drawn. soft: a tinted fill (neutral is the secondary surface). outline: a hairline. solid: the tone at full strength (neutral is the inverted chip). overlay: legible on images \u2014 a dark scrim, or the solid tone. plain: no fill or padding, a status line."
73
+ },
74
+ {
75
+ name: "tone",
76
+ type: '"neutral" | "standard" | "collectible" | "edition" | "info" | "success" | "warning" | "destructive"',
77
+ default: '"neutral"',
78
+ description: "What it means. Every appearance takes every tone."
79
+ },
80
+ {
81
+ name: "size",
82
+ type: '"sm" | "md"',
83
+ default: '"md"',
84
+ description: '"sm" uses tighter padding + text-label-sm; "md" is the default look.'
85
+ },
86
+ {
87
+ name: "icon",
88
+ type: "ReactNode",
89
+ description: 'Optional leading glyph (e.g. <Icon name="lock" />), rendered before the children with the base gap. Ignored when dot is set.'
90
+ },
91
+ {
92
+ name: "dot",
93
+ type: "boolean",
94
+ default: "false",
95
+ description: `A leading status dot in the badge's tone. With appearance="plain" it is a status line (\u25CF Ready).`
96
+ },
97
+ {
98
+ name: "pulse",
99
+ type: "boolean",
100
+ default: "false",
101
+ description: "Pulse the dot, for a state in progress. Needs dot."
102
+ }
103
+ ],
104
+ variants: {
105
+ appearance: ["soft", "outline", "solid", "overlay", "plain"],
106
+ tone: ["neutral", "standard", "collectible", "edition", "info", "success", "warning", "destructive"],
107
+ size: ["sm", "md"]
108
+ },
109
+ tokensUsed: [
110
+ "secondary",
111
+ "secondary-foreground",
112
+ "border",
113
+ "foreground",
114
+ "background",
115
+ "muted",
116
+ "muted-foreground",
117
+ "tone-standard",
118
+ "tone-collectible",
119
+ "tone-edition",
120
+ "tone-info",
121
+ "success",
122
+ "tone-warning",
123
+ "destructive",
124
+ "overlay",
125
+ "overlay-foreground",
126
+ "tone-standard-foreground",
127
+ "tone-collectible-foreground",
128
+ "tone-edition-foreground",
129
+ "tone-info-foreground",
130
+ "success-foreground",
131
+ "tone-warning-foreground",
132
+ "destructive-foreground"
133
+ ],
134
+ a11y: [
135
+ "Badges are static text by default; do not rely on color alone for meaning.",
136
+ "Use clear label text for semantic tones so assistive tech receives the same status information sighted users see."
137
+ ],
138
+ examples: [
139
+ {
140
+ label: "Tones",
141
+ code: '<Row gap={1}><Badge tone="edition">Edition</Badge><Badge tone="collectible">Collectible</Badge><Badge tone="standard">Standard</Badge></Row>'
142
+ },
143
+ {
144
+ label: "Solid",
145
+ code: '<Badge appearance="solid" size="sm">Admin</Badge>'
146
+ },
147
+ {
148
+ label: "Success",
149
+ code: '<Badge tone="success">Resolved</Badge>'
150
+ },
151
+ {
152
+ label: "With icon",
153
+ code: '<Badge size="sm" icon={<Icon name="lock" />}>Locked</Badge>'
154
+ },
155
+ {
156
+ label: "Small",
157
+ code: '<Badge size="sm" tone="info">New</Badge>'
158
+ },
159
+ {
160
+ label: "Metadata row",
161
+ code: '<Row gap={1}><Badge>12 editions</Badge><Badge appearance="outline">Open edition</Badge><Badge tone="info" icon={<Icon name="info" />}>Curated</Badge></Row>'
162
+ },
163
+ {
164
+ label: "Semantic state",
165
+ code: '<Row gap={1}><Badge tone="success">Synced</Badge><Badge tone="warning">Review</Badge><Badge tone="destructive">Blocked</Badge></Row>'
166
+ }
167
+ ]
168
+ };
169
+ export {
170
+ badgeMeta
171
+ };
@@ -0,0 +1,103 @@
1
+ // src/components/badge/badge.variants.ts
2
+ import { cva } from "class-variance-authority";
3
+ var BADGE_TONES = ["neutral", "standard", "collectible", "edition", "info", "success", "warning", "destructive"];
4
+ var BADGE_APPEARANCES = ["soft", "outline", "solid", "overlay", "plain"];
5
+ var MATRIX = {
6
+ // The ink is the tone pulled a quarter of the way to the page's own ink. The
7
+ // raw tone clears 4.5:1 on the page, but on its own 15% wash it did not
8
+ // (light info 4.2:1, dark edition 3.6:1, most of Verdant's tones ~4.1:1).
9
+ // Mixing toward --foreground moves it AWAY from the wash in both modes and
10
+ // every theme, and keeps the hue. Status tones mix from their -text token,
11
+ // not the fill: dark fills now sit low enough for a white label, and ink
12
+ // mixed from them fell under 4.5:1 (Meridian dark destructive, 3.8:1).
13
+ soft: {
14
+ neutral: "bg-secondary text-secondary-foreground",
15
+ standard: "bg-tone-standard/15 text-[color-mix(in_oklch,var(--tone-standard)_75%,var(--foreground))]",
16
+ collectible: "bg-tone-collectible/15 text-[color-mix(in_oklch,var(--tone-collectible)_75%,var(--foreground))]",
17
+ edition: "bg-tone-edition/15 text-[color-mix(in_oklch,var(--tone-edition)_75%,var(--foreground))]",
18
+ info: "bg-tone-info/15 text-[color-mix(in_oklch,var(--tone-info-text)_75%,var(--foreground))]",
19
+ success: "bg-success/15 text-[color-mix(in_oklch,var(--success-text)_75%,var(--foreground))]",
20
+ warning: "bg-tone-warning/15 text-[color-mix(in_oklch,var(--tone-warning-text)_75%,var(--foreground))]",
21
+ destructive: "bg-destructive/15 text-[color-mix(in_oklch,var(--destructive-text)_75%,var(--foreground))]"
22
+ },
23
+ outline: {
24
+ neutral: "border border-border text-foreground",
25
+ standard: "border border-tone-standard/50 text-tone-standard",
26
+ collectible: "border border-tone-collectible/50 text-tone-collectible",
27
+ edition: "border border-tone-edition/50 text-tone-edition",
28
+ info: "border border-tone-info/50 text-tone-info",
29
+ success: "border border-success/50 text-success",
30
+ warning: "border border-tone-warning/50 text-tone-warning",
31
+ destructive: "border border-destructive/50 text-destructive"
32
+ },
33
+ solid: {
34
+ neutral: "bg-foreground text-background",
35
+ standard: "bg-tone-standard text-tone-standard-foreground",
36
+ collectible: "bg-tone-collectible text-tone-collectible-foreground",
37
+ edition: "bg-tone-edition text-tone-edition-foreground",
38
+ info: "bg-tone-info text-tone-info-foreground",
39
+ success: "bg-success text-success-foreground",
40
+ warning: "bg-tone-warning text-tone-warning-foreground",
41
+ destructive: "bg-destructive text-destructive-foreground"
42
+ },
43
+ overlay: {
44
+ neutral: "bg-overlay/85 text-overlay-foreground",
45
+ standard: "bg-tone-standard text-tone-standard-foreground",
46
+ collectible: "bg-tone-collectible text-tone-collectible-foreground",
47
+ edition: "bg-tone-edition text-tone-edition-foreground",
48
+ info: "bg-tone-info text-tone-info-foreground",
49
+ success: "bg-success text-success-foreground",
50
+ warning: "bg-tone-warning text-tone-warning-foreground",
51
+ destructive: "bg-destructive text-destructive-foreground"
52
+ },
53
+ plain: {
54
+ neutral: "text-muted-foreground",
55
+ standard: "text-foreground",
56
+ collectible: "text-foreground",
57
+ edition: "text-foreground",
58
+ info: "text-foreground",
59
+ success: "text-foreground",
60
+ warning: "text-foreground",
61
+ destructive: "text-destructive"
62
+ }
63
+ };
64
+ var badgeVariants = cva(
65
+ "sable-optical-pad [--sable-optical-pad:0.6em] inline-flex w-fit items-center whitespace-nowrap rounded-full",
66
+ {
67
+ variants: {
68
+ // Every drawn appearance carries a 1px border — transparent unless it is
69
+ // the outline — so soft, solid and outline badges are one height in a
70
+ // mixed row (outline alone was a pixel taller).
71
+ appearance: {
72
+ soft: "gap-1 border border-transparent",
73
+ outline: "gap-1",
74
+ solid: "gap-1 border border-transparent",
75
+ overlay: "gap-1 border border-transparent",
76
+ plain: "gap-1.5"
77
+ },
78
+ tone: { neutral: "", standard: "", collectible: "", edition: "", info: "", success: "", warning: "", destructive: "" },
79
+ size: {
80
+ sm: "text-label-sm",
81
+ md: "text-label-md"
82
+ }
83
+ },
84
+ compoundVariants: [
85
+ ...BADGE_APPEARANCES.flatMap(
86
+ (appearance) => BADGE_TONES.map((tone) => ({ appearance, tone, className: MATRIX[appearance][tone] }))
87
+ ),
88
+ // Padding belongs to the drawn appearances; a plain status line has none.
89
+ { appearance: ["soft", "outline", "solid", "overlay"], size: "sm", className: "px-2 pt-[0.2em] pb-[0.08em]" },
90
+ { appearance: ["soft", "outline", "solid", "overlay"], size: "md", className: "px-2.5 pt-[0.23em] pb-[0.1em]" }
91
+ ],
92
+ defaultVariants: {
93
+ appearance: "soft",
94
+ tone: "neutral",
95
+ size: "md"
96
+ }
97
+ }
98
+ );
99
+ export {
100
+ BADGE_APPEARANCES,
101
+ BADGE_TONES,
102
+ badgeVariants
103
+ };
@@ -0,0 +1,11 @@
1
+ // src/components/badge/index.ts
2
+ import { Badge } from "./badge.js";
3
+ import { BADGE_APPEARANCES, BADGE_TONES, badgeVariants } from "./badge.variants.js";
4
+ import { badgeMeta } from "./badge.meta.js";
5
+ export {
6
+ BADGE_APPEARANCES,
7
+ BADGE_TONES,
8
+ Badge,
9
+ badgeMeta,
10
+ badgeVariants
11
+ };
@@ -0,0 +1,76 @@
1
+ "use client";
2
+
3
+ // src/components/banner/banner.tsx
4
+ import { useState } from "react";
5
+ import { Icon } from "../../icon/index.js";
6
+ import { Badge } from "../badge/index.js";
7
+ import { Button } from "../button/button.js";
8
+ import { cn } from "../../lib/cn.js";
9
+ import { bannerVariants } from "./banner.variants.js";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ function Banner({
12
+ tone,
13
+ appearance,
14
+ label,
15
+ action,
16
+ dismissible,
17
+ onDismiss,
18
+ sticky,
19
+ live = "off",
20
+ className,
21
+ children,
22
+ ...props
23
+ }) {
24
+ const [visible, setVisible] = useState(true);
25
+ if (!visible) {
26
+ return null;
27
+ }
28
+ function handleDismiss() {
29
+ setVisible(false);
30
+ onDismiss?.();
31
+ }
32
+ const split = action != null;
33
+ const labelAppearance = appearance === "solid" && (tone ?? "neutral") !== "neutral" ? "overlay" : "soft";
34
+ const dismissButton = dismissible ? /* @__PURE__ */ jsx(Button, { variant: "on-color-ghost", size: "icon-xs", "aria-label": "Dismiss", onClick: handleDismiss, className: "shrink-0", children: /* @__PURE__ */ jsx(Icon, { name: "xmark" }) }) : null;
35
+ const a11yProps = live === "off" ? { role: "region", "aria-label": "Announcement" } : { role: live === "assertive" ? "alert" : "status" };
36
+ return /* @__PURE__ */ jsxs(
37
+ "div",
38
+ {
39
+ ...a11yProps,
40
+ className: cn(
41
+ bannerVariants({ tone, appearance }),
42
+ split ? "justify-between" : "justify-center",
43
+ sticky && "sticky top-0 z-(--z-sticky)",
44
+ // A centred message with a floating dismiss reserves the button's
45
+ // width on BOTH sides: the end so long text never runs under the ×,
46
+ // the start so the message stays optically centred.
47
+ dismissible && !split && "px-[calc(var(--control-xs)+--spacing(4))]",
48
+ className
49
+ ),
50
+ ...props,
51
+ children: [
52
+ /* @__PURE__ */ jsxs(
53
+ "div",
54
+ {
55
+ className: cn(
56
+ "flex items-center gap-3",
57
+ split ? "min-w-0 flex-1" : "justify-center"
58
+ ),
59
+ children: [
60
+ label != null ? /* @__PURE__ */ jsx(Badge, { size: "sm", appearance: labelAppearance, className: "shrink-0", children: label }) : null,
61
+ children
62
+ ]
63
+ }
64
+ ),
65
+ split ? /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
66
+ action,
67
+ dismissButton
68
+ ] }) : dismissButton ? /* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 end-2 flex items-center", children: dismissButton }) : null
69
+ ]
70
+ }
71
+ );
72
+ }
73
+ Banner.displayName = "Banner";
74
+ export {
75
+ Banner
76
+ };
@@ -0,0 +1,172 @@
1
+ // src/components/banner/banner.meta.ts
2
+ var bannerMeta = {
3
+ name: "Banner",
4
+ summary: "Full-width, page-level announcement bar. A tone (neutral, info, success, warning, edition, destructive) \xD7 an appearance (soft tint or loud solid fill), and an optional leading scope label. Centers its message, or \u2014 with a trailing action \u2014 switches to a leading-text + trailing-button layout. Optionally sticky and dismissible.",
5
+ keywords: [
6
+ "banner",
7
+ "announcement",
8
+ "alert",
9
+ "status",
10
+ "message",
11
+ "warning",
12
+ "success",
13
+ "offline",
14
+ "sticky"
15
+ ],
16
+ usage: {
17
+ description: "Use Banner for page-level or app-level messages that affect the current experience: outages, maintenance, success confirmations, policy notices, or major warnings. Prefer Toast for transient feedback from a specific action, and prefer InlineStatus for local row or form state.",
18
+ bestPractices: [
19
+ {
20
+ guidance: "do",
21
+ description: "Use soft appearance for contextual notices and solid appearance for urgent, blocking, or system-wide states."
22
+ },
23
+ {
24
+ guidance: "do",
25
+ description: "Set live='polite' or live='assertive' only when the banner appears or changes dynamically."
26
+ },
27
+ {
28
+ guidance: "do",
29
+ description: "Include one clear action when the user can resolve or inspect the state."
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: "Use multiple stacked solid banners unless the page is genuinely blocked by multiple independent states."
34
+ },
35
+ {
36
+ guidance: "dont",
37
+ description: "Use Banner for field-level validation, row status, or small local hints; use Field, InlineStatus, or Badge instead."
38
+ },
39
+ {
40
+ guidance: "dont",
41
+ description: "Use Banner inside a dialog, a form, or a section to qualify the content around it \u2014 that is Note. Banner is a full-width announcement strip for page- or app-level state, so in a modal it reads as a slab heavier than the fields it warns about, and its soft appearance has no border and no tone-colored icon: the severity survives only as a faint wash."
42
+ }
43
+ ],
44
+ anatomy: [
45
+ {
46
+ name: "Message",
47
+ required: true,
48
+ description: "The short announcement text. It should explain the state in plain language."
49
+ },
50
+ {
51
+ name: "Action",
52
+ required: false,
53
+ description: "Optional trailing action that changes the layout from centered copy to text plus action."
54
+ },
55
+ {
56
+ name: "Dismiss",
57
+ required: false,
58
+ description: "Optional close control for notices the user can safely hide."
59
+ }
60
+ ]
61
+ },
62
+ related: {
63
+ components: ["Note", "AppShell", "Toast", "InlineStatus", "EmptyState", "Button"],
64
+ patterns: ["DashboardPage"]
65
+ },
66
+ status: "stable",
67
+ props: [
68
+ {
69
+ name: "tone",
70
+ type: '"neutral" | "info" | "success" | "warning" | "edition" | "destructive"',
71
+ default: '"neutral"',
72
+ description: "Neutral surface or a tone that encodes the announcement's intent (info / success / warning / edition / destructive)."
73
+ },
74
+ {
75
+ name: "appearance",
76
+ type: '"soft" | "solid"',
77
+ default: '"soft"',
78
+ description: `"soft" is a quiet tinted fill; "solid" is the full tone with its paired ink \u2014 for loud, can't-miss states (offline, chain-down, RPC errors).`
79
+ },
80
+ {
81
+ name: "label",
82
+ type: "ReactNode",
83
+ description: 'A short scope label ("Preview", "Staging", a project name) in a leading chip \u2014 a Badge that reads on soft and solid fills.'
84
+ },
85
+ {
86
+ name: "action",
87
+ type: "ReactNode",
88
+ description: "A trailing action (e.g. a Button). Switches the bar to leading text + trailing action instead of centered text."
89
+ },
90
+ {
91
+ name: "sticky",
92
+ type: "boolean",
93
+ default: "false",
94
+ description: "Stick the banner to the top of its scroll container (sticky top-0, z-30)."
95
+ },
96
+ {
97
+ name: "live",
98
+ type: '"off" | "polite" | "assertive"',
99
+ default: '"off"',
100
+ description: 'ARIA live-region politeness for banners shown/updated at runtime (offline, RPC-down, "N new posts"). "polite" \u2192 role=status; "assertive" \u2192 role=alert. "off" keeps a static labelled region.'
101
+ },
102
+ {
103
+ name: "dismissible",
104
+ type: "boolean",
105
+ default: "false",
106
+ description: "Render a trailing close button that hides the banner when clicked."
107
+ },
108
+ {
109
+ name: "onDismiss",
110
+ type: "() => void",
111
+ description: "Called after the banner is dismissed."
112
+ }
113
+ ],
114
+ variants: {
115
+ tone: ["neutral", "info", "success", "warning", "edition", "destructive"],
116
+ appearance: ["soft", "solid"]
117
+ },
118
+ tokensUsed: [
119
+ "secondary",
120
+ "secondary-foreground",
121
+ "foreground",
122
+ "background",
123
+ "tone-info",
124
+ "tone-info-foreground",
125
+ "success",
126
+ "success-foreground",
127
+ "tone-warning",
128
+ "tone-warning-foreground",
129
+ "tone-edition",
130
+ "tone-edition-foreground",
131
+ "destructive",
132
+ "destructive-foreground"
133
+ ],
134
+ a11y: [
135
+ "Static banners render as a labelled region (role=region); set `live` to announce dynamic status bars (role=status / role=alert) when they appear or change.",
136
+ "The dismiss control is Button (on-color-ghost, icon-xs) with an aria-label; it takes the bar's own ink, so its glyph and focus ring stay legible on soft and solid fills alike.",
137
+ "Solid fills pair each tone with its theme-adaptive ink token, so text stays legible in light and dark."
138
+ ],
139
+ examples: [
140
+ {
141
+ label: "Tones",
142
+ code: '<Banner tone="info">Maintenance window tonight at 02:00 UTC.</Banner>'
143
+ },
144
+ {
145
+ label: "Solid (loud)",
146
+ code: '<Banner tone="destructive" appearance="solid" live="assertive">Blockchain unavailable. Collect and buy are temporarily disabled.</Banner>'
147
+ },
148
+ {
149
+ label: "Success",
150
+ code: '<Banner tone="success" live="polite">Credits authorized for Studio.</Banner>'
151
+ },
152
+ {
153
+ label: "Action",
154
+ code: '<Banner sticky action={<Button variant="outline" size="sm">Refresh</Button>}>12 new posts</Banner>'
155
+ },
156
+ {
157
+ label: "Dismissible",
158
+ code: '<Banner tone="warning" dismissible>Your session expires soon.</Banner>'
159
+ },
160
+ {
161
+ label: "Recoverable warning",
162
+ code: '<Banner tone="warning" action={<Button variant="outline" size="sm">Reconnect</Button>}>Wallet connection paused.</Banner>'
163
+ },
164
+ {
165
+ label: "App-shell outage",
166
+ code: '<AppShell banners={<Banner tone="destructive" appearance="solid" live="assertive">Uploads are temporarily unavailable.</Banner>}><Region max="feed"><EmptyState title="Uploads paused" description="Existing posts are still visible while the service recovers." /></Region></AppShell>'
167
+ }
168
+ ]
169
+ };
170
+ export {
171
+ bannerMeta
172
+ };
@@ -0,0 +1,44 @@
1
+ // src/components/banner/banner.variants.ts
2
+ import { cva } from "class-variance-authority";
3
+ var bannerVariants = cva(
4
+ "relative flex min-h-(--control-md) w-full items-center gap-3 px-4 py-2 text-label-md",
5
+ {
6
+ variants: {
7
+ tone: {
8
+ neutral: "",
9
+ info: "",
10
+ success: "",
11
+ warning: "",
12
+ edition: "",
13
+ destructive: ""
14
+ },
15
+ appearance: {
16
+ soft: "",
17
+ solid: ""
18
+ }
19
+ },
20
+ compoundVariants: [
21
+ // Soft — a quiet tint of the tone (the default announcement look).
22
+ { tone: "neutral", appearance: "soft", class: "bg-secondary text-secondary-foreground" },
23
+ { tone: "info", appearance: "soft", class: "bg-tone-info/15 text-foreground" },
24
+ { tone: "success", appearance: "soft", class: "bg-success/15 text-foreground" },
25
+ { tone: "warning", appearance: "soft", class: "bg-tone-warning/15 text-foreground" },
26
+ { tone: "edition", appearance: "soft", class: "bg-tone-edition/15 text-foreground" },
27
+ { tone: "destructive", appearance: "soft", class: "bg-destructive/15 text-foreground" },
28
+ // Solid — the full tone fill with its paired ink, for loud states.
29
+ { tone: "neutral", appearance: "solid", class: "bg-foreground text-background" },
30
+ { tone: "info", appearance: "solid", class: "bg-tone-info text-tone-info-foreground" },
31
+ { tone: "success", appearance: "solid", class: "bg-success text-success-foreground" },
32
+ { tone: "warning", appearance: "solid", class: "bg-tone-warning text-tone-warning-foreground" },
33
+ { tone: "edition", appearance: "solid", class: "bg-tone-edition text-tone-edition-foreground" },
34
+ { tone: "destructive", appearance: "solid", class: "bg-destructive text-destructive-foreground" }
35
+ ],
36
+ defaultVariants: {
37
+ tone: "neutral",
38
+ appearance: "soft"
39
+ }
40
+ }
41
+ );
42
+ export {
43
+ bannerVariants
44
+ };
@@ -0,0 +1,9 @@
1
+ // src/components/banner/index.ts
2
+ import { Banner } from "./banner.js";
3
+ import { bannerVariants } from "./banner.variants.js";
4
+ import { bannerMeta } from "./banner.meta.js";
5
+ export {
6
+ Banner,
7
+ bannerMeta,
8
+ bannerVariants
9
+ };
@@ -0,0 +1,10 @@
1
+ // src/components/bar-chart/bar-chart.tsx
2
+ import { CartesianChart } from "../../lib/chart/cartesian.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ function BarChart(props) {
5
+ return /* @__PURE__ */ jsx(CartesianChart, { kind: "bar", ...props });
6
+ }
7
+ BarChart.displayName = "BarChart";
8
+ export {
9
+ BarChart
10
+ };