@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,36 @@
1
+ // src/blocks/invite-team-block.tsx
2
+ import { Avatar, AvatarGroup } from "../components/avatar/index.js";
3
+ import { Button } from "../components/button/index.js";
4
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/card/index.js";
5
+ import { Input } from "../components/input/index.js";
6
+ import { cn } from "../lib/cn.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var collaborators = ["MO", "SR", "JL", "AK"];
9
+ function InviteTeamBlock({ className, framed = true, onSend }) {
10
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-xs", className), children: [
11
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
12
+ /* @__PURE__ */ jsx(CardTitle, { children: "Invite your team" }),
13
+ /* @__PURE__ */ jsx(CardDescription, { children: "Collaborators can edit every project." })
14
+ ] }),
15
+ /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-4", children: [
16
+ /* @__PURE__ */ jsx(AvatarGroup, { "aria-label": `${collaborators.length} collaborators`, size: "sm", surface: framed ? "card" : void 0, children: collaborators.map((initials) => /* @__PURE__ */ jsx(Avatar, { variant: "art", fallback: initials, alt: initials }, initials)) }),
17
+ /* @__PURE__ */ jsxs(
18
+ "form",
19
+ {
20
+ className: "flex gap-2",
21
+ onSubmit: (event) => {
22
+ event.preventDefault();
23
+ onSend?.(String(new FormData(event.currentTarget).get("email") ?? ""));
24
+ },
25
+ children: [
26
+ /* @__PURE__ */ jsx(Input, { name: "email", type: "email", placeholder: "name@company.com", "aria-label": "Email address" }),
27
+ /* @__PURE__ */ jsx(Button, { type: "submit", children: "Send" })
28
+ ]
29
+ }
30
+ )
31
+ ] })
32
+ ] });
33
+ }
34
+ export {
35
+ InviteTeamBlock
36
+ };
@@ -0,0 +1,20 @@
1
+ // src/blocks/invite-team-block.meta.ts
2
+ var inviteTeamBlockMeta = {
3
+ name: "InviteTeamBlock",
4
+ family: "Settings & team",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "An invite card: who is already on the team as an AvatarGroup, and an email field with Send.",
8
+ intent: "Reach for this for team or project invites in onboarding, an empty workspace, or a settings section. For managing an existing member list with roles, use a CardList of Entity rows instead.",
9
+ notes: [
10
+ "The field and Send are a <form>, so Enter sends; `onSend` receives the typed address.",
11
+ "The AvatarGroup ring matches the card surface when framed and inherits the host surface when not."
12
+ ],
13
+ a11y: [
14
+ "The AvatarGroup carries an aria-label with the count, so the stack reads as one item, not four initials.",
15
+ "The email Input carries aria-label; there is no visible label in this compact layout."
16
+ ]
17
+ };
18
+ export {
19
+ inviteTeamBlockMeta
20
+ };
@@ -0,0 +1,41 @@
1
+ // src/blocks/invoice-history-block.tsx
2
+ import { Badge } from "../components/badge/index.js";
3
+ import { Button } from "../components/button/index.js";
4
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/card/index.js";
5
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../components/table/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 invoices = [
10
+ { id: "INV-0042", date: "Oct 1, 2026", plan: "Studio \xB7 yearly", amount: "$192.00", status: "Paid" },
11
+ { id: "INV-0031", date: "Sep 1, 2026", plan: "Studio \xB7 monthly", amount: "$20.00", status: "Paid" },
12
+ { id: "INV-0027", date: "Aug 1, 2026", plan: "Studio \xB7 monthly", amount: "$20.00", status: "Refunded" },
13
+ { id: "INV-0019", date: "Jul 1, 2026", plan: "Starter", amount: "$0.00", status: "Paid" }
14
+ ];
15
+ function InvoiceHistoryBlock({ className, framed = true, onDownload }) {
16
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-2xl", className), children: [
17
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
18
+ /* @__PURE__ */ jsx(CardTitle, { render: /* @__PURE__ */ jsx("h2", {}), children: "Invoices" }),
19
+ /* @__PURE__ */ jsx(CardDescription, { children: "Sent to billing@studio.com on the 1st of each month." })
20
+ ] }),
21
+ /* @__PURE__ */ jsx(CardContent, { flush: true, className: "overflow-x-auto scrollbar-quiet", children: /* @__PURE__ */ jsxs(Table, { children: [
22
+ /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
23
+ /* @__PURE__ */ jsx(TableHead, { children: "Date" }),
24
+ /* @__PURE__ */ jsx(TableHead, { children: "Plan" }),
25
+ /* @__PURE__ */ jsx(TableHead, { numeric: true, children: "Amount" }),
26
+ /* @__PURE__ */ jsx(TableHead, { children: "Status" }),
27
+ /* @__PURE__ */ jsx(TableHead, { className: "w-0", children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Download" }) })
28
+ ] }) }),
29
+ /* @__PURE__ */ jsx(TableBody, { children: invoices.map((invoice) => /* @__PURE__ */ jsxs(TableRow, { children: [
30
+ /* @__PURE__ */ jsx(TableCell, { className: "whitespace-nowrap", children: invoice.date }),
31
+ /* @__PURE__ */ jsx(TableCell, { className: "text-muted-foreground", children: invoice.plan }),
32
+ /* @__PURE__ */ jsx(TableCell, { numeric: true, children: invoice.amount }),
33
+ /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Badge, { appearance: "plain", tone: invoice.status === "Paid" ? "success" : "neutral", dot: true, children: invoice.status }) }),
34
+ /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": `Download ${invoice.id}`, onClick: () => onDownload?.(invoice.id), children: /* @__PURE__ */ jsx(Icon, { name: "download" }) }) })
35
+ ] }, invoice.id)) })
36
+ ] }) })
37
+ ] });
38
+ }
39
+ export {
40
+ InvoiceHistoryBlock
41
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/invoice-history-block.meta.ts
2
+ var invoiceHistoryBlockMeta = {
3
+ name: "InvoiceHistoryBlock",
4
+ family: "Commerce",
5
+ kind: "card",
6
+ width: { min: "20rem", max: "42rem" },
7
+ summary: "A billing history card: a flush Table of date, plan, amount and status per invoice, with a download button on each row.",
8
+ intent: "Reach for this in billing settings, under the current plan. For a long, filterable history (hundreds of rows, date ranges, export), use DataTable on its own page.",
9
+ notes: [
10
+ "The table runs edge to edge (CardContent flush); its first and last columns still line up with the card header's padding.",
11
+ "Amounts are a numeric column \u2014 right-aligned with tabular figures \u2014 so they compare by eye.",
12
+ "On a narrow screen the table scrolls sideways inside the card (with a quiet scrollbar) rather than squeezing its columns."
13
+ ],
14
+ a11y: [
15
+ 'The download column has a screen-reader-only header, and each button names its invoice ("Download INV-0042").',
16
+ "Status is text in a Badge; the dot's colour only reinforces it."
17
+ ]
18
+ };
19
+ export {
20
+ invoiceHistoryBlockMeta
21
+ };
@@ -0,0 +1,29 @@
1
+ // src/blocks/kpi-sparkline-block.tsx
2
+ import { Badge } from "../components/badge/index.js";
3
+ import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from "../components/card/index.js";
4
+ import { Sparkline } from "../components/sparkline/index.js";
5
+ import { Icon } from "../icon/index.js";
6
+ import { cn } from "../lib/cn.js";
7
+ import { Grid } from "../layout/index.js";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ var kpis = [
10
+ { label: "Revenue", value: "$18,240", delta: "+8.2%", up: true, trend: [12, 14, 13, 17, 16, 19, 18, 21, 20, 24, 23, 26], tone: "success" },
11
+ { label: "Active users", value: "3,912", delta: "+3.1%", up: true, trend: [30, 31, 29, 33, 34, 33, 36, 35, 37, 38, 37, 39], tone: "info" },
12
+ { label: "Churn", value: "4.1%", delta: "\u22120.6%", up: false, trend: [9, 8, 9, 7, 8, 6, 7, 5, 6, 4, 5, 4], tone: "warning" }
13
+ ];
14
+ function KpiSparklineBlock({ className }) {
15
+ return /* @__PURE__ */ jsx(Grid, { cols: { base: 1, sm: 3 }, gap: 3, className: cn("w-full", className), children: kpis.map((kpi) => /* @__PURE__ */ jsxs(Card, { children: [
16
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
17
+ /* @__PURE__ */ jsx(CardDescription, { children: kpi.label }),
18
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-mono-xl", children: kpi.value }),
19
+ /* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx(Sparkline, { label: `${kpi.label}, last 12 weeks`, data: [...kpi.trend], variant: "area", tone: kpi.tone }) })
20
+ ] }),
21
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Badge, { tone: kpi.up ? "success" : "neutral", size: "sm", icon: /* @__PURE__ */ jsx(Icon, { name: kpi.up ? "arrow-up" : "arrow-down" }), children: [
22
+ kpi.delta,
23
+ " vs last quarter"
24
+ ] }) })
25
+ ] }, kpi.label)) });
26
+ }
27
+ export {
28
+ KpiSparklineBlock
29
+ };
@@ -0,0 +1,20 @@
1
+ // src/blocks/kpi-sparkline-block.meta.ts
2
+ var kpiSparklineBlockMeta = {
3
+ name: "KpiSparklineBlock",
4
+ family: "Dashboard",
5
+ kind: "section",
6
+ summary: "A KPI row with trends: three stat cards, each the value in the metric mono tier, a Sparkline of its last twelve weeks, and the change as a Badge.",
7
+ intent: "Reach for this at the top of a dashboard or a landing page's proof section, where each number needs its recent shape. Without the trend, StatRowBlock is calmer; for one headline trend, TrafficTrendBlock.",
8
+ notes: [
9
+ "Each sparkline is coloured by what its measure is, and the change Badge by whether it is good: churn falling is good news in a warning-toned trend.",
10
+ "The sparklines draw on as the row scrolls into view.",
11
+ "One column on a phone, three from sm."
12
+ ],
13
+ a11y: [
14
+ "Each Sparkline is an image named by the measure and the period, with its range spoken.",
15
+ "The change is stated in text (+8.2% vs last quarter) with an arrow icon; colour only reinforces it."
16
+ ]
17
+ };
18
+ export {
19
+ kpiSparklineBlockMeta
20
+ };
@@ -0,0 +1,68 @@
1
+ // src/blocks/media-player-block.tsx
2
+ import { useState } from "react";
3
+ import { Button } from "../components/button/index.js";
4
+ import { Card, CardContent } from "../components/card/index.js";
5
+ import { Entity } from "../components/entity/index.js";
6
+ import { MediaImage } from "../components/media-image/index.js";
7
+ import { Slider } from "../components/slider/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 track = { title: "Low tide, high noon", artist: "Juno Avery", cover: "", duration: 220, position: 84 };
12
+ function formatTime(seconds) {
13
+ return `${Math.floor(seconds / 60)}:${String(Math.floor(seconds % 60)).padStart(2, "0")}`;
14
+ }
15
+ function MediaPlayerBlock({ className, framed = true, onPlayingChange, onPrevious, onNext }) {
16
+ const [playing, setPlaying] = useState(true);
17
+ const [position, setPosition] = useState(track.position);
18
+ return /* @__PURE__ */ jsx(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-xs", className), children: /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-4", children: [
19
+ /* @__PURE__ */ jsx(
20
+ Entity,
21
+ {
22
+ className: "p-0",
23
+ leading: /* @__PURE__ */ jsx(MediaImage, { src: track.cover, seed: track.title, className: "size-14 shrink-0 rounded-md" }),
24
+ title: track.title,
25
+ subtitle: track.artist,
26
+ action: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Like", children: /* @__PURE__ */ jsx(Icon, { name: "heart" }) })
27
+ }
28
+ ),
29
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
30
+ /* @__PURE__ */ jsx(
31
+ Slider,
32
+ {
33
+ value: position,
34
+ max: track.duration,
35
+ onValueChange: setPosition,
36
+ "aria-label": "Position",
37
+ getAriaValueText: (_, value) => `${formatTime(value)} of ${formatTime(track.duration)}`
38
+ }
39
+ ),
40
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-mono-caption text-muted-foreground", children: [
41
+ /* @__PURE__ */ jsx("span", { children: formatTime(position) }),
42
+ /* @__PURE__ */ jsxs("span", { children: [
43
+ "-",
44
+ formatTime(track.duration - position)
45
+ ] })
46
+ ] })
47
+ ] }),
48
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-3", children: [
49
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Previous", onClick: onPrevious, children: /* @__PURE__ */ jsx(Icon, { name: "previous", variant: "solid" }) }),
50
+ /* @__PURE__ */ jsx(
51
+ Button,
52
+ {
53
+ size: "icon",
54
+ "aria-label": playing ? "Pause" : "Play",
55
+ onClick: () => {
56
+ setPlaying(!playing);
57
+ onPlayingChange?.(!playing);
58
+ },
59
+ children: /* @__PURE__ */ jsx(Icon, { name: playing ? "pause" : "play", variant: "solid" })
60
+ }
61
+ ),
62
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Next", onClick: onNext, children: /* @__PURE__ */ jsx(Icon, { name: "next", variant: "solid" }) })
63
+ ] })
64
+ ] }) });
65
+ }
66
+ export {
67
+ MediaPlayerBlock
68
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/media-player-block.meta.ts
2
+ var mediaPlayerBlockMeta = {
3
+ name: "MediaPlayerBlock",
4
+ family: "Media & files",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "A now-playing card: cover, title and artist as an Entity with a Like action, a position Slider with elapsed and remaining time, and previous / play-pause / next.",
8
+ intent: "Reach for this for audio or video playback controls outside the media itself \u2014 a mini player, a podcast card, a preview in a feed. Playback over the video frame is the Video component's own chrome.",
9
+ notes: [
10
+ "Play/pause is the one filled control, centred between two ghost skips.",
11
+ "Times are `text-mono-caption`, so the digits do not shift as they count.",
12
+ "The cover is painted from the palette as a placeholder; swap it for the real artwork."
13
+ ],
14
+ a11y: [
15
+ "Every icon-only Button carries aria-label, and play/pause's label follows its state.",
16
+ 'The Slider carries aria-label="Position". Give it aria-valuetext in your player ("1:24 of 3:40") so the position is read as time, not a percentage.'
17
+ ]
18
+ };
19
+ export {
20
+ mediaPlayerBlockMeta
21
+ };
@@ -0,0 +1,35 @@
1
+ // src/blocks/newsletter-block.tsx
2
+ import { useId } from "react";
3
+ import { Button } from "../components/button/index.js";
4
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/card/index.js";
5
+ import { Input } from "../components/input/index.js";
6
+ import { cn } from "../lib/cn.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var newsletter = { title: "The Cove digest", body: "One note a month on trusted workflows and product releases." };
9
+ function NewsletterBlock({ className, framed = true, onSubscribe }) {
10
+ const emailId = useId();
11
+ return /* @__PURE__ */ jsxs(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-sm", className), children: [
12
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
13
+ /* @__PURE__ */ jsx(CardTitle, { render: /* @__PURE__ */ jsx("h2", {}), children: newsletter.title }),
14
+ /* @__PURE__ */ jsx(CardDescription, { children: newsletter.body })
15
+ ] }),
16
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(
17
+ "form",
18
+ {
19
+ className: "grid gap-2 sm:grid-cols-[1fr_auto]",
20
+ onSubmit: (event) => {
21
+ event.preventDefault();
22
+ onSubscribe?.(String(new FormData(event.currentTarget).get("email") ?? ""));
23
+ },
24
+ children: [
25
+ /* @__PURE__ */ jsx("label", { htmlFor: emailId, className: "sr-only", children: "Work email" }),
26
+ /* @__PURE__ */ jsx(Input, { id: emailId, name: "email", type: "email", autoComplete: "email", placeholder: "you@company.com", required: true }),
27
+ /* @__PURE__ */ jsx(Button, { type: "submit", className: "w-full sm:w-auto", children: "Subscribe" })
28
+ ]
29
+ }
30
+ ) })
31
+ ] });
32
+ }
33
+ export {
34
+ NewsletterBlock
35
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/newsletter-block.meta.ts
2
+ var newsletterBlockMeta = {
3
+ name: "NewsletterBlock",
4
+ family: "Marketing",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "24rem" },
7
+ summary: "A newsletter sign-up card: the list's name, what it sends and how often, and an email field with Subscribe.",
8
+ intent: "Reach for this in a footer, at the end of an article, or beside a changelog. Creating an account is SignUpBlock; inviting a teammate is InviteTeamBlock.",
9
+ notes: [
10
+ "Copied from the BrandLandingPage page shell's footer.",
11
+ "The description says how often mail arrives \u2014 the one thing people want to know before they subscribe.",
12
+ "The field and button sit side by side from sm up and stack on a phone, where the button goes full width."
13
+ ],
14
+ a11y: [
15
+ "The input has a real (visually hidden) <label>, not just a placeholder.",
16
+ "The CardTitle renders an h2, so the sign-up is reachable by heading in a footer."
17
+ ]
18
+ };
19
+ export {
20
+ newsletterBlockMeta
21
+ };
@@ -0,0 +1,27 @@
1
+ // src/blocks/not-found-block.tsx
2
+ import { Button } from "../components/button/index.js";
3
+ import { Icon } from "../icon/index.js";
4
+ import { cn } from "../lib/cn.js";
5
+ import { Region, Row, Stack } from "../layout/index.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ var notFound = {
8
+ code: "404",
9
+ title: "This page isn't here",
10
+ body: "It may have moved, or the link may be mistyped. Check the address, or head back to somewhere you know.",
11
+ home: { label: "Go home", href: "/" },
12
+ help: { label: "Search the docs", href: "/docs" }
13
+ };
14
+ function NotFoundBlock({ className }) {
15
+ return /* @__PURE__ */ jsx(Region, { as: "section", max: "form", className: cn("w-full py-16 sm:py-24", className), children: /* @__PURE__ */ jsxs(Stack, { gap: 4, align: "center", className: "text-center", children: [
16
+ /* @__PURE__ */ jsx("p", { className: "text-mono-md text-muted-foreground", children: notFound.code }),
17
+ /* @__PURE__ */ jsx("h1", { className: "text-balance text-heading-1", children: notFound.title }),
18
+ /* @__PURE__ */ jsx("p", { className: "text-pretty text-body-md text-muted-foreground", children: notFound.body }),
19
+ /* @__PURE__ */ jsxs(Row, { gap: 2, justify: "center", wrap: true, className: "pt-2", children: [
20
+ /* @__PURE__ */ jsx(Button, { iconStart: /* @__PURE__ */ jsx(Icon, { name: "home" }), render: /* @__PURE__ */ jsx("a", { href: notFound.home.href }), children: notFound.home.label }),
21
+ /* @__PURE__ */ jsx(Button, { variant: "outline", iconStart: /* @__PURE__ */ jsx(Icon, { name: "search" }), render: /* @__PURE__ */ jsx("a", { href: notFound.help.href }), children: notFound.help.label })
22
+ ] })
23
+ ] }) });
24
+ }
25
+ export {
26
+ NotFoundBlock
27
+ };
@@ -0,0 +1,20 @@
1
+ // src/blocks/not-found-block.meta.ts
2
+ var notFoundBlockMeta = {
3
+ name: "NotFoundBlock",
4
+ family: "System",
5
+ kind: "section",
6
+ summary: "A not-found page body: the status code in mono, a plain-language h1, what probably happened, and two ways on \u2014 home and search.",
7
+ intent: "Reach for this as the body of a 404 route. An empty list or a search with no results inside a working page is EmptyState, not this.",
8
+ notes: [
9
+ "The heading says what happened in words; the code is a small mono label for people who look for it.",
10
+ "Two ways on, one primary. Never a dead end with only the browser's back button.",
11
+ "Capped at the `form` region width, so the short message stays a tight, centred column."
12
+ ],
13
+ a11y: [
14
+ "It renders the page's h1 \u2014 use it as the route's main content, inside <main>.",
15
+ "Both actions are links styled as Buttons, because they navigate."
16
+ ]
17
+ };
18
+ export {
19
+ notFoundBlockMeta
20
+ };
@@ -0,0 +1,32 @@
1
+ // src/blocks/notification-list-block.tsx
2
+ import { Avatar } from "../components/avatar/index.js";
3
+ import { Card, CardList } from "../components/card/index.js";
4
+ import { Entity } from "../components/entity/index.js";
5
+ import { StatusDot } from "../components/status-dot/index.js";
6
+ import { cn } from "../lib/cn.js";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ var notifications = [
9
+ { initials: "MO", name: "Mara Okafor", what: "collected your edition", when: "2m", unread: true },
10
+ { initials: "SR", name: "Sam Rivera", what: "left a comment on Dusk", when: "1h", unread: false }
11
+ ];
12
+ function NotificationListBlock({ className, framed = true }) {
13
+ return /* @__PURE__ */ jsx(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-xs overflow-hidden", className), children: /* @__PURE__ */ jsx(CardList, { children: notifications.map((n) => /* @__PURE__ */ jsx(
14
+ Entity,
15
+ {
16
+ leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", size: "sm", fallback: n.initials, alt: n.name }),
17
+ title: /* @__PURE__ */ jsxs(Fragment, { children: [
18
+ n.name,
19
+ n.unread ? /* @__PURE__ */ jsx("span", { className: "sr-only", children: " (unread)" }) : null
20
+ ] }),
21
+ subtitle: n.what,
22
+ action: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 text-caption text-muted-foreground", children: [
23
+ n.unread ? /* @__PURE__ */ jsx(StatusDot, { tone: "info" }) : null,
24
+ n.when
25
+ ] })
26
+ },
27
+ n.name
28
+ )) }) });
29
+ }
30
+ export {
31
+ NotificationListBlock
32
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/notification-list-block.meta.ts
2
+ var notificationListBlockMeta = {
3
+ name: "NotificationListBlock",
4
+ family: "Social & messaging",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "An activity list: Entity rows with the actor's Avatar, who did what, and a compact time with an unread StatusDot.",
8
+ intent: "Reach for this for a notifications popover, a recent-activity card or an inbox preview. A full inbox with selection and bulk actions is a ListDetailPage.",
9
+ notes: [
10
+ "Rows are Card + CardList + Entity, inset from the card's padding at any density.",
11
+ "Unread is a quiet info dot before the time, so the times keep one right edge \u2014 the list stays calm when most items are unread.",
12
+ "framed={false} drops the surface for a Popover, which already is one."
13
+ ],
14
+ a11y: [
15
+ 'The unread dot is decorative; each unread row also carries a screen-reader-only "(unread)" after the name.',
16
+ "Each Avatar's alt is the actor's name."
17
+ ]
18
+ };
19
+ export {
20
+ notificationListBlockMeta
21
+ };
@@ -0,0 +1,25 @@
1
+ // src/blocks/notification-settings-block.tsx
2
+ import { Card, CardList } from "../components/card/index.js";
3
+ import { Entity } from "../components/entity/index.js";
4
+ import { Switch } from "../components/switch/index.js";
5
+ import { cn } from "../lib/cn.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ var preferences = [
8
+ { id: "email", title: "Email notifications", detail: "Replies and mentions", on: true },
9
+ { id: "push", title: "Push notifications", detail: "On this device", on: false },
10
+ { id: "digest", title: "Weekly digest", detail: "Every Monday", on: true }
11
+ ];
12
+ function NotificationSettingsBlock({ className, framed = true, onChange }) {
13
+ return /* @__PURE__ */ jsx(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-xs overflow-hidden", className), children: /* @__PURE__ */ jsx(CardList, { children: preferences.map((p) => /* @__PURE__ */ jsx(
14
+ Entity,
15
+ {
16
+ title: p.title,
17
+ subtitle: p.detail,
18
+ action: /* @__PURE__ */ jsx(Switch, { defaultChecked: p.on, "aria-label": p.title, onCheckedChange: (on) => onChange?.(p.id, on) })
19
+ },
20
+ p.id
21
+ )) }) });
22
+ }
23
+ export {
24
+ NotificationSettingsBlock
25
+ };
@@ -0,0 +1,20 @@
1
+ // src/blocks/notification-settings-block.meta.ts
2
+ var notificationSettingsBlockMeta = {
3
+ name: "NotificationSettingsBlock",
4
+ family: "Settings & team",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "A preferences card: Entity rows in a CardList, each with a title, a one-line detail and a Switch that applies instantly.",
8
+ intent: "Reach for this for any short list of on/off preferences \u2014 notifications, privacy, feature flags in a settings section. For a full settings route with a section rail, start from the SettingsPage page shell.",
9
+ notes: [
10
+ "Switches apply the moment they change; never pair them with a Save button. `onChange` receives the row id and the new state.",
11
+ "Rows are Card + CardList + Entity, so they inset with the card's padding at any density."
12
+ ],
13
+ a11y: [
14
+ "Each Switch takes its row title as aria-label, since the Entity title is not a <label>.",
15
+ "Keep details to one line \u2014 Entity truncates its subtitle."
16
+ ]
17
+ };
18
+ export {
19
+ notificationSettingsBlockMeta
20
+ };
@@ -0,0 +1,26 @@
1
+ // src/blocks/order-tracking-block.tsx
2
+ import { Badge } from "../components/badge/index.js";
3
+ import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from "../components/card/index.js";
4
+ import { Stepper, StepperItem } from "../components/stepper/index.js";
5
+ import { cn } from "../lib/cn.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ var order = { number: "Order #2048", item: "Gicl\xE9e print, 18 \xD7 24 in", status: "In transit", current: 2 };
8
+ var steps = [
9
+ { title: "Order placed", detail: "Oct 9, 10:14 AM" },
10
+ { title: "Printed and packed", detail: "Oct 10, 4:02 PM" },
11
+ { title: "Out for delivery", detail: "Arriving today by 6 PM" },
12
+ { title: "Delivered", detail: void 0 }
13
+ ];
14
+ function OrderTrackingBlock({ className, framed = true }) {
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(CardTitle, { children: order.number }),
18
+ /* @__PURE__ */ jsx(CardDescription, { children: order.item }),
19
+ /* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx(Badge, { tone: "warning", size: "sm", children: order.status }) })
20
+ ] }),
21
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(Stepper, { orientation: "vertical", indicator: "dot", current: order.current, "aria-label": "Delivery status", children: steps.map((step) => /* @__PURE__ */ jsx(StepperItem, { title: step.title, description: step.detail }, step.title)) }) })
22
+ ] });
23
+ }
24
+ export {
25
+ OrderTrackingBlock
26
+ };
@@ -0,0 +1,20 @@
1
+ // src/blocks/order-tracking-block.meta.ts
2
+ var orderTrackingBlockMeta = {
3
+ name: "OrderTrackingBlock",
4
+ family: "Commerce",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "An order status card: order number, item and a status Badge in the header over a vertical dot Stepper of delivery milestones.",
8
+ intent: "Reach for this for anything that moves through known stages \u2014 a delivery, an application, a review, a deployment. For an open-ended activity log, use a list of Entity rows with timestamps instead.",
9
+ notes: [
10
+ "The Stepper's `current` is the step under way; finished steps show their timestamp and future steps show none.",
11
+ "The status Badge restates the current stage in one word so the card scans without reading the steps."
12
+ ],
13
+ a11y: [
14
+ 'The Stepper is labelled "Delivery status" and marks the current step for assistive tech.',
15
+ "The Badge's tone is backed by its text; colour alone never carries the status."
16
+ ]
17
+ };
18
+ export {
19
+ orderTrackingBlockMeta
20
+ };
@@ -0,0 +1,46 @@
1
+ // src/blocks/pricing-card-block.tsx
2
+ import { useState } from "react";
3
+ import { Button } from "../components/button/index.js";
4
+ import { Card, CardContent } 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 plan = {
10
+ monthly: { price: "$20", note: "Billed monthly. Cancel anytime." },
11
+ yearly: { price: "$16", note: "Billed $192 yearly. You save 20%." },
12
+ features: ["Unlimited projects", "Version history", "Priority support"]
13
+ };
14
+ function PricingCardBlock({ className, framed = true, onStart }) {
15
+ const [period, setPeriod] = useState("yearly");
16
+ return /* @__PURE__ */ jsx(Card, { variant: framed ? "default" : "flat", className: cn("w-full max-w-xs", className), children: /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-5", children: [
17
+ /* @__PURE__ */ jsxs(
18
+ ToggleGroup,
19
+ {
20
+ value: [period],
21
+ onValueChange: (v) => v[0] && setPeriod(v[0]),
22
+ "aria-label": "Billing period",
23
+ className: "w-full",
24
+ children: [
25
+ /* @__PURE__ */ jsx(Toggle, { value: "monthly", className: "flex-1", children: "Monthly" }),
26
+ /* @__PURE__ */ jsx(Toggle, { value: "yearly", className: "flex-1", children: "Yearly" })
27
+ ]
28
+ }
29
+ ),
30
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
31
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-1.5", children: [
32
+ /* @__PURE__ */ jsx("span", { className: "text-heading-2", children: plan[period].price }),
33
+ /* @__PURE__ */ jsx("span", { className: "text-body-sm text-muted-foreground", children: "per seat / month" })
34
+ ] }),
35
+ /* @__PURE__ */ jsx("span", { className: "text-body-sm text-muted-foreground", children: plan[period].note })
36
+ ] }),
37
+ /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2 text-body-sm", children: plan.features.map((feature) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2", children: [
38
+ /* @__PURE__ */ jsx(Icon, { name: "check", className: "text-success" }),
39
+ feature
40
+ ] }, feature)) }),
41
+ /* @__PURE__ */ jsx(Button, { className: "w-full", onClick: () => onStart?.(period), children: "Start free trial" })
42
+ ] }) });
43
+ }
44
+ export {
45
+ PricingCardBlock
46
+ };
@@ -0,0 +1,21 @@
1
+ // src/blocks/pricing-card-block.meta.ts
2
+ var pricingCardBlockMeta = {
3
+ name: "PricingCardBlock",
4
+ family: "Commerce",
5
+ kind: "card",
6
+ width: { min: "18rem", max: "20rem" },
7
+ summary: "A single-plan pricing card: a Monthly/Yearly ToggleGroup, the price and billing note, a checked feature list, and one full-width call to action.",
8
+ intent: "Reach for this when one plan is on offer \u2014 an upgrade prompt, a paywall, a plan summary in billing settings. Comparing several tiers side by side is a pricing table, not three of these.",
9
+ notes: [
10
+ "The period switch is a ToggleGroup (a segmented control), not Tabs: it changes a value in place rather than showing another panel.",
11
+ "The price is a heading tier because it is the card's headline; its unit and billing note sit beside and below it in muted body text.",
12
+ "`onStart` receives the period showing, so checkout opens on the plan the person was looking at."
13
+ ],
14
+ a11y: [
15
+ `The ToggleGroup carries aria-label="Billing period"; each Toggle's text is its name.`,
16
+ "The check icons are decorative beside each feature's text."
17
+ ]
18
+ };
19
+ export {
20
+ pricingCardBlockMeta
21
+ };