@repraze/kernelkit 0.0.0-stage → 0.1.0-alpha.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 (584) hide show
  1. package/README.md +41 -2
  2. package/dist/components/accordion.d.ts +13 -0
  3. package/dist/components/accordion.d.ts.map +1 -0
  4. package/dist/components/accordion.js +33 -0
  5. package/dist/components/accordion.js.map +1 -0
  6. package/dist/components/alert-dialog.d.ts +24 -0
  7. package/dist/components/alert-dialog.d.ts.map +1 -0
  8. package/dist/components/alert-dialog.js +49 -0
  9. package/dist/components/alert-dialog.js.map +1 -0
  10. package/dist/components/alert.d.ts +22 -0
  11. package/dist/components/alert.d.ts.map +1 -0
  12. package/dist/components/alert.js +61 -0
  13. package/dist/components/alert.js.map +1 -0
  14. package/dist/components/aspect-ratio.d.ts +10 -0
  15. package/dist/components/aspect-ratio.d.ts.map +1 -0
  16. package/dist/components/aspect-ratio.js +18 -0
  17. package/dist/components/aspect-ratio.js.map +1 -0
  18. package/dist/components/attachment.d.ts +27 -0
  19. package/dist/components/attachment.d.ts.map +1 -0
  20. package/dist/components/attachment.js +76 -0
  21. package/dist/components/attachment.js.map +1 -0
  22. package/dist/components/avatar.d.ts +18 -0
  23. package/dist/components/avatar.d.ts.map +1 -0
  24. package/dist/components/avatar.js +38 -0
  25. package/dist/components/avatar.js.map +1 -0
  26. package/dist/components/badge.d.ts +18 -0
  27. package/dist/components/badge.d.ts.map +1 -0
  28. package/dist/components/badge.js +49 -0
  29. package/dist/components/badge.js.map +1 -0
  30. package/dist/components/breadcrumb.d.ts +11 -0
  31. package/dist/components/breadcrumb.d.ts.map +1 -0
  32. package/dist/components/breadcrumb.js +40 -0
  33. package/dist/components/breadcrumb.js.map +1 -0
  34. package/dist/components/bubble.d.ts +22 -0
  35. package/dist/components/bubble.d.ts.map +1 -0
  36. package/dist/components/bubble.js +72 -0
  37. package/dist/components/bubble.js.map +1 -0
  38. package/dist/components/button-group.d.ts +11 -0
  39. package/dist/components/button-group.d.ts.map +1 -0
  40. package/dist/components/button-group.js +38 -0
  41. package/dist/components/button-group.js.map +1 -0
  42. package/dist/components/button.d.ts +26 -0
  43. package/dist/components/button.d.ts.map +1 -0
  44. package/dist/components/button.js +78 -0
  45. package/dist/components/button.js.map +1 -0
  46. package/dist/components/calendar.d.ts +11 -0
  47. package/dist/components/calendar.d.ts.map +1 -0
  48. package/dist/components/calendar.js +89 -0
  49. package/dist/components/calendar.js.map +1 -0
  50. package/dist/components/callout.d.ts +25 -0
  51. package/dist/components/callout.d.ts.map +1 -0
  52. package/dist/components/callout.js +40 -0
  53. package/dist/components/callout.js.map +1 -0
  54. package/dist/components/card.d.ts +43 -0
  55. package/dist/components/card.d.ts.map +1 -0
  56. package/dist/components/card.js +80 -0
  57. package/dist/components/card.js.map +1 -0
  58. package/dist/components/carousel.d.ts +36 -0
  59. package/dist/components/carousel.d.ts.map +1 -0
  60. package/dist/components/carousel.js +148 -0
  61. package/dist/components/carousel.js.map +1 -0
  62. package/dist/components/chart.d.ts +45 -0
  63. package/dist/components/chart.d.ts.map +1 -0
  64. package/dist/components/chart.js +137 -0
  65. package/dist/components/chart.js.map +1 -0
  66. package/dist/components/checkbox-group.d.ts +9 -0
  67. package/dist/components/checkbox-group.d.ts.map +1 -0
  68. package/dist/components/checkbox-group.js +14 -0
  69. package/dist/components/checkbox-group.js.map +1 -0
  70. package/dist/components/checkbox.d.ts +6 -0
  71. package/dist/components/checkbox.d.ts.map +1 -0
  72. package/dist/components/checkbox.js +27 -0
  73. package/dist/components/checkbox.js.map +1 -0
  74. package/dist/components/code-block.d.ts +29 -0
  75. package/dist/components/code-block.d.ts.map +1 -0
  76. package/dist/components/code-block.js +87 -0
  77. package/dist/components/code-block.js.map +1 -0
  78. package/dist/components/collapsible.d.ts +11 -0
  79. package/dist/components/collapsible.d.ts.map +1 -0
  80. package/dist/components/collapsible.js +21 -0
  81. package/dist/components/collapsible.js.map +1 -0
  82. package/dist/components/combobox.d.ts +26 -0
  83. package/dist/components/combobox.d.ts.map +1 -0
  84. package/dist/components/combobox.js +66 -0
  85. package/dist/components/combobox.js.map +1 -0
  86. package/dist/components/command.d.ts +25 -0
  87. package/dist/components/command.d.ts.map +1 -0
  88. package/dist/components/command.js +48 -0
  89. package/dist/components/command.js.map +1 -0
  90. package/dist/components/context-menu.d.ts +32 -0
  91. package/dist/components/context-menu.d.ts.map +1 -0
  92. package/dist/components/context-menu.js +58 -0
  93. package/dist/components/context-menu.js.map +1 -0
  94. package/dist/components/copy-button.d.ts +21 -0
  95. package/dist/components/copy-button.d.ts.map +1 -0
  96. package/dist/components/copy-button.js +34 -0
  97. package/dist/components/copy-button.js.map +1 -0
  98. package/dist/components/data-table/data-table-utils.d.ts +18 -0
  99. package/dist/components/data-table/data-table-utils.d.ts.map +1 -0
  100. package/dist/components/data-table/data-table-utils.js +92 -0
  101. package/dist/components/data-table/data-table-utils.js.map +1 -0
  102. package/dist/components/data-table/elements/data-table-base.d.ts +24 -0
  103. package/dist/components/data-table/elements/data-table-base.d.ts.map +1 -0
  104. package/dist/components/data-table/elements/data-table-base.js +28 -0
  105. package/dist/components/data-table/elements/data-table-base.js.map +1 -0
  106. package/dist/components/data-table/elements/data-table-body.d.ts +8 -0
  107. package/dist/components/data-table/elements/data-table-body.d.ts.map +1 -0
  108. package/dist/components/data-table/elements/data-table-body.js +16 -0
  109. package/dist/components/data-table/elements/data-table-body.js.map +1 -0
  110. package/dist/components/data-table/elements/data-table-cell.d.ts +12 -0
  111. package/dist/components/data-table/elements/data-table-cell.d.ts.map +1 -0
  112. package/dist/components/data-table/elements/data-table-cell.js +23 -0
  113. package/dist/components/data-table/elements/data-table-cell.js.map +1 -0
  114. package/dist/components/data-table/elements/data-table-filter-row.d.ts +40 -0
  115. package/dist/components/data-table/elements/data-table-filter-row.d.ts.map +1 -0
  116. package/dist/components/data-table/elements/data-table-filter-row.js +117 -0
  117. package/dist/components/data-table/elements/data-table-filter-row.js.map +1 -0
  118. package/dist/components/data-table/elements/data-table-foot.d.ts +9 -0
  119. package/dist/components/data-table/elements/data-table-foot.d.ts.map +1 -0
  120. package/dist/components/data-table/elements/data-table-foot.js +11 -0
  121. package/dist/components/data-table/elements/data-table-foot.js.map +1 -0
  122. package/dist/components/data-table/elements/data-table-head.d.ts +9 -0
  123. package/dist/components/data-table/elements/data-table-head.d.ts.map +1 -0
  124. package/dist/components/data-table/elements/data-table-head.js +11 -0
  125. package/dist/components/data-table/elements/data-table-head.js.map +1 -0
  126. package/dist/components/data-table/elements/data-table-info-row.d.ts +7 -0
  127. package/dist/components/data-table/elements/data-table-info-row.d.ts.map +1 -0
  128. package/dist/components/data-table/elements/data-table-info-row.js +19 -0
  129. package/dist/components/data-table/elements/data-table-info-row.js.map +1 -0
  130. package/dist/components/data-table/elements/data-table-row.d.ts +13 -0
  131. package/dist/components/data-table/elements/data-table-row.d.ts.map +1 -0
  132. package/dist/components/data-table/elements/data-table-row.js +19 -0
  133. package/dist/components/data-table/elements/data-table-row.js.map +1 -0
  134. package/dist/components/data-table/elements/data-table-scroll.d.ts +11 -0
  135. package/dist/components/data-table/elements/data-table-scroll.d.ts.map +1 -0
  136. package/dist/components/data-table/elements/data-table-scroll.js +10 -0
  137. package/dist/components/data-table/elements/data-table-scroll.js.map +1 -0
  138. package/dist/components/data-table/elements/data-table-sort-row.d.ts +28 -0
  139. package/dist/components/data-table/elements/data-table-sort-row.d.ts.map +1 -0
  140. package/dist/components/data-table/elements/data-table-sort-row.js +114 -0
  141. package/dist/components/data-table/elements/data-table-sort-row.js.map +1 -0
  142. package/dist/components/data-table/elements/data-table-title-row.d.ts +11 -0
  143. package/dist/components/data-table/elements/data-table-title-row.d.ts.map +1 -0
  144. package/dist/components/data-table/elements/data-table-title-row.js +16 -0
  145. package/dist/components/data-table/elements/data-table-title-row.js.map +1 -0
  146. package/dist/components/data-table/elements/data-table-virtualized-body.d.ts +10 -0
  147. package/dist/components/data-table/elements/data-table-virtualized-body.d.ts.map +1 -0
  148. package/dist/components/data-table/elements/data-table-virtualized-body.js +38 -0
  149. package/dist/components/data-table/elements/data-table-virtualized-body.js.map +1 -0
  150. package/dist/components/data-table/set-utils.d.ts +41 -0
  151. package/dist/components/data-table/set-utils.d.ts.map +1 -0
  152. package/dist/components/data-table/set-utils.js +97 -0
  153. package/dist/components/data-table/set-utils.js.map +1 -0
  154. package/dist/components/data-table/views/data-table-filter-view.d.ts +18 -0
  155. package/dist/components/data-table/views/data-table-filter-view.d.ts.map +1 -0
  156. package/dist/components/data-table/views/data-table-filter-view.js +63 -0
  157. package/dist/components/data-table/views/data-table-filter-view.js.map +1 -0
  158. package/dist/components/data-table/views/data-table-prop-view.d.ts +297 -0
  159. package/dist/components/data-table/views/data-table-prop-view.d.ts.map +1 -0
  160. package/dist/components/data-table/views/data-table-prop-view.js +44 -0
  161. package/dist/components/data-table/views/data-table-prop-view.js.map +1 -0
  162. package/dist/components/data-table/views/data-table-root-view.d.ts +8 -0
  163. package/dist/components/data-table/views/data-table-root-view.d.ts.map +1 -0
  164. package/dist/components/data-table/views/data-table-root-view.js +18 -0
  165. package/dist/components/data-table/views/data-table-root-view.js.map +1 -0
  166. package/dist/components/data-table/views/data-table-sort-view.d.ts +18 -0
  167. package/dist/components/data-table/views/data-table-sort-view.d.ts.map +1 -0
  168. package/dist/components/data-table/views/data-table-sort-view.js +70 -0
  169. package/dist/components/data-table/views/data-table-sort-view.js.map +1 -0
  170. package/dist/components/data-table/views/data-table-view.d.ts +44 -0
  171. package/dist/components/data-table/views/data-table-view.d.ts.map +1 -0
  172. package/dist/components/data-table/views/data-table-view.js +86 -0
  173. package/dist/components/data-table/views/data-table-view.js.map +1 -0
  174. package/dist/components/data-table.d.ts +20 -0
  175. package/dist/components/data-table.d.ts.map +1 -0
  176. package/dist/components/data-table.js +26 -0
  177. package/dist/components/data-table.js.map +1 -0
  178. package/dist/components/date-picker.d.ts +43 -0
  179. package/dist/components/date-picker.d.ts.map +1 -0
  180. package/dist/components/date-picker.js +45 -0
  181. package/dist/components/date-picker.js.map +1 -0
  182. package/dist/components/dialog.d.ts +24 -0
  183. package/dist/components/dialog.d.ts.map +1 -0
  184. package/dist/components/dialog.js +57 -0
  185. package/dist/components/dialog.js.map +1 -0
  186. package/dist/components/direction.d.ts +2 -0
  187. package/dist/components/direction.d.ts.map +1 -0
  188. package/dist/components/direction.js +3 -0
  189. package/dist/components/direction.js.map +1 -0
  190. package/dist/components/drawer.d.ts +18 -0
  191. package/dist/components/drawer.d.ts.map +1 -0
  192. package/dist/components/drawer.js +84 -0
  193. package/dist/components/drawer.js.map +1 -0
  194. package/dist/components/dropdown-menu.d.ts +45 -0
  195. package/dist/components/dropdown-menu.d.ts.map +1 -0
  196. package/dist/components/dropdown-menu.js +77 -0
  197. package/dist/components/dropdown-menu.js.map +1 -0
  198. package/dist/components/empty.d.ts +15 -0
  199. package/dist/components/empty.d.ts.map +1 -0
  200. package/dist/components/empty.js +44 -0
  201. package/dist/components/empty.js.map +1 -0
  202. package/dist/components/field.d.ts +25 -0
  203. package/dist/components/field.d.ts.map +1 -0
  204. package/dist/components/field.js +72 -0
  205. package/dist/components/field.js.map +1 -0
  206. package/dist/components/file-upload.d.ts +24 -0
  207. package/dist/components/file-upload.d.ts.map +1 -0
  208. package/dist/components/file-upload.js +78 -0
  209. package/dist/components/file-upload.js.map +1 -0
  210. package/dist/components/hero.d.ts +51 -0
  211. package/dist/components/hero.d.ts.map +1 -0
  212. package/dist/components/hero.js +104 -0
  213. package/dist/components/hero.js.map +1 -0
  214. package/dist/components/hover-card.d.ts +6 -0
  215. package/dist/components/hover-card.d.ts.map +1 -0
  216. package/dist/components/hover-card.js +17 -0
  217. package/dist/components/hover-card.js.map +1 -0
  218. package/dist/components/input-group.d.ts +23 -0
  219. package/dist/components/input-group.d.ts.map +1 -0
  220. package/dist/components/input-group.js +86 -0
  221. package/dist/components/input-group.js.map +1 -0
  222. package/dist/components/input-otp.d.ts +13 -0
  223. package/dist/components/input-otp.d.ts.map +1 -0
  224. package/dist/components/input-otp.js +25 -0
  225. package/dist/components/input-otp.js.map +1 -0
  226. package/dist/components/input.d.ts +13 -0
  227. package/dist/components/input.d.ts.map +1 -0
  228. package/dist/components/input.js +29 -0
  229. package/dist/components/input.js.map +1 -0
  230. package/dist/components/item.d.ts +23 -0
  231. package/dist/components/item.d.ts.map +1 -0
  232. package/dist/components/item.js +89 -0
  233. package/dist/components/item.js.map +1 -0
  234. package/dist/components/kbd.d.ts +11 -0
  235. package/dist/components/kbd.d.ts.map +1 -0
  236. package/dist/components/kbd.js +26 -0
  237. package/dist/components/kbd.js.map +1 -0
  238. package/dist/components/label.d.ts +4 -0
  239. package/dist/components/label.d.ts.map +1 -0
  240. package/dist/components/label.js +9 -0
  241. package/dist/components/label.js.map +1 -0
  242. package/dist/components/marker.d.ts +11 -0
  243. package/dist/components/marker.d.ts.map +1 -0
  244. package/dist/components/marker.js +37 -0
  245. package/dist/components/marker.js.map +1 -0
  246. package/dist/components/menubar.d.ts +23 -0
  247. package/dist/components/menubar.d.ts.map +1 -0
  248. package/dist/components/menubar.js +60 -0
  249. package/dist/components/menubar.js.map +1 -0
  250. package/dist/components/message-scroller.d.ts +11 -0
  251. package/dist/components/message-scroller.d.ts.map +1 -0
  252. package/dist/components/message-scroller.js +27 -0
  253. package/dist/components/message-scroller.js.map +1 -0
  254. package/dist/components/message.d.ts +17 -0
  255. package/dist/components/message.d.ts.map +1 -0
  256. package/dist/components/message.js +24 -0
  257. package/dist/components/message.js.map +1 -0
  258. package/dist/components/meter.d.ts +18 -0
  259. package/dist/components/meter.d.ts.map +1 -0
  260. package/dist/components/meter.js +25 -0
  261. package/dist/components/meter.js.map +1 -0
  262. package/dist/components/native-select.d.ts +14 -0
  263. package/dist/components/native-select.d.ts.map +1 -0
  264. package/dist/components/native-select.js +34 -0
  265. package/dist/components/native-select.js.map +1 -0
  266. package/dist/components/navbar.d.ts +11 -0
  267. package/dist/components/navbar.d.ts.map +1 -0
  268. package/dist/components/navbar.js +44 -0
  269. package/dist/components/navbar.js.map +1 -0
  270. package/dist/components/navigation-menu.d.ts +23 -0
  271. package/dist/components/navigation-menu.d.ts.map +1 -0
  272. package/dist/components/navigation-menu.js +51 -0
  273. package/dist/components/navigation-menu.js.map +1 -0
  274. package/dist/components/number-field.d.ts +16 -0
  275. package/dist/components/number-field.d.ts.map +1 -0
  276. package/dist/components/number-field.js +49 -0
  277. package/dist/components/number-field.js.map +1 -0
  278. package/dist/components/page-header.d.ts +13 -0
  279. package/dist/components/page-header.d.ts.map +1 -0
  280. package/dist/components/page-header.js +51 -0
  281. package/dist/components/page-header.js.map +1 -0
  282. package/dist/components/pager.d.ts +14 -0
  283. package/dist/components/pager.d.ts.map +1 -0
  284. package/dist/components/pager.js +36 -0
  285. package/dist/components/pager.js.map +1 -0
  286. package/dist/components/pagination.d.ts +21 -0
  287. package/dist/components/pagination.d.ts.map +1 -0
  288. package/dist/components/pagination.js +29 -0
  289. package/dist/components/pagination.js.map +1 -0
  290. package/dist/components/password-input.d.ts +18 -0
  291. package/dist/components/password-input.d.ts.map +1 -0
  292. package/dist/components/password-input.js +17 -0
  293. package/dist/components/password-input.js.map +1 -0
  294. package/dist/components/password-strength.d.ts +21 -0
  295. package/dist/components/password-strength.d.ts.map +1 -0
  296. package/dist/components/password-strength.js +52 -0
  297. package/dist/components/password-strength.js.map +1 -0
  298. package/dist/components/popover.d.ts +10 -0
  299. package/dist/components/popover.d.ts.map +1 -0
  300. package/dist/components/popover.js +27 -0
  301. package/dist/components/popover.js.map +1 -0
  302. package/dist/components/progress.d.ts +26 -0
  303. package/dist/components/progress.d.ts.map +1 -0
  304. package/dist/components/progress.js +39 -0
  305. package/dist/components/progress.js.map +1 -0
  306. package/dist/components/questionnaire.d.ts +20 -0
  307. package/dist/components/questionnaire.d.ts.map +1 -0
  308. package/dist/components/questionnaire.js +57 -0
  309. package/dist/components/questionnaire.js.map +1 -0
  310. package/dist/components/radio-group.d.ts +8 -0
  311. package/dist/components/radio-group.d.ts.map +1 -0
  312. package/dist/components/radio-group.js +27 -0
  313. package/dist/components/radio-group.js.map +1 -0
  314. package/dist/components/resizable.d.ts +13 -0
  315. package/dist/components/resizable.d.ts.map +1 -0
  316. package/dist/components/resizable.js +24 -0
  317. package/dist/components/resizable.js.map +1 -0
  318. package/dist/components/scroll-area.d.ts +17 -0
  319. package/dist/components/scroll-area.d.ts.map +1 -0
  320. package/dist/components/scroll-area.js +12 -0
  321. package/dist/components/scroll-area.js.map +1 -0
  322. package/dist/components/search-dialog.d.ts +38 -0
  323. package/dist/components/search-dialog.d.ts.map +1 -0
  324. package/dist/components/search-dialog.js +39 -0
  325. package/dist/components/search-dialog.js.map +1 -0
  326. package/dist/components/search-trigger.d.ts +20 -0
  327. package/dist/components/search-trigger.d.ts.map +1 -0
  328. package/dist/components/search-trigger.js +52 -0
  329. package/dist/components/search-trigger.js.map +1 -0
  330. package/dist/components/section.d.ts +30 -0
  331. package/dist/components/section.d.ts.map +1 -0
  332. package/dist/components/section.js +79 -0
  333. package/dist/components/section.js.map +1 -0
  334. package/dist/components/select.d.ts +16 -0
  335. package/dist/components/select.d.ts.map +1 -0
  336. package/dist/components/select.js +38 -0
  337. package/dist/components/select.js.map +1 -0
  338. package/dist/components/separator.d.ts +4 -0
  339. package/dist/components/separator.d.ts.map +1 -0
  340. package/dist/components/separator.js +9 -0
  341. package/dist/components/separator.js.map +1 -0
  342. package/dist/components/sheet.d.ts +16 -0
  343. package/dist/components/sheet.d.ts.map +1 -0
  344. package/dist/components/sheet.js +44 -0
  345. package/dist/components/sheet.js.map +1 -0
  346. package/dist/components/sidebar.d.ts +76 -0
  347. package/dist/components/sidebar.d.ts.map +1 -0
  348. package/dist/components/sidebar.js +289 -0
  349. package/dist/components/sidebar.js.map +1 -0
  350. package/dist/components/site-footer.d.ts +22 -0
  351. package/dist/components/site-footer.d.ts.map +1 -0
  352. package/dist/components/site-footer.js +42 -0
  353. package/dist/components/site-footer.js.map +1 -0
  354. package/dist/components/site-header.d.ts +48 -0
  355. package/dist/components/site-header.d.ts.map +1 -0
  356. package/dist/components/site-header.js +104 -0
  357. package/dist/components/site-header.js.map +1 -0
  358. package/dist/components/site-layout.d.ts +35 -0
  359. package/dist/components/site-layout.d.ts.map +1 -0
  360. package/dist/components/site-layout.js +99 -0
  361. package/dist/components/site-layout.js.map +1 -0
  362. package/dist/components/skeleton.d.ts +6 -0
  363. package/dist/components/skeleton.d.ts.map +1 -0
  364. package/dist/components/skeleton.js +16 -0
  365. package/dist/components/skeleton.js.map +1 -0
  366. package/dist/components/slider.d.ts +4 -0
  367. package/dist/components/slider.d.ts.map +1 -0
  368. package/dist/components/slider.js +11 -0
  369. package/dist/components/slider.js.map +1 -0
  370. package/dist/components/spinner.d.ts +12 -0
  371. package/dist/components/spinner.d.ts.map +1 -0
  372. package/dist/components/spinner.js +26 -0
  373. package/dist/components/spinner.js.map +1 -0
  374. package/dist/components/stat.d.ts +31 -0
  375. package/dist/components/stat.d.ts.map +1 -0
  376. package/dist/components/stat.js +66 -0
  377. package/dist/components/stat.js.map +1 -0
  378. package/dist/components/status-dot.d.ts +25 -0
  379. package/dist/components/status-dot.d.ts.map +1 -0
  380. package/dist/components/status-dot.js +45 -0
  381. package/dist/components/status-dot.js.map +1 -0
  382. package/dist/components/switch.d.ts +17 -0
  383. package/dist/components/switch.d.ts.map +1 -0
  384. package/dist/components/switch.js +49 -0
  385. package/dist/components/switch.js.map +1 -0
  386. package/dist/components/table.d.ts +25 -0
  387. package/dist/components/table.d.ts.map +1 -0
  388. package/dist/components/table.js +45 -0
  389. package/dist/components/table.js.map +1 -0
  390. package/dist/components/tabs.d.ts +18 -0
  391. package/dist/components/tabs.d.ts.map +1 -0
  392. package/dist/components/tabs.js +51 -0
  393. package/dist/components/tabs.js.map +1 -0
  394. package/dist/components/textarea.d.ts +4 -0
  395. package/dist/components/textarea.d.ts.map +1 -0
  396. package/dist/components/textarea.js +10 -0
  397. package/dist/components/textarea.js.map +1 -0
  398. package/dist/components/toast.d.ts +27 -0
  399. package/dist/components/toast.d.ts.map +1 -0
  400. package/dist/components/toast.js +68 -0
  401. package/dist/components/toast.js.map +1 -0
  402. package/dist/components/toc.d.ts +35 -0
  403. package/dist/components/toc.d.ts.map +1 -0
  404. package/dist/components/toc.js +94 -0
  405. package/dist/components/toc.js.map +1 -0
  406. package/dist/components/toggle-group.d.ts +19 -0
  407. package/dist/components/toggle-group.d.ts.map +1 -0
  408. package/dist/components/toggle-group.js +33 -0
  409. package/dist/components/toggle-group.js.map +1 -0
  410. package/dist/components/toggle.d.ts +15 -0
  411. package/dist/components/toggle.d.ts.map +1 -0
  412. package/dist/components/toggle.js +42 -0
  413. package/dist/components/toggle.js.map +1 -0
  414. package/dist/components/toolbar.d.ts +14 -0
  415. package/dist/components/toolbar.d.ts.map +1 -0
  416. package/dist/components/toolbar.js +37 -0
  417. package/dist/components/toolbar.js.map +1 -0
  418. package/dist/components/tooltip.d.ts +7 -0
  419. package/dist/components/tooltip.d.ts.map +1 -0
  420. package/dist/components/tooltip.js +22 -0
  421. package/dist/components/tooltip.js.map +1 -0
  422. package/dist/components/trace.d.ts +20 -0
  423. package/dist/components/trace.d.ts.map +1 -0
  424. package/dist/components/trace.js +32 -0
  425. package/dist/components/trace.js.map +1 -0
  426. package/dist/components/typography.d.ts +37 -0
  427. package/dist/components/typography.d.ts.map +1 -0
  428. package/dist/components/typography.js +140 -0
  429. package/dist/components/typography.js.map +1 -0
  430. package/dist/hooks/use-highlighted-code.d.ts +3 -0
  431. package/dist/hooks/use-highlighted-code.d.ts.map +1 -0
  432. package/dist/hooks/use-highlighted-code.js +50 -0
  433. package/dist/hooks/use-highlighted-code.js.map +1 -0
  434. package/dist/hooks/use-mobile.d.ts +2 -0
  435. package/dist/hooks/use-mobile.d.ts.map +1 -0
  436. package/dist/hooks/use-mobile.js +16 -0
  437. package/dist/hooks/use-mobile.js.map +1 -0
  438. package/dist/lib/color.d.ts +30 -0
  439. package/dist/lib/color.d.ts.map +1 -0
  440. package/dist/lib/color.js +56 -0
  441. package/dist/lib/color.js.map +1 -0
  442. package/dist/lib/highlighter.d.ts +10 -0
  443. package/dist/lib/highlighter.d.ts.map +1 -0
  444. package/dist/lib/highlighter.js +94 -0
  445. package/dist/lib/highlighter.js.map +1 -0
  446. package/dist/lib/recipes.d.ts +30 -0
  447. package/dist/lib/recipes.d.ts.map +1 -0
  448. package/dist/lib/recipes.js +30 -0
  449. package/dist/lib/recipes.js.map +1 -0
  450. package/dist/lib/utils.d.ts +2 -0
  451. package/dist/lib/utils.d.ts.map +1 -0
  452. package/dist/lib/utils.js +2 -0
  453. package/dist/lib/utils.js.map +1 -0
  454. package/dist/provider/index.d.ts +3 -0
  455. package/dist/provider/index.d.ts.map +1 -0
  456. package/dist/provider/index.js +3 -0
  457. package/dist/provider/index.js.map +1 -0
  458. package/dist/provider/theme-provider.d.ts +47 -0
  459. package/dist/provider/theme-provider.d.ts.map +1 -0
  460. package/dist/provider/theme-provider.js +118 -0
  461. package/dist/provider/theme-provider.js.map +1 -0
  462. package/dist/provider/theme.d.ts +42 -0
  463. package/dist/provider/theme.d.ts.map +1 -0
  464. package/dist/provider/theme.js +58 -0
  465. package/dist/provider/theme.js.map +1 -0
  466. package/package.json +145 -5
  467. package/src/components/accordion.tsx +92 -0
  468. package/src/components/alert-dialog.tsx +167 -0
  469. package/src/components/alert.tsx +110 -0
  470. package/src/components/aspect-ratio.tsx +29 -0
  471. package/src/components/attachment.tsx +198 -0
  472. package/src/components/avatar.tsx +115 -0
  473. package/src/components/badge.tsx +75 -0
  474. package/src/components/breadcrumb.tsx +104 -0
  475. package/src/components/bubble.tsx +125 -0
  476. package/src/components/button-group.tsx +75 -0
  477. package/src/components/button.tsx +124 -0
  478. package/src/components/calendar.tsx +204 -0
  479. package/src/components/callout.tsx +131 -0
  480. package/src/components/card.tsx +178 -0
  481. package/src/components/carousel.tsx +329 -0
  482. package/src/components/chart.tsx +332 -0
  483. package/src/components/checkbox-group.tsx +21 -0
  484. package/src/components/checkbox.tsx +39 -0
  485. package/src/components/code-block.tsx +246 -0
  486. package/src/components/collapsible.tsx +47 -0
  487. package/src/components/combobox.tsx +295 -0
  488. package/src/components/command.tsx +174 -0
  489. package/src/components/context-menu.tsx +238 -0
  490. package/src/components/copy-button.tsx +80 -0
  491. package/src/components/data-table/data-table-utils.tsx +125 -0
  492. package/src/components/data-table/elements/data-table-base.tsx +78 -0
  493. package/src/components/data-table/elements/data-table-body.tsx +50 -0
  494. package/src/components/data-table/elements/data-table-cell.tsx +42 -0
  495. package/src/components/data-table/elements/data-table-filter-row.tsx +222 -0
  496. package/src/components/data-table/elements/data-table-foot.tsx +36 -0
  497. package/src/components/data-table/elements/data-table-head.tsx +36 -0
  498. package/src/components/data-table/elements/data-table-info-row.tsx +38 -0
  499. package/src/components/data-table/elements/data-table-row.tsx +58 -0
  500. package/src/components/data-table/elements/data-table-scroll.tsx +33 -0
  501. package/src/components/data-table/elements/data-table-sort-row.tsx +180 -0
  502. package/src/components/data-table/elements/data-table-title-row.tsx +33 -0
  503. package/src/components/data-table/elements/data-table-virtualized-body.tsx +87 -0
  504. package/src/components/data-table/set-utils.ts +103 -0
  505. package/src/components/data-table/views/data-table-filter-view.tsx +75 -0
  506. package/src/components/data-table/views/data-table-prop-view.tsx +55 -0
  507. package/src/components/data-table/views/data-table-root-view.tsx +20 -0
  508. package/src/components/data-table/views/data-table-sort-view.tsx +81 -0
  509. package/src/components/data-table/views/data-table-view.tsx +147 -0
  510. package/src/components/data-table.tsx +30 -0
  511. package/src/components/date-picker.tsx +166 -0
  512. package/src/components/dialog.tsx +158 -0
  513. package/src/components/direction.tsx +3 -0
  514. package/src/components/drawer.tsx +222 -0
  515. package/src/components/dropdown-menu.tsx +267 -0
  516. package/src/components/empty.tsx +97 -0
  517. package/src/components/field.tsx +229 -0
  518. package/src/components/file-upload.tsx +180 -0
  519. package/src/components/hero.tsx +207 -0
  520. package/src/components/hover-card.tsx +44 -0
  521. package/src/components/input-group.tsx +186 -0
  522. package/src/components/input-otp.tsx +82 -0
  523. package/src/components/input.tsx +50 -0
  524. package/src/components/item.tsx +191 -0
  525. package/src/components/kbd.tsx +39 -0
  526. package/src/components/label.tsx +19 -0
  527. package/src/components/marker.tsx +69 -0
  528. package/src/components/menubar.tsx +146 -0
  529. package/src/components/message-scroller.tsx +113 -0
  530. package/src/components/message.tsx +90 -0
  531. package/src/components/meter.tsx +69 -0
  532. package/src/components/native-select.tsx +76 -0
  533. package/src/components/navbar.tsx +55 -0
  534. package/src/components/navigation-menu.tsx +193 -0
  535. package/src/components/number-field.tsx +133 -0
  536. package/src/components/page-header.tsx +63 -0
  537. package/src/components/pager.tsx +70 -0
  538. package/src/components/pagination.tsx +106 -0
  539. package/src/components/password-input.tsx +71 -0
  540. package/src/components/password-strength.tsx +99 -0
  541. package/src/components/popover.tsx +68 -0
  542. package/src/components/progress.tsx +105 -0
  543. package/src/components/questionnaire.tsx +299 -0
  544. package/src/components/radio-group.tsx +43 -0
  545. package/src/components/resizable.tsx +62 -0
  546. package/src/components/scroll-area.tsx +68 -0
  547. package/src/components/search-dialog.tsx +87 -0
  548. package/src/components/search-trigger.tsx +74 -0
  549. package/src/components/section.tsx +110 -0
  550. package/src/components/select.tsx +184 -0
  551. package/src/components/separator.tsx +20 -0
  552. package/src/components/sheet.tsx +116 -0
  553. package/src/components/sidebar.tsx +722 -0
  554. package/src/components/site-footer.tsx +55 -0
  555. package/src/components/site-header.tsx +169 -0
  556. package/src/components/site-layout.tsx +147 -0
  557. package/src/components/skeleton.tsx +19 -0
  558. package/src/components/slider.tsx +46 -0
  559. package/src/components/spinner.tsx +42 -0
  560. package/src/components/stat.tsx +155 -0
  561. package/src/components/status-dot.tsx +94 -0
  562. package/src/components/switch.tsx +70 -0
  563. package/src/components/table.tsx +133 -0
  564. package/src/components/tabs.tsx +99 -0
  565. package/src/components/textarea.tsx +23 -0
  566. package/src/components/toast.tsx +221 -0
  567. package/src/components/toc.tsx +122 -0
  568. package/src/components/toggle-group.tsx +95 -0
  569. package/src/components/toggle.tsx +59 -0
  570. package/src/components/toolbar.tsx +97 -0
  571. package/src/components/tooltip.tsx +57 -0
  572. package/src/components/trace.tsx +143 -0
  573. package/src/components/typography.tsx +205 -0
  574. package/src/hooks/use-highlighted-code.ts +71 -0
  575. package/src/hooks/use-mobile.ts +19 -0
  576. package/src/lib/color.ts +76 -0
  577. package/src/lib/highlighter.tsx +121 -0
  578. package/src/lib/recipes.ts +47 -0
  579. package/src/lib/utils.ts +1 -0
  580. package/src/provider/index.ts +2 -0
  581. package/src/provider/theme-provider.tsx +210 -0
  582. package/src/provider/theme.ts +83 -0
  583. package/src/styles/kernelkit.css +301 -0
  584. package/src/styles/shadcn.css +555 -0
@@ -0,0 +1,55 @@
1
+ "use client";
2
+
3
+ import {mergeProps} from "@base-ui/react/merge-props";
4
+ import {useRender} from "@base-ui/react/use-render";
5
+ import {focusRing} from "@repraze/kernelkit/lib/recipes";
6
+ import {cn} from "cn";
7
+ import type * as React from "react";
8
+
9
+ /**
10
+ * The suite's site footer: a top border and one mono row at the site width, credits on the left and
11
+ * links on the right.
12
+ *
13
+ * ```tsx
14
+ * <SiteFooter>
15
+ * <span>MIT · built from one palette</span>
16
+ * <SiteFooterLinks>
17
+ * <SiteFooterLink href="https://github.com/…">GitHub</SiteFooterLink>
18
+ * </SiteFooterLinks>
19
+ * </SiteFooter>
20
+ * ```
21
+ */
22
+ function SiteFooter({className, children, ...props}: React.ComponentProps<"footer">) {
23
+ return (
24
+ <footer data-slot="site-footer" className={cn("border-t border-border", className)} {...props}>
25
+ <div className="mx-auto flex w-full max-w-(--kk-site-width) flex-col gap-3 px-4 py-6 font-mono text-xs text-muted-foreground sm:flex-row sm:items-center sm:justify-between md:px-6">
26
+ {children}
27
+ </div>
28
+ </footer>
29
+ );
30
+ }
31
+
32
+ /** The footer's links (wrap on phones). */
33
+ function SiteFooterLinks({className, render, ...props}: useRender.ComponentProps<"nav">) {
34
+ return useRender({
35
+ defaultTagName: "nav",
36
+ props: mergeProps<"nav">({className: cn("flex flex-wrap items-center gap-x-4 gap-y-1", className)}, props),
37
+ render,
38
+ state: {slot: "site-footer-links"},
39
+ });
40
+ }
41
+
42
+ /** A footer link: muted, foreground on hover. */
43
+ function SiteFooterLink({className, render, ...props}: useRender.ComponentProps<"a">) {
44
+ return useRender({
45
+ defaultTagName: "a",
46
+ props: mergeProps<"a">(
47
+ {className: cn("rounded-sm transition-colors hover:text-foreground", focusRing, className)},
48
+ props,
49
+ ),
50
+ render,
51
+ state: {slot: "site-footer-link"},
52
+ });
53
+ }
54
+
55
+ export {SiteFooter, SiteFooterLink, SiteFooterLinks};
@@ -0,0 +1,169 @@
1
+ "use client";
2
+
3
+ import {mergeProps} from "@base-ui/react/merge-props";
4
+ import {useRender} from "@base-ui/react/use-render";
5
+ import {Button} from "@repraze/kernelkit/components/button";
6
+ import {Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger} from "@repraze/kernelkit/components/sheet";
7
+ import {focusRing} from "@repraze/kernelkit/lib/recipes";
8
+ import {cn} from "cn";
9
+ import {MenuIcon} from "lucide-react";
10
+ import type * as React from "react";
11
+
12
+ /**
13
+ * The suite's site header: sticky, blurred, one row of `--kk-header-height` inside a `--kk-site-width`
14
+ * container. Brand, then mono nav links (current page underlined in the accent), then actions.
15
+ *
16
+ * ```tsx
17
+ * <SiteHeader>
18
+ * <SiteHeaderContent>
19
+ * <SiteHeaderMenu title="termicolor">…mobile nav…</SiteHeaderMenu>
20
+ * <SiteHeaderBrand render={<Link to="/" />}>…</SiteHeaderBrand>
21
+ * <SiteNav><SiteNavLink render={<Link to="/ports" />}>Ports</SiteNavLink></SiteNav>
22
+ * <SiteHeaderActions>…search, theme, github…</SiteHeaderActions>
23
+ * </SiteHeaderContent>
24
+ * </SiteHeader>
25
+ * ```
26
+ */
27
+ function SiteHeader({className, render, ...props}: useRender.ComponentProps<"header">) {
28
+ return useRender({
29
+ defaultTagName: "header",
30
+ props: mergeProps<"header">(
31
+ {
32
+ className: cn(
33
+ "sticky top-0 z-40 w-full border-b border-border bg-background/85 text-foreground backdrop-blur supports-backdrop-filter:bg-background/70",
34
+ className,
35
+ ),
36
+ },
37
+ props,
38
+ ),
39
+ render,
40
+ state: {slot: "site-header"},
41
+ });
42
+ }
43
+
44
+ /** The header row: centered at the site width, the same gutters as SiteContainer. */
45
+ function SiteHeaderContent({className, render, ...props}: useRender.ComponentProps<"div">) {
46
+ return useRender({
47
+ defaultTagName: "div",
48
+ props: mergeProps<"div">(
49
+ {
50
+ className: cn(
51
+ "mx-auto flex h-14 w-full max-w-(--kk-site-width) items-center gap-4 px-4 md:gap-6 md:px-6",
52
+ className,
53
+ ),
54
+ },
55
+ props,
56
+ ),
57
+ render,
58
+ state: {slot: "site-header-content"},
59
+ });
60
+ }
61
+
62
+ /** Logo + name, links home. Pass the router link with `render`. */
63
+ function SiteHeaderBrand({className, render, ...props}: useRender.ComponentProps<"a">) {
64
+ return useRender({
65
+ defaultTagName: "a",
66
+ props: mergeProps<"a">(
67
+ {
68
+ className: cn(
69
+ "flex shrink-0 items-center gap-2 rounded-md font-mono text-sm font-semibold tracking-tight",
70
+ focusRing,
71
+ "[&_svg]:shrink-0",
72
+ className,
73
+ ),
74
+ },
75
+ props,
76
+ ),
77
+ render,
78
+ state: {slot: "site-header-brand"},
79
+ });
80
+ }
81
+
82
+ /** Primary navigation (desktop). On phones the links move into SiteHeaderMenu. */
83
+ function SiteNav({className, render, ...props}: useRender.ComponentProps<"nav">) {
84
+ return useRender({
85
+ defaultTagName: "nav",
86
+ props: mergeProps<"nav">(
87
+ {"aria-label": "Main", className: cn("hidden items-center gap-1 md:flex", className)},
88
+ props,
89
+ ),
90
+ render,
91
+ state: {slot: "site-nav"},
92
+ });
93
+ }
94
+
95
+ /**
96
+ * A nav link, styled like the suite's other navigation (GUIDELINES §7c): muted at rest, a hover wash,
97
+ * and when current (`aria-current="page"`, `data-status="active"` from TanStack Router, or `data-active`)
98
+ * foreground text plus a 2px accent indicator. In SiteNav the indicator sits on the header's bottom
99
+ * border (like line Tabs); elsewhere (the phone menu) the link is a sidebar row with a tint and the
100
+ * indicator on its left edge.
101
+ */
102
+ function SiteNavLink({className, render, ...props}: useRender.ComponentProps<"a">) {
103
+ return useRender({
104
+ defaultTagName: "a",
105
+ props: mergeProps<"a">(
106
+ {
107
+ className: cn(
108
+ "relative flex h-8 items-center rounded-md px-2.5 font-mono text-sm text-muted-foreground transition-colors hover:bg-hover hover:text-foreground motion-reduce:transition-none",
109
+ focusRing,
110
+ // indicator: vertical by default, on the header border inside SiteNav
111
+ "after:pointer-events-none after:absolute after:top-1.5 after:bottom-1.5 after:left-0 after:w-0.5 after:rounded-pill after:bg-primary-text after:opacity-0",
112
+ "in-data-[slot=site-nav]:after:top-auto in-data-[slot=site-nav]:after:right-2.5 in-data-[slot=site-nav]:after:-bottom-[calc(0.75rem+1px)] in-data-[slot=site-nav]:after:left-2.5 in-data-[slot=site-nav]:after:h-0.5 in-data-[slot=site-nav]:after:w-auto",
113
+ "aria-[current=page]:text-foreground aria-[current=page]:after:opacity-100 data-[status=active]:text-foreground data-[status=active]:after:opacity-100 data-active:text-foreground data-active:after:opacity-100",
114
+ // outside the header row: the sidebar's current-row tint
115
+ "not-in-data-[slot=site-nav]:aria-[current=page]:bg-primary-tint not-in-data-[slot=site-nav]:data-[status=active]:bg-primary-tint not-in-data-[slot=site-nav]:data-active:bg-primary-tint",
116
+ className,
117
+ ),
118
+ },
119
+ props,
120
+ ),
121
+ render,
122
+ state: {slot: "site-nav-link"},
123
+ });
124
+ }
125
+
126
+ /** Right side of the header row: search, theme, repository links. */
127
+ function SiteHeaderActions({className, render, ...props}: useRender.ComponentProps<"div">) {
128
+ return useRender({
129
+ defaultTagName: "div",
130
+ props: mergeProps<"div">({className: cn("ml-auto flex items-center gap-1", className)}, props),
131
+ render,
132
+ state: {slot: "site-header-actions"},
133
+ });
134
+ }
135
+
136
+ interface SiteHeaderMenuProps extends Omit<React.ComponentProps<typeof Sheet>, "children"> {
137
+ children?: React.ReactNode;
138
+ /** Sheet title (also the accessible name). */
139
+ title?: React.ReactNode;
140
+ className?: string;
141
+ }
142
+
143
+ /**
144
+ * Phone navigation: a menu button (hidden from `md`) opening a left sheet with the nav and the page's
145
+ * sidebar. Control `open` to close it on navigation.
146
+ */
147
+ function SiteHeaderMenu({title = "Menu", children, className, ...props}: SiteHeaderMenuProps) {
148
+ return (
149
+ <Sheet {...props}>
150
+ <SheetTrigger
151
+ render={<Button variant="ghost" size="icon-sm" className="-ml-1.5 md:hidden" aria-label="Menu" />}
152
+ >
153
+ <MenuIcon />
154
+ </SheetTrigger>
155
+ <SheetContent
156
+ side="left"
157
+ data-slot="site-header-menu"
158
+ className={cn("w-72 gap-0 overflow-y-auto overscroll-contain p-0", className)}
159
+ >
160
+ <SheetHeader className="border-b border-border">
161
+ <SheetTitle className="flex items-center gap-2">{title}</SheetTitle>
162
+ </SheetHeader>
163
+ <div className="flex flex-col gap-4 p-2">{children}</div>
164
+ </SheetContent>
165
+ </Sheet>
166
+ );
167
+ }
168
+
169
+ export {SiteHeader, SiteHeaderActions, SiteHeaderBrand, SiteHeaderContent, SiteHeaderMenu, SiteNav, SiteNavLink};
@@ -0,0 +1,147 @@
1
+ "use client";
2
+
3
+ import {mergeProps} from "@base-ui/react/merge-props";
4
+ import {useRender} from "@base-ui/react/use-render";
5
+ import {ScrollArea} from "@repraze/kernelkit/components/scroll-area";
6
+ import {cn} from "cn";
7
+ import * as React from "react";
8
+
9
+ /**
10
+ * The suite's page layout, under SiteHeader:
11
+ *
12
+ * ```tsx
13
+ * <SiteLayout>
14
+ * <SiteSidebar aria-label="Docs">…SidebarGroup / SidebarMenu…</SiteSidebar>
15
+ * <SiteMain>…PageHeader, content, Pager…</SiteMain>
16
+ * <SiteAside><Toc>…</Toc></SiteAside>
17
+ * </SiteLayout>
18
+ * ```
19
+ *
20
+ * Sidebars are sticky below the header and scroll on their own with edge fades. Content pages without
21
+ * a sidebar use SiteContainer.
22
+ */
23
+
24
+ /** Centered at `--kk-site-width` with the header's gutters. */
25
+ function SiteContainer({className, render, ...props}: useRender.ComponentProps<"div">) {
26
+ return useRender({
27
+ defaultTagName: "div",
28
+ props: mergeProps<"div">(
29
+ {className: cn("mx-auto w-full max-w-(--kk-site-width) px-4 md:px-6", className)},
30
+ props,
31
+ ),
32
+ render,
33
+ state: {slot: "site-container"},
34
+ });
35
+ }
36
+
37
+ /** Sidebar + main (+ aside) row inside the site container. */
38
+ function SiteLayout({className, render, ...props}: useRender.ComponentProps<"div">) {
39
+ return useRender({
40
+ defaultTagName: "div",
41
+ props: mergeProps<"div">(
42
+ {
43
+ className: cn(
44
+ "mx-auto flex w-full max-w-(--kk-site-width) flex-1 gap-8 px-4 md:px-6 lg:gap-10",
45
+ className,
46
+ ),
47
+ },
48
+ props,
49
+ ),
50
+ render,
51
+ state: {slot: "site-layout"},
52
+ });
53
+ }
54
+
55
+ /** Sticky columns fill the viewport below the header; their content has the page's vertical padding. */
56
+ const stickyColumn = "sticky top-(--kk-header-height) h-[calc(100svh-var(--kk-header-height))]";
57
+ /** Vertical rhythm of every column (the layout itself has none, so the sidebar border runs edge to edge). */
58
+ const columnPadding = "py-8 lg:py-10";
59
+
60
+ interface SiteSidebarProps extends React.ComponentProps<"aside"> {
61
+ /** Classes for the scrolling viewport (padding, etc.). */
62
+ viewportClassName?: string;
63
+ }
64
+
65
+ /** Items a nav marks current: SidebarMenuButton isActive, router links, aria-current. */
66
+ const CURRENT = '[data-active]:not([data-active="false"]), [aria-current="page"], [data-status="active"]';
67
+
68
+ /** Center the current item in the sidebar's own viewport (never scrolls the page). */
69
+ function useKeepCurrentInView(viewport: React.RefObject<HTMLDivElement | null>) {
70
+ React.useEffect(() => {
71
+ const el = viewport.current;
72
+ if (!el) {
73
+ return;
74
+ }
75
+ const reveal = () => {
76
+ const item = el.querySelector<HTMLElement>(CURRENT);
77
+ if (!item) {
78
+ return;
79
+ }
80
+ const offset = item.getBoundingClientRect().top - el.getBoundingClientRect().top;
81
+ if (offset < 0 || offset > el.clientHeight - item.offsetHeight) {
82
+ el.scrollTop += offset - el.clientHeight / 2;
83
+ }
84
+ };
85
+ reveal();
86
+ // navigation flips data-active / aria-current on the links: follow it
87
+ const observer = new MutationObserver(reveal);
88
+ observer.observe(el, {
89
+ subtree: true,
90
+ attributes: true,
91
+ attributeFilter: ["data-active", "aria-current", "data-status"],
92
+ });
93
+ return () => observer.disconnect();
94
+ }, [viewport]);
95
+ }
96
+
97
+ /**
98
+ * Left navigation column (from `md`): sticky, scrolls on its own, fades at its edges, and keeps the
99
+ * current item in view. Its right border runs the layout's full height, header to footer.
100
+ */
101
+ function SiteSidebar({className, viewportClassName, children, ...props}: SiteSidebarProps) {
102
+ const viewport = React.useRef<HTMLDivElement>(null);
103
+ useKeepCurrentInView(viewport);
104
+ return (
105
+ <aside
106
+ data-slot="site-sidebar"
107
+ className={cn("hidden w-60 shrink-0 border-r border-border md:block", className)}
108
+ {...props}
109
+ >
110
+ {/* sticky on a wrapper: Base UI's ScrollArea root sets position inline */}
111
+ <div className={stickyColumn}>
112
+ <ScrollArea
113
+ fade
114
+ className="h-full"
115
+ viewportRef={viewport}
116
+ viewportClassName={cn(columnPadding, "pr-3", viewportClassName)}
117
+ >
118
+ {children}
119
+ </ScrollArea>
120
+ </div>
121
+ </aside>
122
+ );
123
+ }
124
+
125
+ /** The page column. */
126
+ function SiteMain({className, render, ...props}: useRender.ComponentProps<"main">) {
127
+ return useRender({
128
+ defaultTagName: "main",
129
+ props: mergeProps<"main">(
130
+ {className: cn("flex min-w-0 flex-1 flex-col gap-10", columnPadding, className)},
131
+ props,
132
+ ),
133
+ render,
134
+ state: {slot: "site-main"},
135
+ });
136
+ }
137
+
138
+ /** Right column (from `xl`): table of contents, page meta. Sticky like the sidebar. */
139
+ function SiteAside({className, children, ...props}: React.ComponentProps<"aside">) {
140
+ return (
141
+ <aside data-slot="site-aside" className={cn("hidden w-48 shrink-0 xl:block", className)} {...props}>
142
+ <div className={cn(stickyColumn, columnPadding, "overflow-y-auto")}>{children}</div>
143
+ </aside>
144
+ );
145
+ }
146
+
147
+ export {SiteAside, SiteContainer, SiteLayout, SiteMain, SiteSidebar};
@@ -0,0 +1,19 @@
1
+ "use client";
2
+
3
+ import {mergeProps} from "@base-ui/react/merge-props";
4
+ import {useRender} from "@base-ui/react/use-render";
5
+ import {cn} from "cn";
6
+
7
+ /** Placeholder block while content loads. Size it with `h-*`/`w-*`; `rounded-pill` for avatars and pills. */
8
+ const skeletonClass = "animate-pulse rounded-md bg-foreground/10 motion-reduce:animate-none hc:bg-border";
9
+
10
+ function Skeleton({className, render, ...props}: useRender.ComponentProps<"div">) {
11
+ return useRender({
12
+ defaultTagName: "div",
13
+ props: mergeProps<"div">({"aria-hidden": true, className: cn(skeletonClass, className)}, props),
14
+ render,
15
+ state: {slot: "skeleton"},
16
+ });
17
+ }
18
+
19
+ export {Skeleton, skeletonClass};
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import {Slider as SliderPrimitive} from "@base-ui/react/slider";
4
+ import {cn} from "cn";
5
+
6
+ function Slider({className, defaultValue, value, min = 0, max = 100, ...props}: SliderPrimitive.Root.Props) {
7
+ const _values = Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max];
8
+ const thumbs = value !== undefined || defaultValue !== undefined ? _values.length : 1;
9
+
10
+ return (
11
+ <SliderPrimitive.Root
12
+ className={cn("group/slider data-horizontal:w-full data-vertical:h-full", className)}
13
+ data-slot="slider"
14
+ defaultValue={defaultValue}
15
+ value={value}
16
+ min={min}
17
+ max={max}
18
+ thumbAlignment="edge"
19
+ {...props}
20
+ >
21
+ <SliderPrimitive.Control
22
+ data-slot="slider-control"
23
+ className="relative flex w-full touch-none items-center select-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-horizontal:h-4 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-4 data-vertical:flex-col data-vertical:justify-center"
24
+ >
25
+ <SliderPrimitive.Track
26
+ data-slot="slider-track"
27
+ className="relative grow overflow-hidden rounded-pill bg-input select-none data-horizontal:h-1.5 data-horizontal:w-full data-vertical:h-full data-vertical:w-1.5"
28
+ >
29
+ <SliderPrimitive.Indicator
30
+ data-slot="slider-range"
31
+ className="bg-primary select-none group-data-invalid/slider:bg-danger data-horizontal:h-full data-vertical:w-full"
32
+ />
33
+ </SliderPrimitive.Track>
34
+ {Array.from({length: thumbs}, (_, index) => (
35
+ <SliderPrimitive.Thumb
36
+ data-slot="slider-thumb"
37
+ key={index}
38
+ className="relative block size-4 shrink-0 cursor-grab rounded-pill border-2 border-primary-text bg-background shadow-sm shadow-(color:--shadow-color) ring-ring/50 transition-[color,box-shadow,border-color] duration-100 select-none after:absolute after:-inset-1 hover:ring-3 has-focus-visible:ring-3 has-focus-visible:outline-hidden active:cursor-grabbing active:ring-3 group-data-invalid/slider:border-danger group-data-invalid/slider:ring-danger/20 data-disabled:pointer-events-none motion-reduce:transition-none"
39
+ />
40
+ ))}
41
+ </SliderPrimitive.Control>
42
+ </SliderPrimitive.Root>
43
+ );
44
+ }
45
+
46
+ export {Slider};
@@ -0,0 +1,42 @@
1
+ "use client";
2
+
3
+ import {cva, type VariantProps} from "class-variance-authority";
4
+ import {cn} from "cn";
5
+ import {Loader2Icon} from "lucide-react";
6
+
7
+ /** Sizes follow the icon column of §4 so a spinner can replace an icon in place. */
8
+ const spinnerVariants = cva(
9
+ // reduced motion: slow the spin down rather than freeze it, a frozen spinner reads as a glyph
10
+ "shrink-0 animate-spin text-current motion-reduce:[animation-duration:2.5s]",
11
+ {
12
+ variants: {
13
+ size: {
14
+ xs: "size-3",
15
+ sm: "size-3.5",
16
+ default: "size-4",
17
+ lg: "size-5",
18
+ xl: "size-6",
19
+ },
20
+ },
21
+ defaultVariants: {size: "default"},
22
+ },
23
+ );
24
+
25
+ interface SpinnerProps extends React.ComponentProps<"svg">, VariantProps<typeof spinnerVariants> {}
26
+
27
+ /** Indeterminate loading indicator. Inherits `currentColor`; announces itself as a status. */
28
+ function Spinner({className, size, ...props}: SpinnerProps) {
29
+ return (
30
+ <Loader2Icon
31
+ data-slot="spinner"
32
+ data-size={size ?? "default"}
33
+ role="status"
34
+ aria-label="Loading"
35
+ className={cn(spinnerVariants({size}), className)}
36
+ {...props}
37
+ />
38
+ );
39
+ }
40
+
41
+ export {Spinner, spinnerVariants};
42
+ export type {SpinnerProps};
@@ -0,0 +1,155 @@
1
+ "use client";
2
+
3
+ import {mergeProps} from "@base-ui/react/merge-props";
4
+ import {useRender} from "@base-ui/react/use-render";
5
+ import {cva} from "class-variance-authority";
6
+ import {cn} from "cn";
7
+ import {ArrowDownRightIcon, ArrowUpRightIcon, MinusIcon} from "lucide-react";
8
+ import type * as React from "react";
9
+
10
+ /** A metric: label, big mono value, delta and an optional sparkline. Sits alone or inside a Card. */
11
+ const statVariants = cva("group/stat grid min-w-0 grid-cols-[1fr_auto] content-start gap-x-3", {
12
+ variants: {
13
+ size: {
14
+ sm: "gap-y-0.5",
15
+ default: "gap-y-1",
16
+ lg: "gap-y-1.5",
17
+ },
18
+ },
19
+ defaultVariants: {size: "default"},
20
+ });
21
+
22
+ function Stat({
23
+ className,
24
+ size = "default",
25
+ render,
26
+ ...props
27
+ }: useRender.ComponentProps<"div"> & {size?: "sm" | "default" | "lg"}) {
28
+ return useRender({
29
+ defaultTagName: "div",
30
+ props: mergeProps<"div">({className: cn(statVariants({size}), className)}, props),
31
+ render,
32
+ state: {slot: "stat", size},
33
+ });
34
+ }
35
+
36
+ function StatLabel({className, ...props}: React.ComponentProps<"div">) {
37
+ return (
38
+ <div
39
+ data-slot="stat-label"
40
+ className={cn(
41
+ "col-span-full flex min-w-0 items-center gap-1.5 truncate text-xs font-medium text-muted-foreground [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
42
+ className,
43
+ )}
44
+ {...props}
45
+ />
46
+ );
47
+ }
48
+
49
+ function StatValue({className, ...props}: React.ComponentProps<"div">) {
50
+ return (
51
+ <div
52
+ data-slot="stat-value"
53
+ className={cn(
54
+ "col-start-1 flex items-baseline gap-1 font-mono text-2xl leading-tight font-medium tracking-tight text-foreground tabular-nums",
55
+ "group-data-[size=sm]/stat:text-xl group-data-[size=lg]/stat:text-3xl",
56
+ className,
57
+ )}
58
+ {...props}
59
+ />
60
+ );
61
+ }
62
+
63
+ /** Unit or suffix after the value (`ms`, `%`, `req/s`). */
64
+ function StatUnit({className, ...props}: React.ComponentProps<"span">) {
65
+ return (
66
+ <span
67
+ data-slot="stat-unit"
68
+ className={cn("text-sm font-normal tracking-normal text-muted-foreground", className)}
69
+ {...props}
70
+ />
71
+ );
72
+ }
73
+
74
+ type StatTrend = "up" | "down" | "flat";
75
+
76
+ const statDeltaVariants = cva(
77
+ "col-start-1 inline-flex w-fit items-center gap-1 font-mono text-xs font-medium tabular-nums [&_svg]:size-3.5 [&_svg]:shrink-0",
78
+ {
79
+ variants: {
80
+ intent: {
81
+ positive: "text-success",
82
+ negative: "text-danger",
83
+ neutral: "text-muted-foreground",
84
+ },
85
+ },
86
+ defaultVariants: {intent: "neutral"},
87
+ },
88
+ );
89
+
90
+ const trendIcon = {up: ArrowUpRightIcon, down: ArrowDownRightIcon, flat: MinusIcon} as const;
91
+
92
+ /**
93
+ * Change versus a previous period. `trend` picks the arrow; up is good (success) and down is bad (danger)
94
+ * unless `invert` is set (latency, error rate, cost). The arrow keeps the meaning readable without color.
95
+ */
96
+ function StatDelta({
97
+ className,
98
+ trend = "flat",
99
+ invert = false,
100
+ children,
101
+ ...props
102
+ }: React.ComponentProps<"div"> & {trend?: StatTrend; invert?: boolean}) {
103
+ const good = trend === "flat" ? null : (trend === "up") !== invert;
104
+ const intent = good === null ? "neutral" : good ? "positive" : "negative";
105
+ const Icon = trendIcon[trend];
106
+ return (
107
+ <div
108
+ data-slot="stat-delta"
109
+ data-trend={trend}
110
+ data-intent={intent}
111
+ className={cn(statDeltaVariants({intent}), className)}
112
+ {...props}
113
+ >
114
+ <Icon aria-hidden="true" />
115
+ {children}
116
+ </div>
117
+ );
118
+ }
119
+
120
+ function StatDescription({className, ...props}: React.ComponentProps<"div">) {
121
+ return (
122
+ <div
123
+ data-slot="stat-description"
124
+ className={cn("col-start-1 text-xs text-muted-foreground", className)}
125
+ {...props}
126
+ />
127
+ );
128
+ }
129
+
130
+ /** Right-hand slot beside the value and delta rows: a sparkline, an icon tile or a badge. */
131
+ function StatSparkline({className, ...props}: React.ComponentProps<"div">) {
132
+ return (
133
+ <div
134
+ data-slot="stat-sparkline"
135
+ className={cn(
136
+ "col-start-2 row-span-2 row-start-2 flex h-full min-h-8 w-24 items-end self-end text-primary-text",
137
+ className,
138
+ )}
139
+ {...props}
140
+ />
141
+ );
142
+ }
143
+
144
+ export {
145
+ Stat,
146
+ StatDelta,
147
+ statDeltaVariants,
148
+ StatDescription,
149
+ StatLabel,
150
+ StatSparkline,
151
+ StatUnit,
152
+ StatValue,
153
+ statVariants,
154
+ };
155
+ export type {StatTrend};