@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
@@ -1,51 +1,3 @@
1
- import { StatusIcons } from './chunk-NEQNXI2G.js';
2
- import { cn } from './chunk-SRQWQUTW.js';
3
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
-
5
- function Phone({ statusBar = true, systemChrome = true, className, children, ...props }) {
6
- return /* @__PURE__ */ jsxs(
7
- "div",
8
- {
9
- className: cn(
10
- // Hardware is the one surface no preset or mode repaints: a titanium
11
- // body and band, not a theme's scrim (`overlay` is translucent in some
12
- // presets, which drew a grey, see-through phone).
13
- // design-lint-disable-next-line inline-color -- fixed device material, deliberately unthemed
14
- "@container relative mx-auto w-[280px] [--phone-body:oklch(18%_0.004_265)] [--phone-band:oklch(48%_0.006_265)]",
15
- className
16
- ),
17
- ...props,
18
- children: [
19
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -start-[0.6cqi] top-[18%] h-[4.5%] w-[0.8cqi] rounded-s-full bg-(--phone-band)" }),
20
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -start-[0.6cqi] top-[25.5%] h-[7%] w-[0.8cqi] rounded-s-full bg-(--phone-band)" }),
21
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -start-[0.6cqi] top-[34%] h-[7%] w-[0.8cqi] rounded-s-full bg-(--phone-band)" }),
22
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -end-[0.6cqi] top-[27%] h-[10.5%] w-[0.8cqi] rounded-e-full bg-(--phone-band)" }),
23
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -end-[0.4cqi] top-[55%] h-[6%] w-[0.6cqi] rounded-e-full bg-(--phone-band)" }),
24
- /* @__PURE__ */ jsx("div", { className: "relative rounded-[18cqi] bg-(--phone-body) p-[3.7cqi] shadow-xl ring-[0.5cqi] ring-(--phone-band) ring-inset", children: /* @__PURE__ */ jsxs("div", { className: "relative aspect-[402/874] overflow-hidden rounded-[14.3cqi] bg-background text-foreground [clip-path:inset(0_round_14.3cqi)]", children: [
25
- /* @__PURE__ */ jsx("div", { className: cn("h-full overflow-auto overscroll-contain scrollbar-hidden", statusBar && "pt-[14.3cqi]"), children }),
26
- statusBar ? /* @__PURE__ */ jsxs(
27
- "div",
28
- {
29
- "aria-hidden": true,
30
- className: "absolute inset-x-0 top-0 grid h-[14.3cqi] grid-cols-[1fr_19cqi_1fr] grid-rows-[8cqi] content-start items-center bg-background px-[4cqi] pt-[2.6cqi]",
31
- children: [
32
- /* @__PURE__ */ jsx("span", { className: "justify-self-center text-label-md tabular-nums", children: "9:41" }),
33
- /* @__PURE__ */ jsx("span", {}),
34
- /* @__PURE__ */ jsx(StatusIcons, { className: "flex items-center gap-[1.15cqi] justify-self-center [&_svg]:h-[2.8cqi] [&_svg]:w-auto" })
35
- ]
36
- }
37
- ) : null,
38
- systemChrome ? /* @__PURE__ */ jsxs(Fragment, { children: [
39
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute inset-x-0 top-[2.6cqi] mx-auto h-[8cqi] w-[19cqi] rounded-full bg-(--phone-body)" }),
40
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute inset-x-0 bottom-[1.85cqi] mx-auto h-[1.15cqi] min-h-1 w-[35%] rounded-full bg-foreground" })
41
- ] }) : null
42
- ] }) })
43
- ]
44
- }
45
- );
46
- }
47
- Phone.displayName = "Phone";
48
-
49
1
  // src/components/phone/phone.meta.ts
50
2
  var phoneMeta = {
51
3
  name: "Phone",
@@ -135,5 +87,6 @@ var phoneMeta = {
135
87
  }
136
88
  ]
137
89
  };
138
-
139
- export { Phone, phoneMeta };
90
+ export {
91
+ phoneMeta
92
+ };
@@ -1,6 +1,5 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
-
3
1
  // src/components/phone/status-icons.tsx
2
+ import { jsx, jsxs } from "react/jsx-runtime";
4
3
  function StatusIcons(props) {
5
4
  return /* @__PURE__ */ jsxs("span", { "aria-hidden": true, ...props, children: [
6
5
  /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 17 12", width: "17", height: "12", fill: "currentColor", children: [
@@ -21,5 +20,6 @@ function StatusIcons(props) {
21
20
  ] })
22
21
  ] });
23
22
  }
24
-
25
- export { StatusIcons };
23
+ export {
24
+ StatusIcons
25
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/pie-chart/index.ts
2
+ import { PieChart } from "./pie-chart.js";
3
+ import { pieChartMeta } from "./pie-chart.meta.js";
4
+ export {
5
+ PieChart,
6
+ pieChartMeta
7
+ };
@@ -0,0 +1,191 @@
1
+ "use client";
2
+
3
+ // src/components/pie-chart/pie-chart.tsx
4
+ import { useId } from "react";
5
+ import { ChartFrame } from "../../lib/chart/chart-frame.js";
6
+ import { ChartLegend } from "../../lib/chart/chart-legend.js";
7
+ import { ChartTooltipContent } from "../../lib/chart/chart-tooltip.js";
8
+ import { categoryText, centerValueText, chartFormatters } from "../../lib/chart/format.js";
9
+ import { arcPath, polar } from "../../lib/chart/geometry.js";
10
+ import { DRAW_DURATION, morphTransition, pathStyle } from "../../lib/chart/motion.js";
11
+ import {
12
+ categoryStyle,
13
+ numberValue
14
+ } from "../../lib/chart/types.js";
15
+ import { cn } from "../../lib/cn.js";
16
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
+ function PieChart({
18
+ data,
19
+ index,
20
+ valueKey,
21
+ label,
22
+ categories,
23
+ className,
24
+ donut = false,
25
+ centerLabel,
26
+ separator = true,
27
+ labels = "none",
28
+ labelContent = "value",
29
+ legend,
30
+ tooltip = true,
31
+ valueFormatter,
32
+ locale,
33
+ animate = true,
34
+ activeIndex,
35
+ defaultActiveIndex,
36
+ onActiveIndexChange
37
+ }) {
38
+ const uid = useId().replace(/:/g, "");
39
+ const keys = Array.isArray(valueKey) ? valueKey : [valueKey];
40
+ const fmt = chartFormatters(locale, valueFormatter);
41
+ const percent = new Intl.NumberFormat(locale, { style: "percent", maximumFractionDigits: 0 });
42
+ const names = data.map((d) => categoryText(d[index], locale));
43
+ const styles = names.map((name, i) => categoryStyle(categories, name, i));
44
+ const rings = keys.map((key) => {
45
+ const vals = data.map((d) => Math.max(0, numberValue(d[key])));
46
+ const total = vals.reduce((a, b) => a + b, 0) || 1;
47
+ let acc = 0;
48
+ return vals.map((v) => {
49
+ const a0 = acc / total * Math.PI * 2;
50
+ acc += v;
51
+ return { v, share: v / total, a0, a1: acc / total * Math.PI * 2 };
52
+ });
53
+ });
54
+ const tooltipOptions = typeof tooltip === "object" ? tooltip : {};
55
+ const ratio = donut === true ? 0.6 : typeof donut === "number" ? Math.min(0.9, Math.max(0, donut)) : 0;
56
+ const geometry = (size) => {
57
+ const margin = labels === "outside" ? 30 : 8;
58
+ const outer = Math.max(8, Math.min(size.width, size.height) / 2 - margin);
59
+ const inner = outer * ratio;
60
+ const cx = size.width / 2;
61
+ const cy = size.height / 2;
62
+ const ringWidth = (outer - inner) / keys.length;
63
+ return { cx, cy, outer, inner, ringWidth };
64
+ };
65
+ const hitTest = (x, y, size) => {
66
+ const g = geometry(size);
67
+ const dx = x - g.cx;
68
+ const dy = y - g.cy;
69
+ const r = Math.hypot(dx, dy);
70
+ if (r > g.outer + 8 || r < g.inner) return null;
71
+ const angle = (Math.atan2(dx, -dy) + Math.PI * 2) % (Math.PI * 2);
72
+ const ring = Math.min(keys.length - 1, Math.max(0, Math.floor((g.outer - r) / g.ringWidth)));
73
+ const hit = rings[ring].findIndex((s) => angle >= s.a0 && angle < s.a1);
74
+ return hit < 0 ? null : hit;
75
+ };
76
+ const sliceText = (ring, i) => labelContent === "percent" ? percent.format(rings[ring][i].share) : labelContent === "name" ? styles[i].label : fmt.full(rings[ring][i].v);
77
+ const describe = (i) => `${styles[i].label}: ${keys.map((k, r) => `${keys.length > 1 ? `${k} ` : ""}${fmt.full(rings[r][i].v)} (${percent.format(rings[r][i].share)})`).join(", ")}`;
78
+ const tooltipFor = (i, size) => {
79
+ const g = geometry(size);
80
+ const s = rings[0][i];
81
+ const [x, y] = polar(g.cx, g.cy, g.outer, (s.a0 + s.a1) / 2);
82
+ return {
83
+ x,
84
+ y,
85
+ content: /* @__PURE__ */ jsx(
86
+ ChartTooltipContent,
87
+ {
88
+ indicator: tooltipOptions.indicator,
89
+ label: tooltipOptions.hideLabel || keys.length === 1 ? void 0 : styles[i].label,
90
+ rows: keys.map((k, r) => ({
91
+ key: k,
92
+ label: keys.length === 1 ? styles[i].label : k,
93
+ value: fmt.full(rings[r][i].v),
94
+ color: styles[i].color,
95
+ icon: styles[i].icon
96
+ }))
97
+ }
98
+ )
99
+ };
100
+ };
101
+ return /* @__PURE__ */ jsx(
102
+ ChartFrame,
103
+ {
104
+ label,
105
+ className: cn("h-64", className),
106
+ count: data.length,
107
+ interactive: tooltip !== false,
108
+ animate,
109
+ activeIndex,
110
+ defaultActiveIndex,
111
+ onActiveIndexChange,
112
+ hitTest,
113
+ tooltip: tooltip === false ? void 0 : tooltipFor,
114
+ describe,
115
+ table: {
116
+ headers: [index.charAt(0).toUpperCase() + index.slice(1), ...keys],
117
+ rows: data.map((_, i) => [styles[i].label, ...keys.map((_2, r) => fmt.full(rings[r][i].v))])
118
+ },
119
+ legend: legend ?? labels === "none" ? /* @__PURE__ */ jsx(ChartLegend, { items: names.map((n, i) => ({ key: n, label: styles[i].label, color: styles[i].color, icon: styles[i].icon })) }) : null,
120
+ children: ({ size, activeIndex: active }) => {
121
+ const g = geometry(size);
122
+ const maskId = `${uid}-sweep`;
123
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
124
+ /* @__PURE__ */ jsx("mask", { id: maskId, children: /* @__PURE__ */ jsx(
125
+ "circle",
126
+ {
127
+ cx: g.cx,
128
+ cy: g.cy,
129
+ r: g.outer / 2 + 4,
130
+ fill: "none",
131
+ stroke: "white",
132
+ strokeWidth: g.outer + 8,
133
+ pathLength: 1,
134
+ transform: `rotate(-90 ${g.cx} ${g.cy})`,
135
+ className: "[stroke-dasharray:1] [stroke-dashoffset:0] [[data-reveal=out]_&]:[stroke-dashoffset:1]",
136
+ style: { transition: `stroke-dashoffset ${DRAW_DURATION} var(--motion-ease-decelerate)` }
137
+ }
138
+ ) }),
139
+ /* @__PURE__ */ jsx("g", { mask: `url(#${maskId})`, children: rings.map(
140
+ (ring, r) => ring.map((s, i) => {
141
+ if (s.v === 0) return null;
142
+ const outer = g.outer - r * g.ringWidth + (active === i && r === 0 ? 6 : 0);
143
+ const inner = Math.max(g.inner, g.outer - (r + 1) * g.ringWidth);
144
+ const d = arcPath(g.cx, g.cy, inner, outer, s.a0, s.a1);
145
+ return /* @__PURE__ */ jsx(
146
+ "path",
147
+ {
148
+ d,
149
+ strokeWidth: separator ? 2 : 0,
150
+ strokeLinejoin: "round",
151
+ className: cn(separator && "stroke-(--sable-surface-bg,var(--background))", active != null && active !== i && "opacity-60"),
152
+ style: { ...pathStyle(d), fill: styles[i].color, transition: morphTransition() }
153
+ },
154
+ `${r}-${names[i]}`
155
+ );
156
+ })
157
+ ) }),
158
+ labels !== "none" ? rings[0].map((s, i) => {
159
+ if (s.v === 0) return null;
160
+ const mid = (s.a0 + s.a1) / 2;
161
+ const inside = labels === "inside";
162
+ const r = inside ? g.outer - g.ringWidth / 2 : g.outer + 14;
163
+ const [x, y] = polar(g.cx, g.cy, r, mid);
164
+ const anchor = inside ? "middle" : Math.sin(mid) > 0.1 ? "start" : Math.sin(mid) < -0.1 ? "end" : "middle";
165
+ return /* @__PURE__ */ jsx(
166
+ "text",
167
+ {
168
+ x,
169
+ y,
170
+ dy: "0.32em",
171
+ textAnchor: anchor,
172
+ className: cn("text-caption tabular-nums [[data-reveal=out]_&]:opacity-0", inside ? "fill-background text-label-sm" : "fill-foreground"),
173
+ style: { transition: morphTransition(), transitionDelay: "var(--motion-duration-slower)" },
174
+ children: sliceText(0, i)
175
+ },
176
+ `l-${names[i]}`
177
+ );
178
+ }) : null,
179
+ centerLabel && g.inner > 0 ? /* @__PURE__ */ jsxs("text", { x: g.cx, y: g.cy, textAnchor: "middle", className: "[[data-reveal=out]_&]:opacity-0", style: { transition: morphTransition() }, children: [
180
+ /* @__PURE__ */ jsx("tspan", { x: g.cx, dy: "0.35em", className: "fill-foreground text-heading-2 tabular-nums", children: centerValueText(centerLabel.value, locale) }),
181
+ centerLabel.label ? /* @__PURE__ */ jsx("tspan", { x: g.cx, dy: "1.9em", className: "fill-muted-foreground text-caption", children: centerLabel.label }) : null
182
+ ] }) : null
183
+ ] });
184
+ }
185
+ }
186
+ );
187
+ }
188
+ PieChart.displayName = "PieChart";
189
+ export {
190
+ PieChart
191
+ };
@@ -0,0 +1,210 @@
1
+ // src/components/pie-chart/pie-chart.meta.ts
2
+ var pieChartMeta = {
3
+ name: "PieChart",
4
+ summary: "Parts of a whole as slices: a pie or donut, concentric rings for several measures, a total in the hole, slice labels inside or out, and an active slice that pulls outward. Slices sweep in clockwise as the chart scrolls into view.",
5
+ keywords: [
6
+ "chart",
7
+ "pie",
8
+ "donut",
9
+ "doughnut",
10
+ "share",
11
+ "proportion",
12
+ "breakdown",
13
+ "parts",
14
+ "whole"
15
+ ],
16
+ usage: {
17
+ description: "Use PieChart for a share of one total across two to six categories \u2014 traffic sources, a budget split, survey answers. A donut leaves room for the total in the middle (`centerLabel`). With more categories, or to compare values precisely, use BarChart; for a breakdown inside a stat card, SegmentedBar is lighter.",
18
+ bestPractices: [
19
+ {
20
+ guidance: "do",
21
+ description: "Put the total, or the headline slice, in a donut's centerLabel."
22
+ },
23
+ {
24
+ guidance: "do",
25
+ description: "Configure slice names, tones and icons with categories, keyed by each slice's value in the data."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: 'Use more than six slices \u2014 merge the tail into "Other" or use BarChart.'
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: "Use it for data-heavy views \u2014 streaming or real-time data, thousands of points, zoom and brushing, trading charts. Those belong on a charting library (Recharts, visx, ECharts); Sable's charts are for dashboards, landing pages and decks."
34
+ }
35
+ ]
36
+ },
37
+ related: {
38
+ components: [
39
+ "SegmentedBar",
40
+ "RadialChart",
41
+ "BarChart",
42
+ "Card"
43
+ ]
44
+ },
45
+ status: "beta",
46
+ props: [
47
+ {
48
+ name: "data",
49
+ type: "Record<string, unknown>[]",
50
+ description: "One row per slice."
51
+ },
52
+ {
53
+ name: "index",
54
+ type: "string",
55
+ description: "The datum field naming each slice."
56
+ },
57
+ {
58
+ name: "valueKey",
59
+ type: "string | string[]",
60
+ description: "The datum field holding each slice's amount \u2014 or several fields, drawn as concentric rings, outer first."
61
+ },
62
+ {
63
+ name: "label",
64
+ type: "string",
65
+ description: "What the chart shows. Its accessible name and the caption of the data table assistive tech reads."
66
+ },
67
+ {
68
+ name: "categories",
69
+ type: "Record<string, { label?: string; tone?: ChartTone; color?: string; icon?: string }>",
70
+ description: "Labels, tones and icons per slice, keyed by the slice's name. Unlisted slices take the tones in order."
71
+ },
72
+ {
73
+ name: "className",
74
+ type: "string",
75
+ default: '"h-64"',
76
+ description: "Sizes the chart. Set a height."
77
+ },
78
+ {
79
+ name: "donut",
80
+ type: "boolean | number",
81
+ default: "false",
82
+ description: "Cut out the middle: `true` for a ring at 60% of the radius, or a ratio (0\u20130.9)."
83
+ },
84
+ {
85
+ name: "centerLabel",
86
+ type: "{ value: string | number; label?: string }",
87
+ description: "A value and caption in the hole of a donut. The value holds the centre and the caption hangs below it. A number is formatted for you: in full up to 9,999, compact from 10,000 (10.2K, 102.1K, 1.2M); pass a string for units."
88
+ },
89
+ {
90
+ name: "separator",
91
+ type: "boolean",
92
+ default: "true",
93
+ description: "A hairline in the surface colour between slices."
94
+ },
95
+ {
96
+ name: "labels",
97
+ type: '"none" | "outside" | "inside"',
98
+ default: '"none"',
99
+ description: "Label each slice outside the pie or inside it."
100
+ },
101
+ {
102
+ name: "labelContent",
103
+ type: '"value" | "percent" | "name"',
104
+ default: '"value"',
105
+ description: "What a slice label says."
106
+ },
107
+ {
108
+ name: "legend",
109
+ type: "boolean",
110
+ default: "true unless slices are labelled",
111
+ description: "Show the legend."
112
+ },
113
+ {
114
+ name: "tooltip",
115
+ type: 'boolean | { indicator?: "dot" | "line" | "dashed" | "none"; hideLabel?: boolean; labelFormatter?: (label, datum) => ReactNode; showTotal?: boolean }',
116
+ default: "true",
117
+ description: "Show a tooltip on hover and keyboard focus, or configure it: the row marker, hiding the heading, rewriting it, adding a Total row."
118
+ },
119
+ {
120
+ name: "valueFormatter",
121
+ type: "(value: number) => string",
122
+ description: 'Format values everywhere (axis, labels, tooltip, table) \u2014 units like "$12,480". Default: compact on the axis, full elsewhere.'
123
+ },
124
+ {
125
+ name: "locale",
126
+ type: "string",
127
+ default: "runtime locale",
128
+ description: "BCP 47 locale for default number and date formatting."
129
+ },
130
+ {
131
+ name: "animate",
132
+ type: "boolean",
133
+ default: "true",
134
+ description: "Sweep the slices in clockwise when the chart scrolls into view."
135
+ },
136
+ {
137
+ name: "activeIndex",
138
+ type: "number | null",
139
+ description: "The highlighted row (controlled); `null` for none."
140
+ },
141
+ {
142
+ name: "defaultActiveIndex",
143
+ type: "number | null",
144
+ description: "The row highlighted at first \u2014 a tooltip already open before anyone hovers."
145
+ },
146
+ {
147
+ name: "onActiveIndexChange",
148
+ type: "(index: number | null) => void",
149
+ description: "Called as the pointer or keyboard moves between rows."
150
+ }
151
+ ],
152
+ tokensUsed: [
153
+ "tone-edition",
154
+ "tone-collectible",
155
+ "tone-standard",
156
+ "tone-info",
157
+ "tone-warning",
158
+ "primary",
159
+ "muted-foreground",
160
+ "border",
161
+ "popover",
162
+ "popover-foreground",
163
+ "foreground",
164
+ "background"
165
+ ],
166
+ motion: [
167
+ {
168
+ slot: "arrival",
169
+ recipe: "custom",
170
+ part: "Slices",
171
+ why: "Once on screen the slices are revealed by a mask that sweeps clockwise from 12 o'clock \u2014 the whole is read as it fills. On the motion tokens; reduced motion shows the finished chart."
172
+ },
173
+ {
174
+ slot: "response",
175
+ recipe: "none",
176
+ part: "Active slice",
177
+ why: "The hovered slice pulls outward and the rest dim at once; the geometry change itself eases (see transition)."
178
+ },
179
+ {
180
+ slot: "transition",
181
+ recipe: "custom",
182
+ part: "Slices",
183
+ why: "Geometry eases from the old shape to the new one through a CSS `d` transition on the motion tokens (no recipe animates path geometry); browsers without `d` transitions update in place."
184
+ },
185
+ {
186
+ slot: "activity",
187
+ recipe: "none",
188
+ part: "PieChart",
189
+ why: "A chart has no indeterminate state; show a Skeleton while the data loads."
190
+ }
191
+ ],
192
+ a11y: [
193
+ "The drawing is aria-hidden; the same numbers are in a visually hidden data table (captioned by `label`) that the chart is aria-describedby, so assistive tech reads values, not shapes.",
194
+ 'With a tooltip, the chart is one tab stop (role=group, aria-roledescription="chart"): arrow keys, Home and End step through the data, Escape clears, and each step is announced in a polite live region.',
195
+ "Colour is never the only key: series are named in the legend, tooltip and table."
196
+ ],
197
+ examples: [
198
+ {
199
+ label: "Donut with a total",
200
+ code: 'const sources = [\n { source: "Search", visitors: 275 },\n { source: "Direct", visitors: 200 },\n { source: "Social", visitors: 187 },\n { source: "Email", visitors: 90 },\n]\n\n<PieChart\n label="Visitors by source"\n data={sources}\n index="source"\n valueKey="visitors"\n donut\n centerLabel={{ value: 752, label: "Visitors" }}\n/>'
201
+ },
202
+ {
203
+ label: "Labelled slices",
204
+ code: '<PieChart\n label="Share of visitors by source"\n data={sources}\n index="source"\n valueKey="visitors"\n labels="outside"\n labelContent="percent"\n categories={{ Search: { tone: "primary" }, Email: { tone: "neutral" } }}\n/>'
205
+ }
206
+ ]
207
+ };
208
+ export {
209
+ pieChartMeta
210
+ };
@@ -0,0 +1,9 @@
1
+ // src/components/pill/index.ts
2
+ import { Pill } from "./pill.js";
3
+ import { pillVariants } from "./pill.variants.js";
4
+ import { pillMeta } from "./pill.meta.js";
5
+ export {
6
+ Pill,
7
+ pillMeta,
8
+ pillVariants
9
+ };
@@ -0,0 +1,24 @@
1
+ // src/components/pill/pill.tsx
2
+ import { cn } from "../../lib/cn.js";
3
+ import { trimLabel } from "../../lib/trim-label.js";
4
+ import { pillVariants } from "./pill.variants.js";
5
+ import { jsxs } from "react/jsx-runtime";
6
+ function Pill({ selected = false, appearance, size, icon, className, children, type, ...props }) {
7
+ return /* @__PURE__ */ jsxs(
8
+ "button",
9
+ {
10
+ type: type ?? "button",
11
+ "aria-pressed": selected,
12
+ className: cn(pillVariants({ appearance, size, selected }), className),
13
+ ...props,
14
+ children: [
15
+ icon,
16
+ trimLabel(children)
17
+ ]
18
+ }
19
+ );
20
+ }
21
+ Pill.displayName = "Pill";
22
+ export {
23
+ Pill
24
+ };
@@ -0,0 +1,108 @@
1
+ // src/components/pill/pill.meta.ts
2
+ var pillMeta = {
3
+ name: "Pill",
4
+ summary: 'A chip someone clicks: a filter, a tag choice, an option in a row. Always a button with aria-pressed. appearance="solid" (filters; selected lifts onto the primary surface) or "outline" (quiet chips that annotate content, like reactions); size md or sm. A static label is a Badge.',
5
+ status: "stable",
6
+ keywords: [
7
+ "pill",
8
+ "chip",
9
+ "filter",
10
+ "tag",
11
+ "toggle chip",
12
+ "category"
13
+ ],
14
+ usage: {
15
+ description: "Use Pill for a row of filters or choices a person clicks to narrow or toggle what they see. For a label that only describes something, use Badge.",
16
+ bestPractices: [
17
+ {
18
+ guidance: "do",
19
+ description: "Use short text that names the filter or choice."
20
+ },
21
+ {
22
+ guidance: "do",
23
+ description: "Reflect the current choice with selected, so the active filter reads at a glance."
24
+ },
25
+ {
26
+ guidance: "dont",
27
+ description: "Do not use Pill as a static label. A pressable-looking chip that does nothing is the most common cause of dead clicks in a filter row \u2014 that is a Badge."
28
+ },
29
+ {
30
+ guidance: "dont",
31
+ description: "Do not use Pill for primary actions or important system status."
32
+ },
33
+ {
34
+ guidance: "dont",
35
+ description: 'Do not restyle a Pill with border or background classes to get a quieter chip. That is appearance="outline" (and size="sm" for a small one); an override is a look that exists nowhere else in the system.'
36
+ }
37
+ ]
38
+ },
39
+ related: {
40
+ components: [
41
+ "Badge",
42
+ "ToggleGroup"
43
+ ]
44
+ },
45
+ props: [
46
+ {
47
+ name: "selected",
48
+ type: "boolean",
49
+ default: "false",
50
+ description: "Marks the pill as chosen. Solid lifts onto the primary surface; outline takes a primary tint and soft primary edge. Sets aria-pressed."
51
+ },
52
+ {
53
+ name: "appearance",
54
+ type: '"solid" | "outline"',
55
+ default: '"solid"',
56
+ description: "solid for a filter row; outline for quiet chips that annotate other content (a reaction under a message, a tag on a card), where a filled chip would compete with what it annotates."
57
+ },
58
+ {
59
+ name: "size",
60
+ type: '"md" | "sm"',
61
+ default: '"md"',
62
+ description: "md sits on the density ladder's xs control height (28px); sm is 24px, for chips under or inside other content."
63
+ },
64
+ {
65
+ name: "icon",
66
+ type: "ReactNode",
67
+ description: 'Optional leading glyph (e.g. <Icon name="lock" />), rendered before the children with the base gap.'
68
+ }
69
+ ],
70
+ variants: {
71
+ appearance: ["solid", "outline"],
72
+ size: ["md", "sm"],
73
+ selected: ["true", "false"]
74
+ },
75
+ tokensUsed: [
76
+ "secondary",
77
+ "secondary-foreground",
78
+ "accent",
79
+ "accent-foreground",
80
+ "primary",
81
+ "primary-foreground",
82
+ "card",
83
+ "border",
84
+ "muted-foreground",
85
+ "foreground"
86
+ ],
87
+ a11y: [
88
+ 'Renders a native <button type="button"> for focus and keyboard activation.',
89
+ "Selected state is exposed via aria-pressed."
90
+ ],
91
+ examples: [
92
+ {
93
+ label: "Filter row",
94
+ code: "<Row gap={1}><Pill selected onClick={() => {}}>All</Pill><Pill onClick={() => {}}>Editions</Pill><Pill onClick={() => {}}>Collectibles</Pill></Row>"
95
+ },
96
+ {
97
+ label: "Outline, small (reactions)",
98
+ code: '<Row gap={1}><Pill appearance="outline" size="sm" selected onClick={() => {}}>\u{1F389} 3</Pill><Pill appearance="outline" size="sm" onClick={() => {}}>\u{1F440}</Pill></Row>'
99
+ },
100
+ {
101
+ label: "With icon",
102
+ code: '<Pill icon={<Icon name="lock" />} onClick={() => {}}>Locked</Pill>'
103
+ }
104
+ ]
105
+ };
106
+ export {
107
+ pillMeta
108
+ };