@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,93 @@
1
+ /**
2
+ * The tint a project's GLYPH wears.
3
+ *
4
+ * Same treatment as an emoji tile — a pale `--color-glyph-fill-*` under a 1px
5
+ * `--color-glyph-ring-*` inset ring — so a glyph project and an emoji project
6
+ * read as one family in the grid. The difference is where the hue comes from:
7
+ * an emoji's is DERIVED from the glyph (emoji-tint.ts), a glyph's is CHOSEN by
8
+ * the user and stored alongside the name.
9
+ *
10
+ * The ring token also paints the glyph itself. A monochrome icon has no colour
11
+ * of its own, so the colour the user picked has to be visible somewhere the eye
12
+ * lands, and a 1px ring alone is too quiet to carry it.
13
+ */
14
+ import { PROJECT_GLYPH_COLORS } from '../../_vendor/kortix-shared.js';
15
+ /**
16
+ * Every class below is a LITERAL string. Do not build one with a template
17
+ * literal or a .map(): Tailwind v4 extracts class names by scanning source
18
+ * TEXT, so an interpolated name emits no CSS at all and the tints silently
19
+ * never paint. That has already happened once on this feature.
20
+ *
21
+ * There is no `dark:` set — each token is a light-dark() pair and :root / .dark
22
+ * set color-scheme, so one class covers both themes.
23
+ *
24
+ * `border-0` is part of the tint, not the host's business: both hosts bring a
25
+ * 1px border of their own (EntityAvatar's base class list, Button's `outline`
26
+ * variant) and it would sit outside the inset ring as a grey second edge.
27
+ */
28
+ const TINT = {
29
+ grey: 'border-0 bg-glyph-fill-grey inset-ring-1 inset-ring-glyph-ring-grey',
30
+ red: 'border-0 bg-glyph-fill-red inset-ring-1 inset-ring-glyph-ring-red',
31
+ orange: 'border-0 bg-glyph-fill-orange inset-ring-1 inset-ring-glyph-ring-orange',
32
+ yellow: 'border-0 bg-glyph-fill-yellow inset-ring-1 inset-ring-glyph-ring-yellow',
33
+ lime: 'border-0 bg-glyph-fill-lime inset-ring-1 inset-ring-glyph-ring-lime',
34
+ blue: 'border-0 bg-glyph-fill-blue inset-ring-1 inset-ring-glyph-ring-blue',
35
+ purple: 'border-0 bg-glyph-fill-purple inset-ring-1 inset-ring-glyph-ring-purple',
36
+ magenta: 'border-0 bg-glyph-fill-magenta inset-ring-1 inset-ring-glyph-ring-magenta',
37
+ };
38
+ /**
39
+ * The resting fill again, under `hover:`.
40
+ *
41
+ * Only an INTERACTIVE host needs it. Button's `outline` variant carries
42
+ * `hover:bg-foreground/5`, and a `:hover` rule outranks the resting
43
+ * `bg-glyph-fill-*` on specificity, so hovering the trigger would wipe the tint
44
+ * to a neutral wash. Restating the fill at the same modifier is what holds it.
45
+ */
46
+ const TINT_HOVER = {
47
+ grey: 'hover:bg-glyph-fill-grey',
48
+ red: 'hover:bg-glyph-fill-red',
49
+ orange: 'hover:bg-glyph-fill-orange',
50
+ yellow: 'hover:bg-glyph-fill-yellow',
51
+ lime: 'hover:bg-glyph-fill-lime',
52
+ blue: 'hover:bg-glyph-fill-blue',
53
+ purple: 'hover:bg-glyph-fill-purple',
54
+ magenta: 'hover:bg-glyph-fill-magenta',
55
+ };
56
+ /** The glyph's own colour — the ring token, not the fill. */
57
+ const FOREGROUND = {
58
+ grey: 'text-glyph-ring-grey',
59
+ red: 'text-glyph-ring-red',
60
+ orange: 'text-glyph-ring-orange',
61
+ yellow: 'text-glyph-ring-yellow',
62
+ lime: 'text-glyph-ring-lime',
63
+ blue: 'text-glyph-ring-blue',
64
+ purple: 'text-glyph-ring-purple',
65
+ magenta: 'text-glyph-ring-magenta',
66
+ };
67
+ /**
68
+ * Unknown colours resolve to grey rather than to an empty string.
69
+ *
70
+ * An empty string leaves an untinted, unringed tile, which reads as a rendering
71
+ * bug. Grey is a real member of the palette, so the fallback is
72
+ * indistinguishable from a deliberate choice. The server rejects colours
73
+ * outside the palette, so this only fires on stale cached data or a hand-edited
74
+ * row — exactly the cases where failing quietly and legibly is right.
75
+ */
76
+ const FALLBACK = 'grey';
77
+ function resolve(color) {
78
+ return PROJECT_GLYPH_COLORS.includes(color)
79
+ ? color
80
+ : FALLBACK;
81
+ }
82
+ /** The tile: fill + 1px inset ring, in the chosen colour. */
83
+ export function glyphTint(color) {
84
+ return TINT[resolve(color)];
85
+ }
86
+ /** Holds `glyphTint`'s fill through a host variant's own hover background. */
87
+ export function glyphTintHover(color) {
88
+ return TINT_HOVER[resolve(color)];
89
+ }
90
+ /** The glyph itself, in the ring colour. */
91
+ export function glyphForeground(color) {
92
+ return FOREGROUND[resolve(color)];
93
+ }
@@ -0,0 +1,14 @@
1
+ import { Tooltip } from './tooltip.js';
2
+ export type HintProps = {
3
+ label?: React.ReactNode;
4
+ children?: React.ReactNode;
5
+ side?: 'top' | 'right' | 'bottom' | 'left';
6
+ align?: 'start' | 'center' | 'end';
7
+ sideOffset?: number;
8
+ alignOffset?: number;
9
+ className?: string;
10
+ content?: React.ReactNode;
11
+ } & React.ComponentProps<typeof Tooltip>;
12
+ declare const Hint: ({ label, children, className, side, align, sideOffset, alignOffset, content, ...props }: HintProps) => import("react").JSX.Element;
13
+ export { Hint };
14
+ export default Hint;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip.js';
3
+ const Hint = ({ label, children, className, side = 'right', align = 'center', sideOffset = 10, alignOffset = 10, content, ...props }) => {
4
+ return (
5
+ // Own provider, same 300ms delay as the app root's: Radix Tooltip.Root
6
+ // throws without one, and Hint rides along into trees rendered outside
7
+ // the app shell (SSR tests, portals). Nesting under the root provider is
8
+ // supported and harmless.
9
+ _jsx(TooltipProvider, { delayDuration: 300, children: _jsxs(Tooltip, { ...props, children: [_jsx(TooltipTrigger, { asChild: true, children: children }), _jsx(TooltipContent, { side: side, align: align, sideOffset: sideOffset, alignOffset: alignOffset, className: className, children: label ? label : content })] }) }));
10
+ };
11
+ export { Hint };
12
+ export default Hint;
@@ -0,0 +1,38 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * The card's left offset in px: centred on bar `index` of `count` equal bars,
4
+ * clamped to `[0, stripWidth - cardWidth]` so it never clips at an edge.
5
+ */
6
+ export declare function histogramCardOffset(index: number, count: number, stripWidth: number, cardWidth: number): number;
7
+ /** Where the hover card is and whether it is out. */
8
+ export interface CardState {
9
+ visible: boolean;
10
+ /** The bucket it shows; kept while it fades out. */
11
+ index: number | null;
12
+ /** Animate `translateX` to the next bucket (false: jump, as on first show). */
13
+ sliding: boolean;
14
+ }
15
+ export declare const HIDDEN_CARD: CardState;
16
+ /**
17
+ * The card's next state when the (debounced) hovered bucket changes:
18
+ * - pointer gone (`null`): hide, keep the last bucket for the fade-out;
19
+ * - card out: slide to the new bucket, an empty one too (it then reads "no runs");
20
+ * - card hidden: open on a bucket with data, in place, with no slide;
21
+ * a first hover on an empty bucket opens nothing.
22
+ */
23
+ export declare function nextCardState(prev: CardState, shown: number | null, isEmpty: (index: number) => boolean): CardState;
24
+ export interface HistogramBar {
25
+ key: string | number;
26
+ ariaLabel: string;
27
+ /** No data in this bucket: a first hover opens no card; an open card reads it in one line. */
28
+ empty: boolean;
29
+ /** The drawn bar, inside a `group/bar` button that fills its slot. */
30
+ bar: ReactNode;
31
+ }
32
+ export declare function HistogramBars({ bars, onSelect, renderCard, className, }: {
33
+ bars: HistogramBar[];
34
+ onSelect?: (index: number) => void;
35
+ renderCard: (index: number) => ReactNode;
36
+ /** The strip's own classes: height, alignment, gap. */
37
+ className?: string;
38
+ }): import("react").JSX.Element;
@@ -0,0 +1,93 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * The bar strip and hover card of a time histogram, shared by the Models page
5
+ * Logs histogram (`LogHistogram`) and the trigger Runs histogram
6
+ * (`RunHistogram`). The caller draws each bar and the card's content; this
7
+ * owns the hover behaviour:
8
+ *
9
+ * - The bar highlight follows the pointer at once (CSS `group-hover/bar`).
10
+ * - The hovered bucket is debounced (70 ms), so a sweep across the bars does
11
+ * not rebuild the card on every bar it crosses.
12
+ * - The card is ONE element. It moves between buckets by `translateX`,
13
+ * clamped so it never leaves the strip, and fades in with a 4 px y nudge.
14
+ * Opening from hidden does not slide from the last bucket. Reduced motion:
15
+ * opacity only.
16
+ * - The card hides only when the pointer leaves the chart (or focus leaves
17
+ * it). Moving between bars never hides it: it slides by `translateX` (+X
18
+ * right, −X left), and a CSS transition retargets mid-slide. Re-entering
19
+ * fades it in at the bar, with no slide from the old spot.
20
+ * - A first hover on an empty bucket opens nothing; an open card passing over
21
+ * one stays and shows the caller's one-line empty content.
22
+ * - Keyboard focus on a bar opens the same card.
23
+ *
24
+ * Motion: 150 ms (`--duration-normal`) on `--ease-default`, transform and
25
+ * opacity only (animations-dev: tooltips 125–200 ms, ease-out family).
26
+ */
27
+ import { useDebounce } from '../../hooks/use-debounce.js';
28
+ import { cn } from '../../lib/utils.js';
29
+ import { useEffect, useRef, useState } from 'react';
30
+ /** How long the pointer has to rest on a bucket before the card follows it. */
31
+ const HOVER_DEBOUNCE_MS = 70;
32
+ /**
33
+ * The card's left offset in px: centred on bar `index` of `count` equal bars,
34
+ * clamped to `[0, stripWidth - cardWidth]` so it never clips at an edge.
35
+ */
36
+ export function histogramCardOffset(index, count, stripWidth, cardWidth) {
37
+ if (count < 1 || stripWidth <= 0)
38
+ return 0;
39
+ const centre = ((index + 0.5) / count) * stripWidth;
40
+ const max = Math.max(0, stripWidth - cardWidth);
41
+ return Math.min(max, Math.max(0, centre - cardWidth / 2));
42
+ }
43
+ export const HIDDEN_CARD = { visible: false, index: null, sliding: false };
44
+ /**
45
+ * The card's next state when the (debounced) hovered bucket changes:
46
+ * - pointer gone (`null`): hide, keep the last bucket for the fade-out;
47
+ * - card out: slide to the new bucket, an empty one too (it then reads "no runs");
48
+ * - card hidden: open on a bucket with data, in place, with no slide;
49
+ * a first hover on an empty bucket opens nothing.
50
+ */
51
+ export function nextCardState(prev, shown, isEmpty) {
52
+ if (shown === null)
53
+ return { ...prev, visible: false, sliding: false };
54
+ if (prev.visible)
55
+ return { visible: true, index: shown, sliding: true };
56
+ if (isEmpty(shown))
57
+ return prev;
58
+ return { visible: true, index: shown, sliding: false };
59
+ }
60
+ export function HistogramBars({ bars, onSelect, renderCard, className, }) {
61
+ const [active, setActive] = useState(null);
62
+ const { debouncedValue: shown } = useDebounce(active, HOVER_DEBOUNCE_MS);
63
+ // Derived from the previous render (React's "adjust state while rendering"):
64
+ // the card follows the debounced bucket through `nextCardState`.
65
+ const [card, setCard] = useState(HIDDEN_CARD);
66
+ const [prevShown, setPrevShown] = useState(null);
67
+ if (shown !== prevShown) {
68
+ setPrevShown(shown);
69
+ setCard(nextCardState(card, shown, (i) => bars[i]?.empty ?? true));
70
+ }
71
+ const cardIndex = card.index;
72
+ const sliding = card.sliding;
73
+ // Widths come from a ResizeObserver, so the clamp follows a resized column.
74
+ const [widths, setWidths] = useState({ strip: 0, card: 0 });
75
+ const stripRef = useRef(null);
76
+ const cardRef = useRef(null);
77
+ useEffect(() => {
78
+ const strip = stripRef.current;
79
+ const card = cardRef.current;
80
+ if (!strip || !card || typeof ResizeObserver === 'undefined')
81
+ return;
82
+ const measure = () => setWidths({ strip: strip.offsetWidth, card: card.offsetWidth });
83
+ const observer = new ResizeObserver(measure);
84
+ observer.observe(strip);
85
+ observer.observe(card);
86
+ return () => observer.disconnect();
87
+ }, []);
88
+ const x = cardIndex === null ? 0 : histogramCardOffset(cardIndex, bars.length, widths.strip, widths.card);
89
+ const visible = card.visible;
90
+ return (_jsxs("div", { className: "relative", onPointerLeave: () => setActive(null), children: [_jsx("div", { ref: stripRef, className: className, children: bars.map((b, i) => (_jsx("button", { type: "button", "aria-label": b.ariaLabel, onClick: () => onSelect?.(i), onPointerEnter: () => setActive(i), onFocus: () => setActive(i), onBlur: () => setActive(null), className: "group/bar flex h-full min-w-0 flex-1 cursor-pointer items-end outline-none", children: b.bar }, b.key))) }), _jsx("div", { ref: cardRef, "aria-hidden": true, style: { transform: `translateX(${x}px)` }, className: cn('pointer-events-none absolute top-full left-0 z-20 mt-1.5 w-60', 'bg-popover text-popover-foreground border-border rounded-lg border p-3 shadow-md', 'ease-default duration-(--duration-normal)', sliding ? 'transition-[transform,opacity,translate]' : 'transition-[opacity,translate]', 'motion-reduce:transition-opacity', visible
91
+ ? 'translate-y-0 opacity-100'
92
+ : '-translate-y-1 opacity-0 motion-reduce:translate-y-0'), children: cardIndex !== null && cardIndex < bars.length ? renderCard(cardIndex) : null })] }));
93
+ }
@@ -0,0 +1,28 @@
1
+ import { HoverCard as HoverCardPrimitive } from 'radix-ui';
2
+ import * as React from 'react';
3
+ declare function HoverCard({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Root>): React.JSX.Element;
4
+ declare function HoverCardTrigger({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>): React.JSX.Element;
5
+ /**
6
+ * The fifth panel to join `FLOATING_PANEL`.
7
+ *
8
+ * `menu-recipe.ts` reconciled the dropdown, context menu, select and popover
9
+ * surfaces onto one description of "a hairline-bordered card lifted off the
10
+ * canvas". This one was missed and kept its own `rounded-md` + `shadow-sm`,
11
+ * so a hover card sat a step flatter and 2px tighter than every other floating
12
+ * panel — which is why `token-progress.tsx` had to patch `shadow-md` back on at
13
+ * its call site. The recipe owns the surface and the enter/exit now.
14
+ *
15
+ * Two things stay local because they are this primitive's own: the transform
16
+ * origin (the Radix variable is named per primitive) and the `motion-reduce`
17
+ * guard, which no other panel ships and which must survive the move.
18
+ *
19
+ * `animated={false}` takes `FLOATING_PANEL_SURFACE` instead, the same split
20
+ * `MENU_PANEL_STATIC` makes for submenus, and for the same reason: a panel that
21
+ * opens INTO the path the pointer is already travelling spends its enter
22
+ * animation moving content away from the cursor, which reads as the card
23
+ * lagging behind the hand rather than as polish.
24
+ */
25
+ declare function HoverCardContent({ className, align, sideOffset, animated, ...props }: React.ComponentProps<typeof HoverCardPrimitive.Content> & {
26
+ animated?: boolean;
27
+ }): React.JSX.Element;
28
+ export { HoverCard, HoverCardContent, HoverCardTrigger };
@@ -0,0 +1,35 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { HoverCard as HoverCardPrimitive } from 'radix-ui';
4
+ import { cn } from '../../lib/utils.js';
5
+ import { FLOATING_PANEL, FLOATING_PANEL_SURFACE } from './menu-recipe.js';
6
+ function HoverCard({ ...props }) {
7
+ return _jsx(HoverCardPrimitive.Root, { "data-slot": "hover-card", ...props });
8
+ }
9
+ function HoverCardTrigger({ ...props }) {
10
+ return _jsx(HoverCardPrimitive.Trigger, { "data-slot": "hover-card-trigger", ...props });
11
+ }
12
+ /**
13
+ * The fifth panel to join `FLOATING_PANEL`.
14
+ *
15
+ * `menu-recipe.ts` reconciled the dropdown, context menu, select and popover
16
+ * surfaces onto one description of "a hairline-bordered card lifted off the
17
+ * canvas". This one was missed and kept its own `rounded-md` + `shadow-sm`,
18
+ * so a hover card sat a step flatter and 2px tighter than every other floating
19
+ * panel — which is why `token-progress.tsx` had to patch `shadow-md` back on at
20
+ * its call site. The recipe owns the surface and the enter/exit now.
21
+ *
22
+ * Two things stay local because they are this primitive's own: the transform
23
+ * origin (the Radix variable is named per primitive) and the `motion-reduce`
24
+ * guard, which no other panel ships and which must survive the move.
25
+ *
26
+ * `animated={false}` takes `FLOATING_PANEL_SURFACE` instead, the same split
27
+ * `MENU_PANEL_STATIC` makes for submenus, and for the same reason: a panel that
28
+ * opens INTO the path the pointer is already travelling spends its enter
29
+ * animation moving content away from the cursor, which reads as the card
30
+ * lagging behind the hand rather than as polish.
31
+ */
32
+ function HoverCardContent({ className, align = 'center', sideOffset = 4, animated = true, ...props }) {
33
+ return (_jsx(HoverCardPrimitive.Portal, { "data-slot": "hover-card-portal", children: _jsx(HoverCardPrimitive.Content, { "data-slot": "hover-card-content", align: align, sideOffset: sideOffset, className: cn(animated ? FLOATING_PANEL : FLOATING_PANEL_SURFACE, 'z-50 w-64 origin-(--radix-hover-card-content-transform-origin) p-4 outline-hidden motion-reduce:animate-none motion-reduce:transition-none', className), ...props }) }));
34
+ }
35
+ export { HoverCard, HoverCardContent, HoverCardTrigger };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The size a class-less icon renders at. Tailwind size classes and an explicit
3
+ * `size` prop both still win, so this only reaches icons that ask for nothing.
4
+ *
5
+ * Exported because the provider's tests have to rebuild the exact markup this
6
+ * context produces. They previously hard-coded the number, so changing it here
7
+ * failed them from a file that never mentions icons — the failure named the
8
+ * weight, which was not what had moved.
9
+ */
10
+ export declare const DEFAULT_ICON_SIZE = 32;
11
+ /**
12
+ * Applies the app-wide icon weight (packages/ui/src/lib/icon-config.ts; the
13
+ * apps/web path src/lib/icons/icon-config.ts is a shim) to every
14
+ * Phosphor icon in the client tree — identically in development and
15
+ * production. Icons never need a weight prop; the only intentional override
16
+ * is weight="fill" on solid/status icons.
17
+ *
18
+ * Server components can't read context — they import pre-bound icons from
19
+ * '@/lib/icons/ssr' instead.
20
+ */
21
+ export declare function IconProvider({ children }: {
22
+ children: React.ReactNode;
23
+ }): import("react").JSX.Element;
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { IconContext } from '@phosphor-icons/react';
4
+ import { DEFAULT_ICON_WEIGHT } from '../../lib/icon-config.js';
5
+ /**
6
+ * The size a class-less icon renders at. Tailwind size classes and an explicit
7
+ * `size` prop both still win, so this only reaches icons that ask for nothing.
8
+ *
9
+ * Exported because the provider's tests have to rebuild the exact markup this
10
+ * context produces. They previously hard-coded the number, so changing it here
11
+ * failed them from a file that never mentions icons — the failure named the
12
+ * weight, which was not what had moved.
13
+ */
14
+ export const DEFAULT_ICON_SIZE = 32;
15
+ /* Frozen at module scope: the value never changes at runtime, so the provider
16
+ never re-renders its subtree and the identity stays stable across renders. */
17
+ const ICON_DEFAULTS = { weight: DEFAULT_ICON_WEIGHT, size: DEFAULT_ICON_SIZE };
18
+ /**
19
+ * Applies the app-wide icon weight (packages/ui/src/lib/icon-config.ts; the
20
+ * apps/web path src/lib/icons/icon-config.ts is a shim) to every
21
+ * Phosphor icon in the client tree — identically in development and
22
+ * production. Icons never need a weight prop; the only intentional override
23
+ * is weight="fill" on solid/status icons.
24
+ *
25
+ * Server components can't read context — they import pre-bound icons from
26
+ * '@/lib/icons/ssr' instead.
27
+ */
28
+ export function IconProvider({ children }) {
29
+ return _jsx(IconContext.Provider, { value: ICON_DEFAULTS, children: children });
30
+ }
@@ -0,0 +1,14 @@
1
+ import { type StatusTone } from './status.js';
2
+ import * as React from 'react';
3
+ export type InfoBannerIcon = React.ComponentType<{
4
+ className?: string;
5
+ }> | React.ReactElement<{
6
+ className?: string;
7
+ }>;
8
+ export interface InfoBannerProps extends Omit<React.ComponentProps<'div'>, 'title'> {
9
+ tone?: StatusTone;
10
+ icon?: InfoBannerIcon;
11
+ title?: React.ReactNode;
12
+ action?: React.ReactNode;
13
+ }
14
+ export declare function InfoBanner({ tone, icon, title, action, className, children, ...props }: InfoBannerProps): React.JSX.Element;
@@ -0,0 +1,72 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Alert, AlertActions, AlertDescription, AlertMedia, AlertTitle, } from './alert.js';
4
+ import { cn } from '../../lib/utils.js';
5
+ import { cva } from 'class-variance-authority';
6
+ import * as React from 'react';
7
+ /**
8
+ * Tone is carried by a /15 fill and the icon, never by the text. The 25% fill
9
+ * with a solid-tone title it replaced (Marko, 2026-09-03: "never readable on
10
+ * the core component") put orange type on a beige ground at ~2:1. Text is
11
+ * foreground on every tone. A filled banner has no border color: one boundary,
12
+ * a fill or a hairline, never both (color.md). Hues follow D5: info = blue,
13
+ * success = green, warning = orange, destructive = red.
14
+ */
15
+ const infoBannerVariants = cva('group/item flex flex-wrap items-center gap-2 rounded-md border px-2.5 py-2 text-sm [&_[data-slot=alert-content]]:gap-1', {
16
+ variants: {
17
+ tone: {
18
+ neutral: 'border-border bg-popover',
19
+ info: 'bg-kortix-blue/15 border-transparent',
20
+ success: 'bg-kortix-green/15 border-transparent',
21
+ warning: 'bg-kortix-orange/15 border-transparent',
22
+ destructive: 'bg-kortix-red/15 border-transparent',
23
+ },
24
+ },
25
+ defaultVariants: {
26
+ tone: 'neutral',
27
+ },
28
+ });
29
+ /** The title is always foreground — the tone is the fill and the icon. */
30
+ const infoBannerTitleVariants = cva('text-foreground w-full max-w-full font-medium', {
31
+ variants: {
32
+ tone: {
33
+ neutral: '',
34
+ info: '',
35
+ success: '',
36
+ warning: '',
37
+ destructive: '',
38
+ },
39
+ },
40
+ defaultVariants: {
41
+ tone: 'neutral',
42
+ },
43
+ });
44
+ /** Status icon tile — mirrors the sandbox template state indicator. */
45
+ const infoBannerMediaVariants = cva('mt-0 group-has-[[data-slot=item-description]]/item:translate-y-0.5 inline-flex size-7 shrink-0 items-center justify-center self-start [&_svg]:pointer-events-none [&_svg]:size-6 [&_svg]:shrink-0', {
46
+ variants: {
47
+ tone: {
48
+ neutral: 'text-muted-foreground border-border',
49
+ info: 'text-kortix-blue',
50
+ success: 'text-kortix-green',
51
+ warning: 'text-kortix-orange',
52
+ destructive: 'text-kortix-red',
53
+ },
54
+ },
55
+ defaultVariants: {
56
+ tone: 'neutral',
57
+ },
58
+ });
59
+ const infoBannerIconVariants = cva('size-6 shrink-0');
60
+ function renderBannerIcon(icon, className) {
61
+ if (React.isValidElement(icon)) {
62
+ return React.cloneElement(icon, {
63
+ className: cn(className, icon.props.className),
64
+ });
65
+ }
66
+ const IconComponent = icon;
67
+ return _jsx(IconComponent, { className: className });
68
+ }
69
+ export function InfoBanner({ tone = 'neutral', icon, title, action, className, children, ...props }) {
70
+ const safeTone = tone ?? 'neutral';
71
+ return (_jsxs(Alert, { variant: "default", className: cn(infoBannerVariants({ tone: safeTone }), className), ...props, children: [icon != null && (_jsx(AlertMedia, { className: infoBannerMediaVariants({ tone: safeTone }), children: renderBannerIcon(icon, infoBannerIconVariants()) })), title != null && (_jsx(AlertTitle, { className: cn(infoBannerTitleVariants({ tone: safeTone }), 'line-clamp-1 min-h-4 leading-snug font-medium tracking-tight'), children: title })), children != null && (_jsx(AlertDescription, { className: "text-muted-foreground leading-normal font-medium [&_p]:leading-relaxed", children: children })), action != null && _jsx(AlertActions, { children: action })] }));
72
+ }
@@ -0,0 +1,6 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface InlineMetaProps {
3
+ className?: string;
4
+ children: ReactNode;
5
+ }
6
+ export declare function InlineMeta({ className, children }: InlineMetaProps): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from '../../lib/utils.js';
4
+ import { Children, Fragment, isValidElement } from 'react';
5
+ export function InlineMeta({ className, children }) {
6
+ const items = Children.toArray(children).filter((c) => c !== null && c !== undefined && c !== '');
7
+ return (_jsx("div", { className: cn('text-muted-foreground/70 flex items-center gap-2 text-xs', 'min-w-0', className), children: items.map((child, i) => (_jsxs(Fragment, { children: [i > 0 && _jsx("span", { className: "text-muted-foreground/30", children: "\u00B7" }), _jsx("span", { className: "truncate", children: child })] }, isValidElement(child) ? (child.key ?? i) : i))) }));
8
+ }
@@ -0,0 +1,19 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import * as React from 'react';
3
+ import { Button } from './button.js';
4
+ import { InputProps } from './input.js';
5
+ declare function InputGroup({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
6
+ declare const inputGroupAddonVariants: (props?: ({
7
+ align?: "inline-end" | "inline-start" | "block-end" | "block-start" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
10
+ declare const inputGroupButtonVariants: (props?: ({
11
+ size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
12
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
13
+ declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>): React.JSX.Element;
14
+ declare function InputGroupInput({ className, ...props }: InputProps): React.JSX.Element;
15
+ declare function InputGroupSearch({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
16
+ declare function InputGroupSearchIcon({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
17
+ declare function InputGroupSearchInput({ className, variant, size, ...props }: InputProps): React.JSX.Element;
18
+ declare function InputGroupSearchClear({ className, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, 'children'>): React.JSX.Element;
19
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, };
@@ -0,0 +1,73 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { cva } from 'class-variance-authority';
4
+ import { Button } from './button.js';
5
+ import { Input, inputSurfaceClasses, inputTransitionClasses, } from './input.js';
6
+ import { Close } from '../../icons/close.js';
7
+ import { cn } from '../../lib/utils.js';
8
+ function InputGroup({ className, ...props }) {
9
+ return (_jsx("div", { "data-slot": "input-group", role: "group", className: cn('group/input-group relative flex w-full items-center outline-none', inputSurfaceClasses, inputTransitionClasses, 'h-9 min-w-0 has-[>textarea]:h-auto',
10
+ // Variants based on alignment.
11
+ 'has-[>[data-align=inline-start]]:[&>input]:pl-2', 'has-[>[data-align=inline-end]]:[&>input]:pr-2', 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3', 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3',
12
+ // Focus state.
13
+ // Focus state — the same border + halo as `Input`, drawn on the group
14
+ // so addons sit inside the ring rather than beside it.
15
+ 'has-[[data-slot=input-group-control]:focus]:border-ring has-[[data-slot=input-group-control]:focus]:ring-ring/15 has-[[data-slot=input-group-control]:focus]:ring-3',
16
+ // Error state.
17
+ 'has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/15 has-[[data-slot][aria-invalid=true]]:ring-3', className), ...props }));
18
+ }
19
+ const inputGroupAddonVariants = cva("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4", {
20
+ variants: {
21
+ align: {
22
+ 'inline-start': 'order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]',
23
+ 'inline-end': 'order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]',
24
+ 'block-start': 'order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3',
25
+ 'block-end': 'order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3',
26
+ },
27
+ },
28
+ defaultVariants: {
29
+ align: 'inline-start',
30
+ },
31
+ });
32
+ function InputGroupAddon({ className, align = 'inline-start', ...props }) {
33
+ return (_jsx("div", { role: "group", "data-slot": "input-group-addon", "data-align": align, className: cn(inputGroupAddonVariants({ align }), className), onClick: (e) => {
34
+ if (e.target.closest('button')) {
35
+ return;
36
+ }
37
+ e.currentTarget.parentElement?.querySelector('input')?.focus();
38
+ }, ...props }));
39
+ }
40
+ const inputGroupButtonVariants = cva('flex items-center gap-2 text-sm shadow-none', {
41
+ variants: {
42
+ size: {
43
+ xs: "h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5",
44
+ sm: 'h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5',
45
+ 'icon-xs': 'size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0',
46
+ 'icon-sm': 'size-8 p-0 has-[>svg]:p-0',
47
+ },
48
+ },
49
+ defaultVariants: {
50
+ size: 'xs',
51
+ },
52
+ });
53
+ function InputGroupButton({ className, type = 'button', variant = 'ghost', size = 'xs', ...props }) {
54
+ return (_jsx(Button, { type: type, "data-size": size, variant: variant, className: cn(inputGroupButtonVariants({ size }), className), ...props }));
55
+ }
56
+ function InputGroupInput({ className, ...props }) {
57
+ return (_jsx(Input, { "data-slot": "input-group-control", className: cn(
58
+ // The group paints the surface, border and ring; the control is bare.
59
+ 'flex-1 rounded-none border-0 bg-transparent shadow-none', 'focus:ring-0 focus:outline-none aria-invalid:ring-0', className), ...props }));
60
+ }
61
+ function InputGroupSearch({ className, ...props }) {
62
+ return (_jsx("div", { "data-slot": "input-group-search", className: cn('relative w-full', className), ...props }));
63
+ }
64
+ function InputGroupSearchIcon({ className, ...props }) {
65
+ return (_jsx("div", { "data-slot": "input-group-search-icon", "aria-hidden": "true", className: cn('text-muted-foreground pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 [&_svg:not([class*="size-"])]:size-4', className), ...props }));
66
+ }
67
+ function InputGroupSearchInput({ className, variant = 'transparent', size = 'md', ...props }) {
68
+ return (_jsx(Input, { "data-slot": "input-group-search-control", variant: variant, size: size, className: cn('peer placeholder:text-muted-foreground/60 pl-9', className), ...props }));
69
+ }
70
+ function InputGroupSearchClear({ className, variant = 'ghost', size = 'icon', ...props }) {
71
+ return (_jsx(Button, { type: "button", variant: variant, size: size, "aria-label": "Clear", "data-slot": "input-group-search-clear", className: cn('absolute top-1/2 right-2 size-6 -translate-y-1/2 rounded-sm opacity-0 peer-focus:opacity-100', className), ...props, children: _jsx(Close, { className: "text-muted-foreground size-4" }) }));
72
+ }
73
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, };
@@ -0,0 +1,26 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * The one field surface every text input on the web shares — `Input`,
4
+ * `InputGroup`, `Textarea`, and the search field all read these, so a field
5
+ * looks the same on a white page, a gray card, or inside a modal.
6
+ *
7
+ * `bg-popover` is the top surface in both themes (white / #141414), so the well
8
+ * lifts off any substrate instead of sinking into a `bg-card` panel the way the
9
+ * old `bg-input` fill did. Focus is the `ring` token twice: a solid 1px border
10
+ * plus a 3px 15% halo.
11
+ */
12
+ declare const inputSurfaceClasses = "bg-popover border-border rounded-md border";
13
+ declare const inputFocusClasses = "focus:border-ring focus:ring-ring/15 focus:ring-3 focus:outline-none";
14
+ declare const inputInvalidClasses = "aria-invalid:border-destructive aria-invalid:ring-destructive/15 aria-invalid:ring-3 aria-invalid:motion-safe:animate-shake";
15
+ /** Border and halo change on every focus move, so they swap fast and never move layout. */
16
+ declare const inputTransitionClasses = "transition-[border-color,box-shadow] duration-(--duration-fast) ease-out motion-reduce:transition-none";
17
+ export type InputProps = Omit<React.ComponentProps<'input'>, 'size'> & {
18
+ /**
19
+ * @deprecated Every input renders the same surface. Kept so existing
20
+ * callers compile; the value is ignored.
21
+ */
22
+ variant?: 'default' | 'secondary' | 'transparent' | 'popover';
23
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
24
+ };
25
+ declare function Input({ className, type, variant: _variant, size, ...props }: InputProps): React.JSX.Element;
26
+ export { Input, inputFocusClasses, inputInvalidClasses, inputSurfaceClasses, inputTransitionClasses, };
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../../lib/utils.js';
3
+ /**
4
+ * The one field surface every text input on the web shares — `Input`,
5
+ * `InputGroup`, `Textarea`, and the search field all read these, so a field
6
+ * looks the same on a white page, a gray card, or inside a modal.
7
+ *
8
+ * `bg-popover` is the top surface in both themes (white / #141414), so the well
9
+ * lifts off any substrate instead of sinking into a `bg-card` panel the way the
10
+ * old `bg-input` fill did. Focus is the `ring` token twice: a solid 1px border
11
+ * plus a 3px 15% halo.
12
+ */
13
+ const inputSurfaceClasses = 'bg-popover border-border rounded-md border';
14
+ const inputFocusClasses = 'focus:border-ring focus:ring-ring/15 focus:ring-3 focus:outline-none';
15
+ const inputInvalidClasses = 'aria-invalid:border-destructive aria-invalid:ring-destructive/15 aria-invalid:ring-3 aria-invalid:motion-safe:animate-shake';
16
+ /** Border and halo change on every focus move, so they swap fast and never move layout. */
17
+ const inputTransitionClasses = 'transition-[border-color,box-shadow] duration-(--duration-fast) ease-out motion-reduce:transition-none';
18
+ function Input({ className, type, variant: _variant, size = 'sm', ...props }) {
19
+ return (_jsx("input", { type: type, "data-slot": "input", className: cn(inputSurfaceClasses, inputFocusClasses, inputInvalidClasses, inputTransitionClasses, 'text-foreground file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-10 w-full min-w-0 px-3 py-1 text-sm font-medium file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50', type === 'search' &&
20
+ '[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none', type === 'file' &&
21
+ 'text-muted-foreground file:border-border file:text-foreground p-0 pr-3 italic file:me-3 file:h-full file:border-0 file:border-r file:border-solid file:bg-transparent file:px-3 file:text-sm file:font-medium file:not-italic', size === 'xs' && 'h-8 text-xs', size === 'sm' && 'h-9 text-sm', size === 'md' && 'h-10 text-sm', size === 'lg' && 'h-11 text-sm', size === 'xl' && 'h-12 text-base', className), ...props }));
22
+ }
23
+ export { Input, inputFocusClasses, inputInvalidClasses, inputSurfaceClasses, inputTransitionClasses, };