@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,214 @@
1
+ // src/lib/taxonomy.ts
2
+ var COMPONENT_GROUPS = [
3
+ "Actions",
4
+ "Badges & pills",
5
+ "Charts",
6
+ "Chat & AI",
7
+ "Containers",
8
+ "Data display",
9
+ "Forms",
10
+ "Layout",
11
+ "Loading & progress",
12
+ "Media & mockups",
13
+ "Navigation",
14
+ "Overlays",
15
+ "Selection",
16
+ "Status",
17
+ "Text & code"
18
+ ];
19
+ var COMPONENT_TAXONOMY = {
20
+ /* ── Actions ──────────────────────────────────────────────────────────────
21
+ Things whose whole purpose is to DO something on activation. `OverflowMenu`
22
+ is here, not in Overlays: it is the "more actions" button a reader reaches
23
+ for as an action (and the options half of Button's "main action with
24
+ options" pattern) — that its list opens in a layer is how it works, not
25
+ what it is. Copying is `useCopy` on a Button, not a component. */
26
+ Button: ["Actions", "either"],
27
+ OverflowMenu: ["Actions", "either"],
28
+ Toolbar: ["Actions", "either"],
29
+ /* ── Forms ────────────────────────────────────────────────────────────────
30
+ Typing or entering a value, and the structure a form is built from.
31
+ Choosing from options moved out to Selection. `ColorField` and
32
+ `ScrubField` are form vocabulary that happens to be used in tool chrome —
33
+ the register tag carries that, not the group. */
34
+ Calendar: ["Forms", "either"],
35
+ ColorField: ["Forms", "either"],
36
+ DatePicker: ["Forms", "either"],
37
+ Fieldset: ["Forms", "either"],
38
+ FileDropzone: ["Forms", "page"],
39
+ Form: ["Forms", "either"],
40
+ Input: ["Forms", "either"],
41
+ Label: ["Forms", "either"],
42
+ NumberField: ["Forms", "either"],
43
+ OtpField: ["Forms", "either"],
44
+ ScrubField: ["Forms", "workspace"],
45
+ SearchInput: ["Forms", "either"],
46
+ Textarea: ["Forms", "either"],
47
+ /* ── Selection ────────────────────────────────────────────────────────────
48
+ Choosing from options: on/off, one of many, several of many, a point on a
49
+ range. Split from Forms so a 27-item group became two a reader can scan.
50
+ `Toggle` sits with `Switch`, which its own meta calls its sibling;
51
+ `ThemeSelector`/`ThemeSwitcher` capture a stored preference. */
52
+ Checkbox: ["Selection", "either"],
53
+ CheckboxCard: ["Selection", "page"],
54
+ RadioCard: ["Selection", "page"],
55
+ Combobox: ["Selection", "either"],
56
+ DisclosurePicker: ["Selection", "either"],
57
+ FontPicker: ["Selection", "either"],
58
+ Radio: ["Selection", "either"],
59
+ Select: ["Selection", "either"],
60
+ Slider: ["Selection", "either"],
61
+ Switch: ["Selection", "either"],
62
+ ThemeSelector: ["Selection", "either"],
63
+ ThemeSwitcher: ["Selection", "either"],
64
+ Toggle: ["Selection", "either"],
65
+ /* ── Overlays ─────────────────────────────────────────────────────────────
66
+ Anything that renders above the page in its own layer. */
67
+ CommandMenu: ["Overlays", "either"],
68
+ ContextCard: ["Overlays", "page"],
69
+ ContextMenu: ["Overlays", "either"],
70
+ DestructiveActionModal: ["Overlays", "either"],
71
+ Dialog: ["Overlays", "either"],
72
+ Feedback: ["Overlays", "page"],
73
+ Menu: ["Overlays", "either"],
74
+ Popover: ["Overlays", "either"],
75
+ SettingsMenu: ["Overlays", "either"],
76
+ Sheet: ["Overlays", "either"],
77
+ Tooltip: ["Overlays", "either"],
78
+ /* ── Navigation ───────────────────────────────────────────────────────────
79
+ Getting somewhere else, or to more of the same thing. `Pagination` and
80
+ `ShowMore` (and a `Button` with `loading` for load-more) reveal more content and
81
+ stay together; `Tree` is the hierarchy browser. */
82
+ Breadcrumbs: ["Navigation", "either"],
83
+ BottomNav: ["Navigation", "page"],
84
+ Pagination: ["Navigation", "either"],
85
+ ShowMore: ["Navigation", "page"],
86
+ SideNav: ["Navigation", "page"],
87
+ Sidebar: ["Navigation", "page"],
88
+ Tabs: ["Navigation", "either"],
89
+ Tree: ["Navigation", "workspace"],
90
+ /* ── Layout ───────────────────────────────────────────────────────────────
91
+ The frame a product lives in, in either register (renamed from "Shells":
92
+ a designer looks for the app header and panels under Layout). The layout
93
+ PRIMITIVES — Stack, Row, Region, Grid — are foundations, not components,
94
+ and live on the Grid & layout page. */
95
+ AppHeader: ["Layout", "page"],
96
+ AppShell: ["Layout", "page"],
97
+ PageHeader: ["Layout", "page"],
98
+ PanelGroup: ["Layout", "workspace"],
99
+ PanelSection: ["Layout", "workspace"],
100
+ SectionHeader: ["Layout", "page"],
101
+ StatusBar: ["Layout", "workspace"],
102
+ Workspace: ["Layout", "workspace"],
103
+ /* ── Containers ───────────────────────────────────────────────────────────
104
+ A box that holds other content: bounds it, folds it, scrolls it, divides
105
+ it. `Card` moved here from Data Display — people look for a card as a
106
+ container, not as a way of showing data. */
107
+ Accordion: ["Containers", "either"],
108
+ Card: ["Containers", "page"],
109
+ Collapsible: ["Containers", "either"],
110
+ Scroller: ["Containers", "either"],
111
+ Separator: ["Containers", "either"],
112
+ /* ── Charts ───────────────────────────────────────────────────────────────
113
+ Plotted data for dashboards, landing pages and decks: SVG on the theme's
114
+ tones, with arrival and data-change motion and a data table for assistive
115
+ tech. Data-heavy apps (streaming, zoom, thousands of points) belong on a
116
+ charting library. `SegmentedBar` and `Meter` stay in Data display: they
117
+ are readings, not plots. */
118
+ AreaChart: ["Charts", "page"],
119
+ BarChart: ["Charts", "page"],
120
+ LineChart: ["Charts", "page"],
121
+ PieChart: ["Charts", "page"],
122
+ RadarChart: ["Charts", "page"],
123
+ RadialChart: ["Charts", "page"],
124
+ Sparkline: ["Charts", "either"],
125
+ /* ── Data display ─────────────────────────────────────────────────────────
126
+ Showing records and readings. `Meter` (bar or ring) is here: it shows a
127
+ value within a known range (a reading), which is not loading or progress. */
128
+ Avatar: ["Data display", "either"],
129
+ DataTable: ["Data display", "either"],
130
+ DateTile: ["Data display", "page"],
131
+ Entity: ["Data display", "either"],
132
+ GlidingHighlight: ["Data display", "either"],
133
+ Meter: ["Data display", "either"],
134
+ RelativeTime: ["Data display", "either"],
135
+ SegmentedBar: ["Data display", "either"],
136
+ Table: ["Data display", "either"],
137
+ /* ── Badges & pills ───────────────────────────────────────────────────────
138
+ Small labelled shapes. `Badge` (with `dot`) / `StatusDot` belong HERE, not in
139
+ Status: an earlier audit moved them next to Toast/Banner and the crossing
140
+ links went UP (14 → 21) — they relate to Badge, Pill and Entity, which is
141
+ a badge-shaped argument. This group makes that finding the obvious home. */
142
+ Badge: ["Badges & pills", "either"],
143
+ NotificationBadge: ["Badges & pills", "either"],
144
+ Pill: ["Badges & pills", "page"],
145
+ StatusDot: ["Badges & pills", "either"],
146
+ /* ── Text & code ──────────────────────────────────────────────────────────
147
+ Presenting a string: code, a shortcut, a truncated path, a copyable value. */
148
+ Code: ["Text & code", "either"],
149
+ CodeBlock: ["Text & code", "either"],
150
+ Kbd: ["Text & code", "either"],
151
+ MiddleTruncate: ["Text & code", "either"],
152
+ /* ── Status ───────────────────────────────────────────────────────────────
153
+ Telling the user what happened or what state they are in: alerts,
154
+ callouts, empty and error states. `Note` (a callout) joins Banner and
155
+ Toast — it is where a designer looks for an "alert" box. */
156
+ Banner: ["Status", "page"],
157
+ EmptyState: ["Status", "page"],
158
+ InlineStatus: ["Status", "either"],
159
+ Note: ["Status", "page"],
160
+ Toast: ["Status", "either"],
161
+ /* ── Loading & progress ───────────────────────────────────────────────────
162
+ Waiting, and how far along something is. */
163
+ PageLoader: ["Loading & progress", "page"],
164
+ Progress: ["Loading & progress", "either"],
165
+ Skeleton: ["Loading & progress", "either"],
166
+ Spinner: ["Loading & progress", "either"],
167
+ Stepper: ["Loading & progress", "page"],
168
+ /* ── Chat & AI ────────────────────────────────────────────────────────────
169
+ A deliberate exception to "group by kind", made for finding: someone
170
+ building a conversation looks for one place, and these were scattered
171
+ across five groups. The rule that keeps it from becoming a second home for
172
+ everything: a member exists ONLY inside a conversation. A Button used in a
173
+ chat is still a Button; a Message has no meaning outside one. */
174
+ Attachment: ["Chat & AI", "either"],
175
+ Bubble: ["Chat & AI", "either"],
176
+ ChatComposer: ["Chat & AI", "either"],
177
+ Marker: ["Chat & AI", "either"],
178
+ Message: ["Chat & AI", "either"],
179
+ MessageScroller: ["Chat & AI", "either"],
180
+ StreamingText: ["Chat & AI", "either"],
181
+ ThinkingOrb: ["Chat & AI", "either"],
182
+ /* ── Media & mockups ──────────────────────────────────────────────────────
183
+ Presenting images and video: players, galleries, scrolling strips, and the
184
+ device frames a product image sits in. `Video` was filed as a mockup; it is
185
+ a player, and it sits with the other media now. */
186
+ Browser: ["Media & mockups", "page"],
187
+ Carousel: ["Media & mockups", "page"],
188
+ GradientArt: ["Media & mockups", "either"],
189
+ Marquee: ["Media & mockups", "page"],
190
+ MediaImage: ["Media & mockups", "either"],
191
+ MediaTile: ["Media & mockups", "page"],
192
+ Phone: ["Media & mockups", "page"],
193
+ Video: ["Media & mockups", "page"]
194
+ };
195
+ function componentsInGroup(group) {
196
+ return Object.entries(COMPONENT_TAXONOMY).filter(([, [g]]) => g === group).map(([name]) => name).sort((a, b) => componentLabel(a).localeCompare(componentLabel(b)));
197
+ }
198
+ function componentSlug(name) {
199
+ return name.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
200
+ }
201
+ var LABEL_OVERRIDES = {
202
+ DestructiveActionModal: "Destructive Modal",
203
+ OtpField: "OTP Field"
204
+ };
205
+ function componentLabel(name) {
206
+ return LABEL_OVERRIDES[name] ?? name.replace(/([a-z0-9])([A-Z])/g, "$1 $2");
207
+ }
208
+ export {
209
+ COMPONENT_GROUPS,
210
+ COMPONENT_TAXONOMY,
211
+ componentLabel,
212
+ componentSlug,
213
+ componentsInGroup
214
+ };
@@ -0,0 +1,20 @@
1
+ // src/lib/trim-label.tsx
2
+ import { Children, isValidElement } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ function trimLabel(children) {
5
+ if (typeof children === "string" || typeof children === "number") {
6
+ return /* @__PURE__ */ jsx("span", { className: "sable-label-trim", children });
7
+ }
8
+ if (children == null || typeof children === "boolean") return children;
9
+ if (isValidElement(children)) return children;
10
+ let wrapped = false;
11
+ const out = Children.map(children, (child, i) => {
12
+ if (typeof child !== "string" && typeof child !== "number") return child;
13
+ wrapped = true;
14
+ return /* @__PURE__ */ jsx("span", { className: "sable-label-trim", children: child }, `label-${i}`);
15
+ });
16
+ return wrapped ? out : children;
17
+ }
18
+ export {
19
+ trimLabel
20
+ };
@@ -0,0 +1,27 @@
1
+ "use client";
2
+
3
+ // src/lib/use-copy.ts
4
+ import { useCallback, useEffect, useRef, useState } from "react";
5
+ function useCopy(text, { timeout = 1500 } = {}) {
6
+ const [copied, setCopied] = useState(false);
7
+ const timer = useRef(null);
8
+ useEffect(() => () => {
9
+ if (timer.current) clearTimeout(timer.current);
10
+ }, []);
11
+ const copy = useCallback(async () => {
12
+ if (typeof navigator === "undefined" || !navigator.clipboard) return false;
13
+ try {
14
+ await navigator.clipboard.writeText(text);
15
+ } catch {
16
+ return false;
17
+ }
18
+ setCopied(true);
19
+ if (timer.current) clearTimeout(timer.current);
20
+ timer.current = setTimeout(() => setCopied(false), timeout);
21
+ return true;
22
+ }, [text, timeout]);
23
+ return { copy, copied };
24
+ }
25
+ export {
26
+ useCopy
27
+ };
@@ -0,0 +1,32 @@
1
+ "use client";
2
+
3
+ // src/lib/use-edge-fade.ts
4
+ import { useCallback, useState } from "react";
5
+ import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
6
+ import { useResizeObserver } from "./use-resize-observer.js";
7
+ function useEdgeFade(ref, orientation) {
8
+ const [showStart, setShowStart] = useState(false);
9
+ const [showEnd, setShowEnd] = useState(false);
10
+ const sync = useCallback(() => {
11
+ const el = ref.current;
12
+ if (!el) return;
13
+ if (orientation === "horizontal") {
14
+ const { scrollLeft, scrollWidth, clientWidth } = el;
15
+ setShowStart(scrollLeft > 0);
16
+ setShowEnd(scrollLeft < scrollWidth - clientWidth - 1);
17
+ } else {
18
+ const { scrollTop, scrollHeight, clientHeight } = el;
19
+ setShowStart(scrollTop > 0);
20
+ setShowEnd(scrollTop < scrollHeight - clientHeight - 1);
21
+ }
22
+ }, [ref, orientation]);
23
+ useIsomorphicLayoutEffect(sync);
24
+ useResizeObserver(sync, [ref]);
25
+ const fade = "calc(var(--spacing) * 7)";
26
+ const direction = orientation === "vertical" ? "bottom" : "right";
27
+ const mask = showStart || showEnd ? `linear-gradient(to ${direction}, ${showStart ? "transparent" : "#000"}, #000 ${showStart ? fade : "0"}, #000 ${showEnd ? `calc(100% - ${fade})` : "100%"}, ${showEnd ? "transparent" : "#000"})` : void 0;
28
+ return { sync, style: mask ? { maskImage: mask, WebkitMaskImage: mask } : void 0 };
29
+ }
30
+ export {
31
+ useEdgeFade
32
+ };
@@ -0,0 +1,8 @@
1
+ "use client";
2
+
3
+ // src/lib/use-isomorphic-layout-effect.ts
4
+ import { useEffect, useLayoutEffect } from "react";
5
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
6
+ export {
7
+ useIsomorphicLayoutEffect
8
+ };
@@ -0,0 +1,18 @@
1
+ "use client";
2
+
3
+ // src/lib/use-resize-observer.ts
4
+ import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
5
+ function useResizeObserver(measure, refs) {
6
+ useIsomorphicLayoutEffect(() => {
7
+ measure();
8
+ if (typeof ResizeObserver === "undefined") return;
9
+ const ro = new ResizeObserver(measure);
10
+ for (const ref of refs) {
11
+ if (ref.current) ro.observe(ref.current);
12
+ }
13
+ return () => ro.disconnect();
14
+ }, [measure]);
15
+ }
16
+ export {
17
+ useResizeObserver
18
+ };
@@ -0,0 +1,52 @@
1
+ "use client";
2
+
3
+ // src/lib/use-scroll-activity.ts
4
+ import { useCallback, useEffect, useRef } from "react";
5
+ var LINGER_MS = 600;
6
+ function useScrollActivity() {
7
+ const nodeRef = useRef(null);
8
+ const timer = useRef(null);
9
+ const clear = useCallback(() => {
10
+ if (timer.current !== null) {
11
+ window.clearTimeout(timer.current);
12
+ timer.current = null;
13
+ }
14
+ }, []);
15
+ const onScroll = useCallback(() => {
16
+ const node = nodeRef.current;
17
+ if (!node) return;
18
+ node.setAttribute("data-scrolling", "");
19
+ clear();
20
+ timer.current = window.setTimeout(() => {
21
+ nodeRef.current?.removeAttribute("data-scrolling");
22
+ timer.current = null;
23
+ }, LINGER_MS);
24
+ }, [clear]);
25
+ const setNode = useCallback(
26
+ (node) => {
27
+ const previous = nodeRef.current;
28
+ if (previous === node) return;
29
+ if (previous) {
30
+ previous.removeEventListener("scroll", onScroll);
31
+ previous.removeAttribute("data-scrolling");
32
+ }
33
+ nodeRef.current = node;
34
+ if (node) node.addEventListener("scroll", onScroll, { passive: true });
35
+ },
36
+ [onScroll]
37
+ );
38
+ useEffect(() => {
39
+ return () => {
40
+ clear();
41
+ const node = nodeRef.current;
42
+ if (node) {
43
+ node.removeEventListener("scroll", onScroll);
44
+ node.removeAttribute("data-scrolling");
45
+ }
46
+ };
47
+ }, [clear, onScroll]);
48
+ return setNode;
49
+ }
50
+ export {
51
+ useScrollActivity
52
+ };
@@ -0,0 +1,65 @@
1
+ "use client";
2
+
3
+ // src/lib/use-wheel-to-horizontal.ts
4
+ import { useCallback, useRef } from "react";
5
+ var LINE_HEIGHT = 16;
6
+ var PAGE_HEIGHT = 400;
7
+ function toPixels(delta, mode) {
8
+ if (mode === 1) return delta * LINE_HEIGHT;
9
+ if (mode === 2) return delta * PAGE_HEIGHT;
10
+ return delta;
11
+ }
12
+ function useWheelToHorizontal(enabled = true) {
13
+ const nodeRef = useRef(null);
14
+ const onWheel = useCallback((event) => {
15
+ const el = nodeRef.current;
16
+ if (!el) return;
17
+ if (event.shiftKey) return;
18
+ if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;
19
+ if (event.deltaY === 0) return;
20
+ const delta = toPixels(event.deltaY, event.deltaMode);
21
+ const max = el.scrollWidth - el.clientWidth;
22
+ if (max <= 0) return;
23
+ const atStart = Math.round(el.scrollLeft) <= 0;
24
+ const atEnd = Math.round(el.scrollLeft) >= max;
25
+ if (delta < 0 && atStart || delta > 0 && atEnd) return;
26
+ event.preventDefault();
27
+ el.scrollLeft += delta;
28
+ }, []);
29
+ return useCallback(
30
+ (node) => {
31
+ const previous = nodeRef.current;
32
+ if (previous === node) return;
33
+ previous?.removeEventListener("wheel", onWheel);
34
+ nodeRef.current = node;
35
+ if (node && enabled) {
36
+ node.addEventListener("wheel", onWheel, { passive: false });
37
+ }
38
+ },
39
+ [enabled, onWheel]
40
+ );
41
+ }
42
+ function scrollRegionKeyDown(event, orientation) {
43
+ const el = event.currentTarget;
44
+ const horizontal = orientation === "horizontal";
45
+ const page = horizontal ? el.clientWidth : el.clientHeight;
46
+ const step = Math.max(40, page * 0.2);
47
+ const back = horizontal ? "ArrowLeft" : "ArrowUp";
48
+ const forward = horizontal ? "ArrowRight" : "ArrowDown";
49
+ const axis = horizontal ? "scrollLeft" : "scrollTop";
50
+ const max = horizontal ? el.scrollWidth - el.clientWidth : el.scrollHeight - el.clientHeight;
51
+ let next = null;
52
+ if (event.key === back) next = el[axis] - step;
53
+ else if (event.key === forward) next = el[axis] + step;
54
+ else if (event.key === "Home") next = 0;
55
+ else if (event.key === "End") next = max;
56
+ else if (event.key === "PageUp") next = el[axis] - page;
57
+ else if (event.key === "PageDown") next = el[axis] + page;
58
+ if (next === null) return;
59
+ event.preventDefault();
60
+ el[axis] = Math.max(0, Math.min(max, next));
61
+ }
62
+ export {
63
+ scrollRegionKeyDown,
64
+ useWheelToHorizontal
65
+ };
@@ -0,0 +1,75 @@
1
+ "use client";
2
+
3
+ // src/motion/MotionProvider.tsx
4
+ import {
5
+ createContext,
6
+ useCallback,
7
+ useContext,
8
+ useEffect,
9
+ useMemo,
10
+ useState
11
+ } from "react";
12
+ import { useReducedMotion } from "./useReducedMotion.js";
13
+ import { jsx } from "react/jsx-runtime";
14
+ var MotionContext = createContext(null);
15
+ function resolveEnabled(policy, prefersReducedMotion) {
16
+ if (policy === "off" || policy === "reduced") return false;
17
+ if (policy === "full") return true;
18
+ return !prefersReducedMotion;
19
+ }
20
+ function MotionProvider({
21
+ children,
22
+ defaultPolicy = "system",
23
+ policy: controlledPolicy,
24
+ onPolicyChange,
25
+ target = "root"
26
+ }) {
27
+ const [uncontrolled, setUncontrolled] = useState(defaultPolicy);
28
+ const policy = controlledPolicy ?? uncontrolled;
29
+ const prefersReducedMotion = useReducedMotion();
30
+ const setPolicy = useCallback(
31
+ (next) => {
32
+ if (controlledPolicy === void 0) setUncontrolled(next);
33
+ onPolicyChange?.(next);
34
+ },
35
+ [controlledPolicy, onPolicyChange]
36
+ );
37
+ useEffect(() => {
38
+ const el = target === "root" ? typeof document !== "undefined" ? document.documentElement : null : target();
39
+ if (!el) return;
40
+ if (policy === "system") {
41
+ el.removeAttribute("data-motion");
42
+ } else {
43
+ el.setAttribute("data-motion", policy);
44
+ }
45
+ return () => {
46
+ el.removeAttribute("data-motion");
47
+ };
48
+ }, [policy, target]);
49
+ const value = useMemo(
50
+ () => ({
51
+ policy,
52
+ setPolicy,
53
+ prefersReducedMotion,
54
+ enabled: resolveEnabled(policy, prefersReducedMotion)
55
+ }),
56
+ [policy, setPolicy, prefersReducedMotion]
57
+ );
58
+ return /* @__PURE__ */ jsx(MotionContext.Provider, { value, children });
59
+ }
60
+ function useMotion() {
61
+ const ctx = useContext(MotionContext);
62
+ const prefersReducedMotion = useReducedMotion();
63
+ if (ctx) return ctx;
64
+ return {
65
+ policy: "system",
66
+ setPolicy: () => {
67
+ },
68
+ prefersReducedMotion,
69
+ enabled: resolveEnabled("system", prefersReducedMotion)
70
+ };
71
+ }
72
+ export {
73
+ MotionProvider,
74
+ useMotion
75
+ };
@@ -0,0 +1,112 @@
1
+ "use client";
2
+
3
+ // src/motion/Presence.tsx
4
+ import { cloneElement, isValidElement, useRef, useState } from "react";
5
+ import { mergeRefs } from "../lib/refs.js";
6
+ import { useIsomorphicLayoutEffect } from "../lib/use-isomorphic-layout-effect.js";
7
+ import { useMotion } from "./MotionProvider.js";
8
+ function motionScale(node) {
9
+ const raw = Number.parseFloat(getComputedStyle(node).getPropertyValue("--motion-scale"));
10
+ return Number.isFinite(raw) ? Math.max(0, raw) : 1;
11
+ }
12
+ function Presence({
13
+ show,
14
+ children,
15
+ duration,
16
+ easing,
17
+ offset = 8,
18
+ onExitComplete
19
+ }) {
20
+ const { enabled } = useMotion();
21
+ const [mounted, setMounted] = useState(show);
22
+ const nodeRef = useRef(null);
23
+ const prevShow = useRef(show);
24
+ const animRef = useRef(null);
25
+ const exitCompleteRef = useRef(onExitComplete);
26
+ const didExit = useRef(false);
27
+ useIsomorphicLayoutEffect(() => {
28
+ exitCompleteRef.current = onExitComplete;
29
+ });
30
+ useIsomorphicLayoutEffect(() => () => {
31
+ if (!animRef.current) return;
32
+ animRef.current.onfinish = null;
33
+ animRef.current.oncancel = null;
34
+ animRef.current.cancel();
35
+ animRef.current = null;
36
+ }, []);
37
+ useIsomorphicLayoutEffect(() => {
38
+ if (!mounted && didExit.current) {
39
+ didExit.current = false;
40
+ exitCompleteRef.current?.();
41
+ }
42
+ }, [mounted]);
43
+ useIsomorphicLayoutEffect(() => {
44
+ const node = nodeRef.current;
45
+ const was = prevShow.current;
46
+ prevShow.current = show;
47
+ if (was === show && (enabled || !animRef.current)) return;
48
+ if (animRef.current) {
49
+ animRef.current.onfinish = null;
50
+ animRef.current.oncancel = null;
51
+ animRef.current.cancel();
52
+ animRef.current = null;
53
+ }
54
+ const canAnimate = enabled && node && typeof node.animate === "function";
55
+ const scale = node ? motionScale(node) : 1;
56
+ if (show) {
57
+ setMounted(true);
58
+ if (!canAnimate || !node) return;
59
+ animRef.current = node.animate(
60
+ [
61
+ { opacity: 0, transform: `translateY(${offset}px)` },
62
+ { opacity: 1, transform: "translateY(0)" }
63
+ ],
64
+ {
65
+ duration: (duration?.enter ?? 200) * scale,
66
+ easing: easing?.enter ?? "cubic-bezier(0, 0, 0.2, 1)",
67
+ fill: "backwards"
68
+ }
69
+ );
70
+ return;
71
+ }
72
+ const finish = () => {
73
+ if (animRef.current) {
74
+ animRef.current.onfinish = null;
75
+ animRef.current.oncancel = null;
76
+ animRef.current.cancel();
77
+ }
78
+ animRef.current = null;
79
+ didExit.current = true;
80
+ setMounted(false);
81
+ };
82
+ if (!canAnimate || !node) {
83
+ finish();
84
+ return;
85
+ }
86
+ const anim = node.animate(
87
+ [
88
+ { opacity: 1, transform: "translateY(0)" },
89
+ { opacity: 0, transform: `translateY(${offset}px)` }
90
+ ],
91
+ {
92
+ duration: (duration?.exit ?? 150) * scale,
93
+ easing: easing?.exit ?? "cubic-bezier(0.4, 0, 1, 1)",
94
+ fill: "forwards"
95
+ }
96
+ );
97
+ animRef.current = anim;
98
+ anim.onfinish = finish;
99
+ anim.oncancel = finish;
100
+ }, [show, enabled, offset, duration?.enter, duration?.exit, easing?.enter, easing?.exit]);
101
+ if (!show && !mounted) return null;
102
+ if (!isValidElement(children)) return children;
103
+ const element = children;
104
+ const childRef = element.props.ref;
105
+ return cloneElement(element, {
106
+ ref: mergeRefs(nodeRef, childRef)
107
+ });
108
+ }
109
+ Presence.displayName = "Presence";
110
+ export {
111
+ Presence
112
+ };
@@ -0,0 +1,42 @@
1
+ "use client";
2
+
3
+ // src/motion/Reveal.tsx
4
+ import { cn } from "../lib/cn.js";
5
+ import { useMotion } from "./MotionProvider.js";
6
+ import { useInView } from "./useInView.js";
7
+ import { jsx } from "react/jsx-runtime";
8
+ function Reveal({
9
+ as,
10
+ delay,
11
+ when = true,
12
+ once,
13
+ amount,
14
+ rootMargin,
15
+ className,
16
+ style,
17
+ children,
18
+ ...props
19
+ }) {
20
+ const Comp = as ?? "div";
21
+ const { enabled } = useMotion();
22
+ const { ref, inView } = useInView({ once, amount, rootMargin });
23
+ const shown = inView && when || !enabled;
24
+ return /* @__PURE__ */ jsx(
25
+ Comp,
26
+ {
27
+ ref,
28
+ "data-reveal": shown ? "in" : "out",
29
+ className: cn("motion-reveal", className),
30
+ style: delay ? {
31
+ transitionDelay: enabled ? `calc(${delay}ms * var(--motion-scale, 1))` : "0ms",
32
+ ...style
33
+ } : style,
34
+ ...props,
35
+ children
36
+ }
37
+ );
38
+ }
39
+ Reveal.displayName = "Reveal";
40
+ export {
41
+ Reveal
42
+ };