@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,135 @@
1
+ // src/foundations/motion.ts
2
+ var motion = {
3
+ slug: "motion",
4
+ title: "Motion",
5
+ summary: "Motion explains a change: where something came from, what responded, and that work is happening. It is subtle by default, built from named recipes, and one switch turns it off.",
6
+ headline: "4 slots \xB7 3 speeds \xB7 enter-only overshoot \xB7 1 kill switch",
7
+ vocabularies: [
8
+ {
9
+ title: "Three speeds",
10
+ note: "Match duration to the distance and size of what moves. Each value is multiplied by --motion-scale. Two edge steps sit outside the three: --motion-duration-instant (75ms) for a checkbox tick or tab swap, and --motion-duration-slower (500ms) for progress and value changes.",
11
+ terms: [
12
+ { name: "fast --motion-duration-fast", value: "150ms", use: "Hover, press, focus, tooltips, small toggles. Also every exit." },
13
+ { name: "base --motion-duration-base", value: "200ms", use: "Menus, popovers, tabs, disclosure. The default enter." },
14
+ { name: "slow --motion-duration-slow", value: "300ms", use: "Dialogs, sheets, page-level transitions." }
15
+ ]
16
+ },
17
+ {
18
+ title: "Recipes",
19
+ note: "Reach for one named class before writing a transition.",
20
+ terms: [
21
+ { name: "motion-interactive", value: "fast \xB7 standard", use: "Hover/focus/press chrome on anything clickable. Replaces transition-colors." },
22
+ { name: "motion-press", value: "fast \xB7 scale settle", use: "Tactile press. Always paired with motion-interactive." },
23
+ { name: "motion-fade", value: "enter base / exit fast", use: "Scrims and backdrops." },
24
+ { name: "motion-pop", value: "enter base \xB7 spring", use: "Anchored or centred surfaces: popovers, menus, dialogs." },
25
+ { name: "motion-slide-{up,down,left,right}", value: "enter base / exit fast", use: "Directional surfaces: sheets, toasts." },
26
+ { name: "motion-disclosure", value: "base \xB7 standard", use: "Height changes: accordion, collapsible." },
27
+ { name: "motion-icon-swap", value: "enter \xB7 emphasized cross-fade", use: "Two icons of one control trading places: play/pause, outline/fill." },
28
+ { name: "motion-draw", value: "slower \xB7 decelerate", use: 'SVG line art drawing on when a <Reveal> scrolls in. The path needs pathLength="1"; stagger siblings with --motion-draw-delay.' },
29
+ { name: "motion-spin \xB7 pulse \xB7 shimmer \xB7 dot-bounce \xB7 ping", value: "loops", use: "Activity. Scale-aware, so reduced motion freezes them." }
30
+ ]
31
+ },
32
+ {
33
+ title: "Easings",
34
+ terms: [
35
+ { name: "ease-standard", value: "cubic-bezier(0.4, 0, 0.2, 1)", use: "The default for state changes." },
36
+ { name: "ease-decelerate", value: "cubic-bezier(0, 0, 0.2, 1)", use: "Entrances: arrive fast, settle slowly." },
37
+ { name: "ease-emphasized", value: "cubic-bezier(0.2, 0, 0, 1)", use: "Large surfaces covering a lot of distance." },
38
+ { name: "ease-spring", value: "~4% overshoot", use: "A gentle pop on enter. Never on exit." },
39
+ { name: "ease-bounce", value: "~10% overshoot", use: "A playful pop, opt-in only. Enter only, never on exit." }
40
+ ]
41
+ },
42
+ {
43
+ title: "The four slots",
44
+ note: "Every interactive component answers all four, by filling the slot or declining it with a reason in meta.motion.",
45
+ terms: [
46
+ { name: "arrival", value: "fade \xB7 slide \xB7 pop \xB7 Reveal", use: "How does it enter?" },
47
+ { name: "response", value: "motion-interactive \xB7 motion-press", use: "What happens under the pointer?" },
48
+ { name: "transition", value: "motion-disclosure \xB7 eased transform", use: "How does it move between its own states?" },
49
+ { name: "activity", value: "spin \xB7 pulse \xB7 shimmer", use: "How do you tell working from frozen?" }
50
+ ]
51
+ }
52
+ ],
53
+ rules: [
54
+ {
55
+ rule: "Every motion has a reason: orientation, feedback, continuity or activity.",
56
+ why: "Motion with no reason is latency. If you cannot say which of the four it serves, remove it."
57
+ },
58
+ {
59
+ rule: "Reach for a recipe first; drop to tokens only when none fits.",
60
+ why: "Recipes are reviewed once and respect the kill switch. A bespoke transition string is reviewed never.",
61
+ enforcedBy: "sable-lint: transition-colors, transition-all"
62
+ },
63
+ {
64
+ rule: "Exits are one step faster than entrances, and never overshoot.",
65
+ why: "Something leaving should get out of the way. A bounce on exit draws the eye to what the user just dismissed."
66
+ },
67
+ {
68
+ rule: "Animate opacity and transform only.",
69
+ why: "They run on the compositor. Width, height, top and left cause layout on every frame. motion-disclosure is the one sanctioned exception."
70
+ },
71
+ {
72
+ rule: "Durations come from tokens, so --motion-scale can stop them.",
73
+ why: "prefers-reduced-motion and <MotionProvider> off both set --motion-scale to 0. A raw duration ignores that.",
74
+ enforcedBy: "sable-lint: raw-duration, builtin-animate"
75
+ },
76
+ {
77
+ rule: "Interactive elements always respond. Something styled for hover with no motion recipe snaps.",
78
+ why: "A snap between states reads as broken. The four prohibitive rules could not catch missing motion, so this one does.",
79
+ enforcedBy: "sable-lint: static-interactive"
80
+ },
81
+ {
82
+ rule: "JS motion reads useMotion().enabled and does nothing when it is false.",
83
+ why: "Reduced motion is an accessibility setting, not a style preference."
84
+ }
85
+ ],
86
+ noGos: [
87
+ {
88
+ never: "Tailwind's animate-spin / animate-pulse / animate-ping / animate-bounce.",
89
+ instead: "motion-spin, motion-pulse, motion-ping, motion-dot-bounce.",
90
+ why: "The built-ins ignore --motion-scale, so reduced motion cannot freeze them.",
91
+ enforcedBy: "sable-lint: builtin-animate"
92
+ },
93
+ {
94
+ never: "duration-150, duration-300, or any raw duration utility.",
95
+ instead: "duration-(--motion-duration-fast) and siblings.",
96
+ why: "Raw durations bypass the kill switch.",
97
+ enforcedBy: "sable-lint: raw-duration"
98
+ },
99
+ {
100
+ never: "transition-all, or transition-colors on its own.",
101
+ instead: "motion-interactive, or name the properties you animate.",
102
+ why: "transition-all animates unrelated layout changes and defeats the browser's pre-computation.",
103
+ enforcedBy: "sable-lint: transition-all, transition-colors"
104
+ },
105
+ {
106
+ never: "Motion on first paint of static content, or staggered entrances on every list.",
107
+ instead: "Reveal for one deliberate moment per view.",
108
+ why: "Entrance choreography repeated everywhere becomes a loading delay."
109
+ },
110
+ {
111
+ never: "The motion library in the core package.",
112
+ instead: "src/motion (WAAPI, IntersectionObserver, View Transitions).",
113
+ why: "Sable's motion layer is zero-dependency; drag, FLIP and velocity springs belong in an optional adapter."
114
+ }
115
+ ],
116
+ details: [
117
+ {
118
+ title: "Hover that respects the kill switch",
119
+ before: '<button className="transition-colors duration-150 sable-surface-interactive">',
120
+ after: '<button className="motion-interactive sable-surface-interactive">',
121
+ why: "Same feel, but reduced motion now resolves it instantly."
122
+ },
123
+ {
124
+ title: "Faster exits",
125
+ before: "transition: opacity 200ms ease-in-out; /* in and out */",
126
+ after: "data-[starting-style]: enter 200ms decelerate \xB7 data-[ending-style]: exit 150ms standard",
127
+ why: "motion-pop and motion-slide-* already do this; dismissing feels responsive instead of sluggish."
128
+ }
129
+ ],
130
+ related: ["accessibility", "sable docs reviewing-motion", "sable token motion"]
131
+ };
132
+ var motion_default = motion;
133
+ export {
134
+ motion_default as default
135
+ };
@@ -0,0 +1,62 @@
1
+ // src/foundations/scrolling.ts
2
+ var scrolling = {
3
+ slug: "scrolling",
4
+ title: "Scrolling",
5
+ summary: "Every scroll container declares a policy. Vertical regions get a quiet bar that appears only while you are in them; horizontal strips get edge fades instead of a rail.",
6
+ headline: "2 policies \xB7 vertical gets a bar \xB7 horizontal gets a fade",
7
+ vocabularies: [
8
+ {
9
+ title: "Policies",
10
+ terms: [
11
+ { name: "scrollbar-quiet", value: "4px thumb \xB7 hidden at rest \u2192 12% active \u2192 16% hovered \u2192 20% dragging", use: "The default for vertical scrolling. Grows to 6px under the pointer." },
12
+ { name: "scrollbar-hidden", value: "no bar", use: "Only when something else carries the affordance \u2014 and you can name it (an edge fade, paging controls)." },
13
+ { name: "<Scroller>", value: "edge fades + wheel mapping", use: "Horizontal strips: media rows, chip rows, tab overflow." },
14
+ { name: "useScrollActivity", value: "data-scrolling for ~600ms", use: "Lets the bar respond to touch drags and programmatic scrolls, which hover cannot see." }
15
+ ]
16
+ }
17
+ ],
18
+ rules: [
19
+ {
20
+ rule: "Every overflow-*-auto|scroll declares scrollbar-quiet or scrollbar-hidden.",
21
+ why: "Left bare, the platform draws its own: on Windows, stepper arrows hard against the padding edge that poke out of rounded corners.",
22
+ enforcedBy: "sable-lint: unmanaged-overflow (also checked over every registry example)"
23
+ },
24
+ {
25
+ rule: "Vertical regions get a bar; horizontal regions get an edge fade.",
26
+ why: "A vertical list needs position feedback. A horizontal strip needs 'there is more this way', which a fade says better than a 4px rail."
27
+ },
28
+ {
29
+ rule: "A horizontal region must work without a horizontal input.",
30
+ why: "Most mice have no horizontal wheel. Scroller maps the vertical wheel sideways and handles arrow keys, Home and End."
31
+ },
32
+ {
33
+ rule: "Reveal on scrolling, not only on hover.",
34
+ why: "Touch drags and programmatic scrolls (a chat following a reply) hover nothing, and those are the moments a reader needs to see where they are."
35
+ }
36
+ ],
37
+ noGos: [
38
+ {
39
+ never: "scrollbar-hidden on a vertical list with no fade or paging.",
40
+ instead: "scrollbar-quiet.",
41
+ why: "It leaves the reader with no sense of position and nothing to discover."
42
+ },
43
+ {
44
+ never: "A styled ::-webkit-scrollbar written per component.",
45
+ instead: "The scrollbar-quiet utility.",
46
+ why: "Chromium ignores ::-webkit-scrollbar once scrollbar-width is set; the utility handles both engines."
47
+ }
48
+ ],
49
+ details: [
50
+ {
51
+ title: "A scrolling panel",
52
+ before: '<div className="overflow-y-auto">',
53
+ after: '<div className="overflow-y-auto scrollbar-quiet" ref={useScrollActivity()}>',
54
+ why: "No bar at rest; it appears while scrolling, hovered or focused, and fades a beat after. Content cut off at the edge is what says the region scrolls."
55
+ }
56
+ ],
57
+ related: ["surfaces", "accessibility", "sable component Scroller"]
58
+ };
59
+ var scrolling_default = scrolling;
60
+ export {
61
+ scrolling_default as default
62
+ };
@@ -0,0 +1,113 @@
1
+ // src/foundations/shape.ts
2
+ var shape = {
3
+ slug: "shape",
4
+ title: "Shape",
5
+ summary: "Radius signals what something is: tight on containers, full on actions. Nested corners stay concentric, and one edge treatment marks a boundary.",
6
+ headline: "7 radius steps \xB7 concentric nesting \xB7 1 edge treatment per boundary",
7
+ vocabularies: [
8
+ {
9
+ title: "The radius ladder",
10
+ note: "Each step is 4px apart, so common insets land on a real step. Themes and the customizer retune every step together.",
11
+ terms: [
12
+ { name: "rounded-none", value: "0", use: "Full-bleed media." },
13
+ { name: "rounded-xs", value: "4px", use: "Tags, kbd, small inline marks." },
14
+ { name: "rounded-sm", value: "8px", use: "Inputs, menu items, list rows." },
15
+ { name: "rounded-md", value: "12px", use: "Popovers, menus, toasts." },
16
+ { name: "rounded-lg", value: "16px", use: "Cards, dialogs, sheets." },
17
+ { name: "rounded-xl", value: "20px", use: "Hero surfaces." },
18
+ { name: "rounded-full", value: "pill", use: "Buttons (via --button-radius), avatars, pills, dots." }
19
+ ]
20
+ },
21
+ {
22
+ title: "Edges",
23
+ terms: [
24
+ { name: "border-border", value: "hairline", use: "The default edge: inputs, cards, badges." },
25
+ { name: "border-border-strong", value: "hairline, higher contrast", use: "Structural rules: table grids, section separators." },
26
+ { name: "border-border-floating", value: "faint, alpha", use: "Every floating surface: popovers, menus, selects, tooltips, dialogs, sheets, toasts. Lighter than border; the shadow carries the elevation." },
27
+ { name: "ring-2 ring-ring", value: "2px focus ring", use: "Focus only. Never a thick border." }
28
+ ]
29
+ }
30
+ ],
31
+ rules: [
32
+ {
33
+ rule: "Nested corners are concentric: inner radius = outer radius \u2212 inset. Write it as rounded-concentric-<outer>/<inset>, not a hardcoded step.",
34
+ why: "A 12px popover with 4px padding takes 8px items. The utility computes the subtraction from the live tokens, so the pair stays concentric when a theme or the customizer rescales the radius ladder; a hardcoded rounded-sm drifts."
35
+ },
36
+ {
37
+ rule: "A list of rows inside a rounded popup uses popup-inset on the popup, rounded-popup-item on the rows and popup-bleed on a separator.",
38
+ why: "All three derive from the popup's radius: the inset grows to a third of it (never below --spacing(1), so density moves it too), the rows take what is left after the inset and the 1px border, and a separator bleeds by exactly the inset. A rounder look gets more room instead of rows that round into pills; the default ladder lands on a 4px inset and 7px rows.",
39
+ enforcedBy: "sable-lint: popup-separator-bleed"
40
+ },
41
+ {
42
+ rule: "A Button, Pill or Badge gets its look from a variant, never from override classes.",
43
+ why: `border, bg, rounded, ring and shadow classes on a component fight the variant's own hover, selected and focus states, and give one call site a look no other site can ask for. Use the variant that exists (Button variant="floating" over content, "on-color" on a fill; Pill appearance="outline"; Badge appearance and tone) or add one to the component.`,
44
+ enforcedBy: "sable-lint: component-restyle"
45
+ },
46
+ {
47
+ rule: "The outer radius is always at least the inner radius.",
48
+ why: "If the inset is larger than the outer radius, square the inner element or step the container up."
49
+ },
50
+ {
51
+ rule: "Never mix radii within one component.",
52
+ why: "A component reads as one object when its corners agree."
53
+ },
54
+ {
55
+ rule: "Actions are full; containers are tight.",
56
+ why: "The contrast itself says 'this is a control'. A theme flattens buttons through --button-radius, not by editing each one."
57
+ },
58
+ {
59
+ rule: "High-contrast outlines (selection, emphasis) are inset rings; hairline chrome is a border.",
60
+ why: "Rings anti-alias on rounded corners at any display scale; a 1px light border on dark snaps to the pixel grid and looks jagged."
61
+ },
62
+ {
63
+ rule: "One edge treatment per boundary: a border, a ring or a shadow.",
64
+ why: "Stacking all three makes an edge heavier than the content it holds."
65
+ },
66
+ {
67
+ rule: "Prefer a tonal step or space over a divider line.",
68
+ why: "The flattest thing that reads is best."
69
+ }
70
+ ],
71
+ noGos: [
72
+ {
73
+ never: "rounded-[10px] or any off-ladder radius.",
74
+ instead: "The ladder step for the role.",
75
+ why: "Off-ladder radii cannot follow a theme or the customizer's radius control."
76
+ },
77
+ {
78
+ never: "A card inside a card with the same radius.",
79
+ instead: "Flatten the inner one, or use rounded-concentric-*.",
80
+ why: "Nested surfaces with equal corners look misaligned at every corner."
81
+ },
82
+ {
83
+ never: '<Button className="rounded-full">, <Pill className="border bg-card">, a -mx-1 separator in a popup.',
84
+ instead: "The component's variant (add one if it is missing); popup-bleed for the separator.",
85
+ why: "An override fights the component's own states and does not follow the radius ladder, the density or a theme.",
86
+ enforcedBy: "sable-lint: component-restyle, popup-separator-bleed"
87
+ },
88
+ {
89
+ never: "border-2 for emphasis or focus.",
90
+ instead: "ring-2 ring-ring for focus; a tonal fill for emphasis.",
91
+ why: "A thick border shifts layout and competes with the focus ring."
92
+ }
93
+ ],
94
+ details: [
95
+ {
96
+ title: "Crisp selected outlines on dark surfaces",
97
+ before: '<button className="rounded-lg border border-foreground">',
98
+ after: '<button className="rounded-lg ring-[1.5px] ring-foreground ring-inset">',
99
+ why: "A 1px high-contrast border on a rounded corner snaps unevenly at fractional device-pixel ratios (Windows 125%/150%) and reads as jagged, worst light-on-dark. A box-shadow ring is anti-aliased instead, and inset keeps it from changing the element's size. Keep hairline borders for low-contrast chrome, where the snapping is invisible."
100
+ },
101
+ {
102
+ title: "Concentric menu items",
103
+ before: '<div className="rounded-md p-1"><div className="rounded-md">Item</div></div>',
104
+ after: '<div className="rounded-md popup-inset"><div className="rounded-popup-item">Item</div></div>',
105
+ why: "12px outer \u2212 4px inset = 8px inner at the default ladder, and the utilities keep the subtraction right when a preset or the customizer rescales the radius or the density."
106
+ }
107
+ ],
108
+ related: ["surfaces", "spacing", "sable token radii"]
109
+ };
110
+ var shape_default = shape;
111
+ export {
112
+ shape_default as default
113
+ };
@@ -0,0 +1,121 @@
1
+ // src/foundations/spacing.ts
2
+ var spacing = {
3
+ slug: "spacing",
4
+ title: "Spacing & sizing",
5
+ summary: "One 4px scale governs every gap, inset and size, and space is assigned by role. Controls read a height ladder that a density scope can retune all at once.",
6
+ headline: "4px base \xB7 8px rhythm \xB7 3 roles \xB7 1 control ladder",
7
+ vocabularies: [
8
+ {
9
+ title: "Spacing by role",
10
+ note: "Steps below 2 (8px) are optical correction only.",
11
+ terms: [
12
+ { name: "Inset p-4", value: "16px", use: "Padding inside a surface. p-3 for a dense card, px-3 py-2 for a row." },
13
+ { name: "Stack, within a group gap-1.5 \u2013 gap-2", value: "6\u20138px", use: "Label to field, title to description." },
14
+ { name: "Stack, between groups gap-4 \u2013 gap-6", value: "16\u201324px", use: "Field to field, card to card." },
15
+ { name: "Stack, between sections gap-12+", value: "48px+", use: "Major regions of a page." },
16
+ { name: "Inline gap-2 \u2013 gap-3", value: "8\u201312px", use: "Icon to label, control to control." }
17
+ ]
18
+ },
19
+ {
20
+ title: "The control ladder",
21
+ note: 'Comfortable values; data-density="compact" (or <Density>) redefines every step for a region.',
22
+ terms: [
23
+ { name: "h-(--control-xs)", value: "28px \xB7 compact 24", use: "Inline chips, tree rows." },
24
+ { name: "h-(--control-sm)", value: "32px \xB7 compact 28", use: "Compact buttons, toolbar controls." },
25
+ { name: "h-(--control-md)", value: "40px \xB7 compact 32", use: "The default: inputs, buttons, selects, menu triggers." },
26
+ { name: "h-(--control-cta)", value: "44px \xB7 compact 36", use: "The primary call to action; clears the touch floor on its own." },
27
+ { name: "h-(--control-lg)", value: "48px \xB7 compact 40", use: "Prominent or touch-first actions." }
28
+ ]
29
+ },
30
+ {
31
+ title: "Icons and touch",
32
+ terms: [
33
+ { name: "text-base (16px)", value: "sm", use: "Inline with label-md / body-sm." },
34
+ { name: "text-xl (20px)", value: "md \xB7 default", use: "The default UI glyph beside label-lg." },
35
+ { name: "hit-target", value: "44\xD744px", use: "Keeps a visually small control's hit area at the WCAG floor without moving layout." }
36
+ ]
37
+ }
38
+ ],
39
+ rules: [
40
+ {
41
+ rule: "Every margin, padding and gap is a step on the 4px scale.",
42
+ why: "Off-scale values break the rhythm that lets adjacent components line up without coordination."
43
+ },
44
+ {
45
+ rule: "Padding, gaps and insets in a component sit on the spacing scale: a step (p-4, gap-2) or --spacing(n) inside an arbitrary value (p-[var(--card-p,--spacing(6))]).",
46
+ why: 'The density (Character) control works by retuning --spacing, so anything on the scale moves with it. A literal p-[1.5rem] or padding: "12px" stays put while everything around it tightens. Keep fixed rem/px for what must not scale: a 1px hairline, a ring width.',
47
+ enforcedBy: "design-lint: fixed-spacing (library source)"
48
+ },
49
+ {
50
+ rule: "Related things sit closer than unrelated things.",
51
+ why: "Proximity groups content without a divider line. Use space first; reach for a border only when space is not enough."
52
+ },
53
+ {
54
+ rule: "Space lives on the container (gap), not on children (margins).",
55
+ why: "gap survives reordering, conditional children and RTL; per-child margins do not."
56
+ },
57
+ {
58
+ rule: "Control heights read the --control-* ladder.",
59
+ why: "A density scope retunes every control at once. A hardcoded height has to be found and overridden by hand.",
60
+ enforcedBy: "sable-lint: raw-control-height"
61
+ },
62
+ {
63
+ rule: "Single-column content inside a card stacks with flex flex-col and a gap, not CSS grid.",
64
+ why: "A grid track sizes to its widest min-content child, so one long unbreakable string (a URL, a code line, a table) blows the column out past the card. A flex column lets children shrink to the card."
65
+ },
66
+ {
67
+ rule: "A compact surface drops one whole step; a spacious one adds one.",
68
+ why: "Moving in whole steps keeps density changes proportional."
69
+ },
70
+ {
71
+ rule: "Every interactive element clears a 44\xD744px hit area.",
72
+ why: "WCAG 2.5.5. Use padding or hit-target to grow the hit area; never a bigger glyph."
73
+ },
74
+ {
75
+ rule: "Borderless controls get roughly twice the gap of bordered ones.",
76
+ why: "A border declares where a control ends. Two ghost buttons 12px apart read as one target."
77
+ }
78
+ ],
79
+ noGos: [
80
+ {
81
+ never: "Arbitrary values: p-[15px], gap-[7px], mt-[13px].",
82
+ instead: "The nearest scale step.",
83
+ why: "Arbitrary values cannot follow density or a customized scale."
84
+ },
85
+ {
86
+ never: "h-[40px] on a control.",
87
+ instead: "h-(--control-md).",
88
+ why: "It will not follow <Density>.",
89
+ enforcedBy: "sable-lint: raw-control-height"
90
+ },
91
+ {
92
+ never: "Icons sized with type utilities (text-body-md on an <Icon>).",
93
+ instead: "text-{size} scale classes.",
94
+ why: "Type utilities carry line-height and tracking that misalign glyphs."
95
+ },
96
+ {
97
+ never: "A fixed width sized to an English label.",
98
+ instead: "padding-inline and max-width with wrapping.",
99
+ why: "German and Finnish run 30\u201350% longer."
100
+ }
101
+ ],
102
+ details: [
103
+ {
104
+ title: "A dense region in one attribute",
105
+ before: '<div className="[&_button]:h-8 [&_input]:h-8">\u2026</div>',
106
+ after: '<Density value="compact">\u2026</Density>',
107
+ why: "Every control, menu and popup inside retunes, including portaled overlays."
108
+ },
109
+ {
110
+ title: "Grouping by space",
111
+ before: "<Separator /> between every field",
112
+ after: "<Stack gap={3}> between groups (24px), <Stack gap={1}> inside a group (8px)",
113
+ why: "Two spacing steps do the work of every divider, with less ink. Stack's numeric gap counts --rhythm-unit \u2014 two spacing steps \u2014 so it follows the density control like every other spacing value."
114
+ }
115
+ ],
116
+ related: ["shape", "typography", "sable docs building-a-tool", "sable token layout"]
117
+ };
118
+ var spacing_default = spacing;
119
+ export {
120
+ spacing_default as default
121
+ };
@@ -0,0 +1,107 @@
1
+ // src/foundations/surfaces.ts
2
+ var surfaces = {
3
+ slug: "surfaces",
4
+ title: "Surfaces & elevation",
5
+ summary: "Depth is a step up the surface ladder, chosen by how transient a surface is. Dark mode lifts with lighter tones and edge light; light mode adds soft shadows.",
6
+ headline: "4 surface tokens \xB7 5 elevation roles \xB7 1 shadow per surface \xB7 1 layer scale",
7
+ vocabularies: [
8
+ {
9
+ title: "The surface ladder",
10
+ terms: [
11
+ { name: "bg-background", value: "the page", use: "The document body; the furthest-back surface." },
12
+ { name: "bg-card", value: "+1 step", use: "Resting containers: cards, panels, dialogs." },
13
+ { name: "bg-muted", value: "+1 step, quieter", use: "Wells, code blocks, inactive fills inside a card." },
14
+ { name: "bg-popover", value: "+2 steps", use: "Anything that floats: menus, popovers, selects, tooltips. Always distinct from card, so a menu in a dialog never melts into it." },
15
+ { name: "bg-overlay", value: "scrim", use: "Behind modals, and pills over imagery." }
16
+ ]
17
+ },
18
+ {
19
+ title: "Elevation by role",
20
+ note: "Raise by transience \u2014 how much a surface floats over content \u2014 not by importance.",
21
+ terms: [
22
+ { name: "Resting", value: "no shadow", use: "Page content and flat cards. A hairline border if it needs an edge." },
23
+ { name: "Raised shadow-sm", value: "subtle", use: "A draggable card, a sticky header over scrolled content." },
24
+ { name: "Floating shadow-md", value: "anchored", use: "Menus, popovers, selects, dropdowns." },
25
+ { name: "Modal shadow-lg", value: "with scrim", use: "Dialogs, sheets, the command menu." },
26
+ { name: "Top shadow-xl", value: "rare", use: "The toast stack." }
27
+ ]
28
+ },
29
+ {
30
+ title: "Layers",
31
+ terms: [
32
+ { name: "z-(--z-sticky)", value: "30", use: "Sticky in-content chrome: table headers." },
33
+ { name: "z-(--z-nav)", value: "40", use: "App chrome: header, sidebar, bottom nav." },
34
+ { name: "z-(--z-overlay)", value: "50", use: "Every portaled transient surface." },
35
+ { name: "z-(--z-toast)", value: "60", use: "Toasts, above modals." },
36
+ { name: "z-(--z-skip-link)", value: "100", use: "The skip link, above everything." }
37
+ ]
38
+ }
39
+ ],
40
+ rules: [
41
+ {
42
+ rule: "Pick the elevation role, not a shadow value.",
43
+ why: "Elevation is a five-step system. A custom box-shadow cannot follow a theme or the light/dark split."
44
+ },
45
+ {
46
+ rule: "Floating surfaces use bg-popover, resting ones bg-card. Anything with shadow-md or above floats: menus, popovers, selects, tooltips, dialogs, sheets, toasts, a floating panel.",
47
+ why: "In dark mode popover is guaranteed lighter than card, so a menu opened inside a dialog always reads as on top of it. In light mode several presets make background, card and popover the same colour, so the fill alone never carries elevation.",
48
+ enforcedBy: "themes.test.ts + sable-lint: floating-surface"
49
+ },
50
+ {
51
+ rule: "A floating surface's edge is border-border-floating (or ring-border-floating), never the full border-border. The shadow carries the elevation.",
52
+ why: "A full hairline plus a shadow stacks into a heavy dark outline. border-floating is a faint alpha edge: it defines the shape against a same-coloured page in light mode and reads as a lit edge in dark mode, where shadows barely show.",
53
+ enforcedBy: "sable-lint: floating-surface"
54
+ },
55
+ {
56
+ rule: "A recessed area inside a surface (a segmented-control track, a pad, a preview well) is sable-well, and it takes no outline. Whatever sits on the well takes the surface's own colour back (bg-popover inside a popover).",
57
+ why: "sable-well mixes a fixed amount of ink into the surface it sits in, so it is the same visible step on the page, in a card or in a floating panel, in every theme and mode. A fixed bg-muted can nearly vanish inside a popover in dark mode, and adding an outline to every well to compensate stacks a panel into boxes."
58
+ },
59
+ {
60
+ rule: "One shadow per surface; never a heavy shadow with a heavy border.",
61
+ why: "Stacked depth cues read as decoration rather than position."
62
+ },
63
+ {
64
+ rule: "Do not elevate a static section to make it stand out.",
65
+ why: "Elevation means 'this floats'. Use a tonal step or space for emphasis."
66
+ },
67
+ {
68
+ rule: "For modals, the scrim is the primary depth cue.",
69
+ why: "The scrim is what tells the user the page behind is inert; the shadow is secondary."
70
+ },
71
+ {
72
+ rule: "Stack with the named layer scale.",
73
+ why: "Overlays portal to the end of body and order themselves by open order; the layer only has to clear in-flow chrome."
74
+ }
75
+ ],
76
+ noGos: [
77
+ {
78
+ never: "z-[9999] or any raw z-index.",
79
+ instead: "z-(--z-overlay) and the other named layers.",
80
+ why: "Raw z-indexes become a bidding war that a future overlay always loses.",
81
+ enforcedBy: "sable-lint: raw-z-index"
82
+ },
83
+ {
84
+ never: "shadow-[0_8px_30px_rgba(0,0,0,.2)] or any custom shadow.",
85
+ instead: "shadow-sm \u2026 shadow-xl by role.",
86
+ why: "Custom shadows ignore the theme's light/dark elevation recipes."
87
+ },
88
+ {
89
+ never: "bg-card on a popover, or bg-popover on a resting card.",
90
+ instead: "Match the token to the role.",
91
+ why: "Swapping them is how floating surfaces melt into the surface beneath."
92
+ }
93
+ ],
94
+ details: [
95
+ {
96
+ title: "A menu inside a dialog",
97
+ before: "Dialog bg-card \xB7 Menu bg-card \u2014 identical in dark mode",
98
+ after: "Dialog bg-card \xB7 Menu bg-popover \u2014 one step lighter, plus edge light",
99
+ why: "The menu reads as above the dialog without any prop."
100
+ }
101
+ ],
102
+ related: ["shape", "sable docs token-intent"]
103
+ };
104
+ var surfaces_default = surfaces;
105
+ export {
106
+ surfaces_default as default
107
+ };
File without changes