@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,191 @@
1
+ "use client";
2
+
3
+ // src/components/select/select.tsx
4
+ import { Select as Base } from "@base-ui/react/select";
5
+ import {
6
+ Children,
7
+ isValidElement
8
+ } from "react";
9
+ import { Icon } from "../../icon/index.js";
10
+ import { anchoredListScroll } from "../../lib/anchored-scroll.js";
11
+ import { cn } from "../../lib/cn.js";
12
+ import { FIELD_INVALID, FIELD_SHELL_XS, MOBILE_FIELD_TIER } from "../../lib/field-shell.js";
13
+ import { withPortalThemeScope } from "../../lib/portal-theme-scope.js";
14
+ import { useAnchoredDensity, useDensity, useTypeTier } from "../../lib/density.js";
15
+ import { HighlightGlide } from "../../lib/highlight-glide.js";
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ function textContent(node) {
18
+ if (typeof node === "string") return node;
19
+ if (typeof node === "number") return String(node);
20
+ if (Array.isArray(node)) {
21
+ let text = "";
22
+ for (const part of node) {
23
+ const t = textContent(part);
24
+ if (t === void 0) return void 0;
25
+ text += t;
26
+ }
27
+ return text;
28
+ }
29
+ return void 0;
30
+ }
31
+ function deriveItemLabels(node, out = {}) {
32
+ for (const child of Children.toArray(node)) {
33
+ if (!isValidElement(child)) continue;
34
+ const props = child.props;
35
+ if (child.type === SelectItem) {
36
+ const label = props.label ?? textContent(props.children);
37
+ const { value } = props;
38
+ if ((typeof value === "string" || typeof value === "number") && label !== void 0) {
39
+ out[String(value)] = label;
40
+ }
41
+ continue;
42
+ }
43
+ if (props.children) deriveItemLabels(props.children, out);
44
+ }
45
+ return out;
46
+ }
47
+ function Select({
48
+ items,
49
+ children,
50
+ ...props
51
+ }) {
52
+ const derived = items === void 0 ? deriveItemLabels(children) : void 0;
53
+ const resolvedItems = items ?? (derived && Object.keys(derived).length > 0 ? derived : void 0);
54
+ return /* @__PURE__ */ jsx(Base.Root, { items: resolvedItems, ...props, children });
55
+ }
56
+ var SelectPortal = withPortalThemeScope(Base.Portal);
57
+ var SelectGroup = Base.Group;
58
+ var SelectValue = Base.Value;
59
+ function SelectTrigger({
60
+ className,
61
+ placeholder,
62
+ size = "md",
63
+ children,
64
+ ...props
65
+ }) {
66
+ const tier = useTypeTier();
67
+ const density = useDensity();
68
+ const mobileTier = density === "comfortable" && size === "md" && MOBILE_FIELD_TIER;
69
+ return /* @__PURE__ */ jsxs(
70
+ Base.Trigger,
71
+ {
72
+ className: cn(
73
+ `flex w-full items-center justify-between ${tier.body} text-foreground motion-interactive`,
74
+ mobileTier,
75
+ size === "xs" ? cn("h-(--control-xs) gap-1 px-1.5", FIELD_SHELL_XS) : "h-(--control-md) gap-2 rounded-sm border border-input bg-card px-3",
76
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
77
+ "data-[popup-open]:ring-2 data-[popup-open]:ring-ring",
78
+ // Invalid like every other field: Base UI marks the trigger
79
+ // `data-invalid` inside a Field, an explicit aria-invalid works too.
80
+ "data-[invalid]:border-destructive data-[invalid]:ring-destructive/30",
81
+ FIELD_INVALID,
82
+ "disabled:cursor-not-allowed disabled:opacity-50",
83
+ className
84
+ ),
85
+ ...props,
86
+ children: [
87
+ /* @__PURE__ */ jsx(Base.Value, { placeholder, children }),
88
+ /* @__PURE__ */ jsx(Base.Icon, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(
89
+ Icon,
90
+ {
91
+ name: "chevron-down",
92
+ className: "text-xs opacity-60 motion-interactive data-[popup-open]:rotate-180"
93
+ }
94
+ ) })
95
+ ]
96
+ }
97
+ );
98
+ }
99
+ function SelectContent({
100
+ className,
101
+ children,
102
+ side = "bottom",
103
+ align = "start",
104
+ sideOffset = 6,
105
+ ...props
106
+ }) {
107
+ const anchoredDensity = useAnchoredDensity();
108
+ return /* @__PURE__ */ jsx(SelectPortal, { children: /* @__PURE__ */ jsx(
109
+ Base.Positioner,
110
+ {
111
+ side,
112
+ align,
113
+ sideOffset,
114
+ className: "z-(--z-overlay)",
115
+ children: /* @__PURE__ */ jsxs(
116
+ Base.Popup,
117
+ {
118
+ ...anchoredDensity,
119
+ className: cn(
120
+ "min-w-[var(--anchor-width)] rounded-md border border-border-floating bg-popover popup-inset text-popover-foreground shadow-md outline-none",
121
+ // 18rem at rest, but never taller than the room the positioner
122
+ // measured. See lib/anchored-scroll.
123
+ anchoredListScroll,
124
+ "motion-pop",
125
+ className
126
+ ),
127
+ ...props,
128
+ children: [
129
+ /* @__PURE__ */ jsx(HighlightGlide, {}),
130
+ /* @__PURE__ */ jsx(Base.List, { children })
131
+ ]
132
+ }
133
+ )
134
+ }
135
+ ) });
136
+ }
137
+ function SelectItem({ className, children, label, ...props }) {
138
+ const tier = useTypeTier();
139
+ return /* @__PURE__ */ jsxs(
140
+ Base.Item,
141
+ {
142
+ label: label ?? textContent(children),
143
+ className: cn(
144
+ `relative flex cursor-default items-center justify-between gap-(--item-gap) rounded-popup-item px-(--item-px) py-1.5 ${tier.body} outline-none`,
145
+ "data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground",
146
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
147
+ className
148
+ ),
149
+ ...props,
150
+ children: [
151
+ /* @__PURE__ */ jsx(Base.ItemText, { children }),
152
+ /* @__PURE__ */ jsx(Base.ItemIndicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { name: "check", className: "text-xs" }) })
153
+ ]
154
+ }
155
+ );
156
+ }
157
+ function SelectGroupLabel({ className, ...props }) {
158
+ const tier = useTypeTier();
159
+ return /* @__PURE__ */ jsx(
160
+ Base.GroupLabel,
161
+ {
162
+ className: cn(
163
+ // The item inset, not a fixed px-2: the heading's text starts on the
164
+ // same column as the option labels beneath it at every density.
165
+ `px-(--item-px) py-1.5 ${tier.label} text-muted-foreground`,
166
+ className
167
+ ),
168
+ ...props
169
+ }
170
+ );
171
+ }
172
+ function SelectSeparator({ className, ...props }) {
173
+ return /* @__PURE__ */ jsx(
174
+ Base.Separator,
175
+ {
176
+ className: cn("popup-bleed my-1 h-px bg-border", className),
177
+ ...props
178
+ }
179
+ );
180
+ }
181
+ export {
182
+ Select,
183
+ SelectContent,
184
+ SelectGroup,
185
+ SelectGroupLabel,
186
+ SelectItem,
187
+ SelectPortal,
188
+ SelectSeparator,
189
+ SelectTrigger,
190
+ SelectValue
191
+ };
@@ -0,0 +1,189 @@
1
+ // src/components/select/select.meta.ts
2
+ var selectMeta = {
3
+ name: "Select",
4
+ summary: "Listbox over Base UI Select \u2014 typeahead, roving focus, collision-aware popup, ARIA option wiring, and form integration. Trigger shows the selected value; the popup portals to <body>.",
5
+ keywords: [
6
+ "select",
7
+ "listbox",
8
+ "dropdown",
9
+ "picker",
10
+ "option",
11
+ "choice",
12
+ "typeahead",
13
+ "form"
14
+ ],
15
+ usage: {
16
+ description: "Use Select when users choose one value from a known, finite set. Use Combobox for searchable or user-entered values, Combobox `multiple` for several choices, and Radio when all options should remain visible.",
17
+ bestPractices: [
18
+ {
19
+ guidance: "do",
20
+ description: "Use clear item labels and pass label explicitly when children are richer than plain text."
21
+ },
22
+ {
23
+ guidance: "do",
24
+ description: "Group long option sets with SelectGroup and SelectGroupLabel when categories improve scanning."
25
+ },
26
+ {
27
+ guidance: "do",
28
+ description: "Wrap in Field when the select belongs to a form so label, helper text, and errors are wired automatically."
29
+ },
30
+ {
31
+ guidance: "dont",
32
+ description: "Use Select for very large or fuzzy lists. Use Combobox when typing is the primary way to find an option."
33
+ },
34
+ {
35
+ guidance: "dont",
36
+ description: "Use Select for binary on/off settings. Use Switch or Checkbox instead."
37
+ },
38
+ {
39
+ guidance: "do",
40
+ description: "Leave the trigger's type alone on mobile. Below the sm breakpoint the md trigger renders text-body-lg (17px) so it matches the Input and Textarea beside it, which carry that tier because iOS Safari zooms the page when a focused field computes under 16px. A custom field in the same row should follow: a second paired tier under a max-sm: variant, never a hand-set font-size."
41
+ },
42
+ {
43
+ guidance: "do",
44
+ description: "Inside a <Workspace> a Select adapts automatically \u2014 trigger and popup both pick up the compact density, including across the portal. Do NOT hand-size it per call site; that was necessary before v0.41 and is now drift."
45
+ }
46
+ ],
47
+ anatomy: [
48
+ {
49
+ name: "Root",
50
+ required: true,
51
+ description: "Owns value, open state, form integration, and item collection."
52
+ },
53
+ {
54
+ name: "Trigger",
55
+ required: true,
56
+ description: "The button that shows the selected value and opens the listbox."
57
+ },
58
+ {
59
+ name: "Content",
60
+ required: true,
61
+ description: "The positioned popup containing options and optional groups."
62
+ },
63
+ {
64
+ name: "Item",
65
+ required: true,
66
+ description: "A selectable option with selected and highlighted states."
67
+ }
68
+ ]
69
+ },
70
+ related: {
71
+ components: ["Combobox", "Radio", "Field", "Input"],
72
+ patterns: ["SettingsPage", "AuthPage"]
73
+ },
74
+ status: "stable",
75
+ props: [
76
+ {
77
+ name: "items",
78
+ type: "Record<string, ReactNode> | { value: string; label: ReactNode }[]",
79
+ description: "value \u2192 label map (a record, or an array of { value, label }). Derived automatically from literal SelectItem children; pass it explicitly when the items are generated in a loop, or a closed trigger renders the raw value instead of the label."
80
+ },
81
+ {
82
+ name: "Select (Root)",
83
+ type: "Base UI Select.Root props (value, defaultValue, onValueChange, open, defaultOpen, onOpenChange, disabled, required, name, multiple, items)",
84
+ description: "Controls the selected value and open state. Uncontrolled by default. When `items` isn't passed, it is derived from the SelectItem children so the closed trigger shows display text instead of the raw value; pass `items` explicitly when item children aren't plain strings."
85
+ }
86
+ ],
87
+ subcomponents: [
88
+ {
89
+ name: "SelectTrigger",
90
+ type: 'Base UI Trigger props + placeholder?: ReactNode + size?: "md" | "xs" + className',
91
+ description: 'The button. Composes Trigger + Value + a chevron Icon that flips on open (data-[popup-open]). `size="xs"` is the property-grid rung \u2014 height, padding, radius AND surface move together, which is why it is a prop and not a className: the xs trigger is an inset `bg-panel-field` field with no border, matching ScrubField on the same row. A consumer overriding only the height gets an md-register 8px radius on a 24px box and a raised card sitting among inset fields; one inspector panel had eleven of those, and both tells are visible at a glance.'
92
+ },
93
+ {
94
+ name: "SelectContent",
95
+ type: "Base UI Popup props + side, align, sideOffset + className",
96
+ description: 'Portal + Positioner + Popup + List. side="bottom", align="start", sideOffset=6 by default; matches trigger width.'
97
+ },
98
+ {
99
+ name: "SelectItem",
100
+ type: "{ value: string; disabled?: boolean; label?: string } + className",
101
+ description: "An option. Composes Item + ItemText + a check ItemIndicator for the selected row. String children double as the item's `label`, so the closed trigger shows the display text \u2014 pass `label` explicitly only when children are richer than a string."
102
+ },
103
+ {
104
+ name: "SelectGroup",
105
+ type: "Base UI Group props + className",
106
+ description: "Optional grouping of related options."
107
+ },
108
+ {
109
+ name: "SelectGroupLabel",
110
+ type: "Base UI GroupLabel props + className",
111
+ description: "The heading associated with a SelectGroup for screen readers."
112
+ },
113
+ {
114
+ name: "SelectValue",
115
+ type: "Base UI Value props (children render fn) + placeholder",
116
+ description: "Renders the selected option's label with a placeholder fallback. Already composed inside SelectTrigger; exported for advanced layouts that render the value outside the default trigger."
117
+ },
118
+ {
119
+ name: "SelectSeparator",
120
+ type: "Base UI Separator props + className",
121
+ description: "A thin themed divider between groups of items. Decorative \u2014 Base UI marks it aria-hidden."
122
+ }
123
+ ],
124
+ tokensUsed: [
125
+ "input",
126
+ "card",
127
+ "foreground",
128
+ "ring",
129
+ "border",
130
+ "popover",
131
+ "popover-foreground",
132
+ "accent",
133
+ "accent-foreground",
134
+ "muted-foreground"
135
+ ],
136
+ motion: [
137
+ {
138
+ slot: "arrival",
139
+ recipe: "motion-pop",
140
+ part: "SelectContent",
141
+ why: "The popup's transform-origin follows Base UI's anchor, so it grows out of the trigger it belongs to. On a dense form with several selects in a column, that origin is the only thing identifying which field the open list is for."
142
+ },
143
+ {
144
+ slot: "response",
145
+ recipe: "motion-interactive",
146
+ part: "SelectItem",
147
+ why: "Highlight follows both pointer and keyboard. Easing it means arrow-keying down a list is continuous motion rather than a background teleporting between rows, which is what makes a long list readable while moving."
148
+ },
149
+ {
150
+ slot: "transition",
151
+ recipe: "motion-pop",
152
+ part: "SelectContent",
153
+ why: "Closing collapses back toward the trigger, so the reader's eye is returned to the field that now holds the value they just picked."
154
+ },
155
+ {
156
+ slot: "activity",
157
+ recipe: "none",
158
+ part: "SelectContent",
159
+ why: "Select takes a resident list of options. Anything that has to be fetched or filtered as you type is Combobox, which owns that state."
160
+ }
161
+ ],
162
+ a11y: [
163
+ "Base UI provides listbox/option roles, aria-expanded, typeahead, roving focus, and a hidden form input.",
164
+ "Esc and click-outside dismiss; arrow keys and Home/End navigate the list.",
165
+ "Selected option carries data-[selected]; the highlighted option carries data-[highlighted].",
166
+ "Animate the popup via data-[starting-style] / data-[ending-style]."
167
+ ],
168
+ examples: [
169
+ {
170
+ label: "Basic (controlled)",
171
+ code: '<Select value={value} onValueChange={setValue}><SelectTrigger placeholder="Choose a font" /><SelectContent><SelectItem value="sans">Sans-serif</SelectItem><SelectItem value="serif">Serif</SelectItem><SelectItem value="mono">Monospace</SelectItem></SelectContent></Select>'
172
+ },
173
+ {
174
+ label: "Grouped",
175
+ code: '<SelectContent><SelectGroup><SelectGroupLabel>Weights</SelectGroupLabel><SelectItem value="regular">Regular</SelectItem><SelectItem value="bold">Bold</SelectItem></SelectGroup></SelectContent>'
176
+ },
177
+ {
178
+ label: "Inside Field",
179
+ code: '<Field label="Default visibility" description="Controls how new editions appear."><Select defaultValue="public"><SelectTrigger placeholder="Choose visibility" /><SelectContent><SelectItem value="public">Public</SelectItem><SelectItem value="private">Private</SelectItem><SelectItem value="unlisted">Unlisted</SelectItem></SelectContent></Select></Field>'
180
+ },
181
+ {
182
+ label: "Rich item labels",
183
+ code: '<Select defaultValue="edition" items={[{ value: "edition", label: "Edition" }, { value: "collectible", label: "Collectible" }]}><SelectTrigger /><SelectContent><SelectItem value="edition" label="Edition"><span className="flex items-center gap-2"><Badge tone="edition">Edition</Badge><span>Edition drop</span></span></SelectItem><SelectItem value="collectible" label="Collectible"><span className="flex items-center gap-2"><Badge tone="collectible">Collectible</Badge><span>Collectible</span></span></SelectItem></SelectContent></Select>'
184
+ }
185
+ ]
186
+ };
187
+ export {
188
+ selectMeta
189
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/separator/index.ts
2
+ import { Separator } from "./separator.js";
3
+ import { separatorMeta } from "./separator.meta.js";
4
+ export {
5
+ Separator,
6
+ separatorMeta
7
+ };
@@ -0,0 +1,42 @@
1
+ // src/components/separator/separator.tsx
2
+ import { Separator as Base } from "@base-ui/react/separator";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function Separator({
6
+ orientation = "horizontal",
7
+ label,
8
+ className,
9
+ ...props
10
+ }) {
11
+ if (label != null && orientation === "horizontal") {
12
+ return /* @__PURE__ */ jsxs(
13
+ "div",
14
+ {
15
+ role: "separator",
16
+ "aria-orientation": "horizontal",
17
+ className: cn("flex items-center gap-3", className),
18
+ children: [
19
+ /* @__PURE__ */ jsx("span", { className: "h-px flex-1 bg-border" }),
20
+ /* @__PURE__ */ jsx("span", { className: "text-body-xs text-muted-foreground", children: label }),
21
+ /* @__PURE__ */ jsx("span", { className: "h-px flex-1 bg-border" })
22
+ ]
23
+ }
24
+ );
25
+ }
26
+ return /* @__PURE__ */ jsx(
27
+ Base,
28
+ {
29
+ orientation,
30
+ className: cn(
31
+ "shrink-0 bg-border",
32
+ orientation === "horizontal" ? "h-px w-full" : "h-full w-px self-stretch",
33
+ className
34
+ ),
35
+ ...props
36
+ }
37
+ );
38
+ }
39
+ Separator.displayName = "Separator";
40
+ export {
41
+ Separator
42
+ };
@@ -0,0 +1,84 @@
1
+ // src/components/separator/separator.meta.ts
2
+ var separatorMeta = {
3
+ name: "Separator",
4
+ summary: "A hairline divider. Horizontal full-width rule or vertical 1px column, tinted with the border token. Optional centered label (horizontal) for a captioned section divider.",
5
+ status: "stable",
6
+ keywords: [
7
+ "separator",
8
+ "divider",
9
+ "section break",
10
+ "rule"
11
+ ],
12
+ usage: {
13
+ description: "Use Separator to divide related groups where spacing alone does not provide enough structure.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use it sparingly between sections, menu groups, or dense rows."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Choose orientation based on the layout direction it separates."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not use Separator as decoration when hierarchy, spacing, or headings would explain the layout better."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not use it where space would do. A page whose every section is divided by a rule reads as a form; the rule should mark a real change of subject."
30
+ }
31
+ ]
32
+ },
33
+ related: {
34
+ components: [
35
+ "Menu",
36
+ "ContextMenu",
37
+ "Card"
38
+ ]
39
+ },
40
+ props: [
41
+ {
42
+ name: "orientation",
43
+ type: '"horizontal" | "vertical"',
44
+ default: '"horizontal"',
45
+ description: "Axis of the rule. Vertical stretches to its flex parent's height."
46
+ },
47
+ {
48
+ name: "label",
49
+ type: "ReactNode",
50
+ description: "When set (horizontal only), centers a muted caption between two hairline rules."
51
+ },
52
+ {
53
+ name: "render",
54
+ type: "ReactElement | (props, state) => ReactElement",
55
+ description: "Compose with another element/component through the Base UI render prop. Ignored on the labeled variant."
56
+ }
57
+ ],
58
+ variants: {
59
+ orientation: ["horizontal", "vertical"]
60
+ },
61
+ tokensUsed: ["border", "muted-foreground"],
62
+ a11y: [
63
+ "Base UI sets role=separator and aria-orientation for assistive tech.",
64
+ "The labeled variant renders a div with explicit role=separator + aria-orientation (the caption is the visible context).",
65
+ "Purely decorative dividers can carry aria-hidden when adjacent content already conveys the grouping."
66
+ ],
67
+ examples: [
68
+ {
69
+ label: "Horizontal",
70
+ code: "<Separator />"
71
+ },
72
+ {
73
+ label: "Labeled section divider",
74
+ code: '<Separator label="Other holdings" />'
75
+ },
76
+ {
77
+ label: "Vertical (inside a flex row)",
78
+ code: '<Row gap={3} className="h-6 items-center"><span>Edit</span><Separator orientation="vertical" /><span>Delete</span></Row>'
79
+ }
80
+ ]
81
+ };
82
+ export {
83
+ separatorMeta
84
+ };
@@ -0,0 +1,11 @@
1
+ // src/components/settings-menu/index.ts
2
+ import {
3
+ SettingsMenu,
4
+ SettingsRow
5
+ } from "./settings-menu.js";
6
+ import { settingsMenuMeta } from "./settings-menu.meta.js";
7
+ export {
8
+ SettingsMenu,
9
+ SettingsRow,
10
+ settingsMenuMeta
11
+ };
@@ -0,0 +1,101 @@
1
+ // src/components/settings-menu/settings-menu.tsx
2
+ import { Icon } from "../../icon/index.js";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { useTypeTier } from "../../lib/density.js";
5
+ import {
6
+ Menu,
7
+ MenuContent,
8
+ MenuSubmenu,
9
+ MenuSubmenuTrigger,
10
+ MenuTrigger
11
+ } from "../menu/index.js";
12
+ import { Button } from "../button/button.js";
13
+ import {
14
+ SETTINGS_TRIGGER_SIZE,
15
+ SETTINGS_TRIGGER_VARIANT,
16
+ settingsMenuTriggerClassName
17
+ } from "./settings-menu.variants.js";
18
+ import { jsx, jsxs } from "react/jsx-runtime";
19
+ function SettingsMenu({
20
+ summary,
21
+ label = "Change settings",
22
+ variant = "ghost",
23
+ size = "sm",
24
+ side = "top",
25
+ align = "end",
26
+ disabled,
27
+ className,
28
+ children,
29
+ ...props
30
+ }) {
31
+ const tier = useTypeTier();
32
+ return /* @__PURE__ */ jsxs(Menu, { ...props, children: [
33
+ /* @__PURE__ */ jsxs(
34
+ MenuTrigger,
35
+ {
36
+ "aria-label": label,
37
+ disabled,
38
+ render: /* @__PURE__ */ jsx(
39
+ Button,
40
+ {
41
+ variant: SETTINGS_TRIGGER_VARIANT[variant],
42
+ size: SETTINGS_TRIGGER_SIZE[size],
43
+ className: cn(settingsMenuTriggerClassName, tier.body, className)
44
+ }
45
+ ),
46
+ children: [
47
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: summary }),
48
+ /* @__PURE__ */ jsx(Icon, { name: "chevron-down", className: "opacity-60" })
49
+ ]
50
+ }
51
+ ),
52
+ /* @__PURE__ */ jsx(MenuContent, { side, align, className: "min-w-56", children })
53
+ ] });
54
+ }
55
+ SettingsMenu.displayName = "SettingsMenu";
56
+ function SettingsRow({
57
+ label,
58
+ value,
59
+ disabled,
60
+ className,
61
+ children
62
+ }) {
63
+ const tier = useTypeTier();
64
+ if (!children) {
65
+ return /* @__PURE__ */ jsxs(
66
+ "div",
67
+ {
68
+ className: cn(
69
+ // MenuItem's row recipe — inset, gap, concentric radius and tier — so a
70
+ // flat row and a nesting row in the same list are the same shape.
71
+ "flex select-none items-center gap-(--item-gap) rounded-popup-item px-(--item-px) py-1.5",
72
+ tier.body,
73
+ disabled && "opacity-50",
74
+ className
75
+ ),
76
+ children: [
77
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: label }),
78
+ value !== void 0 ? /* @__PURE__ */ jsx("span", { className: "truncate text-muted-foreground", children: value }) : null,
79
+ /* @__PURE__ */ jsx(Icon, { name: "chevron-right", className: "invisible text-xs" })
80
+ ]
81
+ }
82
+ );
83
+ }
84
+ return /* @__PURE__ */ jsxs(MenuSubmenu, { children: [
85
+ /* @__PURE__ */ jsx(
86
+ MenuSubmenuTrigger,
87
+ {
88
+ value,
89
+ disabled,
90
+ className,
91
+ children: label
92
+ }
93
+ ),
94
+ /* @__PURE__ */ jsx(MenuContent, { side: "inline-end", align: "start", sideOffset: 4, children })
95
+ ] });
96
+ }
97
+ SettingsRow.displayName = "SettingsRow";
98
+ export {
99
+ SettingsMenu,
100
+ SettingsRow
101
+ };