@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,100 @@
1
+ // src/components/overflow-menu/overflow-menu.meta.ts
2
+ var overflowMenuMeta = {
3
+ name: "OverflowMenu",
4
+ summary: "An overflow ellipsis icon button that opens a Menu. Composes our Menu + Button + Icon \u2014 pass MenuItems as children and it wires the ghost icon trigger, accessible label, and portal-rendered content. All keyboard, focus, and dismissal behavior comes through Menu.",
5
+ status: "stable",
6
+ keywords: [
7
+ "dots menu",
8
+ "more actions",
9
+ "ellipsis",
10
+ "kebab"
11
+ ],
12
+ usage: {
13
+ description: "Use OverflowMenu for compact overflow actions when the primary action is already visible elsewhere.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use it for secondary commands that belong to a row, card, or toolbar item."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Keep labels explicit so the icon-only trigger does not obscure the command meaning."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not hide the most important or most frequent action inside OverflowMenu."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not use it as the only affordance on a touch surface. It is revealed on hover in most layouts, and hover does not exist on touch \u2014 pair it with a visible action or make it always-visible there."
30
+ }
31
+ ]
32
+ },
33
+ related: {
34
+ components: [
35
+ "Menu",
36
+ "ContextMenu"
37
+ ]
38
+ },
39
+ props: [
40
+ {
41
+ name: "children",
42
+ type: "ReactNode",
43
+ default: "\u2014",
44
+ description: "The menu rows \u2014 MenuItem / MenuSeparator / MenuGroup, etc. Rendered inside MenuContent."
45
+ },
46
+ {
47
+ name: "align",
48
+ type: "'start' | 'center' | 'end'",
49
+ default: "end",
50
+ description: "Alignment of the popup along its side. Overflow menus typically right-align under the trigger; 'start' anchors the popup's left edge to the trigger instead."
51
+ },
52
+ {
53
+ name: "label",
54
+ type: "string",
55
+ default: "More actions",
56
+ description: "Accessible label (aria-label) for the icon-only trigger button."
57
+ },
58
+ {
59
+ name: "icon",
60
+ type: "string",
61
+ default: "ellipsis",
62
+ description: "Semantic icon name rendered in the trigger, always at the solid weight."
63
+ },
64
+ {
65
+ name: "size",
66
+ type: "'icon' | 'icon-sm' | 'icon-xs'",
67
+ default: "icon",
68
+ description: "The trigger's rung on the icon-button ladder. 'icon' for a card or page header; 'icon-sm' or 'icon-xs' in a list row or dense toolbar, so the trigger does not set the row height."
69
+ }
70
+ ],
71
+ variants: {
72
+ size: ["icon", "icon-sm", "icon-xs"]
73
+ },
74
+ tokensUsed: [
75
+ "popover",
76
+ "popover-foreground",
77
+ "border",
78
+ "accent",
79
+ "accent-foreground",
80
+ "muted-foreground"
81
+ ],
82
+ a11y: [
83
+ "The icon-only trigger is labeled via aria-label (label prop, default 'More actions').",
84
+ "Menu provides role=menu/menuitem, roving tabindex, arrow-key navigation, and typeahead via Base UI.",
85
+ "Esc and outside-press dismiss; focus returns to the trigger on close."
86
+ ],
87
+ examples: [
88
+ {
89
+ label: "Basic",
90
+ code: '<OverflowMenu label="Post actions"><MenuItem>Edit</MenuItem><MenuItem>Share</MenuItem><MenuSeparator /><MenuItem variant="destructive">Delete</MenuItem></OverflowMenu>'
91
+ },
92
+ {
93
+ label: "With leading icons",
94
+ code: '<OverflowMenu><MenuItem><Icon name="check" className="text-sm" />Mark as read</MenuItem><MenuSeparator /><MenuItem variant="destructive"><Icon name="xmark" className="text-sm" />Delete</MenuItem></OverflowMenu>'
95
+ }
96
+ ]
97
+ };
98
+ export {
99
+ overflowMenuMeta
100
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/page-header/index.ts
2
+ import { PageHeader } from "./page-header.js";
3
+ import { pageHeaderMeta } from "./page-header.meta.js";
4
+ export {
5
+ PageHeader,
6
+ pageHeaderMeta
7
+ };
@@ -0,0 +1,34 @@
1
+ // src/components/page-header/page-header.tsx
2
+ import { cn } from "../../lib/cn.js";
3
+ import { HeadingRow } from "../../lib/heading-row.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function PageHeader({
6
+ title,
7
+ description,
8
+ back,
9
+ actions,
10
+ titleAs: Title = "h1",
11
+ className,
12
+ children,
13
+ ...props
14
+ }) {
15
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-1 pb-4", className), ...props, children: [
16
+ /* @__PURE__ */ jsx(
17
+ HeadingRow,
18
+ {
19
+ as: Title,
20
+ title,
21
+ titleClassName: "text-heading-2",
22
+ band: "flex min-h-(--control-md) items-center",
23
+ leading: back,
24
+ actions
25
+ }
26
+ ),
27
+ description ? /* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: description }) : null,
28
+ children
29
+ ] });
30
+ }
31
+ PageHeader.displayName = "PageHeader";
32
+ export {
33
+ PageHeader
34
+ };
@@ -0,0 +1,104 @@
1
+ // src/components/page-header/page-header.meta.ts
2
+ var pageHeaderMeta = {
3
+ name: "PageHeader",
4
+ summary: "In-flow page heading block: a title row (optional back control + actions) over an optional description, with room for children (filters, tabs) below.",
5
+ status: "stable",
6
+ keywords: [
7
+ "page header",
8
+ "title",
9
+ "lede",
10
+ "page actions"
11
+ ],
12
+ usage: {
13
+ description: "Use PageHeader to establish a page's title, supporting description, and primary page actions.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use one PageHeader per major page or route."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Keep the title literal and put explanation in the lede or nearby content."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not use PageHeader inside repeated cards, dialogs, or compact panels."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not use a second PageHeader for a section of the page. It is the route's one h1; each section below it takes a SectionHeader (an h2 with the same title row, description and actions)."
30
+ },
31
+ {
32
+ guidance: "dont",
33
+ description: "Do not put it outside the Region that holds the page content. It then sits at a different measure from what it introduces, and the page reads as two documents."
34
+ }
35
+ ]
36
+ },
37
+ related: {
38
+ components: [
39
+ "AppHeader",
40
+ "SectionHeader",
41
+ "Breadcrumbs",
42
+ "Button"
43
+ ]
44
+ },
45
+ props: [
46
+ { name: "title", type: "ReactNode", description: "The page title (renders an <h1>)." },
47
+ {
48
+ name: "description",
49
+ type: "ReactNode",
50
+ description: "Supporting copy beneath the title."
51
+ },
52
+ {
53
+ name: "back",
54
+ type: "ReactNode",
55
+ description: 'Leading element before the title \u2014 typically a back control on drill-in routes. Keep it a ghost icon Button (size="icon", variant="ghost", aria-label="Back") so it stays quieter than the title. A ghost back control bleeds by its inset at the start, so its glyph lines up with the content edge below (Button bleed="none" opts out).'
56
+ },
57
+ {
58
+ name: "actions",
59
+ type: "ReactNode",
60
+ description: "Trailing actions aligned to the title row's end. They drop under the title when the row runs out of room, and the title wraps rather than truncating. A ghost or link Button at either end of the group bleeds by its own padding, so its label meets the content edge (the end on the title row, the start once wrapped); filled buttons keep their edge on the line. Direct children only."
61
+ },
62
+ {
63
+ name: "titleAs",
64
+ type: '"h1" | "h2"',
65
+ default: '"h1"',
66
+ description: "The title's heading element. Keep h1 \u2014 the route's one h1. Use h2 only when something above already owns the h1: a shell that renders the route title, or a page showing a PageHeader as an example."
67
+ }
68
+ ],
69
+ a11y: [
70
+ "Renders the title as an <h1>; use one PageHeader per page.",
71
+ "Its title renders the route's `h1`. Do not render another `h1` elsewhere on the page: heading navigation would report two documents, and the outline a screen-reader user builds from it stops matching the page."
72
+ ],
73
+ tokensUsed: ["foreground", "muted-foreground"],
74
+ examples: [
75
+ {
76
+ label: "With actions",
77
+ code: '<PageHeader title="Storage credits" description="Fund permanent storage." actions={<Button>Top up</Button>} />'
78
+ },
79
+ {
80
+ label: "One per page, inside the region",
81
+ code: `// PageHeader introduces the current route: title, optional description, and the
82
+ // actions that act on THIS page.
83
+
84
+ <Region max="content">
85
+ <PageHeader
86
+ title="Invoices"
87
+ description="Every charge on this account."
88
+ actions={<Button>Export</Button>}
89
+ />
90
+ <p className="text-body-md text-muted-foreground">Page content.</p>
91
+ </Region>
92
+
93
+ // \u2717 Outside the Region. The header then sits at a different measure from the
94
+ // content it introduces, and the page reads as two documents.
95
+ // \u2717 Two on one page. A second one is a section heading: a SectionHeader
96
+ // (an h2 on text-heading-3, same title row and actions), not another PageHeader.
97
+ // \u2717 Global actions in it (account, search). Those persist across routes and
98
+ // belong in AppHeader.`
99
+ }
100
+ ]
101
+ };
102
+ export {
103
+ pageHeaderMeta
104
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/page-loader/index.ts
2
+ import { PageLoader } from "./page-loader.js";
3
+ import { pageLoaderMeta } from "./page-loader.meta.js";
4
+ export {
5
+ PageLoader,
6
+ pageLoaderMeta
7
+ };
@@ -0,0 +1,37 @@
1
+ // src/components/page-loader/page-loader.tsx
2
+ import { cn } from "../../lib/cn.js";
3
+ import { Progress } from "../progress/progress.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function PageLoader({
6
+ children,
7
+ label = "Loading",
8
+ fullscreen = true,
9
+ hideBar = false,
10
+ className,
11
+ ref,
12
+ ...props
13
+ }) {
14
+ return /* @__PURE__ */ jsxs(
15
+ "div",
16
+ {
17
+ ref,
18
+ role: "status",
19
+ "aria-label": label,
20
+ className: cn(
21
+ fullscreen ? "fixed inset-0" : "absolute inset-0",
22
+ "z-(--z-overlay) flex flex-col items-center justify-center gap-6 bg-background animate-fade-in",
23
+ className
24
+ ),
25
+ ...props,
26
+ children: [
27
+ /* @__PURE__ */ jsx("div", { className: "motion-pulse", children: children ?? /* @__PURE__ */ jsx("span", { className: "block size-12 rounded-xl bg-foreground/90", "aria-hidden": true }) }),
28
+ label ? /* @__PURE__ */ jsx("p", { className: "text-label-md text-muted-foreground", children: label }) : null,
29
+ hideBar ? null : /* @__PURE__ */ jsx(Progress, { "aria-hidden": true, size: "sm", className: "w-24" })
30
+ ]
31
+ }
32
+ );
33
+ }
34
+ PageLoader.displayName = "PageLoader";
35
+ export {
36
+ PageLoader
37
+ };
@@ -0,0 +1,85 @@
1
+ // src/components/page-loader/page-loader.meta.ts
2
+ var pageLoaderMeta = {
3
+ name: "PageLoader",
4
+ summary: "Full-screen branded loading splash: the screen fades in, the mark breathes, and an indeterminate Progress bar pulses beneath it. All motion is token-driven, so it freezes to a calm static screen when motion is off/reduced.",
5
+ status: "stable",
6
+ keywords: [
7
+ "page loader",
8
+ "loading",
9
+ "route",
10
+ "pending"
11
+ ],
12
+ usage: {
13
+ description: "Use PageLoader for full-route or full-page pending states where the entire view is not ready yet.",
14
+ bestPractices: [
15
+ {
16
+ guidance: "do",
17
+ description: "Use it during route transitions, auth checks, or initial data loading."
18
+ },
19
+ {
20
+ guidance: "do",
21
+ description: "Prefer a clear page-level message when the wait may take noticeable time."
22
+ },
23
+ {
24
+ guidance: "dont",
25
+ description: "Do not use PageLoader for small inline waits; use Spinner, an indeterminate Progress, or Skeleton."
26
+ },
27
+ {
28
+ guidance: "dont",
29
+ description: "Do not leave it mounted if the route's data can fail. It covers the whole viewport, so a PageLoader that never resolves is indistinguishable from a hung application \u2014 always give it a failure path."
30
+ }
31
+ ]
32
+ },
33
+ related: {
34
+ components: [
35
+ "Spinner",
36
+ "Skeleton",
37
+ "Progress"
38
+ ]
39
+ },
40
+ props: [
41
+ {
42
+ name: "children",
43
+ type: "ReactNode",
44
+ description: "Brand mark / logo shown at center. Falls back to a neutral pulsing mark."
45
+ },
46
+ {
47
+ name: "label",
48
+ type: "string",
49
+ default: '"Loading"',
50
+ description: "Caption beneath the mark; also the accessible label on the role=status region."
51
+ },
52
+ {
53
+ name: "fullscreen",
54
+ type: "boolean",
55
+ default: "true",
56
+ description: "Cover the viewport (fixed) vs fill the nearest positioned parent (absolute)."
57
+ },
58
+ {
59
+ name: "hideBar",
60
+ type: "boolean",
61
+ default: "false",
62
+ description: "Hide the indeterminate Progress bar under the mark."
63
+ }
64
+ ],
65
+ tokensUsed: ["background", "foreground", "secondary", "primary", "muted-foreground"],
66
+ a11y: [
67
+ "role=status with an aria-label (the label prop) announces the loading state politely.",
68
+ "Decorative mark and bar are aria-hidden.",
69
+ "Motion respects the policy: under off/reduced the pulses hold their first frame (static)."
70
+ ],
71
+ examples: [
72
+ { label: "Default", code: '<PageLoader label="Loading Studio" />' },
73
+ {
74
+ label: "With a logo",
75
+ code: '<PageLoader label="Loading"><img src="/logo.svg" alt="" className="h-10 w-auto" /></PageLoader>'
76
+ },
77
+ {
78
+ label: "Contained (fills parent)",
79
+ code: '<div className="relative h-80"><PageLoader fullscreen={false} hideBar /></div>'
80
+ }
81
+ ]
82
+ };
83
+ export {
84
+ pageLoaderMeta
85
+ };
@@ -0,0 +1,7 @@
1
+ // src/components/pagination/index.ts
2
+ import { Pagination } from "./pagination.js";
3
+ import { paginationMeta } from "./pagination.meta.js";
4
+ export {
5
+ Pagination,
6
+ paginationMeta
7
+ };
@@ -0,0 +1,105 @@
1
+ "use client";
2
+
3
+ // src/components/pagination/pagination.tsx
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Button } from "../button/button.js";
6
+ import { Icon } from "../../icon/Icon.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var ELLIPSIS = "ellipsis";
9
+ function buildRange(page, total, siblingCount) {
10
+ const totalSlots = siblingCount * 2 + 5;
11
+ if (total <= totalSlots) {
12
+ return Array.from({ length: total }, (_, i) => i + 1);
13
+ }
14
+ const range = (from, to) => Array.from({ length: to - from + 1 }, (_, i) => from + i);
15
+ const left = Math.max(page - siblingCount, 1);
16
+ const right = Math.min(page + siblingCount, total);
17
+ const showLeftEllipsis = left > 2;
18
+ const showRightEllipsis = right < total - 1;
19
+ const endRun = totalSlots - 2;
20
+ if (!showLeftEllipsis) {
21
+ return [...range(1, endRun), ELLIPSIS, total];
22
+ }
23
+ if (!showRightEllipsis) {
24
+ return [1, ELLIPSIS, ...range(total - endRun + 1, total)];
25
+ }
26
+ return [1, ELLIPSIS, ...range(left, right), ELLIPSIS, total];
27
+ }
28
+ function Pagination({
29
+ page,
30
+ total,
31
+ onPageChange,
32
+ siblingCount = 1,
33
+ label = "Pagination",
34
+ className,
35
+ ref,
36
+ ...props
37
+ }) {
38
+ const safeTotal = Math.max(total, 1);
39
+ const current = Math.min(Math.max(page, 1), safeTotal);
40
+ const items = buildRange(current, safeTotal, siblingCount);
41
+ const goTo = (next) => {
42
+ if (next < 1 || next > safeTotal || next === current) return;
43
+ onPageChange(next);
44
+ };
45
+ return /* @__PURE__ */ jsxs(
46
+ "nav",
47
+ {
48
+ ref,
49
+ "aria-label": label,
50
+ className: cn("flex items-center gap-1", className),
51
+ ...props,
52
+ children: [
53
+ /* @__PURE__ */ jsx(
54
+ Button,
55
+ {
56
+ variant: "ghost",
57
+ size: "icon-sm",
58
+ "aria-label": "Previous page",
59
+ disabled: current <= 1,
60
+ onClick: () => goTo(current - 1),
61
+ children: /* @__PURE__ */ jsx(Icon, { name: "chevron-left", className: "text-base" })
62
+ }
63
+ ),
64
+ /* @__PURE__ */ jsx("ul", { className: "flex items-center gap-1", children: items.map(
65
+ (item, index) => item === ELLIPSIS ? /* @__PURE__ */ jsx(
66
+ "li",
67
+ {
68
+ "aria-hidden": "true",
69
+ className: "flex h-(--control-sm) w-(--control-sm) items-center justify-center text-muted-foreground",
70
+ children: /* @__PURE__ */ jsx(Icon, { name: "ellipsis", className: "text-base" })
71
+ },
72
+ `ellipsis-${index}`
73
+ ) : /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
74
+ Button,
75
+ {
76
+ variant: item === current ? "secondary" : "ghost",
77
+ size: "icon-sm",
78
+ className: "w-auto min-w-(--control-sm) px-1 tabular-nums",
79
+ "aria-label": `Page ${item}`,
80
+ "aria-current": item === current ? "page" : void 0,
81
+ onClick: () => goTo(item),
82
+ children: item
83
+ }
84
+ ) }, item)
85
+ ) }),
86
+ /* @__PURE__ */ jsx(
87
+ Button,
88
+ {
89
+ variant: "ghost",
90
+ size: "icon-sm",
91
+ "aria-label": "Next page",
92
+ disabled: current >= safeTotal,
93
+ onClick: () => goTo(current + 1),
94
+ children: /* @__PURE__ */ jsx(Icon, { name: "chevron-right", className: "text-base" })
95
+ }
96
+ )
97
+ ]
98
+ }
99
+ );
100
+ }
101
+ Pagination.displayName = "Pagination";
102
+ export {
103
+ Pagination,
104
+ buildRange
105
+ };
@@ -0,0 +1,141 @@
1
+ // src/components/pagination/pagination.meta.ts
2
+ var paginationMeta = {
3
+ name: "Pagination",
4
+ summary: "Page navigation built from our own Button + Icon (no Base UI). A <nav aria-label='Pagination'> with prev/next icon buttons that disable at the bounds and numbered page buttons; the current page is a secondary button marked aria-current. Collapses to first/last/current plus a sibling window, bridging skipped runs with an ellipsis.",
5
+ keywords: [
6
+ "pagination",
7
+ "pager",
8
+ "pages",
9
+ "table",
10
+ "results",
11
+ "navigation",
12
+ "next",
13
+ "previous"
14
+ ],
15
+ usage: {
16
+ description: "Use Pagination when a result set is split into discrete pages and the user needs predictable movement through them. Pair it with DataTable, list results, or server-paged views; use a load-more Button or infinite scroll when page numbers are not meaningful.",
17
+ bestPractices: [
18
+ {
19
+ guidance: "do",
20
+ description: "Keep page state controlled by the parent route or data layer so URL, filters, and result fetches stay in sync."
21
+ },
22
+ {
23
+ guidance: "do",
24
+ description: 'Use a specific label when multiple pagers appear on a page, such as "Collector pages".'
25
+ },
26
+ {
27
+ guidance: "do",
28
+ description: "Reset to page 1 when filters or search terms materially change the result set."
29
+ },
30
+ {
31
+ guidance: "dont",
32
+ description: "Use Pagination for tiny lists where all items fit comfortably on one page."
33
+ },
34
+ {
35
+ guidance: "dont",
36
+ description: "Hide disabled previous/next buttons at the bounds; disabled controls make the current position clearer."
37
+ }
38
+ ],
39
+ anatomy: [
40
+ {
41
+ name: "Nav",
42
+ required: true,
43
+ description: "The labelled pagination landmark."
44
+ },
45
+ {
46
+ name: "Previous/next",
47
+ required: true,
48
+ description: "Icon buttons for adjacent page movement, disabled at the bounds."
49
+ },
50
+ {
51
+ name: "Page buttons",
52
+ required: true,
53
+ description: "Numbered buttons with aria-current on the active page."
54
+ },
55
+ {
56
+ name: "Ellipsis",
57
+ required: false,
58
+ description: "Non-interactive marker for skipped page ranges."
59
+ }
60
+ ]
61
+ },
62
+ related: {
63
+ components: ["DataTable", "Table", "Button"],
64
+ patterns: ["ListDetailPage", "DashboardPage"]
65
+ },
66
+ status: "stable",
67
+ props: [
68
+ {
69
+ name: "page",
70
+ type: "number",
71
+ default: "\u2014",
72
+ description: "The active page (1-based). Clamped into the valid range."
73
+ },
74
+ {
75
+ name: "total",
76
+ type: "number",
77
+ default: "\u2014",
78
+ description: "Total number of pages."
79
+ },
80
+ {
81
+ name: "onPageChange",
82
+ type: "(page: number) => void",
83
+ default: "\u2014",
84
+ description: "Called with the next page when a control is activated. No-op for out-of-range or unchanged values."
85
+ },
86
+ {
87
+ name: "siblingCount",
88
+ type: "number",
89
+ default: "1",
90
+ description: "Page buttons shown on each side of the current page before the list collapses into ellipses. First and last pages are always shown."
91
+ },
92
+ {
93
+ name: "label",
94
+ type: "string",
95
+ default: "Pagination",
96
+ description: "Accessible label applied to the surrounding nav element."
97
+ },
98
+ {
99
+ name: "className",
100
+ type: "string",
101
+ default: "\u2014",
102
+ description: "Extra classes merged onto the nav."
103
+ }
104
+ ],
105
+ tokensUsed: [
106
+ "secondary",
107
+ "secondary-foreground",
108
+ "accent",
109
+ "accent-foreground",
110
+ "foreground",
111
+ "muted-foreground",
112
+ "ring"
113
+ ],
114
+ a11y: [
115
+ "Renders a landmark <nav> with aria-label so assistive tech can jump to the pager.",
116
+ "The current page button carries aria-current='page'.",
117
+ "Prev/next buttons are real <button>s with aria-label and become disabled at the bounds.",
118
+ "Ellipsis slots are aria-hidden \u2014 they convey no navigable target."
119
+ ],
120
+ examples: [
121
+ {
122
+ label: "Controlled",
123
+ code: "const [page, setPage] = useState(1)\n<Pagination page={page} total={10} onPageChange={setPage} />"
124
+ },
125
+ {
126
+ label: "Many pages (ellipsis)",
127
+ code: "const [page, setPage] = useState(8)\n<Pagination page={page} total={20} onPageChange={setPage} />"
128
+ },
129
+ {
130
+ label: "Table results footer",
131
+ code: '<Stack gap={2}><DataTable data={rows} columns={columns} rowKey={(row) => row.id} /><Pagination label="Collector pages" page={page} total={12} onPageChange={setPage} /></Stack>'
132
+ },
133
+ {
134
+ label: "Server query state",
135
+ code: "const [page, setPage] = useState(searchParams.page ?? 1)\n<Pagination page={page} total={pageCount} onPageChange={(next) => { setPage(next); loadPage(next) }} />"
136
+ }
137
+ ]
138
+ };
139
+ export {
140
+ paginationMeta
141
+ };
@@ -0,0 +1,10 @@
1
+ // src/components/panel-group/index.ts
2
+ import { Panel, PanelGroup, PanelResizer, usePanelWidth } from "./panel-group.js";
3
+ import { panelGroupMeta } from "./panel-group.meta.js";
4
+ export {
5
+ Panel,
6
+ PanelGroup,
7
+ PanelResizer,
8
+ panelGroupMeta,
9
+ usePanelWidth
10
+ };