@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,21 @@
1
+ // src/blocks/stat-row-block.meta.ts
2
+ var statRowBlockMeta = {
3
+ name: "StatRowBlock",
4
+ family: "Dashboard",
5
+ kind: "section",
6
+ summary: "A KPI row: four stat cards, each a label, the value in the metric mono tier, and a trend Badge with its comparison note \u2014 2 \xD7 2 on a phone, one row from xl.",
7
+ intent: "Reach for this at the top of a dashboard or report, above the tables and charts it summarises. One headline number worth splitting into categories is RevenueBreakdownBlock.",
8
+ notes: [
9
+ "Copied from the DashboardPage page shell's stat row.",
10
+ "Values are `text-mono-xl` \u2014 tabular figures, never a heading tier \u2014 so the four numbers align digit for digit.",
11
+ "The trend Badge sits with its note in CardContent, so the value keeps the full card width when the row folds to 2 \xD7 2.",
12
+ "Keep it to four. A fifth stat is a sign one of them belongs in a table."
13
+ ],
14
+ a11y: [
15
+ "The trend is stated in text (+8.2%) with an arrow icon; the tone is reinforcement, not the signal.",
16
+ "Each card's label is read before its value, in source order."
17
+ ]
18
+ };
19
+ export {
20
+ statRowBlockMeta
21
+ };
@@ -0,0 +1,37 @@
1
+ // src/blocks/steps-block.tsx
2
+ import { useId } from "react";
3
+ import { Button } from "../components/button/index.js";
4
+ import { Icon } from "../icon/index.js";
5
+ import { cn } from "../lib/cn.js";
6
+ import { Region, Stack } from "../layout/index.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var intro = {
9
+ eyebrow: "How it works",
10
+ title: "From request to sealed record.",
11
+ lede: "Teams are usually live within a week. Cove adapts to the routes you already run instead of asking you to start over.",
12
+ link: { label: "Read the rollout guide", href: "/guides/rollout" }
13
+ };
14
+ var steps = [
15
+ { title: "Connect your spaces", body: "Bring teams, vendors, and record stores into one workspace, with roles that mirror how you already work." },
16
+ { title: "Route every approval", body: "Requests follow the path you define, with reviewers, deadlines, and escalation built in from the start." },
17
+ { title: "Seal the record", body: "Approved work is archived with its full context and is ready for review the moment it closes." }
18
+ ];
19
+ function StepsBlock({ className }) {
20
+ const titleId = useId();
21
+ return /* @__PURE__ */ jsx(Region, { as: "section", "aria-labelledby": titleId, max: "wide", className: cn("w-full py-16 sm:py-24", className), children: /* @__PURE__ */ jsxs("div", { className: "grid gap-12 lg:grid-cols-[1fr_2fr] lg:gap-16", children: [
22
+ /* @__PURE__ */ jsxs(Stack, { gap: 2, className: "max-w-md", children: [
23
+ /* @__PURE__ */ jsx("p", { className: "text-overline text-muted-foreground", children: intro.eyebrow }),
24
+ /* @__PURE__ */ jsx("h2", { id: titleId, className: "text-balance text-heading-1", children: intro.title }),
25
+ /* @__PURE__ */ jsx("p", { className: "text-body-md text-muted-foreground", children: intro.lede }),
26
+ /* @__PURE__ */ jsx("div", { className: "pt-3", children: /* @__PURE__ */ jsx(Button, { variant: "outline", iconEnd: /* @__PURE__ */ jsx(Icon, { name: "arrow-right" }), render: /* @__PURE__ */ jsx("a", { href: intro.link.href }), children: intro.link.label }) })
27
+ ] }),
28
+ /* @__PURE__ */ jsx("ol", { className: "grid gap-10 sm:grid-cols-3 sm:gap-6", children: steps.map((step, index) => /* @__PURE__ */ jsxs("li", { className: "flex flex-col gap-2 border-t border-border-strong pt-6", children: [
29
+ /* @__PURE__ */ jsx("span", { className: "text-mono-sm text-muted-foreground", children: String(index + 1).padStart(2, "0") }),
30
+ /* @__PURE__ */ jsx("h3", { className: "mt-3 text-title-lg sm:mt-6", children: step.title }),
31
+ /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: step.body })
32
+ ] }, step.title)) })
33
+ ] }) });
34
+ }
35
+ export {
36
+ StepsBlock
37
+ };
@@ -0,0 +1,20 @@
1
+ // src/blocks/steps-block.meta.ts
2
+ var stepsBlockMeta = {
3
+ name: "StepsBlock",
4
+ family: "Marketing",
5
+ kind: "section",
6
+ summary: "A how-it-works section: the heading, lede and a guide link on the left; three numbered steps on the right, each under a strong rule.",
7
+ intent: "Reach for this when the pitch is a sequence \u2014 onboarding, a workflow, a setup. Parallel benefits with no order are FeatureGridBlock; progress through a live process is a Stepper.",
8
+ notes: [
9
+ "Copied from the BrandLandingPage page shell's how-it-works section.",
10
+ "The steps are an <ol>, so the order is semantic and the 01 / 02 / 03 numbers are its visual echo, set in the mono tier.",
11
+ "Three steps fit the 1 : 2 split on desktop; on a phone everything stacks with the intro first."
12
+ ],
13
+ a11y: [
14
+ "Each step has an h3 under the section's h2.",
15
+ "The guide link is an <a> styled as an outline Button, because it navigates."
16
+ ]
17
+ };
18
+ export {
19
+ stepsBlockMeta
20
+ };
@@ -0,0 +1,52 @@
1
+ // src/blocks/task-list-block.tsx
2
+ import { useId, useState } from "react";
3
+ import { Badge } from "../components/badge/index.js";
4
+ import { Button } from "../components/button/index.js";
5
+ import { Card, CardAction, CardContent, CardFooter, CardHeader, CardTitle } from "../components/card/index.js";
6
+ import { Checkbox } from "../components/checkbox/index.js";
7
+ import { Label } from "../components/label/index.js";
8
+ import { Icon } from "../icon/index.js";
9
+ import { cn } from "../lib/cn.js";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ var tasks = [
12
+ { title: "Pick the cover type", tag: "Design", tone: "collectible", done: true },
13
+ { title: "Wire up checkout", tag: "Engineering", tone: "info", done: false },
14
+ { title: "Draft launch post", tag: "Launch", tone: "edition", done: false }
15
+ ];
16
+ function TaskListBlock({ className, framed = true, onAddTask }) {
17
+ const [done, setDone] = useState(tasks.map((t) => t.done));
18
+ const id = useId();
19
+ const left = done.filter((d) => !d).length;
20
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-xs", className), children: [
21
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
22
+ /* @__PURE__ */ jsx(CardTitle, { children: "This week" }),
23
+ /* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsxs("span", { className: "text-caption text-muted-foreground", children: [
24
+ left,
25
+ " left"
26
+ ] }) })
27
+ ] }),
28
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-1", children: tasks.map((task, i) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-3 py-1.5", children: [
29
+ /* @__PURE__ */ jsx(
30
+ Checkbox,
31
+ {
32
+ id: `${id}-${i}`,
33
+ checked: done[i],
34
+ onCheckedChange: (v) => setDone(done.map((d, j) => j === i ? v : d))
35
+ }
36
+ ),
37
+ /* @__PURE__ */ jsx(
38
+ Label,
39
+ {
40
+ htmlFor: `${id}-${i}`,
41
+ className: cn("min-w-0 flex-1 motion-interactive", done[i] && "text-muted-foreground line-through"),
42
+ children: task.title
43
+ }
44
+ ),
45
+ /* @__PURE__ */ jsx(Badge, { tone: task.tone, size: "sm", children: task.tag })
46
+ ] }, task.title)) }) }),
47
+ /* @__PURE__ */ jsx(CardFooter, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", bleed: "start", iconStart: /* @__PURE__ */ jsx(Icon, { name: "plus" }), onClick: onAddTask, children: "Add task" }) })
48
+ ] });
49
+ }
50
+ export {
51
+ TaskListBlock
52
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/task-list-block.meta.ts
2
+ var taskListBlockMeta = {
3
+ name: "TaskListBlock",
4
+ family: "Dashboard",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "A checklist card: a titled list of Checkbox rows with a category Badge each, a live count of what is left, and a quiet Add task action.",
8
+ intent: "Reach for this for a short, personal to-do list on a dashboard or in onboarding. A team's task board with assignees and status columns needs a Table or DataTable.",
9
+ notes: [
10
+ "Finishing a task strikes it through and mutes it rather than removing it, so the list does not jump under the pointer.",
11
+ "The count in CardAction updates with every check, so progress reads without counting rows.",
12
+ "Add task is a ghost Button in the footer \u2014 present, but quieter than the list."
13
+ ],
14
+ a11y: [
15
+ "Every Checkbox has a real <Label htmlFor>, so the whole title is the click target and the accessible name.",
16
+ "Category Badges carry text; the tone only groups them visually."
17
+ ]
18
+ };
19
+ export {
20
+ taskListBlockMeta
21
+ };
@@ -0,0 +1,49 @@
1
+ // src/blocks/team-members-block.tsx
2
+ import { Avatar } from "../components/avatar/index.js";
3
+ import { Badge } from "../components/badge/index.js";
4
+ import { Button } from "../components/button/index.js";
5
+ import { Card, CardAction, CardDescription, CardHeader, CardList, CardTitle } from "../components/card/index.js";
6
+ import { OverflowMenu } from "../components/overflow-menu/index.js";
7
+ import { Entity } from "../components/entity/index.js";
8
+ import { MenuItem, MenuSeparator } from "../components/menu/index.js";
9
+ import { Icon } from "../icon/index.js";
10
+ import { cn } from "../lib/cn.js";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ var members = [
13
+ { id: "u1", name: "Ada Lovelace", initials: "AL", email: "ada@studio.com", role: "Owner" },
14
+ { id: "u2", name: "Mara Okafor", initials: "MO", email: "mara@studio.com", role: "Admin" },
15
+ { id: "u3", name: "Sam Rivera", initials: "SR", email: "sam@studio.com", role: "Member" },
16
+ { id: "u4", name: "jun@studio.com", initials: "J", email: "Invited 2 days ago", role: "Pending" }
17
+ ];
18
+ function TeamMembersBlock({ className, framed = true, onInvite, onMemberAction }) {
19
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-2xl", className), children: [
20
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
21
+ /* @__PURE__ */ jsx(CardTitle, { render: /* @__PURE__ */ jsx("h2", {}), children: "Members" }),
22
+ /* @__PURE__ */ jsxs(CardDescription, { children: [
23
+ members.length,
24
+ " people in this workspace."
25
+ ] }),
26
+ /* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx(Button, { size: "sm", iconStart: /* @__PURE__ */ jsx(Icon, { name: "plus" }), onClick: onInvite, children: "Invite" }) })
27
+ ] }),
28
+ /* @__PURE__ */ jsx(CardList, { children: members.map((m) => /* @__PURE__ */ jsx(
29
+ Entity,
30
+ {
31
+ leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", size: "sm", fallback: m.initials, alt: m.name }),
32
+ title: m.name,
33
+ subtitle: m.email,
34
+ action: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
35
+ /* @__PURE__ */ jsx(Badge, { appearance: m.role === "Pending" ? "outline" : "plain", tone: m.role === "Owner" ? "edition" : "neutral", size: "sm", children: m.role }),
36
+ m.role === "Owner" ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "size-(--control-sm)" }) : /* @__PURE__ */ jsxs(OverflowMenu, { label: `Manage ${m.name}`, size: "icon-sm", children: [
37
+ m.role === "Pending" ? /* @__PURE__ */ jsx(MenuItem, { onClick: () => onMemberAction?.(m.id, "resend"), children: "Resend invite" }) : m.role === "Admin" ? /* @__PURE__ */ jsx(MenuItem, { onClick: () => onMemberAction?.(m.id, "make-member"), children: "Make member" }) : /* @__PURE__ */ jsx(MenuItem, { onClick: () => onMemberAction?.(m.id, "make-admin"), children: "Make admin" }),
38
+ /* @__PURE__ */ jsx(MenuSeparator, {}),
39
+ /* @__PURE__ */ jsx(MenuItem, { variant: "destructive", onClick: () => onMemberAction?.(m.id, "remove"), children: m.role === "Pending" ? "Cancel invite" : "Remove from workspace" })
40
+ ] })
41
+ ] })
42
+ },
43
+ m.id
44
+ )) })
45
+ ] });
46
+ }
47
+ export {
48
+ TeamMembersBlock
49
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/team-members-block.meta.ts
2
+ var teamMembersBlockMeta = {
3
+ name: "TeamMembersBlock",
4
+ family: "Settings & team",
5
+ kind: "card",
6
+ width: { min: "20rem", max: "42rem" },
7
+ summary: "A members card: Entity rows with avatar, name and email, a role Badge, and an OverflowMenu of role changes and removal; pending invites sit in the same list.",
8
+ intent: "Reach for this to manage who is in a workspace, project or team. For inviting people when the list is empty or short, InviteTeamBlock is the lighter shape; for hundreds of members with filters, use a DataTable.",
9
+ notes: [
10
+ "Each row's menu offers only what applies to it: Make admin or Make member, Resend invite for pending rows, then the destructive action after a separator.",
11
+ "The owner has no menu \u2014 ownership is transferred elsewhere \u2014 and a control-sized spacer keeps the role badges aligned.",
12
+ "Pending invites are outline Badges in the same list, so the team's full size reads in one place."
13
+ ],
14
+ a11y: [
15
+ `Each OverflowMenu is labelled with the member's name ("Manage Mara Okafor"), so the triggers are distinguishable in a list.`,
16
+ "Roles are text in a Badge; tone only distinguishes the owner."
17
+ ]
18
+ };
19
+ export {
20
+ teamMembersBlockMeta
21
+ };
@@ -0,0 +1,49 @@
1
+ // src/blocks/testimonial-block.tsx
2
+ import { Avatar } from "../components/avatar/index.js";
3
+ import { Card, CardContent } from "../components/card/index.js";
4
+ import { Separator } from "../components/separator/index.js";
5
+ import { cn } from "../lib/cn.js";
6
+ import { Region, Stack } from "../layout/index.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var story = {
9
+ quote: "We used to chase approvals across four tools. Now every request has an owner, a deadline, and a record, and our auditors stopped asking for screenshots.",
10
+ name: "Maya Okafor",
11
+ initials: "MO",
12
+ role: "Head of operations, Fielddesk"
13
+ };
14
+ var outcomes = [
15
+ { value: "3.2\xD7", label: "faster approvals in the first quarter" },
16
+ { value: "68%", label: "fewer follow-ups on handoffs" },
17
+ { value: "1 day", label: "to prepare a quarterly audit" }
18
+ ];
19
+ function TestimonialBlock({ className }) {
20
+ return /* @__PURE__ */ jsx(Region, { as: "section", "aria-label": "Customer story", max: "wide", className: cn("w-full py-16", className), children: /* @__PURE__ */ jsx(Card, { render: /* @__PURE__ */ jsx("figure", {}), children: /* @__PURE__ */ jsxs("div", { className: "grid lg:grid-cols-[1.5fr_1fr]", children: [
21
+ /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col justify-between gap-10 sm:p-10", children: [
22
+ /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
23
+ /* @__PURE__ */ jsx("p", { className: "text-overline text-muted-foreground", children: "Customer story" }),
24
+ /* @__PURE__ */ jsxs("blockquote", { className: "text-balance text-heading-3 sm:text-heading-2", children: [
25
+ "\u201C",
26
+ story.quote,
27
+ "\u201D"
28
+ ] })
29
+ ] }),
30
+ /* @__PURE__ */ jsxs("figcaption", { className: "flex items-center gap-3", children: [
31
+ /* @__PURE__ */ jsx(Avatar, { variant: "art", size: "lg", fallback: story.initials, alt: story.name }),
32
+ /* @__PURE__ */ jsxs("div", { children: [
33
+ /* @__PURE__ */ jsx("p", { className: "text-title-sm", children: story.name }),
34
+ /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: story.role })
35
+ ] })
36
+ ] })
37
+ ] }),
38
+ /* @__PURE__ */ jsx("div", { className: "border-border max-lg:border-t lg:border-s", children: /* @__PURE__ */ jsx(CardContent, { className: "flex h-full flex-col justify-center gap-6 sm:p-10", children: outcomes.map((outcome, index) => /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
39
+ index > 0 && /* @__PURE__ */ jsx(Separator, {}),
40
+ /* @__PURE__ */ jsxs("div", { children: [
41
+ /* @__PURE__ */ jsx("p", { className: "text-heading-1 sm:text-display-lg", children: outcome.value }),
42
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-body-sm text-muted-foreground", children: outcome.label })
43
+ ] })
44
+ ] }, outcome.label)) }) })
45
+ ] }) }) });
46
+ }
47
+ export {
48
+ TestimonialBlock
49
+ };
@@ -0,0 +1,20 @@
1
+ // src/blocks/testimonial-block.meta.ts
2
+ var testimonialBlockMeta = {
3
+ name: "TestimonialBlock",
4
+ family: "Marketing",
5
+ kind: "section",
6
+ summary: "A customer story: one large blockquote with the person's avatar, name and role, beside three outcome figures separated by rules.",
7
+ intent: "Reach for this for one strong, attributable quote backed by numbers. A wall of short quotes is a different section; a logo row is Marquee.",
8
+ notes: [
9
+ "Copied from the BrandLandingPage page shell's customer story.",
10
+ "The quote and the outcomes share one Card as a <figure>; the outcomes move under the quote below lg.",
11
+ "Outcome values use display sizes because they are the proof; their labels say what each number counts."
12
+ ],
13
+ a11y: [
14
+ "<figure> + <blockquote> + <figcaption> tie the quote to the person who said it.",
15
+ 'The section is labelled "Customer story" so it is reachable as a landmark.'
16
+ ]
17
+ };
18
+ export {
19
+ testimonialBlockMeta
20
+ };
@@ -0,0 +1,39 @@
1
+ // src/blocks/traffic-sources-block.tsx
2
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "../components/card/index.js";
3
+ import { PieChart } from "../components/pie-chart/index.js";
4
+ import { cn } from "../lib/cn.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ var sources = [
7
+ { source: "Search", visitors: 4280 },
8
+ { source: "Direct", visitors: 2910 },
9
+ { source: "Social", visitors: 1840 },
10
+ { source: "Email", visitors: 960 }
11
+ ];
12
+ var total = sources.reduce((sum, s) => sum + s.visitors, 0);
13
+ function TrafficSourcesBlock({ className, framed = true }) {
14
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-sm", className), children: [
15
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
16
+ /* @__PURE__ */ jsx(CardTitle, { render: /* @__PURE__ */ jsx("h2", {}), children: "Traffic sources" }),
17
+ /* @__PURE__ */ jsx(CardDescription, { children: "Where this month's visitors came from." })
18
+ ] }),
19
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(
20
+ PieChart,
21
+ {
22
+ label: "Visitors by source, this month",
23
+ data: sources,
24
+ index: "source",
25
+ valueKey: "visitors",
26
+ donut: true,
27
+ centerLabel: { value: total, label: "Visitors" }
28
+ }
29
+ ) }),
30
+ /* @__PURE__ */ jsxs(CardFooter, { className: "text-body-sm text-muted-foreground", children: [
31
+ "Search brings ",
32
+ Math.round(sources[0].visitors / total * 100),
33
+ "% of visitors."
34
+ ] })
35
+ ] });
36
+ }
37
+ export {
38
+ TrafficSourcesBlock
39
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/traffic-sources-block.meta.ts
2
+ var trafficSourcesBlockMeta = {
3
+ name: "TrafficSourcesBlock",
4
+ family: "Dashboard",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "24rem" },
7
+ summary: "A share card: a donut PieChart of where a total comes from, the total in the hole, a legend, and the headline share in words in the footer.",
8
+ intent: "Reach for this for a split of one total into four or fewer parts \u2014 traffic sources, revenue by plan, tickets by channel. More parts, or values to compare exactly, belong in a horizontal BarChart.",
9
+ notes: [
10
+ `The total sits in the donut's hole, so the card answers "how many" and "from where" at once.`,
11
+ "The footer puts the biggest share in a sentence \u2014 the takeaway does not depend on reading the slices.",
12
+ "The slices sweep in clockwise as the card scrolls into view."
13
+ ],
14
+ a11y: [
15
+ "The chart's data table lists every source and its count; the legend repeats it visually.",
16
+ "Hovering or arrowing through the slices pulls each out and announces it."
17
+ ]
18
+ };
19
+ export {
20
+ trafficSourcesBlockMeta
21
+ };
@@ -0,0 +1,61 @@
1
+ // src/blocks/traffic-trend-block.tsx
2
+ import { useState } from "react";
3
+ import { AreaChart } from "../components/area-chart/index.js";
4
+ import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "../components/card/index.js";
5
+ import { Toggle, ToggleGroup } from "../components/toggle/index.js";
6
+ import { Icon } from "../icon/index.js";
7
+ import { cn } from "../lib/cn.js";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ var days = Array.from({ length: 90 }, (_, i) => {
10
+ const wave = Math.sin(i / 6) * 60 + Math.sin(i / 2.3) * 25;
11
+ return {
12
+ date: new Date(2026, 6, 1 + i).toISOString().slice(0, 10),
13
+ desktop: Math.round(240 + wave + i % 7 * 9),
14
+ mobile: Math.round(160 + wave * 0.7 + i * 3 % 11 * 6)
15
+ };
16
+ });
17
+ var series = [
18
+ { key: "desktop", label: "Desktop" },
19
+ { key: "mobile", label: "Mobile" }
20
+ ];
21
+ var ranges = [
22
+ { id: "90d", label: "3 months", days: 90 },
23
+ { id: "30d", label: "30 days", days: 30 },
24
+ { id: "7d", label: "7 days", days: 7 }
25
+ ];
26
+ var shortDate = (iso) => (/* @__PURE__ */ new Date(`${iso}T00:00:00`)).toLocaleDateString("en-US", { month: "short", day: "numeric" });
27
+ function TrafficTrendBlock({ className, framed = true }) {
28
+ const [range, setRange] = useState("90d");
29
+ const shown = days.slice(-(ranges.find((r) => r.id === range)?.days ?? 90));
30
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("@container/trend w-full max-w-3xl", className), children: [
31
+ /* @__PURE__ */ jsxs(CardHeader, { className: "@max-sm/trend:has-data-[slot=card-action]:grid-cols-1", children: [
32
+ /* @__PURE__ */ jsx(CardTitle, { render: /* @__PURE__ */ jsx("h2", {}), children: "Visitors" }),
33
+ /* @__PURE__ */ jsx(CardDescription, { children: "Desktop and mobile, by day." }),
34
+ /* @__PURE__ */ jsx(CardAction, { className: "@max-sm/trend:col-start-1 @max-sm/trend:row-span-1 @max-sm/trend:row-start-auto @max-sm/trend:mt-2 @max-sm/trend:justify-self-start", children: /* @__PURE__ */ jsx(ToggleGroup, { value: [range], onValueChange: (v) => v[0] && setRange(String(v[0])), "aria-label": "Time range", children: ranges.map((r) => /* @__PURE__ */ jsx(Toggle, { value: r.id, children: r.label }, r.id)) }) })
35
+ ] }),
36
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(
37
+ AreaChart,
38
+ {
39
+ label: `Visitors per day, last ${ranges.find((r) => r.id === range)?.label}`,
40
+ data: shown,
41
+ index: "date",
42
+ series,
43
+ indexFormatter: shortDate,
44
+ tooltip: { labelFormatter: (d) => (/* @__PURE__ */ new Date(`${d}T00:00:00`)).toLocaleDateString("en-US", { weekday: "short", month: "short", day: "numeric" }) },
45
+ stacked: true,
46
+ gradient: true,
47
+ className: "h-64"
48
+ }
49
+ ) }),
50
+ /* @__PURE__ */ jsxs(CardFooter, { className: "gap-1.5 text-body-sm", children: [
51
+ /* @__PURE__ */ jsx(Icon, { name: "arrow-up", className: "text-success" }),
52
+ /* @__PURE__ */ jsxs("span", { children: [
53
+ "Up 5.2% on the previous period ",
54
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\xB7 desktop leads every week" })
55
+ ] })
56
+ ] })
57
+ ] });
58
+ }
59
+ export {
60
+ TrafficTrendBlock
61
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/traffic-trend-block.meta.ts
2
+ var trafficTrendBlockMeta = {
3
+ name: "TrafficTrendBlock",
4
+ family: "Dashboard",
5
+ kind: "card",
6
+ width: { min: "20rem", max: "48rem" },
7
+ summary: "A trend card: a stacked gradient AreaChart of two series by day, a time-range ToggleGroup in the header, and a one-line takeaway with its direction in the footer.",
8
+ intent: "Reach for this as the headline chart of a dashboard or an analytics section on a landing page. For a single number with a small trend beside it, KpiSparklineBlock is lighter.",
9
+ notes: [
10
+ "Switching the range eases the chart from one shape to the next instead of redrawing it.",
11
+ "The footer states the takeaway in words, so the card says something even before the chart is read.",
12
+ "The tooltip heading spells out the weekday; the axis keeps short dates so they fit."
13
+ ],
14
+ a11y: [
15
+ "The chart's accessible name includes the range showing, and its data table updates with it.",
16
+ "The range control is a labelled ToggleGroup; the chart is one tab stop with arrow-key navigation."
17
+ ]
18
+ };
19
+ export {
20
+ trafficTrendBlockMeta
21
+ };
@@ -0,0 +1,39 @@
1
+ // src/blocks/upload-list-block.tsx
2
+ import { Attachment } from "../components/attachment/index.js";
3
+ import { Button } from "../components/button/index.js";
4
+ import { Icon } from "../icon/index.js";
5
+ import { cn } from "../lib/cn.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ var uploading = { name: "brand-guidelines.pdf", meta: "4.2 MB of 6.8 MB", progress: 62 };
8
+ var uploaded = { name: "cover-final.png", meta: "Uploaded \xB7 2.1 MB" };
9
+ function UploadListBlock({ className, onCancel }) {
10
+ return (
11
+ // An upload list, not chips: rows fill the block's width.
12
+ /* @__PURE__ */ jsxs("div", { className: cn("flex w-full max-w-xs flex-col gap-2", className), children: [
13
+ /* @__PURE__ */ jsx(
14
+ Attachment,
15
+ {
16
+ className: "max-w-none",
17
+ name: uploading.name,
18
+ meta: uploading.meta,
19
+ status: "uploading",
20
+ progress: uploading.progress,
21
+ actions: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Cancel upload", onClick: onCancel, children: /* @__PURE__ */ jsx(Icon, { name: "xmark" }) })
22
+ }
23
+ ),
24
+ /* @__PURE__ */ jsx(
25
+ Attachment,
26
+ {
27
+ className: "max-w-none",
28
+ name: uploaded.name,
29
+ icon: "image-stack",
30
+ meta: uploaded.meta,
31
+ actions: /* @__PURE__ */ jsx("span", { className: "grid size-(--control-sm) place-items-center", children: /* @__PURE__ */ jsx(Icon, { name: "circle-check", className: "text-success", "aria-label": "Uploaded" }) })
32
+ }
33
+ )
34
+ ] })
35
+ );
36
+ }
37
+ export {
38
+ UploadListBlock
39
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/upload-list-block.meta.ts
2
+ var uploadListBlockMeta = {
3
+ name: "UploadListBlock",
4
+ family: "Media & files",
5
+ kind: "card",
6
+ width: { min: "16rem", max: "20rem" },
7
+ summary: "An upload queue: full-width Attachment rows \u2014 one uploading with progress and a cancel button, one finished with a success check.",
8
+ intent: "Reach for this under a FileDropzone, or anywhere files are in flight \u2014 a composer, an import step, a document form. For files attached to a message, Attachment chips in the composer fit better.",
9
+ notes: [
10
+ "Rows, not chips: each Attachment drops its chip cap (`max-w-none`) to fill the block's width.",
11
+ "The success check sits in a control-sized box so it lines up with the cancel button on the row above.",
12
+ "No card: Attachment rows are their own surfaces. Wrap the block in a Card if it needs a header."
13
+ ],
14
+ a11y: [
15
+ "Attachment announces upload progress; the cancel Button carries aria-label.",
16
+ `The finished row's check carries aria-label="Uploaded", so the state is spoken, not only coloured.`
17
+ ]
18
+ };
19
+ export {
20
+ uploadListBlockMeta
21
+ };
@@ -0,0 +1,28 @@
1
+ // src/blocks/verify-code-block.tsx
2
+ import { Button } from "../components/button/index.js";
3
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "../components/card/index.js";
4
+ import { Field } from "../components/form/index.js";
5
+ import { OtpField } from "../components/otp-field/index.js";
6
+ import { cn } from "../lib/cn.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var sentTo = "ada@studio.com";
9
+ function VerifyCodeBlock({ className, framed = true, onVerify, onResend }) {
10
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-sm", className), children: [
11
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
12
+ /* @__PURE__ */ jsx(CardTitle, { children: "Check your email" }),
13
+ /* @__PURE__ */ jsxs(CardDescription, { children: [
14
+ "We sent a 6-digit code to ",
15
+ /* @__PURE__ */ jsx("span", { className: "text-foreground", children: sentTo }),
16
+ "."
17
+ ] })
18
+ ] }),
19
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(Field, { label: "Verification code", description: "The code expires in 10 minutes.", children: /* @__PURE__ */ jsx(OtpField, { length: 6, groupSize: 3, onValueComplete: (code) => onVerify?.(code) }) }) }),
20
+ /* @__PURE__ */ jsxs(CardFooter, { className: "justify-between gap-3", children: [
21
+ /* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground", children: "Didn\u2019t get it?" }),
22
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", bleed: "end", onClick: onResend, children: "Resend code" })
23
+ ] })
24
+ ] });
25
+ }
26
+ export {
27
+ VerifyCodeBlock
28
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/verify-code-block.meta.ts
2
+ var verifyCodeBlockMeta = {
3
+ name: "VerifyCodeBlock",
4
+ family: "Auth",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "24rem" },
7
+ summary: "A one-time-code card: where the code went, a six-slot OtpField grouped 3 + 3 under a visible label, and a quiet Resend.",
8
+ intent: "Reach for this for email or SMS verification, two-factor sign-in, or confirming a sensitive change. For a code someone copies out (a recovery key), show it with Code and a copy button instead.",
9
+ notes: [
10
+ "No submit button: the code verifies the moment the last slot fills, which is what people expect from a code field.",
11
+ "The destination is named in the description, so a mistyped address is caught before the wait.",
12
+ "Resend is a ghost Button \u2014 present for the stuck case, never competing with the field."
13
+ ],
14
+ a11y: [
15
+ 'OtpField names each slot ("Character 1 of 6") and accepts a pasted code into all six at once.',
16
+ "Field labels the group and reads the expiry as its description."
17
+ ]
18
+ };
19
+ export {
20
+ verifyCodeBlockMeta
21
+ };
@@ -0,0 +1,48 @@
1
+ // src/blocks/wallet-block.tsx
2
+ import { Button } from "../components/button/index.js";
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/card/index.js";
4
+ import { Entity } from "../components/entity/index.js";
5
+ import { Icon } from "../icon/index.js";
6
+ import { cn } from "../lib/cn.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var balance = "14.62 SOL";
9
+ var activity = [
10
+ { title: "Sold \u201CDusk, no. 4\u201D", detail: "Edition \xB7 2h ago", amount: "+0.80", tone: "edition" },
11
+ { title: "Royalty", detail: "Collectible \xB7 Yesterday", amount: "+0.12", tone: "collectible" },
12
+ { title: "Withdrawal", detail: "To Phantom \xB7 Mon", amount: "-1.50", tone: "standard" }
13
+ ];
14
+ function WalletBlock({ className, framed = true, onSend, onReceive }) {
15
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-xs", className), children: [
16
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
17
+ /* @__PURE__ */ jsx(CardDescription, { children: "Balance" }),
18
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-mono-xl", children: balance })
19
+ ] }),
20
+ /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-3", children: [
21
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
22
+ /* @__PURE__ */ jsx(Button, { iconStart: /* @__PURE__ */ jsx(Icon, { name: "arrow-up" }), onClick: onSend, children: "Send" }),
23
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", iconStart: /* @__PURE__ */ jsx(Icon, { name: "arrow-down" }), onClick: onReceive, children: "Receive" })
24
+ ] }),
25
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: activity.map((item) => /* @__PURE__ */ jsx(
26
+ Entity,
27
+ {
28
+ className: "px-0",
29
+ leading: /* @__PURE__ */ jsx(
30
+ "span",
31
+ {
32
+ "aria-hidden": true,
33
+ className: "block size-8 rounded-full",
34
+ style: { background: `oklch(from var(--tone-${item.tone}) clamp(0.5, calc(l + 0.16), 0.9) max(calc(c * 1.25), 0.1) h)` }
35
+ }
36
+ ),
37
+ title: item.title,
38
+ subtitle: item.detail,
39
+ action: /* @__PURE__ */ jsx("span", { className: cn("text-mono-md", item.amount.startsWith("+") ? "text-success" : "text-muted-foreground"), children: item.amount })
40
+ },
41
+ item.title
42
+ )) })
43
+ ] })
44
+ ] });
45
+ }
46
+ export {
47
+ WalletBlock
48
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/wallet-block.meta.ts
2
+ var walletBlockMeta = {
3
+ name: "WalletBlock",
4
+ family: "Commerce",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "A balance card: the balance in the metric mono tier, Send and Receive as an equal pair, and recent activity as Entity rows with signed amounts.",
8
+ intent: "Reach for this for a wallet, account balance or credits summary with its latest movements. For a full transaction history with filters, use a DataTable.",
9
+ notes: [
10
+ "The balance is CardTitle at `text-mono-xl` \u2014 tabular figures, never a heading tier \u2014 under its label as CardDescription.",
11
+ "Send is primary and Receive secondary, side by side at equal width: two directions of one action, with sending the riskier and more frequent.",
12
+ "Incoming amounts are `text-success`; outgoing stay muted rather than red, because a withdrawal is not an error."
13
+ ],
14
+ a11y: [
15
+ "Each activity row's leading swatch is aria-hidden; the title and detail carry the meaning.",
16
+ "Amounts keep their sign in text (+0.80 / -1.50), so the direction does not depend on colour."
17
+ ]
18
+ };
19
+ export {
20
+ walletBlockMeta
21
+ };