@kortix/ui 0.0.0-bootstrap.0 → 0.14.3

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 (416) hide show
  1. package/README.md +153 -2
  2. package/dist/_vendor/kortix-shared.js +341 -0
  3. package/dist/chat/agent-picker.d.ts +8 -0
  4. package/dist/chat/agent-picker.js +18 -0
  5. package/dist/chat/composer.d.ts +31 -0
  6. package/dist/chat/composer.js +114 -0
  7. package/dist/chat/index.d.ts +22 -0
  8. package/dist/chat/index.js +22 -0
  9. package/dist/chat/markdown.d.ts +10 -0
  10. package/dist/chat/markdown.js +36 -0
  11. package/dist/chat/message-list.d.ts +25 -0
  12. package/dist/chat/message-list.js +73 -0
  13. package/dist/chat/message-view.d.ts +17 -0
  14. package/dist/chat/message-view.js +86 -0
  15. package/dist/chat/model-picker.d.ts +10 -0
  16. package/dist/chat/model-picker.js +68 -0
  17. package/dist/chat/permission-prompt.d.ts +10 -0
  18. package/dist/chat/permission-prompt.js +40 -0
  19. package/dist/chat/question-prompt.d.ts +8 -0
  20. package/dist/chat/question-prompt.js +60 -0
  21. package/dist/chat/send-failure.d.ts +9 -0
  22. package/dist/chat/send-failure.js +21 -0
  23. package/dist/chat/session-thread.d.ts +28 -0
  24. package/dist/chat/session-thread.js +47 -0
  25. package/dist/chat/streaming-markdown.d.ts +21 -0
  26. package/dist/chat/streaming-markdown.js +59 -0
  27. package/dist/chat/tool-call.d.ts +4 -0
  28. package/dist/chat/tool-call.js +150 -0
  29. package/dist/chat/user-message-parts.d.ts +6 -0
  30. package/dist/chat/user-message-parts.js +11 -0
  31. package/dist/components/ui/accordion.d.ts +7 -0
  32. package/dist/components/ui/accordion.js +18 -0
  33. package/dist/components/ui/alert-dialog.d.ts +19 -0
  34. package/dist/components/ui/alert-dialog.js +48 -0
  35. package/dist/components/ui/alert.d.ts +13 -0
  36. package/dist/components/ui/alert.js +67 -0
  37. package/dist/components/ui/avatar.d.ts +11 -0
  38. package/dist/components/ui/avatar.js +23 -0
  39. package/dist/components/ui/back-pill.d.ts +13 -0
  40. package/dist/components/ui/back-pill.js +18 -0
  41. package/dist/components/ui/badge.d.ts +10 -0
  42. package/dist/components/ui/badge.js +42 -0
  43. package/dist/components/ui/breadcrumb.d.ts +11 -0
  44. package/dist/components/ui/breadcrumb.js +28 -0
  45. package/dist/components/ui/bubble.d.ts +20 -0
  46. package/dist/components/ui/bubble.js +38 -0
  47. package/dist/components/ui/button-group.d.ts +9 -0
  48. package/dist/components/ui/button-group.js +32 -0
  49. package/dist/components/ui/button.d.ts +13 -0
  50. package/dist/components/ui/button.js +67 -0
  51. package/dist/components/ui/calendar.d.ts +4 -0
  52. package/dist/components/ui/calendar.js +39 -0
  53. package/dist/components/ui/card.d.ts +96 -0
  54. package/dist/components/ui/card.js +291 -0
  55. package/dist/components/ui/chain-of-thought.d.ts +75 -0
  56. package/dist/components/ui/chain-of-thought.js +66 -0
  57. package/dist/components/ui/chart.d.ts +65 -0
  58. package/dist/components/ui/chart.js +118 -0
  59. package/dist/components/ui/checkbox-group.d.ts +19 -0
  60. package/dist/components/ui/checkbox-group.js +41 -0
  61. package/dist/components/ui/checkbox.d.ts +14 -0
  62. package/dist/components/ui/checkbox.js +27 -0
  63. package/dist/components/ui/collapsible.d.ts +5 -0
  64. package/dist/components/ui/collapsible.js +14 -0
  65. package/dist/components/ui/command.d.ts +58 -0
  66. package/dist/components/ui/command.js +135 -0
  67. package/dist/components/ui/confirm-dialog.d.ts +19 -0
  68. package/dist/components/ui/confirm-dialog.js +30 -0
  69. package/dist/components/ui/context-menu.d.ts +45 -0
  70. package/dist/components/ui/context-menu.js +93 -0
  71. package/dist/components/ui/count-badge.d.ts +26 -0
  72. package/dist/components/ui/count-badge.js +26 -0
  73. package/dist/components/ui/data-grid.d.ts +24 -0
  74. package/dist/components/ui/data-grid.js +107 -0
  75. package/dist/components/ui/date-range-picker.d.ts +119 -0
  76. package/dist/components/ui/date-range-picker.js +190 -0
  77. package/dist/components/ui/definition-list.d.ts +15 -0
  78. package/dist/components/ui/definition-list.js +26 -0
  79. package/dist/components/ui/dialog.d.ts +29 -0
  80. package/dist/components/ui/dialog.js +52 -0
  81. package/dist/components/ui/disclosure.d.ts +121 -0
  82. package/dist/components/ui/disclosure.js +138 -0
  83. package/dist/components/ui/dot-matrix/dotm-3x3-10.d.ts +4 -0
  84. package/dist/components/ui/dot-matrix/dotm-3x3-10.js +29 -0
  85. package/dist/components/ui/dot-matrix/dotm-3x3-12.d.ts +4 -0
  86. package/dist/components/ui/dot-matrix/dotm-3x3-12.js +19 -0
  87. package/dist/components/ui/dot-matrix/dotm-3x3-13.d.ts +4 -0
  88. package/dist/components/ui/dot-matrix/dotm-3x3-13.js +19 -0
  89. package/dist/components/ui/dot-matrix/dotm-3x3-15.d.ts +4 -0
  90. package/dist/components/ui/dot-matrix/dotm-3x3-15.js +22 -0
  91. package/dist/components/ui/dot-matrix/dotm-3x3-16.d.ts +4 -0
  92. package/dist/components/ui/dot-matrix/dotm-3x3-16.js +5 -0
  93. package/dist/components/ui/dot-matrix/dotm-3x3-18.d.ts +4 -0
  94. package/dist/components/ui/dot-matrix/dotm-3x3-18.js +5 -0
  95. package/dist/components/ui/dot-matrix/dotm-3x3-19.d.ts +4 -0
  96. package/dist/components/ui/dot-matrix/dotm-3x3-19.js +5 -0
  97. package/dist/components/ui/dot-matrix/dotm-3x3-2.d.ts +4 -0
  98. package/dist/components/ui/dot-matrix/dotm-3x3-2.js +3 -0
  99. package/dist/components/ui/dot-matrix/dotm-3x3-20.d.ts +4 -0
  100. package/dist/components/ui/dot-matrix/dotm-3x3-20.js +5 -0
  101. package/dist/components/ui/dot-matrix/dotm-3x3-21.d.ts +4 -0
  102. package/dist/components/ui/dot-matrix/dotm-3x3-21.js +5 -0
  103. package/dist/components/ui/dot-matrix/dotm-3x3-3.d.ts +4 -0
  104. package/dist/components/ui/dot-matrix/dotm-3x3-3.js +3 -0
  105. package/dist/components/ui/dot-matrix/dotm-3x3-4.d.ts +4 -0
  106. package/dist/components/ui/dot-matrix/dotm-3x3-4.js +3 -0
  107. package/dist/components/ui/dot-matrix/dotm-3x3-5.d.ts +4 -0
  108. package/dist/components/ui/dot-matrix/dotm-3x3-5.js +3 -0
  109. package/dist/components/ui/dot-matrix/dotm-3x3-6.d.ts +4 -0
  110. package/dist/components/ui/dot-matrix/dotm-3x3-6.js +19 -0
  111. package/dist/components/ui/dot-matrix/dotm-3x3-7.d.ts +4 -0
  112. package/dist/components/ui/dot-matrix/dotm-3x3-7.js +19 -0
  113. package/dist/components/ui/dot-matrix/dotm-3x3-8.d.ts +4 -0
  114. package/dist/components/ui/dot-matrix/dotm-3x3-8.js +19 -0
  115. package/dist/components/ui/dot-matrix/dotm-3x3-9.d.ts +4 -0
  116. package/dist/components/ui/dot-matrix/dotm-3x3-9.js +23 -0
  117. package/dist/components/ui/dot-matrix/dotm-circular-1.d.ts +4 -0
  118. package/dist/components/ui/dot-matrix/dotm-circular-1.js +28 -0
  119. package/dist/components/ui/dot-matrix/dotm-circular-10.d.ts +4 -0
  120. package/dist/components/ui/dot-matrix/dotm-circular-10.js +40 -0
  121. package/dist/components/ui/dot-matrix/dotm-circular-11.d.ts +4 -0
  122. package/dist/components/ui/dot-matrix/dotm-circular-11.js +37 -0
  123. package/dist/components/ui/dot-matrix/dotm-circular-12.d.ts +4 -0
  124. package/dist/components/ui/dot-matrix/dotm-circular-12.js +42 -0
  125. package/dist/components/ui/dot-matrix/dotm-circular-14.d.ts +4 -0
  126. package/dist/components/ui/dot-matrix/dotm-circular-14.js +37 -0
  127. package/dist/components/ui/dot-matrix/dotm-circular-15.d.ts +4 -0
  128. package/dist/components/ui/dot-matrix/dotm-circular-15.js +49 -0
  129. package/dist/components/ui/dot-matrix/dotm-circular-17.d.ts +4 -0
  130. package/dist/components/ui/dot-matrix/dotm-circular-17.js +31 -0
  131. package/dist/components/ui/dot-matrix/dotm-circular-2.d.ts +4 -0
  132. package/dist/components/ui/dot-matrix/dotm-circular-2.js +37 -0
  133. package/dist/components/ui/dot-matrix/dotm-circular-3.d.ts +4 -0
  134. package/dist/components/ui/dot-matrix/dotm-circular-3.js +54 -0
  135. package/dist/components/ui/dot-matrix/dotm-circular-4.d.ts +4 -0
  136. package/dist/components/ui/dot-matrix/dotm-circular-4.js +35 -0
  137. package/dist/components/ui/dot-matrix/dotm-circular-5.d.ts +4 -0
  138. package/dist/components/ui/dot-matrix/dotm-circular-5.js +30 -0
  139. package/dist/components/ui/dot-matrix/dotm-circular-6.d.ts +4 -0
  140. package/dist/components/ui/dot-matrix/dotm-circular-6.js +37 -0
  141. package/dist/components/ui/dot-matrix/dotm-circular-7.d.ts +4 -0
  142. package/dist/components/ui/dot-matrix/dotm-circular-7.js +25 -0
  143. package/dist/components/ui/dot-matrix/dotm-circular-8.d.ts +4 -0
  144. package/dist/components/ui/dot-matrix/dotm-circular-8.js +26 -0
  145. package/dist/components/ui/dot-matrix/dotm-circular-9.d.ts +4 -0
  146. package/dist/components/ui/dot-matrix/dotm-circular-9.js +41 -0
  147. package/dist/components/ui/dot-matrix/dotm-square-1.d.ts +4 -0
  148. package/dist/components/ui/dot-matrix/dotm-square-1.js +27 -0
  149. package/dist/components/ui/dot-matrix/dotm-square-10.d.ts +4 -0
  150. package/dist/components/ui/dot-matrix/dotm-square-10.js +27 -0
  151. package/dist/components/ui/dot-matrix/dotm-square-11.d.ts +4 -0
  152. package/dist/components/ui/dot-matrix/dotm-square-11.js +25 -0
  153. package/dist/components/ui/dot-matrix/dotm-square-12.d.ts +4 -0
  154. package/dist/components/ui/dot-matrix/dotm-square-12.js +28 -0
  155. package/dist/components/ui/dot-matrix/dotm-square-13.d.ts +4 -0
  156. package/dist/components/ui/dot-matrix/dotm-square-13.js +45 -0
  157. package/dist/components/ui/dot-matrix/dotm-square-14.d.ts +4 -0
  158. package/dist/components/ui/dot-matrix/dotm-square-14.js +38 -0
  159. package/dist/components/ui/dot-matrix/dotm-square-15.d.ts +4 -0
  160. package/dist/components/ui/dot-matrix/dotm-square-15.js +31 -0
  161. package/dist/components/ui/dot-matrix/dotm-square-16.d.ts +4 -0
  162. package/dist/components/ui/dot-matrix/dotm-square-16.js +33 -0
  163. package/dist/components/ui/dot-matrix/dotm-square-17.d.ts +4 -0
  164. package/dist/components/ui/dot-matrix/dotm-square-17.js +27 -0
  165. package/dist/components/ui/dot-matrix/dotm-square-18.d.ts +4 -0
  166. package/dist/components/ui/dot-matrix/dotm-square-18.js +29 -0
  167. package/dist/components/ui/dot-matrix/dotm-square-19.d.ts +4 -0
  168. package/dist/components/ui/dot-matrix/dotm-square-19.js +74 -0
  169. package/dist/components/ui/dot-matrix/dotm-square-2.d.ts +4 -0
  170. package/dist/components/ui/dot-matrix/dotm-square-2.js +72 -0
  171. package/dist/components/ui/dot-matrix/dotm-square-20.d.ts +4 -0
  172. package/dist/components/ui/dot-matrix/dotm-square-20.js +79 -0
  173. package/dist/components/ui/dot-matrix/dotm-square-3.d.ts +4 -0
  174. package/dist/components/ui/dot-matrix/dotm-square-3.js +23 -0
  175. package/dist/components/ui/dot-matrix/dotm-square-4.d.ts +4 -0
  176. package/dist/components/ui/dot-matrix/dotm-square-4.js +41 -0
  177. package/dist/components/ui/dot-matrix/dotm-square-5.d.ts +4 -0
  178. package/dist/components/ui/dot-matrix/dotm-square-5.js +23 -0
  179. package/dist/components/ui/dot-matrix/dotm-square-6.d.ts +4 -0
  180. package/dist/components/ui/dot-matrix/dotm-square-6.js +20 -0
  181. package/dist/components/ui/dot-matrix/dotm-square-7.d.ts +4 -0
  182. package/dist/components/ui/dot-matrix/dotm-square-7.js +43 -0
  183. package/dist/components/ui/dot-matrix/dotm-square-8.d.ts +4 -0
  184. package/dist/components/ui/dot-matrix/dotm-square-8.js +57 -0
  185. package/dist/components/ui/dot-matrix/dotm-square-9.d.ts +4 -0
  186. package/dist/components/ui/dot-matrix/dotm-square-9.js +89 -0
  187. package/dist/components/ui/dot-matrix/session-dot-matrix.d.ts +46 -0
  188. package/dist/components/ui/dot-matrix/session-dot-matrix.js +153 -0
  189. package/dist/components/ui/drawer.d.ts +15 -0
  190. package/dist/components/ui/drawer.js +35 -0
  191. package/dist/components/ui/dropdown-menu.d.ts +49 -0
  192. package/dist/components/ui/dropdown-menu.js +113 -0
  193. package/dist/components/ui/emoji-picker.d.ts +15 -0
  194. package/dist/components/ui/emoji-picker.js +137 -0
  195. package/dist/components/ui/emoji-tint.d.ts +41 -0
  196. package/dist/components/ui/emoji-tint.js +131 -0
  197. package/dist/components/ui/empty.d.ts +11 -0
  198. package/dist/components/ui/empty.js +33 -0
  199. package/dist/components/ui/entity-avatar.d.ts +84 -0
  200. package/dist/components/ui/entity-avatar.js +106 -0
  201. package/dist/components/ui/faded-scroll-area.d.ts +8 -0
  202. package/dist/components/ui/faded-scroll-area.js +80 -0
  203. package/dist/components/ui/favicon-avatar.d.ts +32 -0
  204. package/dist/components/ui/favicon-avatar.js +18 -0
  205. package/dist/components/ui/field.d.ts +15 -0
  206. package/dist/components/ui/field.js +48 -0
  207. package/dist/components/ui/file-tree.d.ts +32 -0
  208. package/dist/components/ui/file-tree.js +30 -0
  209. package/dist/components/ui/glyph-face.d.ts +18 -0
  210. package/dist/components/ui/glyph-face.js +37 -0
  211. package/dist/components/ui/glyph-paths-source.d.ts +2 -0
  212. package/dist/components/ui/glyph-paths-source.js +40 -0
  213. package/dist/components/ui/glyph-paths.generated.d.ts +2 -0
  214. package/dist/components/ui/glyph-paths.generated.js +207 -0
  215. package/dist/components/ui/glyph-picker.d.ts +22 -0
  216. package/dist/components/ui/glyph-picker.js +118 -0
  217. package/dist/components/ui/glyph-registry.d.ts +36 -0
  218. package/dist/components/ui/glyph-registry.js +479 -0
  219. package/dist/components/ui/glyph-tint.d.ts +6 -0
  220. package/dist/components/ui/glyph-tint.js +93 -0
  221. package/dist/components/ui/hint.d.ts +14 -0
  222. package/dist/components/ui/hint.js +12 -0
  223. package/dist/components/ui/histogram-bars.d.ts +38 -0
  224. package/dist/components/ui/histogram-bars.js +93 -0
  225. package/dist/components/ui/hover-card.d.ts +28 -0
  226. package/dist/components/ui/hover-card.js +35 -0
  227. package/dist/components/ui/icon-provider.d.ts +23 -0
  228. package/dist/components/ui/icon-provider.js +30 -0
  229. package/dist/components/ui/info-banner.d.ts +14 -0
  230. package/dist/components/ui/info-banner.js +72 -0
  231. package/dist/components/ui/inline-meta.d.ts +6 -0
  232. package/dist/components/ui/inline-meta.js +8 -0
  233. package/dist/components/ui/input-group.d.ts +19 -0
  234. package/dist/components/ui/input-group.js +73 -0
  235. package/dist/components/ui/input.d.ts +26 -0
  236. package/dist/components/ui/input.js +23 -0
  237. package/dist/components/ui/item.d.ts +23 -0
  238. package/dist/components/ui/item.js +67 -0
  239. package/dist/components/ui/kbd.d.ts +3 -0
  240. package/dist/components/ui/kbd.js +20 -0
  241. package/dist/components/ui/kortix-asterisk.d.ts +6 -0
  242. package/dist/components/ui/kortix-asterisk.js +17 -0
  243. package/dist/components/ui/kortix-icons.d.ts +2 -0
  244. package/dist/components/ui/kortix-icons.js +17 -0
  245. package/dist/components/ui/kortix-loader.d.ts +76 -0
  246. package/dist/components/ui/kortix-loader.js +74 -0
  247. package/dist/components/ui/kortix-logo.d.ts +30 -0
  248. package/dist/components/ui/kortix-logo.js +47 -0
  249. package/dist/components/ui/label.d.ts +4 -0
  250. package/dist/components/ui/label.js +9 -0
  251. package/dist/components/ui/list.d.ts +15 -0
  252. package/dist/components/ui/list.js +25 -0
  253. package/dist/components/ui/loading.d.ts +19 -0
  254. package/dist/components/ui/loading.js +31 -0
  255. package/dist/components/ui/local-time.d.ts +34 -0
  256. package/dist/components/ui/local-time.js +60 -0
  257. package/dist/components/ui/map.d.ts +101 -0
  258. package/dist/components/ui/map.js +257 -0
  259. package/dist/components/ui/marker.d.ts +14 -0
  260. package/dist/components/ui/marker.js +28 -0
  261. package/dist/components/ui/menu-recipe.d.ts +102 -0
  262. package/dist/components/ui/menu-recipe.js +129 -0
  263. package/dist/components/ui/mermaid-render.d.ts +51 -0
  264. package/dist/components/ui/mermaid-render.js +65 -0
  265. package/dist/components/ui/mermaid-renderer.d.ts +13 -0
  266. package/dist/components/ui/mermaid-renderer.js +340 -0
  267. package/dist/components/ui/message.d.ts +15 -0
  268. package/dist/components/ui/message.js +26 -0
  269. package/dist/components/ui/modal.d.ts +104 -0
  270. package/dist/components/ui/modal.js +180 -0
  271. package/dist/components/ui/navigation-menu.d.ts +16 -0
  272. package/dist/components/ui/navigation-menu.js +35 -0
  273. package/dist/components/ui/page-search-bar.d.ts +11 -0
  274. package/dist/components/ui/page-search-bar.js +13 -0
  275. package/dist/components/ui/phone-input.d.ts +7 -0
  276. package/dist/components/ui/phone-input.js +59 -0
  277. package/dist/components/ui/pixel-kortix-mark.d.ts +13 -0
  278. package/dist/components/ui/pixel-kortix-mark.js +40 -0
  279. package/dist/components/ui/popover.d.ts +10 -0
  280. package/dist/components/ui/popover.js +38 -0
  281. package/dist/components/ui/portal.d.ts +5 -0
  282. package/dist/components/ui/portal.js +15 -0
  283. package/dist/components/ui/preview-image.d.ts +14 -0
  284. package/dist/components/ui/preview-image.js +58 -0
  285. package/dist/components/ui/progress-ring.d.ts +6 -0
  286. package/dist/components/ui/progress-ring.js +9 -0
  287. package/dist/components/ui/progress.d.ts +6 -0
  288. package/dist/components/ui/progress.js +8 -0
  289. package/dist/components/ui/radio-group.d.ts +12 -0
  290. package/dist/components/ui/radio-group.js +20 -0
  291. package/dist/components/ui/resizable.d.ts +24 -0
  292. package/dist/components/ui/resizable.js +16 -0
  293. package/dist/components/ui/scroll-area.d.ts +5 -0
  294. package/dist/components/ui/scroll-area.js +11 -0
  295. package/dist/components/ui/section-card.d.ts +37 -0
  296. package/dist/components/ui/section-card.js +14 -0
  297. package/dist/components/ui/section.d.ts +10 -0
  298. package/dist/components/ui/section.js +22 -0
  299. package/dist/components/ui/select.d.ts +25 -0
  300. package/dist/components/ui/select.js +59 -0
  301. package/dist/components/ui/separator.d.ts +4 -0
  302. package/dist/components/ui/separator.js +8 -0
  303. package/dist/components/ui/shader-safe.d.ts +48 -0
  304. package/dist/components/ui/shader-safe.js +74 -0
  305. package/dist/components/ui/sheet.d.ts +32 -0
  306. package/dist/components/ui/sheet.js +55 -0
  307. package/dist/components/ui/sidebar-context.d.ts +72 -0
  308. package/dist/components/ui/sidebar-context.js +36 -0
  309. package/dist/components/ui/sidebar-menu-primitives.d.ts +38 -0
  310. package/dist/components/ui/sidebar-menu-primitives.js +97 -0
  311. package/dist/components/ui/sidebar-panel.d.ts +36 -0
  312. package/dist/components/ui/sidebar-panel.js +265 -0
  313. package/dist/components/ui/sidebar-peek.d.ts +27 -0
  314. package/dist/components/ui/sidebar-peek.js +70 -0
  315. package/dist/components/ui/sidebar-width.d.ts +48 -0
  316. package/dist/components/ui/sidebar-width.js +62 -0
  317. package/dist/components/ui/sidebar.d.ts +18 -0
  318. package/dist/components/ui/sidebar.js +194 -0
  319. package/dist/components/ui/skeleton.d.ts +3 -0
  320. package/dist/components/ui/skeleton.js +6 -0
  321. package/dist/components/ui/slider-native.d.ts +7 -0
  322. package/dist/components/ui/slider-native.js +16 -0
  323. package/dist/components/ui/slider.d.ts +14 -0
  324. package/dist/components/ui/slider.js +48 -0
  325. package/dist/components/ui/sliding-tab-indicator.d.ts +61 -0
  326. package/dist/components/ui/sliding-tab-indicator.js +128 -0
  327. package/dist/components/ui/split-sheet.d.ts +61 -0
  328. package/dist/components/ui/split-sheet.js +239 -0
  329. package/dist/components/ui/spotlight-card.d.ts +8 -0
  330. package/dist/components/ui/spotlight-card.js +43 -0
  331. package/dist/components/ui/status-ring.d.ts +38 -0
  332. package/dist/components/ui/status-ring.js +38 -0
  333. package/dist/components/ui/status.d.ts +58 -0
  334. package/dist/components/ui/status.js +76 -0
  335. package/dist/components/ui/stepper.d.ts +28 -0
  336. package/dist/components/ui/stepper.js +73 -0
  337. package/dist/components/ui/switch.d.ts +8 -0
  338. package/dist/components/ui/switch.js +131 -0
  339. package/dist/components/ui/system-message.d.ts +23 -0
  340. package/dist/components/ui/system-message.js +51 -0
  341. package/dist/components/ui/table.d.ts +10 -0
  342. package/dist/components/ui/table.js +28 -0
  343. package/dist/components/ui/tabs.d.ts +73 -0
  344. package/dist/components/ui/tabs.js +207 -0
  345. package/dist/components/ui/tag.d.ts +7 -0
  346. package/dist/components/ui/tag.js +22 -0
  347. package/dist/components/ui/text-shimmer.d.ts +13 -0
  348. package/dist/components/ui/text-shimmer.js +91 -0
  349. package/dist/components/ui/textarea.d.ts +33 -0
  350. package/dist/components/ui/textarea.js +87 -0
  351. package/dist/components/ui/toast.d.ts +105 -0
  352. package/dist/components/ui/toast.js +233 -0
  353. package/dist/components/ui/toggle.d.ts +12 -0
  354. package/dist/components/ui/toggle.js +26 -0
  355. package/dist/components/ui/tooltip.d.ts +9 -0
  356. package/dist/components/ui/tooltip.js +16 -0
  357. package/dist/components/ui/trigger-variants.d.ts +14 -0
  358. package/dist/components/ui/trigger-variants.js +67 -0
  359. package/dist/components/ui/type-to-confirm-dialog.d.ts +88 -0
  360. package/dist/components/ui/type-to-confirm-dialog.js +101 -0
  361. package/dist/components/ui/typed-title-logic.d.ts +22 -0
  362. package/dist/components/ui/typed-title-logic.js +33 -0
  363. package/dist/components/ui/typed-title.d.ts +38 -0
  364. package/dist/components/ui/typed-title.js +66 -0
  365. package/dist/components/ui/typing-animation.d.ts +36 -0
  366. package/dist/components/ui/typing-animation.js +141 -0
  367. package/dist/components/ui/user-avatar.d.ts +47 -0
  368. package/dist/components/ui/user-avatar.js +46 -0
  369. package/dist/hooks/use-debounce.d.ts +4 -0
  370. package/dist/hooks/use-debounce.js +17 -0
  371. package/dist/hooks/use-is-dark.d.ts +2 -0
  372. package/dist/hooks/use-is-dark.js +27 -0
  373. package/dist/hooks/use-mobile.d.ts +2 -0
  374. package/dist/hooks/use-mobile.js +15 -0
  375. package/dist/hooks/use-proximity-hover.d.ts +52 -0
  376. package/dist/hooks/use-proximity-hover.js +232 -0
  377. package/dist/icons/close.d.ts +2 -0
  378. package/dist/icons/close.js +7 -0
  379. package/dist/icons/copy.d.ts +3 -0
  380. package/dist/icons/copy.js +6 -0
  381. package/dist/icons/sidebar-toggle.d.ts +13 -0
  382. package/dist/icons/sidebar-toggle.js +13 -0
  383. package/dist/index.d.ts +24 -0
  384. package/dist/index.js +33 -0
  385. package/dist/lib/dotmatrix-core.d.ts +113 -0
  386. package/dist/lib/dotmatrix-core.js +920 -0
  387. package/dist/lib/dotmatrix-hooks.d.ts +28 -0
  388. package/dist/lib/dotmatrix-hooks.js +151 -0
  389. package/dist/lib/favicon.d.ts +4 -0
  390. package/dist/lib/favicon.js +21 -0
  391. package/dist/lib/font-weight.d.ts +6 -0
  392. package/dist/lib/font-weight.js +6 -0
  393. package/dist/lib/icon-config.d.ts +33 -0
  394. package/dist/lib/icon-config.js +22 -0
  395. package/dist/lib/icon-context.d.ts +34 -0
  396. package/dist/lib/icon-context.js +81 -0
  397. package/dist/lib/portal-root.d.ts +8 -0
  398. package/dist/lib/portal-root.js +26 -0
  399. package/dist/lib/settle.d.ts +16 -0
  400. package/dist/lib/settle.js +29 -0
  401. package/dist/lib/springs.d.ts +31 -0
  402. package/dist/lib/springs.js +29 -0
  403. package/dist/lib/utils.d.ts +2 -0
  404. package/dist/lib/utils.js +5 -0
  405. package/dist/lib/z-stack.d.ts +55 -0
  406. package/dist/lib/z-stack.js +130 -0
  407. package/dist/providers/ui-provider.d.ts +141 -0
  408. package/dist/providers/ui-provider.js +93 -0
  409. package/dist/styles/dotmatrix-loader.css +1239 -0
  410. package/dist/styles/fonts.css +46 -0
  411. package/dist/styles/tailwind.css +10 -0
  412. package/dist/styles/theme.css +1019 -0
  413. package/dist/styles/tokens.css +146 -0
  414. package/dist/styles.css +2 -0
  415. package/package.json +874 -4
  416. package/skills/kortix-ui/SKILL.md +150 -0
@@ -0,0 +1,239 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * SplitSheet — a sheet that takes a column of the layout instead of floating
5
+ * above it.
6
+ *
7
+ * `Sheet` portals a fixed panel over the page and dims everything behind it.
8
+ * `SplitSheet` does neither. The root is a CSS grid, the page is its first
9
+ * column, and opening the sheet adds a second column on the right. The page
10
+ * narrows to make room. Nothing is `absolute` or `fixed`.
11
+ *
12
+ * Layout follows the width of the root, not the viewport (`@container`):
13
+ * - Root ≥ 48rem: page and sheet sit side by side, split by a hairline. The
14
+ * sheet column is `size` wide, capped at half the root.
15
+ * - Root < 48rem: the sheet fills the same grid cell as the page. The page stays
16
+ * mounted but `invisible`, so it keeps its scroll position and leaves the tab
17
+ * order and the accessibility tree until the sheet closes.
18
+ *
19
+ * Non-modal: no overlay, no focus trap, no scroll lock. A trigger moves focus
20
+ * into the sheet. Closing returns focus to that trigger when focus was inside
21
+ * the sheet. Escape inside the sheet closes it.
22
+ *
23
+ * The root needs a bounded height (`h-full` in a sized parent, or `h-dvh`).
24
+ * The page and the sheet each scroll inside their own column.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <SplitSheet>
29
+ * <SplitSheetMain>
30
+ * <SplitSheetTrigger asChild>
31
+ * <Button size="sm" variant="secondary">Details</Button>
32
+ * </SplitSheetTrigger>
33
+ * </SplitSheetMain>
34
+ * <SplitSheetContent>
35
+ * <SplitSheetHeader>
36
+ * <SplitSheetTitle>Title</SplitSheetTitle>
37
+ * <SplitSheetDescription>Description</SplitSheetDescription>
38
+ * </SplitSheetHeader>
39
+ * <SplitSheetBody>{children}</SplitSheetBody>
40
+ * <SplitSheetFooter>
41
+ * <SplitSheetClose asChild>
42
+ * <Button variant="outline-ghost" size="sm">Cancel</Button>
43
+ * </SplitSheetClose>
44
+ * <Button size="sm">Save</Button>
45
+ * </SplitSheetFooter>
46
+ * </SplitSheetContent>
47
+ * </SplitSheet>
48
+ * ```
49
+ *
50
+ * Controlled:
51
+ * ```tsx
52
+ * <SplitSheet open={open} onOpenChange={setOpen}>...</SplitSheet>
53
+ * ```
54
+ */
55
+ import { XIcon } from '@phosphor-icons/react';
56
+ import { Slot } from '@radix-ui/react-slot';
57
+ import * as React from 'react';
58
+ import { cn } from '../../lib/utils.js';
59
+ import { hasOpenFloatingLayer } from '../../lib/z-stack.js';
60
+ import { Button } from './button.js';
61
+ import Hint from './hint.js';
62
+ import { triggerVariants } from './trigger-variants.js';
63
+ /** Sheet column width, from Tailwind's container scale. The grid caps it at
64
+ * `--split-sheet-max` (default 50%) of the root — a caller whose sheet IS
65
+ * the main content may raise the cap (`[--split-sheet-max:60%]`). */
66
+ const SIZE_CLASS = {
67
+ xs: '[--split-sheet-width:var(--container-2xs)]', // 18rem
68
+ sm: '[--split-sheet-width:var(--container-xs)]', // 20rem
69
+ md: '[--split-sheet-width:var(--container-sm)]', // 24rem
70
+ lg: '[--split-sheet-width:var(--container-md)]', // 28rem
71
+ };
72
+ /**
73
+ * The one decision every open/close request goes through. A controlled sheet
74
+ * writes no state of its own: the parent's `open` prop is the only source of
75
+ * truth. Same contract `Disclosure` adopted after its mirrored-state bug.
76
+ */
77
+ export function resolveSplitSheetChange(state) {
78
+ const changed = state.open !== state.nextOpen;
79
+ return { changed, writesInternalState: changed && !state.isControlled };
80
+ }
81
+ const SplitSheetContext = React.createContext(null);
82
+ function useSplitSheetContext(component) {
83
+ const context = React.useContext(SplitSheetContext);
84
+ if (!context)
85
+ throw new Error(`${component} must be rendered inside <SplitSheet>.`);
86
+ return context;
87
+ }
88
+ /** Read or set the nearest sheet's open state from anywhere inside it. */
89
+ function useSplitSheet() {
90
+ const { open, requestOpen } = useSplitSheetContext('useSplitSheet');
91
+ return React.useMemo(() => ({ open, setOpen: (nextOpen) => requestOpen(nextOpen) }), [open, requestOpen]);
92
+ }
93
+ function SplitSheet({ open: openProp, defaultOpen = false, onOpenChange, size = 'md', cover = false, className, children, ...props }) {
94
+ const isControlled = openProp !== undefined;
95
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
96
+ const open = isControlled ? openProp : uncontrolledOpen;
97
+ const [instant, setInstant] = React.useState(false);
98
+ const baseId = React.useId();
99
+ const returnFocusRef = React.useRef(null);
100
+ const focusOnOpenRef = React.useRef(false);
101
+ const restoreFocusRef = React.useRef(false);
102
+ const requestOpen = React.useCallback((nextOpen, request = {}) => {
103
+ const { changed, writesInternalState } = resolveSplitSheetChange({
104
+ open,
105
+ nextOpen,
106
+ isControlled,
107
+ });
108
+ if (!changed)
109
+ return;
110
+ if (request.from)
111
+ returnFocusRef.current = request.from;
112
+ if (nextOpen) {
113
+ focusOnOpenRef.current = request.moveFocus ?? false;
114
+ setInstant(request.instant ?? false);
115
+ }
116
+ if (writesInternalState)
117
+ setUncontrolledOpen(nextOpen);
118
+ onOpenChange?.(nextOpen);
119
+ }, [open, isControlled, onOpenChange]);
120
+ // The panel flags `restoreFocusRef` as it unmounts with focus inside it.
121
+ // Without this, focus falls to <body> and the next Tab starts from the top.
122
+ React.useEffect(() => {
123
+ if (open || !restoreFocusRef.current)
124
+ return;
125
+ restoreFocusRef.current = false;
126
+ const target = returnFocusRef.current;
127
+ if (target?.isConnected)
128
+ target.focus({ preventScroll: true });
129
+ }, [open]);
130
+ const context = React.useMemo(() => ({
131
+ open,
132
+ instant,
133
+ cover,
134
+ contentId: `${baseId}-content`,
135
+ titleId: `${baseId}-title`,
136
+ requestOpen,
137
+ returnFocusRef,
138
+ focusOnOpenRef,
139
+ restoreFocusRef,
140
+ }), [open, instant, cover, baseId, requestOpen]);
141
+ return (_jsx(SplitSheetContext.Provider, { value: context, children: _jsx("div", { "data-slot": "split-sheet", "data-state": open ? 'open' : 'closed', className: cn('@container/split-sheet h-full min-h-0 w-full', SIZE_CLASS[size], className), ...props, children: _jsx("div", { "data-slot": "split-sheet-grid", className: cn('grid h-full min-h-0 grid-cols-1 grid-rows-1', open &&
142
+ !cover &&
143
+ '@3xl/split-sheet:grid-cols-[minmax(0,1fr)_min(var(--split-sheet-width),var(--split-sheet-max,50%))]'), children: children }) }) }));
144
+ }
145
+ /** The page. Always the first column; it scrolls on its own. */
146
+ function SplitSheetMain({ className, ...props }) {
147
+ const { open, cover } = useSplitSheetContext('SplitSheetMain');
148
+ return (_jsx("div", { "data-slot": "split-sheet-main", className: cn('col-start-1 row-start-1 min-h-0 min-w-0 overflow-y-auto',
149
+ // Narrow root (or `cover`): the sheet covers this cell. `invisible`
150
+ // keeps the page mounted with its scroll position and hides it from
151
+ // keyboard and AT.
152
+ open && (cover ? 'invisible' : '@max-3xl/split-sheet:invisible'), className), ...props }));
153
+ }
154
+ /** Toggles the sheet. Call `event.preventDefault()` in `onClick` to handle the click yourself. */
155
+ function SplitSheetTrigger({ asChild = false, variant, size, className, type, onClick, ...props }) {
156
+ const { open, contentId, requestOpen } = useSplitSheetContext('SplitSheetTrigger');
157
+ const Comp = asChild ? Slot : 'button';
158
+ return (_jsx(Comp, { ...props, type: asChild ? type : (type ?? 'button'), "data-slot": "split-sheet-trigger", "data-state": open ? 'open' : 'closed', "aria-expanded": open, "aria-controls": open ? contentId : undefined,
159
+ // With `asChild` the child owns its styling — merging ours would double it.
160
+ className: asChild ? className : cn(triggerVariants({ variant, size }), className), onClick: (event) => {
161
+ onClick?.(event);
162
+ if (event.defaultPrevented)
163
+ return;
164
+ requestOpen(!open, {
165
+ from: event.currentTarget,
166
+ // `detail === 0` is an Enter/Space activation. Keyboard is never animated.
167
+ instant: event.detail === 0,
168
+ moveFocus: true,
169
+ });
170
+ } }));
171
+ }
172
+ function SplitSheetClose({ asChild = false, type, onClick, ...props }) {
173
+ const { requestOpen } = useSplitSheetContext('SplitSheetClose');
174
+ const Comp = asChild ? Slot : 'button';
175
+ return (_jsx(Comp, { "data-slot": "split-sheet-close", ...props, type: asChild ? type : (type ?? 'button'), onClick: (event) => {
176
+ onClick?.(event);
177
+ if (event.defaultPrevented)
178
+ return;
179
+ requestOpen(false);
180
+ } }));
181
+ }
182
+ /** The sheet column. Renders nothing while closed. Always include a `SplitSheetTitle`. */
183
+ function SplitSheetContent(props) {
184
+ const { open } = useSplitSheetContext('SplitSheetContent');
185
+ return open ? _jsx(SplitSheetPanel, { ...props }) : null;
186
+ }
187
+ function SplitSheetPanel({ className, onKeyDown, ...props }) {
188
+ const { instant, cover, contentId, titleId, requestOpen, focusOnOpenRef, restoreFocusRef } = useSplitSheetContext('SplitSheetContent');
189
+ const panelRef = React.useRef(null);
190
+ React.useLayoutEffect(() => {
191
+ const panel = panelRef.current;
192
+ restoreFocusRef.current = false;
193
+ if (panel && focusOnOpenRef.current) {
194
+ focusOnOpenRef.current = false;
195
+ panel.focus({ preventScroll: true });
196
+ }
197
+ return () => {
198
+ // Layout cleanup runs before React detaches the panel, so focus is still readable.
199
+ if (panel?.contains(document.activeElement))
200
+ restoreFocusRef.current = true;
201
+ };
202
+ }, [focusOnOpenRef, restoreFocusRef]);
203
+ const handleKeyDown = (event) => {
204
+ onKeyDown?.(event);
205
+ if (event.defaultPrevented || event.key !== 'Escape')
206
+ return;
207
+ // Escape inside a portaled menu or select bubbles here through the React
208
+ // tree. That Escape belongs to the menu, not the sheet — the guard `Modal` uses.
209
+ if (!event.currentTarget.contains(event.target) || hasOpenFloatingLayer())
210
+ return;
211
+ event.preventDefault();
212
+ requestOpen(false);
213
+ };
214
+ return (_jsx("aside", { "aria-labelledby": titleId, ...props, ref: panelRef, id: contentId, tabIndex: -1, "data-slot": "split-sheet-content", "data-state": "open", "data-instant": instant ? '' : undefined, onKeyDown: handleKeyDown, className: cn('bg-surface col-start-1 row-start-1 flex min-h-0 min-w-0 flex-col outline-none',
215
+ // `cover` keeps the panel on the page's own cell at every width.
216
+ !cover && '@3xl/split-sheet:col-start-2 @3xl/split-sheet:border-l',
217
+ // Enter only. The column itself snaps: animating grid tracks re-wraps
218
+ // the page on every frame. Reduced motion keeps the fade, drops the slide.
219
+ // `duration-(--duration-moderate)`, not `duration-moderate`: Tailwind 4 has
220
+ // no `--duration-*` theme namespace, so the bare token class emits no CSS.
221
+ 'transition-[opacity,translate] duration-(--duration-moderate) ease-out starting:opacity-0 motion-safe:starting:translate-x-2', 'data-instant:transition-none', className) }));
222
+ }
223
+ function SplitSheetHeader({ className, children, showCloseButton = true, closeLabel = 'Close', ...props }) {
224
+ return (_jsxs("div", { "data-slot": "split-sheet-header", className: cn('flex shrink-0 items-start gap-3 border-b px-4 py-3', className), ...props, children: [_jsx("div", { className: "flex min-h-8 min-w-0 flex-1 flex-col justify-center gap-0.5 pointer-coarse:min-h-11", children: children }), showCloseButton ? (_jsx(Hint, { label: closeLabel, side: "bottom", sideOffset: 4, children: _jsx(SplitSheetClose, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-base", "aria-label": closeLabel, className: "-mr-1.5 shrink-0 pointer-coarse:size-11", children: _jsx(XIcon, { className: "size-4" }) }) }) })) : null] }));
225
+ }
226
+ function SplitSheetTitle({ className, ...props }) {
227
+ const { titleId } = useSplitSheetContext('SplitSheetTitle');
228
+ return (_jsx("h2", { id: titleId, "data-slot": "split-sheet-title", className: cn('text-foreground text-sm font-medium text-pretty wrap-break-word', className), ...props }));
229
+ }
230
+ function SplitSheetDescription({ className, ...props }) {
231
+ return (_jsx("p", { "data-slot": "split-sheet-description", className: cn('text-muted-foreground text-xs text-pretty wrap-break-word', className), ...props }));
232
+ }
233
+ function SplitSheetBody({ className, ...props }) {
234
+ return (_jsx("div", { "data-slot": "split-sheet-body", className: cn('min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 py-5', className), ...props }));
235
+ }
236
+ function SplitSheetFooter({ className, ...props }) {
237
+ return (_jsx("div", { "data-slot": "split-sheet-footer", className: cn('flex shrink-0 flex-wrap items-center justify-end gap-2 border-t px-4 py-3', className), ...props }));
238
+ }
239
+ export { SplitSheet, SplitSheetBody, SplitSheetClose, SplitSheetContent, SplitSheetDescription, SplitSheetFooter, SplitSheetHeader, SplitSheetMain, SplitSheetTitle, SplitSheetTrigger, useSplitSheet, };
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ interface SpotlightCardProps {
3
+ children: React.ReactNode;
4
+ className?: string;
5
+ spotlightColor?: string;
6
+ }
7
+ export declare function SpotlightCard({ children, className, spotlightColor }: SpotlightCardProps): React.JSX.Element;
8
+ export {};
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from '../../lib/utils.js';
4
+ import { useRef, useState } from 'react';
5
+ export function SpotlightCard({ children, className, spotlightColor }) {
6
+ const cardRef = useRef(null);
7
+ const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
8
+ const [isHovered, setIsHovered] = useState(false);
9
+ const handleMouseMove = (e) => {
10
+ if (!cardRef.current)
11
+ return;
12
+ const rect = cardRef.current.getBoundingClientRect();
13
+ setMousePosition({
14
+ x: e.clientX - rect.left,
15
+ y: e.clientY - rect.top,
16
+ });
17
+ };
18
+ // Use custom color if provided, otherwise use CSS variables for light/dark mode
19
+ const spotlightBg = spotlightColor
20
+ ? `radial-gradient(600px circle at var(--mouse-x) var(--mouse-y), ${spotlightColor}, transparent 40%)`
21
+ : undefined;
22
+ const borderGlowBg = spotlightColor
23
+ ? `radial-gradient(400px circle at var(--mouse-x) var(--mouse-y), ${spotlightColor.replace('0.1', '0.2')}, transparent 40%)`
24
+ : undefined;
25
+ return (_jsxs("div", { ref: cardRef, onMouseMove: handleMouseMove, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), className: cn('relative overflow-hidden rounded-2xl', className), style: {
26
+ // @ts-expect-error - CSS custom properties are not in CSSProperties type
27
+ '--mouse-x': `${mousePosition.x}px`,
28
+ '--mouse-y': `${mousePosition.y}px`,
29
+ }, children: [isHovered && (_jsx("div", { className: cn('pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300', !spotlightColor &&
30
+ 'bg-[radial-gradient(600px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(0,0,0,0.06),transparent_40%)] dark:bg-[radial-gradient(600px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(255,255,255,0.1),transparent_40%)]'), style: {
31
+ opacity: isHovered ? 1 : 0,
32
+ ...(spotlightBg && { background: spotlightBg }),
33
+ } })), isHovered && (_jsx("div", { className: cn('pointer-events-none absolute inset-0 rounded-2xl opacity-0 transition-opacity duration-300', !spotlightColor &&
34
+ 'bg-[radial-gradient(400px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(0,0,0,0.1),transparent_40%)] dark:bg-[radial-gradient(400px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(255,255,255,0.2),transparent_40%)]'), style: {
35
+ opacity: isHovered ? 1 : 0,
36
+ ...(borderGlowBg && { background: borderGlowBg }),
37
+ mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',
38
+ WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',
39
+ maskComposite: 'exclude',
40
+ WebkitMaskComposite: 'xor',
41
+ padding: '1px',
42
+ } })), _jsx("div", { className: "relative z-10", children: children })] }));
43
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The one circle every status glyph in the app is drawn on.
3
+ *
4
+ * Three components render this ring — `Loading` (`variant="ring"`),
5
+ * `TodoStatusIcon`, and `PlanRing` — and they used to disagree about it. All
6
+ * three were nominally `size-4`, and all three painted something different:
7
+ *
8
+ * pending todo viewBox 16 r 6.3 stroke 1.5 → 14.1px disc, 1.50px stroke
9
+ * completed todo viewBox 256 r 104 (filled) → 13.0px disc (Phosphor)
10
+ * spinner viewBox 24 r 10 stroke 4 → 16.0px disc, 2.67px stroke
11
+ * plan ring viewBox 24 r 9.9 stroke 2 → 15.8px disc, 1.33px stroke
12
+ *
13
+ * Same class, four sizes, three weights. That is why the check read small and
14
+ * the spinner read fat next to each other. Sharing these numbers is what makes
15
+ * the states interchangeable: swap one glyph for another and only the *meaning*
16
+ * changes — the ink never moves.
17
+ *
18
+ * Lives in `components/ui` rather than beside the todo code because `Loading`
19
+ * is a ui primitive and a primitive must not import from a feature.
20
+ */
21
+ export declare const STATUS_RING: {
22
+ /** Square viewBox. 16 so one user unit is one CSS pixel at `size-4`. */
23
+ readonly BOX: 16;
24
+ readonly CENTER: 8;
25
+ /** Ring centreline. */
26
+ readonly RADIUS: 6.3;
27
+ readonly STROKE: 1.5;
28
+ /** Dash pattern of the `pending` ring, in user units: a 3-long tick against a
29
+ * 6.4 pitch. This is also the plan ring's texture — see `plan-card.tsx`. */
30
+ readonly DASH: 3;
31
+ readonly GAP: 3.4;
32
+ };
33
+ /** Where the ring's ink actually ends: centreline + half the stroke. A filled
34
+ * state uses this as its radius, so a disc and a ring occupy the same circle
35
+ * rather than the disc sitting visibly inside it. */
36
+ export declare const STATUS_RING_OUTER_RADIUS: number;
37
+ /** Dash pitch, in user units. */
38
+ export declare const STATUS_RING_PITCH: number;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The one circle every status glyph in the app is drawn on.
3
+ *
4
+ * Three components render this ring — `Loading` (`variant="ring"`),
5
+ * `TodoStatusIcon`, and `PlanRing` — and they used to disagree about it. All
6
+ * three were nominally `size-4`, and all three painted something different:
7
+ *
8
+ * pending todo viewBox 16 r 6.3 stroke 1.5 → 14.1px disc, 1.50px stroke
9
+ * completed todo viewBox 256 r 104 (filled) → 13.0px disc (Phosphor)
10
+ * spinner viewBox 24 r 10 stroke 4 → 16.0px disc, 2.67px stroke
11
+ * plan ring viewBox 24 r 9.9 stroke 2 → 15.8px disc, 1.33px stroke
12
+ *
13
+ * Same class, four sizes, three weights. That is why the check read small and
14
+ * the spinner read fat next to each other. Sharing these numbers is what makes
15
+ * the states interchangeable: swap one glyph for another and only the *meaning*
16
+ * changes — the ink never moves.
17
+ *
18
+ * Lives in `components/ui` rather than beside the todo code because `Loading`
19
+ * is a ui primitive and a primitive must not import from a feature.
20
+ */
21
+ export const STATUS_RING = {
22
+ /** Square viewBox. 16 so one user unit is one CSS pixel at `size-4`. */
23
+ BOX: 16,
24
+ CENTER: 8,
25
+ /** Ring centreline. */
26
+ RADIUS: 6.3,
27
+ STROKE: 1.5,
28
+ /** Dash pattern of the `pending` ring, in user units: a 3-long tick against a
29
+ * 6.4 pitch. This is also the plan ring's texture — see `plan-card.tsx`. */
30
+ DASH: 3,
31
+ GAP: 3.4,
32
+ };
33
+ /** Where the ring's ink actually ends: centreline + half the stroke. A filled
34
+ * state uses this as its radius, so a disc and a ring occupy the same circle
35
+ * rather than the disc sitting visibly inside it. */
36
+ export const STATUS_RING_OUTER_RADIUS = STATUS_RING.RADIUS + STATUS_RING.STROKE / 2; // 7.05
37
+ /** Dash pitch, in user units. */
38
+ export const STATUS_RING_PITCH = STATUS_RING.DASH + STATUS_RING.GAP; // 6.4
@@ -0,0 +1,58 @@
1
+ import type * as React from 'react';
2
+ /**
3
+ * Kortix status palette — the SINGLE source of truth for "this means
4
+ * success / warning / error / info" coloring.
5
+ *
6
+ * The design system already encapsulates this palette inside `<Badge>` and
7
+ * `<InfoBanner>`. Use those whenever the surface is a chip or a box. But for
8
+ * the cases a component can't cover — a lone status icon, a diff +/- counter,
9
+ * a live activity dot — reach for these maps instead of re-inlining a palette
10
+ * class by hand (which is how shade drift creeps in).
11
+ *
12
+ * Hues follow D5 (kortix-brand color.md): success = kortix-green, warning =
13
+ * kortix-orange, destructive = kortix-red, info = kortix-blue. Accents fail AA
14
+ * as body text on white, so STATUS_TEXT paints glyphs and counters only; a
15
+ * label beside the glyph stays foreground.
16
+ */
17
+ export type StatusTone = 'success' | 'warning' | 'destructive' | 'info' | 'neutral';
18
+ /** Foreground (text / icon) color per tone. */
19
+ export declare const STATUS_TEXT: Record<StatusTone, string>;
20
+ /** Faint tinted background per tone (for chips / fills). */
21
+ export declare const STATUS_BG: Record<StatusTone, string>;
22
+ /** Solid hairline border per tone. */
23
+ export declare const STATUS_BORDER: Record<StatusTone, string>;
24
+ /** Solid dot fill per tone (for the live activity indicator). */
25
+ export declare const STATUS_DOT: Record<StatusTone, string>;
26
+ export declare function statusText(tone: StatusTone): string;
27
+ /**
28
+ * A faint, tone-based status chip — the member of the status family for
29
+ * "this row/item is success/warning/error/info" labels.
30
+ *
31
+ * Use this (not `<Badge variant="destructive">`) for INFORMATIONAL status,
32
+ * because Badge's `destructive` variant is a SOLID red pill meant for
33
+ * actions — and "red is the brake, not the paint". StatusBadge keeps red
34
+ * faint and consistent with its success/warning/info siblings, sharing the
35
+ * same tone vocabulary as StatusDot / InfoBanner / DiffStat. Geometry matches
36
+ * `<Badge size="sm">` so the two are visually interchangeable for non-red tones.
37
+ */
38
+ export declare function StatusBadge({ tone, className, children, ...props }: React.ComponentProps<'span'> & {
39
+ tone?: StatusTone;
40
+ }): React.JSX.Element;
41
+ /**
42
+ * A small solid status dot — the canonical replacement for hand-rolled
43
+ * `bg-emerald-500 animate-pulse` indicators.
44
+ */
45
+ export declare function StatusDot({ tone, pulse, className, }: {
46
+ tone?: StatusTone;
47
+ pulse?: boolean;
48
+ className?: string;
49
+ }): React.JSX.Element;
50
+ /**
51
+ * Diff line-count summary — `+12 −3` in the DS success / destructive colors.
52
+ * Renders nothing when both counts are zero/absent.
53
+ */
54
+ export declare function DiffStat({ additions, deletions, className, }: {
55
+ additions?: number;
56
+ deletions?: number;
57
+ className?: string;
58
+ }): React.JSX.Element | null;
@@ -0,0 +1,76 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from '../../lib/utils.js';
4
+ /** Foreground (text / icon) color per tone. */
5
+ export const STATUS_TEXT = {
6
+ success: 'text-kortix-green',
7
+ warning: 'text-kortix-orange',
8
+ destructive: 'text-kortix-red',
9
+ info: 'text-kortix-blue',
10
+ neutral: 'text-muted-foreground',
11
+ };
12
+ /** Faint tinted background per tone (for chips / fills). */
13
+ export const STATUS_BG = {
14
+ success: 'bg-kortix-green/15',
15
+ warning: 'bg-kortix-orange/15',
16
+ destructive: 'bg-kortix-red/15',
17
+ info: 'bg-kortix-blue/15',
18
+ neutral: 'bg-popover',
19
+ };
20
+ /** Solid hairline border per tone. */
21
+ export const STATUS_BORDER = {
22
+ success: 'border-kortix-green',
23
+ warning: 'border-kortix-orange',
24
+ destructive: 'border-kortix-red',
25
+ info: 'border-kortix-blue',
26
+ neutral: 'border-border',
27
+ };
28
+ /** Solid dot fill per tone (for the live activity indicator). */
29
+ export const STATUS_DOT = {
30
+ success: 'bg-kortix-green',
31
+ warning: 'bg-kortix-orange',
32
+ destructive: 'bg-kortix-red',
33
+ info: 'bg-kortix-blue',
34
+ neutral: 'bg-muted-foreground',
35
+ };
36
+ /** Tone color for an svg glyph inside a chip. The chip label stays foreground. */
37
+ const STATUS_CHIP_GLYPH = {
38
+ success: '[&>svg]:text-kortix-green',
39
+ warning: '[&>svg]:text-kortix-orange',
40
+ destructive: '[&>svg]:text-kortix-red',
41
+ info: '[&>svg]:text-kortix-blue',
42
+ neutral: '[&>svg]:text-muted-foreground',
43
+ };
44
+ export function statusText(tone) {
45
+ return STATUS_TEXT[tone];
46
+ }
47
+ /**
48
+ * A faint, tone-based status chip — the member of the status family for
49
+ * "this row/item is success/warning/error/info" labels.
50
+ *
51
+ * Use this (not `<Badge variant="destructive">`) for INFORMATIONAL status,
52
+ * because Badge's `destructive` variant is a SOLID red pill meant for
53
+ * actions — and "red is the brake, not the paint". StatusBadge keeps red
54
+ * faint and consistent with its success/warning/info siblings, sharing the
55
+ * same tone vocabulary as StatusDot / InfoBanner / DiffStat. Geometry matches
56
+ * `<Badge size="sm">` so the two are visually interchangeable for non-red tones.
57
+ */
58
+ export function StatusBadge({ tone = 'neutral', className, children, ...props }) {
59
+ return (_jsx("span", { "data-slot": "status-badge", className: cn('text-foreground inline-flex w-fit items-center gap-1 rounded-md px-2 py-0.5 text-xs font-medium whitespace-nowrap', STATUS_BG[tone], STATUS_CHIP_GLYPH[tone], className), ...props, children: children }));
60
+ }
61
+ /**
62
+ * A small solid status dot — the canonical replacement for hand-rolled
63
+ * `bg-emerald-500 animate-pulse` indicators.
64
+ */
65
+ export function StatusDot({ tone = 'neutral', pulse = false, className, }) {
66
+ return (_jsx("span", { "data-slot": "status-dot", className: cn('inline-block size-2 shrink-0 rounded-full', STATUS_DOT[tone], pulse && 'animate-pulse', className) }));
67
+ }
68
+ /**
69
+ * Diff line-count summary — `+12 −3` in the DS success / destructive colors.
70
+ * Renders nothing when both counts are zero/absent.
71
+ */
72
+ export function DiffStat({ additions, deletions, className, }) {
73
+ if (!additions && !deletions)
74
+ return null;
75
+ return (_jsxs("span", { "data-slot": "diff-stat", className: cn('inline-flex items-center gap-1.5 font-mono tabular-nums', className), children: [additions ? _jsxs("span", { className: STATUS_TEXT.success, children: ["+", additions] }) : null, deletions ? _jsx("span", { className: STATUS_TEXT.destructive, children: `−${deletions}` }) : null] }));
76
+ }
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ defaultValue?: number;
4
+ value?: number;
5
+ onValueChange?: (value: number) => void;
6
+ orientation?: 'horizontal' | 'vertical';
7
+ /** Total step count — lets StepperSeparator hide after the last step. */
8
+ count?: number;
9
+ }
10
+ declare function Stepper({ defaultValue, value, onValueChange, orientation, count, className, ...props }: StepperProps): React.JSX.Element;
11
+ interface StepperItemProps extends React.HTMLAttributes<HTMLDivElement> {
12
+ step: number;
13
+ completed?: boolean;
14
+ disabled?: boolean;
15
+ }
16
+ declare function StepperItem({ step, completed, disabled, className, children, ...props }: StepperItemProps): React.JSX.Element;
17
+ interface StepperTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
18
+ asChild?: boolean;
19
+ }
20
+ declare function StepperTrigger({ asChild, className, children, ...props }: StepperTriggerProps): React.JSX.Element;
21
+ interface StepperIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {
22
+ asChild?: boolean;
23
+ }
24
+ declare function StepperIndicator({ asChild, className, children, ...props }: StepperIndicatorProps): React.JSX.Element;
25
+ declare function StepperTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>): React.JSX.Element;
26
+ declare function StepperDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
27
+ declare function StepperSeparator({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element | null;
28
+ export { Stepper, StepperDescription, StepperIndicator, StepperItem, StepperSeparator, StepperTitle, StepperTrigger, };
@@ -0,0 +1,73 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Slot } from '@radix-ui/react-slot';
4
+ import * as React from 'react';
5
+ import { createContext, useContext } from 'react';
6
+ import { cn } from '../../lib/utils.js';
7
+ const StepperContext = createContext(undefined);
8
+ const StepItemContext = createContext(undefined);
9
+ const useStepper = () => {
10
+ const context = useContext(StepperContext);
11
+ if (!context) {
12
+ throw new Error('useStepper must be used within a Stepper');
13
+ }
14
+ return context;
15
+ };
16
+ const useStepItem = () => {
17
+ const context = useContext(StepItemContext);
18
+ if (!context) {
19
+ throw new Error('useStepItem must be used within a StepperItem');
20
+ }
21
+ return context;
22
+ };
23
+ function Stepper({ defaultValue = 0, value, onValueChange, orientation = 'horizontal', count, className, ...props }) {
24
+ const [activeStep, setInternalStep] = React.useState(defaultValue);
25
+ const setActiveStep = React.useCallback((step) => {
26
+ if (value === undefined) {
27
+ setInternalStep(step);
28
+ }
29
+ onValueChange?.(step);
30
+ }, [value, onValueChange]);
31
+ const currentStep = value ?? activeStep;
32
+ const contextValue = React.useMemo(() => ({
33
+ activeStep: currentStep,
34
+ setActiveStep,
35
+ orientation,
36
+ count,
37
+ }), [currentStep, setActiveStep, orientation, count]);
38
+ return (_jsx(StepperContext.Provider, { value: contextValue, children: _jsx("div", { "data-slot": "stepper", className: cn('group/stepper inline-flex data-[orientation=horizontal]:w-full data-[orientation=horizontal]:flex-row data-[orientation=vertical]:flex-col', className), "data-orientation": orientation, ...props }) }));
39
+ }
40
+ function StepperItem({ step, completed = false, disabled = false, className, children, ...props }) {
41
+ const { activeStep } = useStepper();
42
+ const state = completed || step < activeStep ? 'completed' : activeStep === step ? 'active' : 'inactive';
43
+ const itemContextValue = React.useMemo(() => ({ step, state, isDisabled: disabled }), [step, state, disabled]);
44
+ return (_jsx(StepItemContext.Provider, { value: itemContextValue, children: _jsx("div", { "data-slot": "stepper-item", className: cn('group/step flex items-center group-data-[orientation=horizontal]/stepper:flex-row group-data-[orientation=vertical]/stepper:flex-col group-data-[orientation=vertical]/stepper:justify-start group-data-[orientation=vertical]/stepper:self-stretch', className), "data-state": state, ...props, children: children }) }));
45
+ }
46
+ function StepperTrigger({ asChild = false, className, children, ...props }) {
47
+ const { setActiveStep } = useStepper();
48
+ const { step, isDisabled } = useStepItem();
49
+ if (asChild) {
50
+ const Comp = asChild ? Slot : 'span';
51
+ return (_jsx(Comp, { "data-slot": "stepper-trigger", className: className, children: children }));
52
+ }
53
+ return (_jsx("button", { "data-slot": "stepper-trigger", className: cn('focus-visible:border-ring focus-visible:ring-ring/50 inline-flex items-center gap-3 rounded-full outline-none focus-visible:z-10 focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50', className), onClick: () => setActiveStep(step), disabled: isDisabled, ...props, children: children }));
54
+ }
55
+ function StepperIndicator({ asChild = false, className, children, ...props }) {
56
+ const { state } = useStepItem();
57
+ return (_jsx("span", { "data-slot": "stepper-indicator", className: cn('bg-muted text-muted-foreground data-[state=active]:bg-secondary data-[state=completed]:bg-secondary data-[state=active]:text-secondary-foreground data-[state=completed]:text-secondary-foreground relative flex size-6 shrink-0 items-center justify-center rounded-full text-xs font-medium', className), "data-state": state, ...props, children: asChild ? children : children }));
58
+ }
59
+ function StepperTitle({ className, ...props }) {
60
+ return (_jsx("h3", { "data-slot": "stepper-title", className: cn('text-sm font-medium', className), ...props }));
61
+ }
62
+ function StepperDescription({ className, ...props }) {
63
+ return (_jsx("p", { "data-slot": "stepper-description", className: cn('text-muted-foreground text-sm', className), ...props }));
64
+ }
65
+ function StepperSeparator({ className, ...props }) {
66
+ const { count } = useStepper();
67
+ const stepItem = useContext(StepItemContext);
68
+ if (stepItem && count !== undefined && stepItem.step >= count) {
69
+ return null;
70
+ }
71
+ return (_jsx("div", { "data-slot": "stepper-separator", className: cn('bg-secondary group-data-[state=completed]/step:bg-secondary m-0.5 group-data-[orientation=horizontal]/stepper:h-0.5 group-data-[orientation=horizontal]/stepper:w-full group-data-[orientation=horizontal]/stepper:flex-1 group-data-[orientation=vertical]/stepper:min-h-4 group-data-[orientation=vertical]/stepper:w-0.5 group-data-[orientation=vertical]/stepper:flex-1', className), ...props }));
72
+ }
73
+ export { Stepper, StepperDescription, StepperIndicator, StepperItem, StepperSeparator, StepperTitle, StepperTrigger, };
@@ -0,0 +1,8 @@
1
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
2
+ import { type ComponentProps } from 'react';
3
+ type SwitchProps = Omit<ComponentProps<typeof SwitchPrimitive.Root>, 'asChild'> & {
4
+ label?: string;
5
+ };
6
+ declare const Switch: import("react").ForwardRefExoticComponent<Omit<SwitchProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
7
+ export { Switch };
8
+ export type { SwitchProps };