@adea-ai/ui 0.61.0 → 0.62.0

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 (334) hide show
  1. package/README.md +44 -6
  2. package/dist/LICENSE +201 -0
  3. package/dist/NOTICE +50 -0
  4. package/dist/components/composites/account-menu/index.js +2 -0
  5. package/dist/components/composites/list-row/index.js +2 -0
  6. package/dist/components/composites/settings/index.js +2 -0
  7. package/dist/components/composites/stat/index.js +2 -0
  8. package/dist/components/composites/update-dialog/index.js +2 -0
  9. package/dist/components/composites/workspace-mark/index.js +2 -0
  10. package/dist/components/conversation/index.js +6 -0
  11. package/dist/components/layout/app-shell/index.js +2 -0
  12. package/dist/components/layout/page/index.js +2 -0
  13. package/dist/components/layout/panel/index.js +2 -0
  14. package/dist/components/layout/side-rail/index.js +3 -0
  15. package/dist/components/layout/sidebar-nav/index.js +2 -0
  16. package/dist/components/layout/status-bar/index.js +2 -0
  17. package/dist/components/layout/top-bar/index.js +2 -0
  18. package/dist/components/motion/index.js +2 -2
  19. package/dist/components/theme/index.js +5 -0
  20. package/dist/components/ui/accordion/index.js +2 -0
  21. package/dist/components/ui/alert/index.js +2 -0
  22. package/dist/components/ui/alert-dialog/index.js +2 -0
  23. package/dist/components/ui/aspect-ratio/index.js +2 -0
  24. package/dist/components/ui/avatar/index.js +2 -0
  25. package/dist/components/ui/badge/index.js +2 -0
  26. package/dist/components/ui/board/index.js +2 -0
  27. package/dist/components/ui/breadcrumb/index.js +2 -0
  28. package/dist/components/ui/button/index.js +2 -0
  29. package/dist/components/ui/button-group/index.js +2 -0
  30. package/dist/components/ui/calendar/index.js +2 -0
  31. package/dist/components/ui/card/index.js +2 -0
  32. package/dist/components/ui/carousel/index.js +2 -0
  33. package/dist/components/ui/chart/index.js +2 -0
  34. package/dist/components/ui/checkbox/index.js +2 -0
  35. package/dist/components/ui/code-block/index.js +2 -0
  36. package/dist/components/ui/collapsible/index.js +2 -0
  37. package/dist/components/ui/combobox/index.js +2 -0
  38. package/dist/components/ui/command/index.js +2 -0
  39. package/dist/components/ui/context-menu/index.js +2 -0
  40. package/dist/components/ui/detail-panel/index.js +2 -0
  41. package/dist/components/ui/dialog/index.js +2 -0
  42. package/dist/components/ui/diff-block/index.js +2 -0
  43. package/dist/components/ui/drawer/index.js +2 -0
  44. package/dist/components/ui/dropdown-menu/index.js +2 -0
  45. package/dist/components/ui/empty/index.js +2 -0
  46. package/dist/components/ui/entity-icon/index.js +2 -0
  47. package/dist/components/ui/field/index.js +2 -0
  48. package/dist/components/ui/hover-card/index.js +2 -0
  49. package/dist/components/ui/input/index.js +2 -0
  50. package/dist/components/ui/input-group/index.js +2 -0
  51. package/dist/components/ui/input-otp/index.js +2 -0
  52. package/dist/components/ui/item/index.js +2 -0
  53. package/dist/components/ui/kbd/index.js +2 -0
  54. package/dist/components/ui/label/index.js +2 -0
  55. package/dist/components/ui/menubar/index.js +2 -0
  56. package/dist/components/ui/modal-dialog/index.js +2 -0
  57. package/dist/components/ui/navigation-menu/index.js +2 -0
  58. package/dist/components/ui/pagination/index.js +2 -0
  59. package/dist/components/ui/popover/index.js +2 -0
  60. package/dist/components/ui/progress/index.js +2 -0
  61. package/dist/components/ui/radio-group/index.js +2 -0
  62. package/dist/components/ui/resizable/index.js +2 -0
  63. package/dist/components/ui/scroll-area/index.js +2 -0
  64. package/dist/components/ui/select/index.js +2 -0
  65. package/dist/components/ui/separator/index.js +2 -0
  66. package/dist/components/ui/sheet/index.js +2 -0
  67. package/dist/components/ui/skeleton/index.js +2 -0
  68. package/dist/components/ui/slider/index.js +2 -0
  69. package/dist/components/ui/spinner/index.js +2 -0
  70. package/dist/components/ui/status-chip/index.js +2 -0
  71. package/dist/components/ui/switch/index.js +2 -0
  72. package/dist/components/ui/table/index.js +2 -0
  73. package/dist/components/ui/tabs/index.js +2 -0
  74. package/dist/components/ui/textarea/index.js +2 -0
  75. package/dist/components/ui/toast/index.js +2 -0
  76. package/dist/components/ui/toggle/index.js +2 -0
  77. package/dist/components/ui/toggle-group/index.js +2 -0
  78. package/dist/components/ui/tooltip/index.js +2 -0
  79. package/dist/index.d.ts +2 -4
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +1 -3
  82. package/dist/r/accordion.json +3 -1
  83. package/dist/r/account-menu.json +2 -1
  84. package/dist/r/alert-dialog.json +3 -1
  85. package/dist/r/alert.json +3 -1
  86. package/dist/r/app-shell.json +3 -1
  87. package/dist/r/aspect-ratio.json +3 -1
  88. package/dist/r/avatar.json +3 -1
  89. package/dist/r/badge.json +3 -1
  90. package/dist/r/board.json +3 -1
  91. package/dist/r/breadcrumb.json +3 -1
  92. package/dist/r/button-group.json +2 -1
  93. package/dist/r/button.json +3 -1
  94. package/dist/r/calendar.json +2 -1
  95. package/dist/r/card.json +3 -1
  96. package/dist/r/carousel.json +2 -1
  97. package/dist/r/chart.json +3 -1
  98. package/dist/r/checkbox.json +3 -1
  99. package/dist/r/code-block.json +2 -1
  100. package/dist/r/collapsible.json +3 -1
  101. package/dist/r/combobox.json +3 -1
  102. package/dist/r/command.json +3 -1
  103. package/dist/r/context-menu.json +3 -1
  104. package/dist/r/conversation.json +2 -1
  105. package/dist/r/detail-panel.json +2 -1
  106. package/dist/r/dialog.json +3 -1
  107. package/dist/r/diff-block.json +3 -1
  108. package/dist/r/drawer.json +3 -1
  109. package/dist/r/dropdown-menu.json +3 -1
  110. package/dist/r/empty.json +3 -1
  111. package/dist/r/entity-icon.json +3 -1
  112. package/dist/r/field.json +3 -1
  113. package/dist/r/hover-card.json +3 -1
  114. package/dist/r/input-group.json +3 -1
  115. package/dist/r/input-otp.json +3 -1
  116. package/dist/r/input.json +3 -1
  117. package/dist/r/item.json +3 -1
  118. package/dist/r/kbd.json +3 -1
  119. package/dist/r/label.json +3 -1
  120. package/dist/r/lib.json +50 -0
  121. package/dist/r/list-row.json +3 -1
  122. package/dist/r/menubar.json +3 -1
  123. package/dist/r/modal-dialog.json +2 -1
  124. package/dist/r/motion.json +22 -0
  125. package/dist/r/navigation-menu.json +3 -1
  126. package/dist/r/page.json +3 -1
  127. package/dist/r/pagination.json +3 -1
  128. package/dist/r/panel.json +3 -1
  129. package/dist/r/popover.json +3 -1
  130. package/dist/r/progress.json +3 -1
  131. package/dist/r/radio-group.json +3 -1
  132. package/dist/r/registry.json +320 -73
  133. package/dist/r/resizable.json +3 -1
  134. package/dist/r/scroll-area.json +3 -1
  135. package/dist/r/select.json +3 -1
  136. package/dist/r/separator.json +3 -1
  137. package/dist/r/settings.json +3 -1
  138. package/dist/r/sheet.json +2 -1
  139. package/dist/r/side-rail.json +3 -1
  140. package/dist/r/sidebar-nav.json +3 -1
  141. package/dist/r/skeleton.json +3 -1
  142. package/dist/r/slider.json +3 -1
  143. package/dist/r/spinner.json +3 -1
  144. package/dist/r/src/components/composites/account-menu/account-menu.tsx +150 -0
  145. package/dist/r/src/components/composites/account-menu/index.ts +1 -0
  146. package/dist/r/src/components/composites/list-row/index.ts +1 -0
  147. package/dist/r/src/components/composites/list-row/list-row.tsx +116 -0
  148. package/dist/r/src/components/composites/settings/index.ts +1 -0
  149. package/dist/r/src/components/composites/settings/settings.tsx +142 -0
  150. package/dist/r/src/components/composites/stat/index.ts +9 -0
  151. package/dist/r/src/components/composites/stat/stat.tsx +155 -0
  152. package/dist/r/src/components/composites/update-dialog/index.ts +7 -0
  153. package/dist/r/src/components/composites/update-dialog/update-dialog.tsx +529 -0
  154. package/dist/r/src/components/composites/workspace-mark/index.ts +1 -0
  155. package/dist/r/src/components/composites/workspace-mark/workspace-mark.tsx +72 -0
  156. package/dist/r/src/components/conversation/conversation-avatar.tsx +60 -0
  157. package/dist/r/src/components/conversation/conversation-surface.tsx +107 -0
  158. package/dist/r/src/components/conversation/index.ts +25 -0
  159. package/dist/r/src/components/conversation/message-composer.tsx +239 -0
  160. package/dist/r/src/components/conversation/message-row.tsx +387 -0
  161. package/dist/r/src/components/conversation/thread-panel.tsx +141 -0
  162. package/dist/r/src/components/layout/app-shell/app-shell.tsx +92 -0
  163. package/dist/r/src/components/layout/app-shell/index.ts +1 -0
  164. package/dist/r/src/components/layout/page/index.ts +9 -0
  165. package/dist/r/src/components/layout/page/page.tsx +122 -0
  166. package/dist/r/src/components/layout/panel/index.ts +12 -0
  167. package/dist/r/src/components/layout/panel/panel.tsx +166 -0
  168. package/dist/r/src/components/layout/side-rail/index.ts +12 -0
  169. package/dist/r/src/components/layout/side-rail/side-rail-context.ts +42 -0
  170. package/dist/r/src/components/layout/side-rail/side-rail.tsx +405 -0
  171. package/dist/r/src/components/layout/sidebar-nav/index.ts +14 -0
  172. package/dist/r/src/components/layout/sidebar-nav/sidebar-nav.tsx +244 -0
  173. package/dist/r/src/components/layout/status-bar/index.ts +1 -0
  174. package/dist/r/src/components/layout/status-bar/status-bar.tsx +73 -0
  175. package/dist/r/src/components/layout/top-bar/index.ts +10 -0
  176. package/dist/r/src/components/layout/top-bar/top-bar.tsx +166 -0
  177. package/dist/r/src/components/motion/index.ts +2 -0
  178. package/dist/r/src/components/motion/presence.tsx +32 -0
  179. package/dist/r/src/components/theme/appearance-panel.tsx +179 -0
  180. package/dist/r/src/components/theme/index.ts +22 -0
  181. package/dist/r/src/components/theme/theme-picker.tsx +174 -0
  182. package/dist/r/src/components/theme/theme-provider.tsx +309 -0
  183. package/dist/r/src/components/theme/theme-toggle.tsx +64 -0
  184. package/dist/r/src/components/ui/accordion/accordion.tsx +66 -0
  185. package/dist/r/src/components/ui/accordion/index.ts +1 -0
  186. package/dist/r/src/components/ui/alert/alert.tsx +95 -0
  187. package/dist/r/src/components/ui/alert/index.ts +1 -0
  188. package/dist/r/src/components/ui/alert-dialog/alert-dialog.tsx +176 -0
  189. package/dist/r/src/components/ui/alert-dialog/index.ts +13 -0
  190. package/dist/r/src/components/ui/aspect-ratio/aspect-ratio.tsx +38 -0
  191. package/dist/r/src/components/ui/aspect-ratio/index.ts +1 -0
  192. package/dist/r/src/components/ui/avatar/avatar.tsx +114 -0
  193. package/dist/r/src/components/ui/avatar/index.ts +9 -0
  194. package/dist/r/src/components/ui/badge/badge.tsx +59 -0
  195. package/dist/r/src/components/ui/badge/index.ts +1 -0
  196. package/dist/r/src/components/ui/board/board.tsx +254 -0
  197. package/dist/r/src/components/ui/board/index.ts +10 -0
  198. package/dist/r/src/components/ui/breadcrumb/breadcrumb.tsx +117 -0
  199. package/dist/r/src/components/ui/breadcrumb/index.ts +9 -0
  200. package/dist/r/src/components/ui/button/button.tsx +89 -0
  201. package/dist/r/src/components/ui/button/index.ts +1 -0
  202. package/dist/r/src/components/ui/button-group/button-group.tsx +92 -0
  203. package/dist/r/src/components/ui/button-group/index.ts +6 -0
  204. package/dist/r/src/components/ui/calendar/calendar.tsx +277 -0
  205. package/dist/r/src/components/ui/calendar/index.ts +1 -0
  206. package/dist/r/src/components/ui/card/card.tsx +82 -0
  207. package/dist/r/src/components/ui/card/index.ts +10 -0
  208. package/dist/r/src/components/ui/carousel/carousel.tsx +209 -0
  209. package/dist/r/src/components/ui/carousel/index.ts +1 -0
  210. package/dist/r/src/components/ui/chart/chart.tsx +413 -0
  211. package/dist/r/src/components/ui/chart/index.ts +17 -0
  212. package/dist/r/src/components/ui/checkbox/checkbox.tsx +99 -0
  213. package/dist/r/src/components/ui/checkbox/index.ts +1 -0
  214. package/dist/r/src/components/ui/code-block/code-block.tsx +238 -0
  215. package/dist/r/src/components/ui/code-block/index.ts +1 -0
  216. package/dist/r/src/components/ui/collapsible/collapsible.tsx +54 -0
  217. package/dist/r/src/components/ui/collapsible/index.ts +1 -0
  218. package/dist/r/src/components/ui/combobox/combobox.tsx +142 -0
  219. package/dist/r/src/components/ui/combobox/index.ts +10 -0
  220. package/dist/r/src/components/ui/command/command.tsx +214 -0
  221. package/dist/r/src/components/ui/command/index.ts +12 -0
  222. package/dist/r/src/components/ui/context-menu/context-menu.tsx +163 -0
  223. package/dist/r/src/components/ui/context-menu/index.ts +15 -0
  224. package/dist/r/src/components/ui/detail-panel/detail-panel.tsx +161 -0
  225. package/dist/r/src/components/ui/detail-panel/index.ts +9 -0
  226. package/dist/r/src/components/ui/dialog/dialog.tsx +138 -0
  227. package/dist/r/src/components/ui/dialog/index.ts +14 -0
  228. package/dist/r/src/components/ui/diff-block/diff-block.tsx +286 -0
  229. package/dist/r/src/components/ui/diff-block/index.ts +11 -0
  230. package/dist/r/src/components/ui/drawer/drawer.tsx +144 -0
  231. package/dist/r/src/components/ui/drawer/index.ts +13 -0
  232. package/dist/r/src/components/ui/dropdown-menu/dropdown-menu.tsx +203 -0
  233. package/dist/r/src/components/ui/dropdown-menu/index.ts +18 -0
  234. package/dist/r/src/components/ui/empty/empty.tsx +104 -0
  235. package/dist/r/src/components/ui/empty/index.ts +10 -0
  236. package/dist/r/src/components/ui/entity-icon/entity-icon.tsx +154 -0
  237. package/dist/r/src/components/ui/entity-icon/index.ts +1 -0
  238. package/dist/r/src/components/ui/field/field.tsx +131 -0
  239. package/dist/r/src/components/ui/field/index.ts +11 -0
  240. package/dist/r/src/components/ui/hover-card/hover-card.tsx +48 -0
  241. package/dist/r/src/components/ui/hover-card/index.ts +1 -0
  242. package/dist/r/src/components/ui/input/index.ts +1 -0
  243. package/dist/r/src/components/ui/input/input.tsx +41 -0
  244. package/dist/r/src/components/ui/input-group/index.ts +8 -0
  245. package/dist/r/src/components/ui/input-group/input-group.tsx +111 -0
  246. package/dist/r/src/components/ui/input-otp/index.ts +1 -0
  247. package/dist/r/src/components/ui/input-otp/input-otp.tsx +108 -0
  248. package/dist/r/src/components/ui/item/index.ts +10 -0
  249. package/dist/r/src/components/ui/item/item.tsx +146 -0
  250. package/dist/r/src/components/ui/kbd/index.ts +1 -0
  251. package/dist/r/src/components/ui/kbd/kbd.tsx +42 -0
  252. package/dist/r/src/components/ui/label/index.ts +1 -0
  253. package/dist/r/src/components/ui/label/label.tsx +36 -0
  254. package/dist/r/src/components/ui/menubar/index.ts +16 -0
  255. package/dist/r/src/components/ui/menubar/menubar.tsx +190 -0
  256. package/dist/r/src/components/ui/modal-dialog/index.ts +1 -0
  257. package/dist/r/src/components/ui/modal-dialog/modal-dialog.tsx +95 -0
  258. package/dist/r/src/components/ui/navigation-menu/index.ts +13 -0
  259. package/dist/r/src/components/ui/navigation-menu/navigation-menu.tsx +229 -0
  260. package/dist/r/src/components/ui/pagination/index.ts +8 -0
  261. package/dist/r/src/components/ui/pagination/pagination.tsx +144 -0
  262. package/dist/r/src/components/ui/popover/index.ts +10 -0
  263. package/dist/r/src/components/ui/popover/popover.tsx +81 -0
  264. package/dist/r/src/components/ui/progress/index.ts +1 -0
  265. package/dist/r/src/components/ui/progress/progress.tsx +67 -0
  266. package/dist/r/src/components/ui/radio-group/index.ts +1 -0
  267. package/dist/r/src/components/ui/radio-group/radio-group.tsx +78 -0
  268. package/dist/r/src/components/ui/resizable/index.ts +6 -0
  269. package/dist/r/src/components/ui/resizable/resizable.tsx +74 -0
  270. package/dist/r/src/components/ui/scroll-area/index.ts +1 -0
  271. package/dist/r/src/components/ui/scroll-area/scroll-area.tsx +66 -0
  272. package/dist/r/src/components/ui/select/index.ts +11 -0
  273. package/dist/r/src/components/ui/select/select.tsx +188 -0
  274. package/dist/r/src/components/ui/separator/index.ts +1 -0
  275. package/dist/r/src/components/ui/separator/separator.tsx +40 -0
  276. package/dist/r/src/components/ui/sheet/index.ts +13 -0
  277. package/dist/r/src/components/ui/sheet/sheet.tsx +132 -0
  278. package/dist/r/src/components/ui/skeleton/index.ts +1 -0
  279. package/dist/r/src/components/ui/skeleton/skeleton.tsx +28 -0
  280. package/dist/r/src/components/ui/slider/index.ts +1 -0
  281. package/dist/r/src/components/ui/slider/slider.tsx +81 -0
  282. package/dist/r/src/components/ui/spinner/index.ts +1 -0
  283. package/dist/r/src/components/ui/spinner/spinner.tsx +58 -0
  284. package/dist/r/src/components/ui/status-chip/index.ts +8 -0
  285. package/dist/r/src/components/ui/status-chip/status-chip.tsx +142 -0
  286. package/dist/r/src/components/ui/switch/index.ts +1 -0
  287. package/dist/r/src/components/ui/switch/switch.tsx +100 -0
  288. package/dist/r/src/components/ui/table/index.ts +11 -0
  289. package/dist/r/src/components/ui/table/table.tsx +125 -0
  290. package/dist/r/src/components/ui/tabs/index.ts +8 -0
  291. package/dist/r/src/components/ui/tabs/tabs.tsx +77 -0
  292. package/dist/r/src/components/ui/textarea/index.ts +1 -0
  293. package/dist/r/src/components/ui/textarea/textarea.tsx +36 -0
  294. package/dist/r/src/components/ui/toast/index.ts +1 -0
  295. package/dist/r/src/components/ui/toast/toast.tsx +220 -0
  296. package/dist/r/src/components/ui/toggle/index.ts +1 -0
  297. package/dist/r/src/components/ui/toggle/toggle.tsx +60 -0
  298. package/dist/r/src/components/ui/toggle-group/index.ts +6 -0
  299. package/dist/r/src/components/ui/toggle-group/toggle-group.tsx +66 -0
  300. package/dist/r/src/components/ui/tooltip/index.ts +9 -0
  301. package/dist/r/src/components/ui/tooltip/tooltip.tsx +102 -0
  302. package/dist/r/src/lib/keyed-rows.ts +68 -0
  303. package/dist/r/src/lib/overlay.ts +70 -0
  304. package/dist/r/src/lib/themes.ts +490 -0
  305. package/dist/r/src/lib/tokens.ts +688 -0
  306. package/dist/r/src/lib/utils.ts +76 -0
  307. package/dist/r/src/lib/variants.ts +62 -0
  308. package/dist/r/src/lib/version-notes.ts +65 -0
  309. package/dist/r/src/styles/base.css +644 -0
  310. package/dist/r/src/styles/fonts.css +26 -0
  311. package/dist/r/src/styles/globals.css +18 -0
  312. package/dist/r/src/styles/theme.css +864 -0
  313. package/dist/r/stat.json +3 -1
  314. package/dist/r/status-bar.json +3 -1
  315. package/dist/r/status-chip.json +2 -1
  316. package/dist/r/switch.json +3 -1
  317. package/dist/r/table.json +3 -1
  318. package/dist/r/tabs.json +3 -1
  319. package/dist/r/textarea.json +3 -1
  320. package/dist/r/theming.json +42 -0
  321. package/dist/r/toast.json +3 -1
  322. package/dist/r/toggle-group.json +2 -1
  323. package/dist/r/toggle.json +3 -1
  324. package/dist/r/tooltip.json +3 -1
  325. package/dist/r/top-bar.json +3 -1
  326. package/dist/r/update-dialog.json +2 -1
  327. package/dist/r/workspace-mark.json +2 -1
  328. package/package.json +10 -9
  329. package/registry.json +320 -73
  330. package/src/index.ts +2 -4
  331. package/dist/components/ui/diff-block/diff-block.test.d.ts +0 -2
  332. package/dist/components/ui/diff-block/diff-block.test.d.ts.map +0 -1
  333. package/dist/lib/keyed-rows.test.d.ts +0 -2
  334. package/dist/lib/keyed-rows.test.d.ts.map +0 -1
@@ -0,0 +1,102 @@
1
+ import { Tooltip as KobalteTooltip } from '@kobalte/core/tooltip'
2
+ import type { ComponentProps } from 'solid-js'
3
+ import { createContext, splitProps, useContext } from 'solid-js'
4
+ import { cn } from '../../../lib/utils'
5
+
6
+ /**
7
+ * The provider sets the *timing* defaults for every tooltip below it.
8
+ *
9
+ * Timing is the part of a tooltip that has to agree across an app: one that
10
+ * opens in 200ms in a toolbar and 700ms in a sidebar reads as a bug. The
11
+ * provider is where that agreement lives. It is optional — a tooltip outside a
12
+ * provider falls back to the same defaults — so a consumer can drop it in
13
+ * without restructuring anything.
14
+ */
15
+ type TooltipTiming = {
16
+ openDelay: number
17
+ closeDelay: number
18
+ skipDelayDuration: number
19
+ }
20
+
21
+ const tooltipDefaults: TooltipTiming = {
22
+ /** Long enough that a pointer crossing a toolbar does not strobe tooltips. */
23
+ openDelay: 400,
24
+ /** Short, because the pointer has already left the control. */
25
+ closeDelay: 80,
26
+ /**
27
+ * After a tooltip has been seen, the next one opens immediately for this
28
+ * long. This is what makes moving along a row of icons feel like one
29
+ * gesture instead of four separate waits.
30
+ */
31
+ skipDelayDuration: 500,
32
+ }
33
+
34
+ const TooltipTimingContext = createContext<TooltipTiming>(tooltipDefaults)
35
+
36
+ export type TooltipProviderProps = {
37
+ children?: ComponentProps<'div'>['children']
38
+ openDelay?: number
39
+ closeDelay?: number
40
+ skipDelayDuration?: number
41
+ }
42
+
43
+ export function TooltipProvider(props: TooltipProviderProps) {
44
+ return (
45
+ <TooltipTimingContext.Provider
46
+ value={{
47
+ openDelay: props.openDelay ?? tooltipDefaults.openDelay,
48
+ closeDelay: props.closeDelay ?? tooltipDefaults.closeDelay,
49
+ skipDelayDuration: props.skipDelayDuration ?? tooltipDefaults.skipDelayDuration,
50
+ }}
51
+ >
52
+ {props.children}
53
+ </TooltipTimingContext.Provider>
54
+ )
55
+ }
56
+
57
+ export type TooltipRootProps = ComponentProps<typeof KobalteTooltip>
58
+
59
+ export function Tooltip(props: TooltipRootProps) {
60
+ const timing = useContext(TooltipTimingContext)
61
+
62
+ return (
63
+ <KobalteTooltip
64
+ openDelay={props.openDelay ?? timing.openDelay}
65
+ closeDelay={props.closeDelay ?? timing.closeDelay}
66
+ skipDelayDuration={props.skipDelayDuration ?? timing.skipDelayDuration}
67
+ {...props}
68
+ />
69
+ )
70
+ }
71
+
72
+ export function TooltipTrigger(props: ComponentProps<typeof KobalteTooltip.Trigger>) {
73
+ return <KobalteTooltip.Trigger {...props} />
74
+ }
75
+
76
+ export type TooltipContentProps = ComponentProps<typeof KobalteTooltip.Content> & {
77
+ /** Hide the caret pointing at the trigger. */
78
+ hideArrow?: boolean
79
+ }
80
+
81
+ export function TooltipContent(props: TooltipContentProps) {
82
+ const [local, rest] = splitProps(props, ['class', 'hideArrow', 'children'])
83
+
84
+ return (
85
+ <KobalteTooltip.Portal>
86
+ <KobalteTooltip.Content
87
+ class={cn(
88
+ 'bg-scrim text-scrim-foreground z-(--z-tooltip) w-fit max-w-64 rounded-md px-2 py-1 text-xs',
89
+ 'origin-(--kb-tooltip-content-transform-origin) text-balance',
90
+ 'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95',
91
+ 'data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',
92
+ 'data-expanded:duration-150 data-closed:duration-100',
93
+ local.class
94
+ )}
95
+ {...rest}
96
+ >
97
+ {local.children}
98
+ <KobalteTooltip.Arrow aria-hidden="true" />
99
+ </KobalteTooltip.Content>
100
+ </KobalteTooltip.Portal>
101
+ )
102
+ }
@@ -0,0 +1,68 @@
1
+ import { createMemo, createSignal, type Accessor } from 'solid-js'
2
+
3
+ /**
4
+ * A stable list entry for `<For>`. The wrapper object never changes identity
5
+ * once the key exists, so the control flow keeps the row's DOM; the row's
6
+ * bindings update through `entry.item()` instead of remounting.
7
+ */
8
+ export type KeyedRow<T> = Readonly<{ item: Accessor<T> }>
9
+
10
+ /**
11
+ * Maps a reactive list to stable, key-indexed rows.
12
+ *
13
+ * Server-backed lists — query results, and projections over them — produce fresh
14
+ * object identities on every fetch. Feeding them straight into `<For>` remounts
15
+ * every row on each refetch: open menus close, focus and hover state drop, and
16
+ * the whole subtree's DOM is rebuilt. On a list that refetches on a poll or a
17
+ * websocket tick, that is a visible flicker and a measurable cost.
18
+ *
19
+ * Keying on a stable id keeps each row's DOM alive across refetches and pushes
20
+ * the update through that row's own accessor, so only the bindings whose values
21
+ * actually changed touch the DOM. Removed keys drop their rows; reordered keys
22
+ * keep their rows and move the DOM nodes. Keys must be unique within the list —
23
+ * a duplicate reuses the first entry's row.
24
+ *
25
+ * `equals` decides whether a fresh item replaces the row's stored value. The
26
+ * default treats every new object as a change, which is correct for a projection
27
+ * whose fields are all rendered. Pass a field-level comparator — a version
28
+ * stamp, a revision number — to skip redundant downstream updates entirely.
29
+ *
30
+ * ```tsx
31
+ * const rows = keyedRows(() => tasks(), (task) => task.id, (a, b) => a.version === b.version)
32
+ * return <For each={rows()}>{(row) => <TaskCard task={row.item} />}</For>
33
+ * ```
34
+ */
35
+ export function keyedRows<T, K>(
36
+ list: () => readonly T[],
37
+ key: (item: T) => K,
38
+ equals: false | ((previous: T, next: T) => boolean) = false
39
+ ): Accessor<readonly KeyedRow<T>[]> {
40
+ type Entry = { row: KeyedRow<T>; set(item: T): void }
41
+ let entries = new Map<K, Entry>()
42
+ return createMemo<readonly KeyedRow<T>[]>(() => {
43
+ const items = list()
44
+ const next = new Map<K, Entry>()
45
+ const rows = items.map((item) => {
46
+ const itemKey = key(item)
47
+ let entry = next.get(itemKey) ?? entries.get(itemKey)
48
+ if (!entry) {
49
+ // The tuple wrapper keeps the item out of createSignal's
50
+ // `Exclude<T, Function>` overload, which unconstrained generics cannot
51
+ // satisfy, while giving the custom equality a stable shape to compare.
52
+ const [holder, setHolder] = createSignal<readonly [T]>([item], {
53
+ equals:
54
+ equals === false
55
+ ? false
56
+ : (previousHolder, nextHolder) => equals(previousHolder[0], nextHolder[0]),
57
+ })
58
+ entry = { row: { item: () => holder()[0] }, set: (nextItem) => setHolder([nextItem]) }
59
+ } else if (!next.has(itemKey)) {
60
+ entry.set(item)
61
+ }
62
+ next.set(itemKey, entry)
63
+ return entry.row
64
+ })
65
+ entries = next
66
+ return rows
67
+ })
68
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared strings for the overlay layer: dialogs, sheets, menus, popovers,
3
+ * tooltips and the command palette.
4
+ *
5
+ * These live here rather than in each component because the overlay family is
6
+ * where consistency is most visible and least likely to survive duplication.
7
+ * A dialog, a sheet and a dropdown that disagree about their border, radius,
8
+ * motion or shadow read as three different apps — and an app that adopts this
9
+ * library would inherit all three. Declaring the surface once is what makes
10
+ * "an overlay looks like this" a fact rather than a convention.
11
+ */
12
+
13
+ /** The panel itself: fill, hairline edge, radius, elevation. */
14
+ export const overlaySurface =
15
+ 'bg-popover text-popover-foreground rounded-xl border border-border shadow-lg'
16
+
17
+ /** The span of the portal wrapper that centres a dialog-like overlay. */
18
+ export const overlayPositioner = 'fixed inset-0 z-(--z-dialog) grid place-items-center p-4'
19
+
20
+ /** The dimming layer behind a modal overlay. */
21
+ export const overlayScrim =
22
+ 'fixed inset-0 z-(--z-dialog) bg-scrim/50 supports-[backdrop-filter]:backdrop-blur-xs'
23
+
24
+ /**
25
+ * Entrance and exit motion, expressed as data-state classes.
26
+ *
27
+ * `data-expanded` / `data-closed` are Kobalte's; `data-side-*` come from its
28
+ * popper positioning and let a menu slide in from the edge it is anchored to,
29
+ * which is what makes a dropdown feel attached to its trigger rather than
30
+ * dropped on the screen. Exit motion is shorter than entry, because a
31
+ * dismissal should feel immediate while an arrival benefits from being seen.
32
+ */
33
+ export const overlayMotion = [
34
+ 'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95',
35
+ 'data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',
36
+ 'data-expanded:duration-200 data-closed:duration-150',
37
+ ].join(' ')
38
+
39
+ /** Popover-style motion: no zoom, so a panel anchored to a control does not
40
+ * appear to breathe away from it. */
41
+ export const popoverMotion = [
42
+ 'data-expanded:animate-in data-expanded:fade-in-0 data-closed:animate-out data-closed:fade-out-0',
43
+ 'data-expanded:duration-150 data-closed:duration-100',
44
+ ].join(' ')
45
+
46
+ /** The popper arrow. Sized in the component; coloured here. */
47
+ export const popoverArrow = 'fill-popover stroke-border'
48
+
49
+ /**
50
+ * A menu row: the shared height, radius, hover fill and focus treatment for
51
+ * every item inside a menu, listbox or command list.
52
+ */
53
+ export const menuItem = [
54
+ 'relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none',
55
+ 'transition-colors ease-out',
56
+ 'data-[highlighted]:bg-surface-hover data-[highlighted]:text-foreground',
57
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
58
+ '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4',
59
+ '[&_svg:not([class*=text-])]:text-muted-foreground',
60
+ ].join(' ')
61
+
62
+ /** The label above a group of menu rows. */
63
+ export const menuLabel =
64
+ 'px-2 py-1.5 text-2xs font-medium tracking-wide text-muted-foreground uppercase'
65
+
66
+ /** The rule between menu groups. */
67
+ export const menuSeparator = 'bg-border -mx-1 my-1 h-px'
68
+
69
+ /** Padding shared by every menu-list surface. */
70
+ export const menuContentPadding = 'p-1'