@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,54 @@
1
+ "use client";
2
+
3
+ // src/components/kbd/kbd.tsx
4
+ import { useSyncExternalStore } from "react";
5
+ import { cn } from "../../lib/cn.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ function detectApple() {
8
+ if (typeof navigator === "undefined") return false;
9
+ const nav = navigator;
10
+ const platform = nav.userAgentData?.platform || nav.platform || nav.userAgent || "";
11
+ return /mac|iphone|ipad|ipod/i.test(platform);
12
+ }
13
+ var noopSubscribe = () => () => {
14
+ };
15
+ function useIsApple() {
16
+ return useSyncExternalStore(noopSubscribe, detectApple, () => false);
17
+ }
18
+ var KBD_VARIANTS = {
19
+ key: "rounded-xs border border-border border-b-border-strong bg-[var(--sable-surface-bg,var(--background))] text-muted-foreground shadow-[0_1px_0_0_var(--border)]",
20
+ ghost: "text-current opacity-70"
21
+ };
22
+ function Kbd({ mod = false, variant = "key", className, children, ...props }) {
23
+ const apple = useIsApple();
24
+ const content = mod ? apple ? "\u2318" : "Ctrl" : children;
25
+ return /* @__PURE__ */ jsx(
26
+ "kbd",
27
+ {
28
+ "data-slot": "kbd",
29
+ className: cn(
30
+ "inline-flex h-[1.6em] min-w-[1.6em] items-center justify-center px-[0.4em] align-middle font-sans text-[max(0.75rem,0.85em)] font-medium leading-none tabular-nums",
31
+ KBD_VARIANTS[variant],
32
+ className
33
+ ),
34
+ ...props,
35
+ children: content
36
+ }
37
+ );
38
+ }
39
+ Kbd.displayName = "Kbd";
40
+ function KbdGroup({ className, ...props }) {
41
+ return /* @__PURE__ */ jsx(
42
+ "kbd",
43
+ {
44
+ "data-slot": "kbd-group",
45
+ className: cn("inline-flex items-center gap-[0.2em] align-middle", className),
46
+ ...props
47
+ }
48
+ );
49
+ }
50
+ KbdGroup.displayName = "KbdGroup";
51
+ export {
52
+ Kbd,
53
+ KbdGroup
54
+ };
@@ -0,0 +1,95 @@
1
+ // src/components/kbd/kbd.meta.ts
2
+ var kbdMeta = {
3
+ name: "Kbd",
4
+ summary: 'A keyboard key indicator. Renders a raised <kbd> key cap sized from the surrounding text, so one Kbd fits body copy, menus and tooltips; KbdGroup sets one cap per key for a combo. `mod` renders the platform modifier (\u2318 or Ctrl); `variant="ghost"` is the bare label for menu rows and tooltips.',
5
+ status: "stable",
6
+ keywords: [
7
+ "keyboard",
8
+ "shortcut",
9
+ "key",
10
+ "kbd"
11
+ ],
12
+ usage: {
13
+ description: "Use Kbd to display keyboard keys or shortcuts in help text, menus, and docs.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use it only for literal keyboard input such as Cmd, Enter, or Esc."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Show a combo as one cap per key inside KbdGroup \u2014 `<KbdGroup><Kbd mod /><Kbd>K</Kbd></KbdGroup>` \u2014 not several keys typed into one cap."
22
+ },
23
+ {
24
+ guidance: "do",
25
+ description: 'Use `variant="ghost"` where the shortcut sits on a surface of its own \u2014 a menu row\'s trailing slot, a tooltip \u2014 so it reads as a hint, not a second control.'
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not use Kbd as a decorative badge or button replacement."
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: "Do not set a text size on a Kbd. It sizes itself from the text around it."
34
+ },
35
+ {
36
+ guidance: "dont",
37
+ description: "Do not hardcode \u2318 or Ctrl. The modifier differs by platform; use `<Kbd mod />`, which renders \u2318 on macOS/iOS and Ctrl elsewhere, or Windows users read Mac keys."
38
+ }
39
+ ]
40
+ },
41
+ related: {
42
+ components: [
43
+ "Code",
44
+ "Menu",
45
+ "CommandMenu"
46
+ ]
47
+ },
48
+ props: [
49
+ {
50
+ name: "mod",
51
+ type: "boolean",
52
+ default: "false",
53
+ description: "Render the platform's shortcut modifier in place of children: \u2318 on macOS and iOS, Ctrl everywhere else. Server-rendered as Ctrl and corrected on hydration."
54
+ },
55
+ {
56
+ name: "variant",
57
+ type: '"key" | "ghost"',
58
+ default: '"key"',
59
+ description: "`key`: a raised cap on the surface it sits on, with a heavier bottom edge as the key's lip. `ghost`: the bare label, for menu rows, tooltips and other surfaces that are already a frame."
60
+ },
61
+ {
62
+ name: "className",
63
+ type: "string",
64
+ description: "Merge additional classes onto the key cap."
65
+ },
66
+ {
67
+ name: "...props",
68
+ type: 'ComponentPropsWithRef<"kbd">',
69
+ description: "All native <kbd> attributes (children, ref, etc.)."
70
+ }
71
+ ],
72
+ tokensUsed: ["border", "border-strong", "background", "muted-foreground"],
73
+ a11y: [
74
+ "Uses the semantic <kbd> element so assistive tech announces keyboard input.",
75
+ "KbdGroup is itself a <kbd> around the per-key caps \u2014 the HTML spelling of one key combination \u2014 so the combo is announced as a single piece of input.",
76
+ "Sized in em from the surrounding text, so it scales with the user's text size and never shrinks below 12px."
77
+ ],
78
+ examples: [
79
+ {
80
+ label: "Single keys",
81
+ code: "<Kbd>Esc</Kbd>"
82
+ },
83
+ {
84
+ label: "Combo",
85
+ code: "<KbdGroup><Kbd mod /><Kbd>K</Kbd></KbdGroup>"
86
+ },
87
+ {
88
+ label: "In a menu row",
89
+ code: '<MenuItem>Search<KbdGroup className="ms-auto"><Kbd variant="ghost" mod /><Kbd variant="ghost">K</Kbd></KbdGroup></MenuItem>'
90
+ }
91
+ ]
92
+ };
93
+ export {
94
+ kbdMeta
95
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/label/index.ts
2
+ import { Label } from "./label.js";
3
+ import { labelMeta } from "./label.meta.js";
4
+ export {
5
+ Label,
6
+ labelMeta
7
+ };
@@ -0,0 +1,51 @@
1
+ // src/components/label/label.tsx
2
+ import { cva } from "class-variance-authority";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { SimpleTooltip } from "../tooltip/index.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ var labelVariants = cva(
7
+ "text-foreground select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
8
+ {
9
+ variants: {
10
+ size: {
11
+ xs: "text-label-xs",
12
+ sm: "text-label-sm",
13
+ md: "text-label-md",
14
+ lg: "text-label-lg"
15
+ }
16
+ },
17
+ defaultVariants: {
18
+ size: "lg"
19
+ }
20
+ }
21
+ );
22
+ function Label({
23
+ size,
24
+ eyebrow = false,
25
+ hint,
26
+ className,
27
+ tabIndex,
28
+ ...props
29
+ }) {
30
+ const labelEl = /* @__PURE__ */ jsx(
31
+ "label",
32
+ {
33
+ tabIndex: hint != null ? tabIndex ?? 0 : tabIndex,
34
+ className: cn(
35
+ labelVariants({ size }),
36
+ eyebrow && "text-overline",
37
+ hint != null && "cursor-help border-b border-dotted border-muted-foreground/40",
38
+ className
39
+ ),
40
+ ...props
41
+ }
42
+ );
43
+ if (hint == null) {
44
+ return labelEl;
45
+ }
46
+ return /* @__PURE__ */ jsx(SimpleTooltip, { content: hint, children: labelEl });
47
+ }
48
+ Label.displayName = "Label";
49
+ export {
50
+ Label
51
+ };
@@ -0,0 +1,98 @@
1
+ // src/components/label/label.meta.ts
2
+ var labelMeta = {
3
+ name: "Label",
4
+ summary: "Styled native <label>. Paired label typography via a size step (xs / sm / md / lg, all sentence case) or an uppercase eyebrow (eyebrow), non-selectable, dims when its peer control is disabled. Optional hint adds a dotted-underline tooltip affordance.",
5
+ status: "stable",
6
+ keywords: [
7
+ "label",
8
+ "form label",
9
+ "control",
10
+ "accessibility"
11
+ ],
12
+ usage: {
13
+ description: "Use Label to name a form control and create a clear accessible relationship with that control.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use explicit, persistent labels for inputs, selects, textareas, and grouped controls."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Place helper text separately so the label stays short and direct."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not rely on placeholder text as the only label for a control."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not use it as a bare styled span. A Label without htmlFor or a wrapped control looks like a label and does nothing \u2014 clicking it will not focus the field, which is the entire point."
30
+ }
31
+ ]
32
+ },
33
+ related: {
34
+ components: [
35
+ "Input",
36
+ "Textarea",
37
+ "Fieldset",
38
+ "Form",
39
+ "Field"
40
+ ]
41
+ },
42
+ props: [
43
+ {
44
+ name: "htmlFor",
45
+ type: "string",
46
+ description: "Associates the label with a control by its id (native <label for>)."
47
+ },
48
+ {
49
+ name: "size",
50
+ type: '"xs" | "sm" | "md" | "lg"',
51
+ default: '"lg"',
52
+ description: "Paired label typography step, all sentence case. xs is simply the smallest; for an uppercase eyebrow use eyebrow."
53
+ },
54
+ {
55
+ name: "eyebrow",
56
+ type: "boolean",
57
+ default: "false",
58
+ description: "Set the label as an eyebrow: the uppercase, letter-spaced text-overline tier (themeable to sentence case). Replaces size. For a kicker above a group, not an ordinary field label."
59
+ },
60
+ {
61
+ name: "hint",
62
+ type: "ReactNode",
63
+ description: "When set, the label gets a dotted-underline affordance and reveals this content in a tooltip on hover/focus."
64
+ },
65
+ {
66
+ name: "className",
67
+ type: "string",
68
+ description: "Merge or override classes via cn()."
69
+ }
70
+ ],
71
+ variants: {
72
+ size: ["xs", "sm", "md", "lg"]
73
+ },
74
+ tokensUsed: ["foreground", "muted-foreground"],
75
+ a11y: [
76
+ "Renders a native <label> \u2014 clicking it focuses/activates the associated control.",
77
+ "Associate with a control via htmlFor (matching the control's id) or by wrapping the control.",
78
+ "In a form, use Field: it renders this Label, wires htmlFor/id, and dims the label when the field is disabled. Hand-wired outside a Field, the label only dims via peer-disabled when the control carries `peer` AND precedes the Label in the DOM (Tailwind peer-* only matches a later sibling).",
79
+ "With `hint`, the label becomes focusable and the help text is announced via the tooltip's aria-describedby \u2014 so the affordance works for keyboard and screen-reader users, not just hover."
80
+ ],
81
+ examples: [
82
+ {
83
+ label: "With control",
84
+ code: '<Stack gap={1}><Label htmlFor="name">Display name</Label><Input id="name" /></Stack>'
85
+ },
86
+ {
87
+ label: "In a form",
88
+ code: '<Field label="Display name" disabled><Input /></Field>'
89
+ },
90
+ {
91
+ label: "With hint",
92
+ code: '<Label htmlFor="royalty" hint="A percentage of every resale, paid to you.">Royalty</Label>'
93
+ }
94
+ ]
95
+ };
96
+ export {
97
+ labelMeta
98
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/line-chart/index.ts
2
+ import { LineChart } from "./line-chart.js";
3
+ import { lineChartMeta } from "./line-chart.meta.js";
4
+ export {
5
+ LineChart,
6
+ lineChartMeta
7
+ };
@@ -0,0 +1,10 @@
1
+ // src/components/line-chart/line-chart.tsx
2
+ import { CartesianChart } from "../../lib/chart/cartesian.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ function LineChart(props) {
5
+ return /* @__PURE__ */ jsx(CartesianChart, { kind: "line", ...props });
6
+ }
7
+ LineChart.displayName = "LineChart";
8
+ export {
9
+ LineChart
10
+ };
@@ -0,0 +1,222 @@
1
+ // src/components/line-chart/line-chart.meta.ts
2
+ var lineChartMeta = {
3
+ name: "LineChart",
4
+ summary: "Lines over a sequence \u2014 for comparing how measures move. Smooth, linear or step curves, optional dots (coloured by series or by category) and value labels. Lines draw on as the chart scrolls into view.",
5
+ keywords: [
6
+ "chart",
7
+ "line",
8
+ "trend",
9
+ "time series",
10
+ "graph",
11
+ "compare",
12
+ "analytics",
13
+ "dashboard"
14
+ ],
15
+ usage: {
16
+ description: "Use LineChart to compare how two or more measures change over the same sequence, or to show one trend precisely (with dots and labels). Unlike AreaChart, its value axis is fitted to the data rather than forced to zero, so small movements stay visible \u2014 say so if the axis is shown.",
17
+ bestPractices: [
18
+ {
19
+ guidance: "do",
20
+ description: "Turn on dots and labels for six or fewer points, when the exact values are the story."
21
+ },
22
+ {
23
+ guidance: "do",
24
+ description: 'Use curve="step" for values that hold until they change \u2014 prices, plan tiers, headcount.'
25
+ },
26
+ {
27
+ guidance: "dont",
28
+ description: "Plot unordered categories (channels, products) as a line \u2014 the line implies a path between them; use BarChart."
29
+ },
30
+ {
31
+ guidance: "dont",
32
+ 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."
33
+ }
34
+ ]
35
+ },
36
+ related: {
37
+ components: [
38
+ "AreaChart",
39
+ "BarChart",
40
+ "Sparkline",
41
+ "Card"
42
+ ]
43
+ },
44
+ status: "beta",
45
+ props: [
46
+ {
47
+ name: "data",
48
+ type: "Record<string, unknown>[]",
49
+ description: "The rows, in order along the category axis."
50
+ },
51
+ {
52
+ name: "index",
53
+ type: "string",
54
+ description: "The datum field naming each row's category (a month, a day, a channel)."
55
+ },
56
+ {
57
+ name: "series",
58
+ type: "{ key: string; label: string; tone?: ChartTone; color?: string; icon?: string }[]",
59
+ description: "The measures to plot: the datum field, its name in the legend/tooltip/table, and its colour (a tone by role, or any CSS colour). Omitted, series take the chart palette in order: --chart-1 \u2026 --chart-8, validated for colour-blind separation in light and dark; a theme may override the set."
60
+ },
61
+ {
62
+ name: "label",
63
+ type: "string",
64
+ description: "What the chart shows. Its accessible name and the caption of the data table assistive tech reads."
65
+ },
66
+ {
67
+ name: "className",
68
+ type: "string",
69
+ default: '"h-60"',
70
+ description: "Sizes the chart (plot + legend). Set a height: `h-72`, `aspect-video h-auto`."
71
+ },
72
+ {
73
+ name: "valueFormatter",
74
+ type: "(value: number) => string",
75
+ description: 'Format values everywhere (axis, labels, tooltip, table) \u2014 units like "$12,480". Default: compact on the axis, full elsewhere.'
76
+ },
77
+ {
78
+ name: "indexFormatter",
79
+ type: "(value: string) => string",
80
+ description: 'Shorten category labels on the axis ("January" \u2192 "Jan"); the tooltip keeps the full value.'
81
+ },
82
+ {
83
+ name: "locale",
84
+ type: "string",
85
+ default: "runtime locale",
86
+ description: "BCP 47 locale for default number and date formatting."
87
+ },
88
+ {
89
+ name: "tooltip",
90
+ type: 'boolean | { indicator?: "dot" | "line" | "dashed" | "none"; hideLabel?: boolean; labelFormatter?: (label, datum) => ReactNode; showTotal?: boolean }',
91
+ default: "true",
92
+ description: "Show a tooltip on hover and keyboard focus, or configure it: the row marker, hiding the heading, rewriting it, adding a Total row."
93
+ },
94
+ {
95
+ name: "legend",
96
+ type: "boolean",
97
+ default: "true when there is more than one series",
98
+ description: "Show the legend under the chart."
99
+ },
100
+ {
101
+ name: "grid",
102
+ type: "boolean",
103
+ default: "true (false for horizontal bars)",
104
+ description: "Hairline gridlines along the value axis."
105
+ },
106
+ {
107
+ name: "xAxis",
108
+ type: "boolean",
109
+ default: "true for columns; false for horizontal bars",
110
+ description: "The horizontal axis."
111
+ },
112
+ {
113
+ name: "yAxis",
114
+ type: "boolean",
115
+ default: "false for columns; true for horizontal bars",
116
+ description: "The vertical axis."
117
+ },
118
+ {
119
+ name: "animate",
120
+ type: "boolean",
121
+ default: "true",
122
+ description: "Play the arrival once the chart scrolls into view. Reduced motion shows the finished chart."
123
+ },
124
+ {
125
+ name: "activeIndex",
126
+ type: "number | null",
127
+ description: "The highlighted row (controlled); `null` for none."
128
+ },
129
+ {
130
+ name: "defaultActiveIndex",
131
+ type: "number | null",
132
+ description: "The row highlighted at first \u2014 a tooltip already open before anyone hovers."
133
+ },
134
+ {
135
+ name: "onActiveIndexChange",
136
+ type: "(index: number | null) => void",
137
+ description: "Called as the pointer or keyboard moves between rows."
138
+ },
139
+ {
140
+ name: "curve",
141
+ type: '"smooth" | "linear" | "step"',
142
+ default: '"smooth"',
143
+ description: "How the line runs between points. `smooth` is monotone: it never overshoots a value the data does not contain."
144
+ },
145
+ {
146
+ name: "dots",
147
+ type: "boolean",
148
+ default: "false",
149
+ description: "Mark every data point with a dot."
150
+ },
151
+ {
152
+ name: "colorBy",
153
+ type: '"series" | "index"',
154
+ default: '"series"',
155
+ description: "Colour the dots by series, or each by its category."
156
+ },
157
+ {
158
+ name: "labels",
159
+ type: "boolean",
160
+ default: "false",
161
+ description: "Print each point's value above it."
162
+ }
163
+ ],
164
+ tokensUsed: [
165
+ "tone-edition",
166
+ "tone-collectible",
167
+ "tone-standard",
168
+ "tone-info",
169
+ "tone-warning",
170
+ "primary",
171
+ "muted-foreground",
172
+ "border",
173
+ "popover",
174
+ "popover-foreground",
175
+ "foreground",
176
+ "background"
177
+ ],
178
+ motion: [
179
+ {
180
+ slot: "arrival",
181
+ recipe: "custom",
182
+ part: "Line",
183
+ why: "Once on screen each line draws on from the first point (stroke-dashoffset), series staggered, then the dots and labels fade in. On the motion tokens; reduced motion shows the finished chart."
184
+ },
185
+ {
186
+ slot: "response",
187
+ recipe: "none",
188
+ part: "Cursor + tooltip",
189
+ why: "Hover and focus move the cursor and tooltip instantly \u2014 a lagging cursor reads as a slow chart."
190
+ },
191
+ {
192
+ slot: "transition",
193
+ recipe: "custom",
194
+ part: "Line + dots",
195
+ 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."
196
+ },
197
+ {
198
+ slot: "activity",
199
+ recipe: "none",
200
+ part: "LineChart",
201
+ why: "A chart has no indeterminate state; show a Skeleton while the data loads."
202
+ }
203
+ ],
204
+ a11y: [
205
+ "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.",
206
+ '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.',
207
+ "Colour is never the only key: series are named in the legend, tooltip and table."
208
+ ],
209
+ examples: [
210
+ {
211
+ label: "Compare two series",
212
+ code: '<LineChart\n label="Desktop and mobile visitors"\n data={visitors}\n index="month"\n series={[\n { key: "desktop", label: "Desktop", tone: "primary" },\n { key: "mobile", label: "Mobile", tone: "info" },\n ]}\n indexFormatter={(m) => m.slice(0, 3)}\n/>'
213
+ },
214
+ {
215
+ label: "Dots and labels",
216
+ code: '<LineChart\n label="Desktop visitors"\n data={visitors}\n index="month"\n series={[{ key: "desktop", label: "Desktop" }]}\n curve="linear"\n dots\n labels\n grid={false}\n/>'
217
+ }
218
+ ]
219
+ };
220
+ export {
221
+ lineChartMeta
222
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/marker/index.ts
2
+ import { Marker } from "./marker.js";
3
+ import { markerMeta } from "./marker.meta.js";
4
+ export {
5
+ Marker,
6
+ markerMeta
7
+ };
@@ -0,0 +1,39 @@
1
+ // src/components/marker/marker.tsx
2
+ import { Icon } from "../../icon/index.js";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { useTypeTier } from "../../lib/density.js";
5
+ import { Separator } from "../separator/separator.js";
6
+ import { markerRuleVariants, markerVariants } from "./marker.variants.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ function Marker({
9
+ variant = "status",
10
+ icon,
11
+ spin = false,
12
+ shimmer = false,
13
+ live,
14
+ className,
15
+ children,
16
+ ...props
17
+ }) {
18
+ const announce = live ?? variant === "status";
19
+ const tier = useTypeTier();
20
+ return /* @__PURE__ */ jsxs(
21
+ "div",
22
+ {
23
+ role: announce ? "status" : void 0,
24
+ "aria-live": announce ? "polite" : void 0,
25
+ className: cn(markerVariants({ variant }), tier.secondary, className),
26
+ ...props,
27
+ children: [
28
+ variant === "separator" ? /* @__PURE__ */ jsx(Separator, { "aria-hidden": true, className: markerRuleVariants() }) : null,
29
+ icon ? /* @__PURE__ */ jsx(Icon, { name: icon, spin, className: "shrink-0 text-[1.15em]" }) : null,
30
+ /* @__PURE__ */ jsx("span", { className: cn("min-w-0", shimmer && "motion-text-shimmer"), children }),
31
+ variant === "separator" ? /* @__PURE__ */ jsx(Separator, { "aria-hidden": true, className: markerRuleVariants() }) : null
32
+ ]
33
+ }
34
+ );
35
+ }
36
+ Marker.displayName = "Marker";
37
+ export {
38
+ Marker
39
+ };