@kortix/ui 0.0.0-stage → 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 +155 -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 +881 -4
  416. package/skills/kortix-ui/SKILL.md +150 -0
@@ -0,0 +1,153 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Dotm3x3_10 } from './dotm-3x3-10.js';
4
+ import { Dotm3x3_12 } from './dotm-3x3-12.js';
5
+ import { Dotm3x3_13 } from './dotm-3x3-13.js';
6
+ import { Dotm3x3_15 } from './dotm-3x3-15.js';
7
+ import { Dotm3x3_16 } from './dotm-3x3-16.js';
8
+ import { Dotm3x3_18 } from './dotm-3x3-18.js';
9
+ import { Dotm3x3_19 } from './dotm-3x3-19.js';
10
+ import { Dotm3x3_2 } from './dotm-3x3-2.js';
11
+ import { Dotm3x3_20 } from './dotm-3x3-20.js';
12
+ import { Dotm3x3_21 } from './dotm-3x3-21.js';
13
+ import { Dotm3x3_3 } from './dotm-3x3-3.js';
14
+ import { Dotm3x3_4 } from './dotm-3x3-4.js';
15
+ import { Dotm3x3_5 } from './dotm-3x3-5.js';
16
+ import { Dotm3x3_6 } from './dotm-3x3-6.js';
17
+ import { Dotm3x3_7 } from './dotm-3x3-7.js';
18
+ import { Dotm3x3_8 } from './dotm-3x3-8.js';
19
+ import { Dotm3x3_9 } from './dotm-3x3-9.js';
20
+ import { DotmCircular1 } from './dotm-circular-1.js';
21
+ import { DotmCircular10 } from './dotm-circular-10.js';
22
+ import { DotmCircular11 } from './dotm-circular-11.js';
23
+ import { DotmCircular12 } from './dotm-circular-12.js';
24
+ import { DotmCircular14 } from './dotm-circular-14.js';
25
+ import { DotmCircular15 } from './dotm-circular-15.js';
26
+ import { DotmCircular17 } from './dotm-circular-17.js';
27
+ import { DotmCircular2 } from './dotm-circular-2.js';
28
+ import { DotmCircular3 } from './dotm-circular-3.js';
29
+ import { DotmCircular4 } from './dotm-circular-4.js';
30
+ import { DotmCircular5 } from './dotm-circular-5.js';
31
+ import { DotmCircular6 } from './dotm-circular-6.js';
32
+ import { DotmCircular7 } from './dotm-circular-7.js';
33
+ import { DotmCircular8 } from './dotm-circular-8.js';
34
+ import { DotmCircular9 } from './dotm-circular-9.js';
35
+ import { DotmSquare1 } from './dotm-square-1.js';
36
+ import { DotmSquare10 } from './dotm-square-10.js';
37
+ import { DotmSquare11 } from './dotm-square-11.js';
38
+ import { DotmSquare12 } from './dotm-square-12.js';
39
+ import { DotmSquare13 } from './dotm-square-13.js';
40
+ import { DotmSquare14 } from './dotm-square-14.js';
41
+ import { DotmSquare15 } from './dotm-square-15.js';
42
+ import { DotmSquare16 } from './dotm-square-16.js';
43
+ import { DotmSquare17 } from './dotm-square-17.js';
44
+ import { DotmSquare18 } from './dotm-square-18.js';
45
+ import { DotmSquare19 } from './dotm-square-19.js';
46
+ import { DotmSquare2 } from './dotm-square-2.js';
47
+ import { DotmSquare20 } from './dotm-square-20.js';
48
+ import { DotmSquare3 } from './dotm-square-3.js';
49
+ import { DotmSquare4 } from './dotm-square-4.js';
50
+ import { DotmSquare5 } from './dotm-square-5.js';
51
+ import { DotmSquare6 } from './dotm-square-6.js';
52
+ import { DotmSquare7 } from './dotm-square-7.js';
53
+ import { DotmSquare8 } from './dotm-square-8.js';
54
+ import { DotmSquare9 } from './dotm-square-9.js';
55
+ export const DOT_MATRIX_CATALOG = [
56
+ { name: 'dotm-3x3-2', family: '3x3', Component: Dotm3x3_2 },
57
+ { name: 'dotm-3x3-3', family: '3x3', Component: Dotm3x3_3 },
58
+ { name: 'dotm-3x3-4', family: '3x3', Component: Dotm3x3_4 },
59
+ { name: 'dotm-3x3-5', family: '3x3', Component: Dotm3x3_5 },
60
+ { name: 'dotm-3x3-6', family: '3x3', Component: Dotm3x3_6 },
61
+ { name: 'dotm-3x3-7', family: '3x3', Component: Dotm3x3_7 },
62
+ { name: 'dotm-3x3-8', family: '3x3', Component: Dotm3x3_8 },
63
+ { name: 'dotm-3x3-9', family: '3x3', Component: Dotm3x3_9 },
64
+ { name: 'dotm-3x3-10', family: '3x3', Component: Dotm3x3_10 },
65
+ { name: 'dotm-3x3-12', family: '3x3', Component: Dotm3x3_12 },
66
+ { name: 'dotm-3x3-13', family: '3x3', Component: Dotm3x3_13 },
67
+ { name: 'dotm-3x3-15', family: '3x3', Component: Dotm3x3_15 },
68
+ { name: 'dotm-3x3-16', family: '3x3', Component: Dotm3x3_16 },
69
+ { name: 'dotm-3x3-18', family: '3x3', Component: Dotm3x3_18 },
70
+ { name: 'dotm-3x3-19', family: '3x3', Component: Dotm3x3_19 },
71
+ { name: 'dotm-3x3-20', family: '3x3', Component: Dotm3x3_20 },
72
+ { name: 'dotm-3x3-21', family: '3x3', Component: Dotm3x3_21 },
73
+ { name: 'dotm-circular-1', family: 'circular', Component: DotmCircular1 },
74
+ { name: 'dotm-circular-2', family: 'circular', Component: DotmCircular2 },
75
+ { name: 'dotm-circular-3', family: 'circular', Component: DotmCircular3 },
76
+ { name: 'dotm-circular-4', family: 'circular', Component: DotmCircular4 },
77
+ { name: 'dotm-circular-5', family: 'circular', Component: DotmCircular5 },
78
+ { name: 'dotm-circular-6', family: 'circular', Component: DotmCircular6 },
79
+ { name: 'dotm-circular-7', family: 'circular', Component: DotmCircular7 },
80
+ { name: 'dotm-circular-8', family: 'circular', Component: DotmCircular8 },
81
+ { name: 'dotm-circular-9', family: 'circular', Component: DotmCircular9 },
82
+ { name: 'dotm-circular-10', family: 'circular', Component: DotmCircular10 },
83
+ { name: 'dotm-circular-11', family: 'circular', Component: DotmCircular11 },
84
+ { name: 'dotm-circular-12', family: 'circular', Component: DotmCircular12 },
85
+ { name: 'dotm-circular-14', family: 'circular', Component: DotmCircular14 },
86
+ { name: 'dotm-circular-15', family: 'circular', Component: DotmCircular15 },
87
+ { name: 'dotm-circular-17', family: 'circular', Component: DotmCircular17 },
88
+ { name: 'dotm-square-1', family: 'square', Component: DotmSquare1 },
89
+ { name: 'dotm-square-2', family: 'square', Component: DotmSquare2 },
90
+ { name: 'dotm-square-3', family: 'square', Component: DotmSquare3 },
91
+ { name: 'dotm-square-4', family: 'square', Component: DotmSquare4 },
92
+ { name: 'dotm-square-5', family: 'square', Component: DotmSquare5 },
93
+ { name: 'dotm-square-6', family: 'square', Component: DotmSquare6 },
94
+ { name: 'dotm-square-7', family: 'square', Component: DotmSquare7 },
95
+ { name: 'dotm-square-8', family: 'square', Component: DotmSquare8 },
96
+ { name: 'dotm-square-9', family: 'square', Component: DotmSquare9 },
97
+ { name: 'dotm-square-10', family: 'square', Component: DotmSquare10 },
98
+ { name: 'dotm-square-11', family: 'square', Component: DotmSquare11 },
99
+ { name: 'dotm-square-12', family: 'square', Component: DotmSquare12 },
100
+ { name: 'dotm-square-13', family: 'square', Component: DotmSquare13 },
101
+ { name: 'dotm-square-14', family: 'square', Component: DotmSquare14 },
102
+ { name: 'dotm-square-15', family: 'square', Component: DotmSquare15 },
103
+ { name: 'dotm-square-16', family: 'square', Component: DotmSquare16 },
104
+ { name: 'dotm-square-17', family: 'square', Component: DotmSquare17 },
105
+ { name: 'dotm-square-18', family: 'square', Component: DotmSquare18 },
106
+ { name: 'dotm-square-19', family: 'square', Component: DotmSquare19 },
107
+ { name: 'dotm-square-20', family: 'square', Component: DotmSquare20 },
108
+ ];
109
+ export const SESSION_DOT_MATRIX_FAMILIES = new Set([
110
+ '3x3',
111
+ 'circular',
112
+ 'square',
113
+ ]);
114
+ export const SESSION_DOT_MATRIX_POOL = DOT_MATRIX_CATALOG.filter((entry) => SESSION_DOT_MATRIX_FAMILIES.has(entry.family));
115
+ export const SESSION_DOT_MATRIX_VARIANTS = SESSION_DOT_MATRIX_POOL.map((entry) => entry.Component);
116
+ /**
117
+ * FNV-1a over the session id, reduced onto the registry. Deterministic and
118
+ * dependency-free; `Math.imul` keeps the multiply in 32-bit space and
119
+ * `>>> 0` makes the result unsigned before the modulo.
120
+ */
121
+ export function sessionDotMatrixIndex(sessionId) {
122
+ let hash = 0x811c9dc5;
123
+ for (let i = 0; i < sessionId.length; i += 1) {
124
+ hash ^= sessionId.charCodeAt(i);
125
+ hash = Math.imul(hash, 0x01000193);
126
+ }
127
+ return (hash >>> 0) % SESSION_DOT_MATRIX_VARIANTS.length;
128
+ }
129
+ /**
130
+ * The 5x5 families (circular, square) default `dotSize` to 5 for their 36px
131
+ * design size. At the 14px busy-indicator size that leaves 5px dots whose
132
+ * grid overflows the box — far too heavy. When the caller sets `size`
133
+ * without `dotSize`, derive the dot from the same 36:5 ratio the variants
134
+ * were designed at (14 → 2, matching `DotmSquare14`'s hand-tuned values).
135
+ * 3x3 variants size themselves from `dotSize` + `cellPadding` and never
136
+ * overflow, so they pass through untouched.
137
+ */
138
+ const FIVE_BY_FIVE_FAMILIES = new Set(['circular', 'square']);
139
+ const FIVE_BY_FIVE_BASE_SIZE = 36;
140
+ const FIVE_BY_FIVE_BASE_DOT_SIZE = 5;
141
+ export function fiveByFiveDotSizeFor(size) {
142
+ return Math.max(1, Math.round((size * FIVE_BY_FIVE_BASE_DOT_SIZE) / FIVE_BY_FIVE_BASE_SIZE));
143
+ }
144
+ export function SessionDotMatrix({ sessionId, ...props }) {
145
+ if (!sessionId) {
146
+ return _jsx(DotmSquare14, { ...props });
147
+ }
148
+ const { family, Component } = SESSION_DOT_MATRIX_POOL[sessionDotMatrixIndex(sessionId)];
149
+ const dotSize = props.dotSize == null && props.size != null && FIVE_BY_FIVE_FAMILIES.has(family)
150
+ ? fiveByFiveDotSizeFor(props.size)
151
+ : props.dotSize;
152
+ return _jsx(Component, { ...props, dotSize: dotSize });
153
+ }
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import { Drawer as DrawerPrimitive } from 'vaul';
3
+ declare function Drawer({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>): React.JSX.Element;
4
+ declare function DrawerTrigger({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Trigger>): React.JSX.Element;
5
+ declare function DrawerPortal({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Portal>): React.JSX.Element;
6
+ declare function DrawerClose({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Close>): React.JSX.Element;
7
+ declare function DrawerOverlay({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Overlay>): React.JSX.Element;
8
+ declare function DrawerContent({ className, children, bar, ...props }: React.ComponentProps<typeof DrawerPrimitive.Content> & {
9
+ bar?: boolean;
10
+ }): React.JSX.Element;
11
+ declare function DrawerHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
12
+ declare function DrawerFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
13
+ declare function DrawerTitle({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Title>): React.JSX.Element;
14
+ declare function DrawerDescription({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Description>): React.JSX.Element;
15
+ export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, };
@@ -0,0 +1,35 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Drawer as DrawerPrimitive } from 'vaul';
4
+ import { cn } from '../../lib/utils.js';
5
+ function Drawer({ ...props }) {
6
+ return _jsx(DrawerPrimitive.Root, { "data-slot": "drawer", ...props });
7
+ }
8
+ function DrawerTrigger({ ...props }) {
9
+ return _jsx(DrawerPrimitive.Trigger, { "data-slot": "drawer-trigger", ...props });
10
+ }
11
+ function DrawerPortal({ ...props }) {
12
+ return _jsx(DrawerPrimitive.Portal, { "data-slot": "drawer-portal", ...props });
13
+ }
14
+ function DrawerClose({ ...props }) {
15
+ return _jsx(DrawerPrimitive.Close, { "data-slot": "drawer-close", ...props });
16
+ }
17
+ function DrawerOverlay({ className, ...props }) {
18
+ return (_jsx(DrawerPrimitive.Overlay, { "data-slot": "drawer-overlay", className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50', className), ...props }));
19
+ }
20
+ function DrawerContent({ className, children, bar = true, ...props }) {
21
+ return (_jsxs(DrawerPortal, { "data-slot": "drawer-portal", children: [_jsx(DrawerOverlay, {}), _jsxs(DrawerPrimitive.Content, { "data-slot": "drawer-content", className: cn('group/drawer-content bg-background fixed z-50 flex h-auto flex-col', 'data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b', 'data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t', 'data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm', 'data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm', className), ...props, children: [bar && (_jsx("div", { className: "bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block" })), children] })] }));
22
+ }
23
+ function DrawerHeader({ className, ...props }) {
24
+ return (_jsx("div", { "data-slot": "drawer-header", className: cn('flex flex-col gap-1.5 p-4', className), ...props }));
25
+ }
26
+ function DrawerFooter({ className, ...props }) {
27
+ return (_jsx("div", { "data-slot": "drawer-footer", className: cn('mt-auto flex flex-col gap-2 p-4', className), ...props }));
28
+ }
29
+ function DrawerTitle({ className, ...props }) {
30
+ return (_jsx(DrawerPrimitive.Title, { "data-slot": "drawer-title", className: cn('text-foreground font-semibold', className), ...props }));
31
+ }
32
+ function DrawerDescription({ className, ...props }) {
33
+ return (_jsx(DrawerPrimitive.Description, { "data-slot": "drawer-description", className: cn('text-muted-foreground text-sm', className), ...props }));
34
+ }
35
+ export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, };
@@ -0,0 +1,49 @@
1
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
2
+ import * as React from 'react';
3
+ import { type MenuRowSize } from './menu-recipe.js';
4
+ import { type TriggerVariantProps } from './trigger-variants.js';
5
+ declare const DropdownMenu: React.FC<DropdownMenuPrimitive.DropdownMenuProps>;
6
+ declare const DropdownMenuTrigger: React.ForwardRefExoticComponent<Omit<Omit<DropdownMenuPrimitive.DropdownMenuTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref">, "size"> & TriggerVariantProps & React.RefAttributes<HTMLButtonElement>>;
7
+ declare const DropdownMenuGroup: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
8
+ declare const DropdownMenuPortal: React.FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
9
+ declare const DropdownMenuSub: React.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
10
+ declare const DropdownMenuRadioGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & React.RefAttributes<HTMLDivElement>>;
11
+ /**
12
+ * Takes the same `size` and `inset` props as `DropdownMenuItem`, because a
13
+ * submenu trigger is a row like any other and has to line up with its siblings.
14
+ *
15
+ * The caret is `size-3.5` against the leading icon's `size-4`: it is an
16
+ * affordance, not content, and matching the icon's weight makes it compete with
17
+ * the label. `text-muted-foreground` for the same reason.
18
+ */
19
+ declare const DropdownMenuSubTrigger: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
20
+ inset?: boolean;
21
+ size?: MenuRowSize;
22
+ } & React.RefAttributes<HTMLDivElement>>;
23
+ declare const DropdownMenuSubContent: React.ForwardRefExoticComponent<Omit<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & React.RefAttributes<HTMLDivElement>, "ref">, "align"> & {
24
+ side?: "top" | "bottom" | "left" | "right";
25
+ align?: "start" | "center" | "end";
26
+ } & React.RefAttributes<HTMLDivElement>>;
27
+ declare const DropdownMenuContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
28
+ declare const DropdownMenuItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
29
+ inset?: boolean;
30
+ variant?: "default" | "destructive";
31
+ size?: "sm" | "md" | "lg";
32
+ } & React.RefAttributes<HTMLDivElement>>;
33
+ declare const DropdownMenuCheckboxItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
34
+ reverse?: boolean;
35
+ size?: MenuRowSize;
36
+ } & React.RefAttributes<HTMLDivElement>>;
37
+ declare const DropdownMenuRadioItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
38
+ size?: MenuRowSize;
39
+ side?: "left" | "right";
40
+ } & React.RefAttributes<HTMLDivElement>>;
41
+ declare const DropdownMenuLabel: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
42
+ inset?: boolean;
43
+ } & React.RefAttributes<HTMLDivElement>>;
44
+ declare const DropdownMenuSeparator: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
45
+ declare const DropdownMenuShortcut: {
46
+ ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element;
47
+ displayName: string;
48
+ };
49
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, };
@@ -0,0 +1,113 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { cn } from '../../lib/utils.js';
4
+ import { floatingZ, useDialogDepth } from '../../lib/z-stack.js';
5
+ import { CheckIcon as Check, CaretRightIcon as ChevronRight } from '@phosphor-icons/react';
6
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
7
+ import * as React from 'react';
8
+ import { MENU_INDICATOR, MENU_INDICATOR_ICON, MENU_INSET, MENU_INSET_END, MENU_LABEL, MENU_PANEL_STATIC, MENU_SEPARATOR, MENU_SHORTCUT, menuRow, } from './menu-recipe.js';
9
+ import { triggerVariants } from './trigger-variants.js';
10
+ /**
11
+ * The row recipe, the panel and the label/separator/shortcut classes live in
12
+ * `./menu-recipe`, shared with `context-menu.tsx` — see that file for why the
13
+ * four row components here (Item, SubTrigger, CheckboxItem, RadioItem) are no
14
+ * longer allowed to style themselves.
15
+ *
16
+ * A dropdown is anchored to a trigger, so its panel is at least as wide as a
17
+ * typical trigger. A right-click menu has no trigger width to match and floors
18
+ * itself lower.
19
+ *
20
+ * No enter/exit animation on the root panel or the submenu. The root panel
21
+ * used to `animate-in` (fade + `zoom-in-95` + a 2-unit slide, ~150ms). Radix
22
+ * Presence also keeps the node mounted until `animate-out` fires
23
+ * `animationend`, so every open AND every close waited on the animation. People
24
+ * open these menus tens of times a day; the project sidebar's workspace
25
+ * switcher is the worst case. The motion read as the menu lagging behind the
26
+ * click, and it dropped frames under load. The panel now paints on the frame it
27
+ * mounts and unmounts on the frame it closes.
28
+ *
29
+ * The submenu lost its animation earlier for a second reason: it opens INTO the
30
+ * pointer's path, so the slide moved its rows away from the cursor.
31
+ */
32
+ const DROPDOWN_PANEL = cn(MENU_PANEL_STATIC, 'min-w-[14rem] overflow-hidden');
33
+ const DropdownMenu = DropdownMenuPrimitive.Root;
34
+ const DropdownMenuTrigger = React.forwardRef(({ className, variant, size, asChild, ...props }, ref) => (_jsx(DropdownMenuPrimitive.Trigger, { ref: ref, asChild: asChild,
35
+ // With `asChild` the child owns its styling — merging ours would double it.
36
+ className: asChild ? className : cn(triggerVariants({ variant, size }), className), ...props })));
37
+ DropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName;
38
+ const DropdownMenuGroup = React.forwardRef(({ className, ...props }, ref) => (
39
+ // No padding of its own: the panel's `p-1` is the only inset, so a grouped
40
+ // row is exactly as wide as an ungrouped one.
41
+ _jsx(DropdownMenuPrimitive.Group, { ref: ref, className: className, ...props })));
42
+ DropdownMenuGroup.displayName = DropdownMenuPrimitive.Group.displayName;
43
+ const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
44
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub;
45
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
46
+ /**
47
+ * Takes the same `size` and `inset` props as `DropdownMenuItem`, because a
48
+ * submenu trigger is a row like any other and has to line up with its siblings.
49
+ *
50
+ * The caret is `size-3.5` against the leading icon's `size-4`: it is an
51
+ * affordance, not content, and matching the icon's weight makes it compete with
52
+ * the label. `text-muted-foreground` for the same reason.
53
+ */
54
+ const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, size = 'sm', children, ...props }, ref) => (_jsxs(DropdownMenuPrimitive.SubTrigger, { ref: ref, className: cn('group', menuRow(size, 'default'), inset && MENU_INSET, className), ...props, children: [children, _jsx(ChevronRight, { className: "text-muted-foreground ml-auto size-3.5" })] })));
55
+ DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
56
+ const DropdownMenuSubContent = React.forwardRef(({ className, side: _side, align: _align, sideOffset = 5, style, ...props }, ref) => {
57
+ const depth = useDialogDepth();
58
+ return (_jsx(DropdownMenuPrimitive.SubContent, { ref: ref, sideOffset: sideOffset, className: cn(DROPDOWN_PANEL, className), style: { zIndex: floatingZ(depth), ...style }, ...props }));
59
+ });
60
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
61
+ const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, style, ...props }, ref) => {
62
+ const depth = useDialogDepth();
63
+ return (_jsx(DropdownMenuPrimitive.Portal, { children: _jsx(DropdownMenuPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn(DROPDOWN_PANEL, className), style: { zIndex: floatingZ(depth), ...style }, ...props }) }));
64
+ });
65
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
66
+ const DropdownMenuItem = React.forwardRef(({ className, inset, variant = 'default', size = 'sm', ...props }, ref) => (_jsx(DropdownMenuPrimitive.Item, { ref: ref, className: cn(menuRow(size, variant), inset && MENU_INSET, className), ...props })));
67
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
68
+ const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, reverse, size = 'sm', ...props }, ref) => (_jsxs(DropdownMenuPrimitive.CheckboxItem, { ref: ref,
69
+ // The check sits in the row's leading slot (absolute, so an unchecked row
70
+ // keeps the same label x as a checked one) and the label starts at
71
+ // `MENU_INSET` — the same x as an `inset` item or an icon row's label.
72
+ className: cn(menuRow(size, 'default'), reverse ? MENU_INSET_END : MENU_INSET, className), checked: checked, ...props, children: [_jsx("span", { className: cn(MENU_INDICATOR, 'absolute', reverse ? 'right-2' : 'left-2'), children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(Check, { className: MENU_INDICATOR_ICON }) }) }), children] })));
73
+ DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
74
+ /**
75
+ * The label column of a radio row.
76
+ *
77
+ * `flex-1` is what pushes the check to the row's far edge — but the span used
78
+ * to stop there, i.e. it was a BLOCK. Tailwind's Preflight sets
79
+ * `svg { display: block }`, so any radio row with a leading icon rendered the
80
+ * icon on its own line above the label. Every other row component
81
+ * (`Item`, `CheckboxItem`, `SubTrigger`) escapes this because `MENU_ROW_BASE`
82
+ * makes the row itself the flex container and their children are direct
83
+ * children of it; only `RadioItem` interposes this wrapper.
84
+ *
85
+ * Two consumers had already worked around it by hand-wrapping their children
86
+ * in exactly this class (`user-menu-shared.tsx`, `reasoning-effort-selector.tsx`)
87
+ * — the workaround is now the component's job. `gap-2` matches `MENU_ROW_BASE`
88
+ * so an icon+label pair is spaced identically whichever row type holds it.
89
+ */
90
+ const RADIO_LABEL = 'flex min-w-0 flex-1 items-center gap-2';
91
+ const DropdownMenuRadioItem = React.forwardRef(({ className, children, size = 'sm', side = 'right', ...props }, ref) => {
92
+ /**
93
+ * A check, not a dot, and the same check `DropdownMenuCheckboxItem` uses.
94
+ *
95
+ * This was `<Circle className="h-2 w-2 fill-current" />`, which could not
96
+ * work: Phosphor's CircleIcon is a stroked outline, so `fill-current` painted
97
+ * nothing, and `MENU_ROW_BASE`'s `[&_svg]:size-4` — a descendant selector —
98
+ * outranked the `h-2 w-2` sitting on the icon itself. The mark rendered as a
99
+ * hollow ring. No consumer had ever rendered a RadioItem, so nobody saw it.
100
+ */
101
+ const indicator = (_jsx("span", { className: MENU_INDICATOR, children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(Check, { className: MENU_INDICATOR_ICON }) }) }));
102
+ return (_jsx(DropdownMenuPrimitive.RadioItem, { ref: ref, className: cn(menuRow(size, 'default'), className), ...props, children: side === 'left' ? (_jsxs(_Fragment, { children: [indicator, _jsx("span", { className: RADIO_LABEL, children: children })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: RADIO_LABEL, children: children }), indicator] })) }));
103
+ });
104
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
105
+ const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => (_jsx(DropdownMenuPrimitive.Label, { ref: ref, className: cn(MENU_LABEL, inset && MENU_INSET, className), ...props })));
106
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
107
+ const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx(DropdownMenuPrimitive.Separator, { ref: ref, className: cn(MENU_SEPARATOR, className), ...props })));
108
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
109
+ const DropdownMenuShortcut = ({ className, ...props }) => {
110
+ return _jsx("span", { className: cn(MENU_SHORTCUT, className), ...props });
111
+ };
112
+ DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';
113
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, };
@@ -0,0 +1,15 @@
1
+ export interface EmojiSelection {
2
+ emoji: string;
3
+ label: string;
4
+ }
5
+ export declare function EmojiPicker({ onEmojiSelect, className, emojibaseUrl, }: {
6
+ onEmojiSelect: (emoji: EmojiSelection) => void;
7
+ className?: string;
8
+ /**
9
+ * Root-relative URL that serves `en/data.json` and `en/messages.json` from
10
+ * `emojibase-data`. apps/web copies them to `public/emojibase/`. A host that
11
+ * serves them elsewhere passes its own path; a host that serves nothing gets
12
+ * a picker that stays on its loading state (frimousse has no error slot).
13
+ */
14
+ emojibaseUrl?: string;
15
+ }): import("react").JSX.Element;
@@ -0,0 +1,137 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { MagnifyingGlassIcon } from '@phosphor-icons/react';
4
+ import { EmojiPicker as Frimousse } from 'frimousse';
5
+ import Hint from './hint.js';
6
+ import { InputGroupSearch, InputGroupSearchIcon } from './input-group.js';
7
+ import Loading from './loading.js';
8
+ import { cn } from '../../lib/utils.js';
9
+ /**
10
+ * Emoji picker built on frimousse.
11
+ *
12
+ * The hovered/keyboard-active cell takes one of six tints, rotated by three on
13
+ * alternating rows so a tint never sits directly above itself. Rotation by
14
+ * three within a six-cycle guarantees that for ANY column count — frimousse
15
+ * defaults to 9 columns (its own JSDoc says 10, but the shipped default is
16
+ * `columns = 9`, and we pass no override), and the guarantee does not depend on
17
+ * that number. The repeating tile is 6 x 2 = 12 cells: the tint is a pure
18
+ * function of (nth-child mod 6, row parity).
19
+ *
20
+ * Colours come from two paired token families in globals.css: a pale
21
+ * `--color-emoji-fill-*` and a stronger `--color-emoji-ring-*` per hue. The
22
+ * active cell is the ONLY visible cue for which emoji is selected — frimousse
23
+ * gives every emoji button tabIndex={-1} and no focus ring — so the state
24
+ * indicator has to clear WCAG 1.4.11's 3:1 against --popover. A pale fill
25
+ * cannot reach that on white at any saturation, so the 1px inset ring carries
26
+ * the contrast (measured 3.03–3.19:1) and the fill stays quiet.
27
+ */
28
+ /**
29
+ * Every variant is written out as a LITERAL string. Do not generate these with
30
+ * a template literal or a .map() — Tailwind v4 extracts class names by scanning
31
+ * source text, so an interpolated class name produces no CSS at all and the
32
+ * hover backgrounds silently never appear.
33
+ *
34
+ * There is no `dark:` set: every token is a light-dark() pair, and :root /
35
+ * .dark set color-scheme, so one class covers both themes.
36
+ *
37
+ * The ring GEOMETRY is declared once, as a single `data-[active]:inset-ring-1`
38
+ * — only the colour is slot-specific. Repeating the width on all twelve slots
39
+ * would be twelve chances for one to drift.
40
+ *
41
+ * VARIANT ORDER: `data-[active]` LAST, i.e.
42
+ * `group-data-[row=even]/row:nth-[6n+1]:data-[active]:bg-…`. Verified against
43
+ * tailwindcss 4.3.2, which compiles that to
44
+ * `:is(:where(.group\/row)[data-row="even"] *):nth-child(6n+1)[data-active]`.
45
+ * Leading with `data-[active]` also compiles to a working selector, so either
46
+ * order emits CSS — this one just reads in the order the cascade applies.
47
+ *
48
+ * `nth-[6n+k]` counts the emoji button among its row's children, which is
49
+ * exactly the column: frimousse renders nothing into a row but emoji buttons.
50
+ *
51
+ * WHY `data-row` AND NOT `group-odd/row:` / `group-even/row:` (the obvious
52
+ * CSS-only choice): frimousse virtualises the list, so a row's `:nth-child()`
53
+ * index counts only the rows currently mounted, offset by a hidden measurement
54
+ * <div> that is always the first child and by a spacer <div> inserted before
55
+ * every row that starts a category. `:nth-child(odd)` on a row therefore tracks
56
+ * neither the logical row nor any stable value — it flips as you scroll.
57
+ * `aria-rowindex`, which frimousse derives from the logical row index, is the
58
+ * one stable source, so `<Row>` reads it and stamps the parity as an attribute.
59
+ */
60
+ const EMOJI_BUTTON = cn('flex size-8 items-center justify-center rounded-md text-lg leading-none', 'cursor-pointer select-none',
61
+ // `scale` not `transform`: Tailwind v4's scale-* utility sets the standalone
62
+ // `scale` property, which `transition-property: transform` does not cover.
63
+ // box-shadow is in the list because Tailwind draws inset-ring-* with it.
64
+ 'transition-[background-color,box-shadow,scale] duration-100 active:scale-[0.96]',
65
+ // Ring geometry, declared once. Only the colour varies per slot below.
66
+ 'data-[active]:inset-ring-1',
67
+ // Fill — even rows: 1→red, 2→amber, 3→green, 4→teal, 5→blue, 6→violet
68
+ 'group-data-[row=even]/row:nth-[6n+1]:data-[active]:bg-emoji-fill-red', 'group-data-[row=even]/row:nth-[6n+2]:data-[active]:bg-emoji-fill-amber', 'group-data-[row=even]/row:nth-[6n+3]:data-[active]:bg-emoji-fill-green', 'group-data-[row=even]/row:nth-[6n+4]:data-[active]:bg-emoji-fill-teal', 'group-data-[row=even]/row:nth-[6n+5]:data-[active]:bg-emoji-fill-blue', 'group-data-[row=even]/row:nth-[6n+6]:data-[active]:bg-emoji-fill-violet',
69
+ // Fill — odd rows: same six, rotated by three
70
+ 'group-data-[row=odd]/row:nth-[6n+1]:data-[active]:bg-emoji-fill-teal', 'group-data-[row=odd]/row:nth-[6n+2]:data-[active]:bg-emoji-fill-blue', 'group-data-[row=odd]/row:nth-[6n+3]:data-[active]:bg-emoji-fill-violet', 'group-data-[row=odd]/row:nth-[6n+4]:data-[active]:bg-emoji-fill-red', 'group-data-[row=odd]/row:nth-[6n+5]:data-[active]:bg-emoji-fill-amber', 'group-data-[row=odd]/row:nth-[6n+6]:data-[active]:bg-emoji-fill-green',
71
+ // Ring colour — same rotation, paired with the fill by hue
72
+ 'group-data-[row=even]/row:nth-[6n+1]:data-[active]:inset-ring-emoji-ring-red', 'group-data-[row=even]/row:nth-[6n+2]:data-[active]:inset-ring-emoji-ring-amber', 'group-data-[row=even]/row:nth-[6n+3]:data-[active]:inset-ring-emoji-ring-green', 'group-data-[row=even]/row:nth-[6n+4]:data-[active]:inset-ring-emoji-ring-teal', 'group-data-[row=even]/row:nth-[6n+5]:data-[active]:inset-ring-emoji-ring-blue', 'group-data-[row=even]/row:nth-[6n+6]:data-[active]:inset-ring-emoji-ring-violet', 'group-data-[row=odd]/row:nth-[6n+1]:data-[active]:inset-ring-emoji-ring-teal', 'group-data-[row=odd]/row:nth-[6n+2]:data-[active]:inset-ring-emoji-ring-blue', 'group-data-[row=odd]/row:nth-[6n+3]:data-[active]:inset-ring-emoji-ring-violet', 'group-data-[row=odd]/row:nth-[6n+4]:data-[active]:inset-ring-emoji-ring-red', 'group-data-[row=odd]/row:nth-[6n+5]:data-[active]:inset-ring-emoji-ring-amber', 'group-data-[row=odd]/row:nth-[6n+6]:data-[active]:inset-ring-emoji-ring-green');
73
+ let warnedMissingRowIndex = false;
74
+ /**
75
+ * Row parity, from frimousse's `aria-rowindex`.
76
+ *
77
+ * The fallback is deliberately noisy rather than silent: if frimousse ever
78
+ * stopped emitting `aria-rowindex`, every row would fall back to `even`, the
79
+ * rotation would collapse to a single set, and nothing would fail. The hidden
80
+ * measurement row legitimately has neither `role` nor `aria-rowindex`, so only
81
+ * a real row (`role="row"`) missing the index is a regression worth warning on.
82
+ *
83
+ * Note frimousse's `aria-rowindex` is 0-based, which is against ARIA's 1-based
84
+ * convention. This code is correct against what it ships today; if frimousse
85
+ * ever conforms, every parity flips and the rotation shifts by three.
86
+ */
87
+ function rowParity(props) {
88
+ const rowIndex = props['aria-rowindex'];
89
+ if (typeof rowIndex !== 'number') {
90
+ if (process.env.NODE_ENV !== 'production' && props.role === 'row' && !warnedMissingRowIndex) {
91
+ warnedMissingRowIndex = true;
92
+ console.warn('[EmojiPicker] a frimousse row is missing aria-rowindex; the active-cell ' +
93
+ 'tint rotation has collapsed to one set. Check the frimousse version.');
94
+ }
95
+ return 'even';
96
+ }
97
+ return rowIndex % 2 === 0 ? 'even' : 'odd';
98
+ }
99
+ export function EmojiPicker({ onEmojiSelect, className, emojibaseUrl = '/emojibase', }) {
100
+ return (_jsxs(Frimousse.Root, { onEmojiSelect: onEmojiSelect,
101
+ // Self-hosted, not frimousse's default CDN. Left unset, frimousse fetches
102
+ // the emojibase dataset from `https://cdn.jsdelivr.net/npm/emojibase-data`
103
+ // in the user's browser the first time the picker opens — the only
104
+ // external runtime CDN this app would have. Kortix ships self-hosted, so
105
+ // that is wrong here regardless; what makes it a defect is that it fails
106
+ // INVISIBLY. frimousse exposes `Loading` and `Empty` and no error slot,
107
+ // and its cold-cache path is a bare `await` (only the etag-revalidation
108
+ // branch catches), so an unreachable CDN leaves the popover on `Loading`
109
+ // forever with no message. Air-gapped installs, restricted networks and
110
+ // any future `connect-src` CSP all land there.
111
+ //
112
+ // frimousse appends `${locale}/data.json` and `${locale}/messages.json`
113
+ // to this. Both are copied into `public/emojibase/en/` at dev/build time
114
+ // by scripts/emojibase-data.mjs — one locale, ~782 KB on disk / ~94 KB
115
+ // gzipped, fetched on first open and never part of the JS bundle.
116
+ //
117
+ // These two literals are the same values the copy script spells out, and
118
+ // nothing but apps/web/src/components/ui/emoji-picker-data.test.ts ties them
119
+ // together: a build script cannot import a client component's constants.
120
+ // `locale` is written out rather than left to frimousse's `en` default so
121
+ // the coupling is visible at the place someone would change it.
122
+ emojibaseUrl: emojibaseUrl, locale: "en", className: cn('isolate flex h-[368px] w-full flex-col', className), children: [_jsx("div", { className: "p-1", children: _jsxs(InputGroupSearch, { children: [_jsx(InputGroupSearchIcon, { children: _jsx(MagnifyingGlassIcon, {}) }), _jsx(Frimousse.Search, { "aria-label": "Search emoji", placeholder: "Search emoji", className: cn('border-border bg-popover text-foreground placeholder:text-muted-foreground/60', 'h-9 w-full rounded-md border pr-3 pl-9 text-sm font-medium transition-[color] outline-none', 'focus:border-kortix-blue focus:border focus:outline-none',
123
+ // frimousse hardcodes type="search". Tailwind's preflight resets
124
+ // ::-webkit-search-decoration but not ::-webkit-search-cancel-button,
125
+ // so without this WebKit paints its native clear X inside the field.
126
+ // Same reset input.tsx already carries for type="search".
127
+ '[&::-webkit-search-cancel-button]:appearance-none') })] }) }), _jsxs(Frimousse.Viewport, { className: "relative flex-1 overflow-y-auto outline-none", children: [_jsx(Frimousse.Loading, { className: "text-muted-foreground absolute inset-0 flex items-center justify-center", children: _jsx(Loading, {}) }), _jsx(Frimousse.Empty, { className: "text-muted-foreground absolute inset-0 flex items-center justify-center px-6 text-center text-sm text-balance", children: ({ search }) => _jsxs(_Fragment, { children: ["No emoji for \u201C", search, "\u201D"] }) }), _jsx(Frimousse.List, { "aria-label": "Emoji", className: "pb-1.5 select-none", components: {
128
+ // In each of these, `className` comes AFTER `{...props}` and merges
129
+ // `props.className`. All three prop types extend ComponentProps, so
130
+ // className is in the type; frimousse does not pass one today, but
131
+ // if it ever did, a className before the spread would be replaced
132
+ // outright and the whole tint system would go dead silently.
133
+ CategoryHeader: ({ category, ...props }) => (_jsx("div", { ...props, className: cn('bg-popover text-muted-foreground px-2 pt-3 pb-1.5 text-xs font-medium', props.className), children: category.label })),
134
+ Row: ({ children, ...props }) => (_jsx("div", { ...props, "data-row": rowParity(props), className: cn('group/row flex px-1.5', props.className), children: children })),
135
+ Emoji: ({ emoji, ...props }) => (_jsx("button", { type: "button", ...props, className: cn(EMOJI_BUTTON, props.className), children: emoji.emoji })),
136
+ } })] }), _jsxs("div", { className: "border-border/60 flex h-11 items-center gap-2 border-t px-2", children: [_jsx(Frimousse.ActiveEmoji, { children: ({ emoji }) => emoji ? (_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx("span", { className: "text-lg leading-none", children: emoji.emoji }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: emoji.label })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: "Pick an emoji" })) }), _jsx(Hint, { label: "Change skin tone", side: "top", children: _jsx(Frimousse.SkinToneSelector, { className: "hover:bg-muted ml-auto flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-md text-base transition-[background-color,scale] duration-100 active:scale-[0.96]" }) })] })] }));
137
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The tint a project's emoji wears.
3
+ *
4
+ * In the picker (emoji-picker.tsx) a cell takes a pale fill and a stronger 1px
5
+ * inset ring while it is hovered or keyboard-active. That treatment is what a
6
+ * project's icon now wears AT REST everywhere it appears: the card tile in
7
+ * /projects, the switcher row in the sidebar, and the picker's own trigger
8
+ * button in the create/edit modals.
9
+ *
10
+ * WHERE THE HUE COMES FROM. The picker rotates its six hues by GRID POSITION —
11
+ * a cell's tint is a function of (column mod 6, row parity). A card tile and a
12
+ * trigger button have no position, so that source does not exist here. The hue
13
+ * is derived from the EMOJI instead, which also buys the property the feature
14
+ * needs: the same project shows the same colour on every surface, with no state
15
+ * to thread and nothing to store. 🌿 is green wherever it renders.
16
+ *
17
+ * TWO TIERS, deliberately lopsided:
18
+ *
19
+ * 1. An anchor table of ~106 emoji, below. It is not an attempt at coverage —
20
+ * it is the set where a MISMATCH would read as a mistake, i.e. glyphs
21
+ * dominated by one hue in every major vendor font (Apple, Noto, Segoe,
22
+ * Twemoji). A blue ring on 🔥 looks broken; a blue ring on 📝 is just a
23
+ * colour. Most emoji are the second kind, which is why the table stays this
24
+ * small and why growing it is rarely the right fix.
25
+ *
26
+ * 2. A hash for everything else. Deterministic, so a project's colour survives
27
+ * a reload and matches across surfaces, and spread across all six hues so
28
+ * the grid does not settle on one.
29
+ *
30
+ * teal is thin on purpose. Almost no emoji is unambiguously teal across
31
+ * vendors, so rather than force marginal glyphs into it the table leaves teal
32
+ * almost entirely to the hash, which keeps it in rotation.
33
+ */
34
+ export declare const EMOJI_HUES: readonly ["red", "amber", "green", "teal", "blue", "violet"];
35
+ export type EmojiHue = (typeof EMOJI_HUES)[number];
36
+ /** The hue an emoji wears — anchored if it is loud, hashed if it is not. */
37
+ export declare function emojiHue(emoji: string): EmojiHue;
38
+ /** The picker's active-cell treatment, at rest: fill + 1px inset ring. */
39
+ export declare function emojiTint(emoji: string): string;
40
+ /** Holds `emojiTint`'s fill through a host variant's own hover background. */
41
+ export declare function emojiTintHover(emoji: string): string;