@opencode-ai/ui 0.0.0-dev-202609071625 → 0.0.0-dev-19270

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 (299) hide show
  1. package/dist/actions/button/button.d.ts +10 -0
  2. package/dist/actions/icon-button/icon-button.d.ts +11 -0
  3. package/dist/actions/split-button/split-button.d.ts +5 -0
  4. package/dist/components/card.d.ts +1 -1
  5. package/dist/components/list.d.ts +1 -1
  6. package/dist/components/scroll-view.d.ts +14 -4
  7. package/dist/context/i18n.d.ts +10 -7
  8. package/dist/context/marked-base.d.ts +3 -0
  9. package/dist/context/marked-parser.d.ts +1 -2
  10. package/dist/{components → data-display/accordion}/accordion.d.ts +6 -6
  11. package/dist/{v2/components/avatar-v2.d.ts → data-display/avatar/avatar.d.ts} +1 -1
  12. package/dist/data-display/badge/badge.d.ts +7 -0
  13. package/dist/{components → data-display/diff-changes}/diff-changes.d.ts +2 -1
  14. package/dist/data-display/keybind/keybind.d.ts +7 -0
  15. package/dist/{v2/components/line-comment-v2.d.ts → data-display/line-comment/line-comment.d.ts} +9 -9
  16. package/dist/{v2/components/project-avatar-v2.d.ts → data-display/project-avatar/project-avatar.d.ts} +1 -1
  17. package/dist/feedback/loader/loader.d.ts +3 -0
  18. package/dist/{components → feedback/progress-circle}/progress-circle.d.ts +2 -0
  19. package/dist/feedback/toast/toast.d.ts +57 -0
  20. package/dist/{components → forms/checkbox}/checkbox.d.ts +2 -2
  21. package/dist/{v2/components/field-v2.d.ts → forms/field/field.d.ts} +4 -10
  22. package/dist/forms/radio/radio.d.ts +16 -0
  23. package/dist/{v2/components/select-v2.d.ts → forms/select/select.d.ts} +5 -6
  24. package/dist/{components → forms/switch}/switch.d.ts +4 -2
  25. package/dist/{v2/components/text-input-v2.d.ts → forms/text-input/text-input.d.ts} +3 -3
  26. package/dist/forms/textarea/textarea.d.ts +7 -0
  27. package/dist/hooks/use-filtered-list.d.ts +9 -0
  28. package/dist/i18n/ar.d.ts +0 -2
  29. package/dist/i18n/bg.d.ts +0 -2
  30. package/dist/i18n/br.d.ts +0 -2
  31. package/dist/i18n/bs.d.ts +0 -2
  32. package/dist/i18n/da.d.ts +0 -2
  33. package/dist/i18n/de.d.ts +0 -2
  34. package/dist/i18n/en.d.ts +244 -1
  35. package/dist/i18n/es.d.ts +0 -2
  36. package/dist/i18n/fr.d.ts +0 -2
  37. package/dist/i18n/he.d.ts +197 -0
  38. package/dist/i18n/ja.d.ts +0 -2
  39. package/dist/i18n/km.d.ts +0 -2
  40. package/dist/i18n/ko.d.ts +0 -2
  41. package/dist/i18n/lo.d.ts +0 -2
  42. package/dist/i18n/mk.d.ts +0 -2
  43. package/dist/i18n/mn.d.ts +0 -2
  44. package/dist/i18n/my.d.ts +0 -2
  45. package/dist/i18n/pl.d.ts +0 -2
  46. package/dist/i18n/ru.d.ts +0 -2
  47. package/dist/i18n/sr.d.ts +0 -2
  48. package/dist/i18n/tg.d.ts +0 -2
  49. package/dist/i18n/th.d.ts +0 -2
  50. package/dist/i18n/tr.d.ts +0 -2
  51. package/dist/i18n/zh.d.ts +0 -2
  52. package/dist/i18n/zht.d.ts +0 -2
  53. package/dist/{components/icon.d.ts → icons/icon/additional-icons.d.ts} +8 -8
  54. package/dist/{v2/components → icons/icon}/icon.d.ts +60 -1
  55. package/dist/layout/divider/divider.d.ts +5 -0
  56. package/dist/navigation/menu/menu.d.ts +59 -0
  57. package/dist/{v2/components/segmented-control-v2.d.ts → navigation/segmented-control/segmented-control.d.ts} +5 -5
  58. package/dist/{components → navigation/tabs}/tabs.d.ts +15 -8
  59. package/dist/{v2/components/dialog-v2.d.ts → overlays/dialog/dialog.d.ts} +1 -2
  60. package/dist/overlays/tooltip/tooltip.d.ts +15 -0
  61. package/dist/{components → typography/text-shimmer}/text-shimmer.d.ts +1 -0
  62. package/dist/typography/wordmark/wordmark.d.ts +5 -0
  63. package/package.json +141 -35
  64. package/src/{v2/components/button-v2.css → actions/button/button.css} +30 -0
  65. package/src/{components → actions/button}/button.tsx +19 -11
  66. package/src/{v2/components/icon-button-v2.css → actions/icon-button/icon-button.css} +27 -9
  67. package/src/actions/icon-button/icon-button.tsx +32 -0
  68. package/src/{v2/components/split-button-v2.css → actions/split-button/split-button.css} +2 -6
  69. package/src/{v2/components/split-button-v2.tsx → actions/split-button/split-button.tsx} +4 -4
  70. package/src/components/animated-number.css +29 -11
  71. package/src/components/animated-number.tsx +2 -2
  72. package/src/components/card.css +2 -23
  73. package/src/components/card.tsx +4 -4
  74. package/src/components/collapsible.tsx +2 -2
  75. package/src/components/dock-surface.css +2 -9
  76. package/src/components/image-preview.tsx +3 -2
  77. package/src/components/list.css +5 -5
  78. package/src/components/list.tsx +7 -5
  79. package/src/components/popover.tsx +3 -2
  80. package/src/components/scroll-view.css +36 -4
  81. package/src/components/scroll-view.tsx +153 -88
  82. package/src/components/sticky-accordion-header.tsx +1 -1
  83. package/src/components/text-field.tsx +12 -4
  84. package/src/context/dialog.tsx +1 -0
  85. package/src/context/i18n.tsx +17 -14
  86. package/src/context/marked-base.tsx +27 -0
  87. package/src/context/marked-parser.tsx +3 -13
  88. package/src/{components → data-display/accordion}/accordion.css +7 -33
  89. package/src/{components → data-display/accordion}/accordion.tsx +14 -14
  90. package/src/{v2/components/avatar-v2.tsx → data-display/avatar/avatar.tsx} +1 -1
  91. package/src/{v2/components/badge-v2.css → data-display/badge/badge.css} +19 -0
  92. package/src/{v2/components/badge-v2.tsx → data-display/badge/badge.tsx} +6 -4
  93. package/src/{components → data-display/diff-changes}/diff-changes.css +22 -19
  94. package/src/{v2/components/diff-changes-v2.tsx → data-display/diff-changes/diff-changes.tsx} +7 -2
  95. package/src/{v2/components/keybind-v2.css → data-display/keybind/keybind.css} +1 -1
  96. package/src/{v2/components/keybind-v2.tsx → data-display/keybind/keybind.tsx} +3 -3
  97. package/src/{v2/components/line-comment-v2.css → data-display/line-comment/line-comment.css} +4 -4
  98. package/src/{v2/components/line-comment-v2.tsx → data-display/line-comment/line-comment.tsx} +17 -15
  99. package/src/{v2/components/project-avatar-v2.css → data-display/project-avatar/project-avatar.css} +4 -4
  100. package/src/{v2/components/project-avatar-v2.tsx → data-display/project-avatar/project-avatar.tsx} +1 -1
  101. package/src/{v2/components/loader-v2.tsx → feedback/loader/loader.tsx} +2 -2
  102. package/src/feedback/progress-circle/progress-circle.css +28 -0
  103. package/src/feedback/progress-circle/progress-circle.tsx +64 -0
  104. package/src/{v2/components/toast-v2.tsx → feedback/toast/toast.tsx} +60 -58
  105. package/src/{components → forms/checkbox}/checkbox.css +1 -7
  106. package/src/{components → forms/checkbox}/checkbox.tsx +13 -13
  107. package/src/{v2/components/field-v2.css → forms/field/field.css} +1 -1
  108. package/src/{v2/components/field-v2.tsx → forms/field/field.tsx} +9 -11
  109. package/src/{v2/components/radio-v2.tsx → forms/radio/radio.tsx} +30 -20
  110. package/src/{v2/components/select-v2.css → forms/select/select.css} +2 -8
  111. package/src/{v2/components/select-v2.tsx → forms/select/select.tsx} +42 -32
  112. package/src/{v2/components/switch-v2.css → forms/switch/switch.css} +110 -0
  113. package/src/forms/switch/switch.tsx +34 -0
  114. package/src/{v2/components/text-input-v2.css → forms/text-input/text-input.css} +3 -3
  115. package/src/{v2/components/text-input-v2.tsx → forms/text-input/text-input.tsx} +4 -4
  116. package/src/{v2/components/textarea-v2.tsx → forms/textarea/textarea.tsx} +3 -3
  117. package/src/hooks/create-auto-scroll.tsx +20 -0
  118. package/src/i18n/am.ts +7 -9
  119. package/src/i18n/ar.ts +7 -9
  120. package/src/i18n/az.ts +7 -9
  121. package/src/i18n/bg.ts +7 -9
  122. package/src/i18n/bn.ts +7 -9
  123. package/src/i18n/br.ts +7 -9
  124. package/src/i18n/bs.ts +7 -9
  125. package/src/i18n/ca.ts +7 -9
  126. package/src/i18n/cs.ts +7 -9
  127. package/src/i18n/da.ts +7 -9
  128. package/src/i18n/de.ts +1 -3
  129. package/src/i18n/dv.ts +7 -9
  130. package/src/i18n/dz.ts +5 -7
  131. package/src/i18n/el.ts +7 -9
  132. package/src/i18n/en.ts +61 -12
  133. package/src/i18n/es.ts +6 -8
  134. package/src/i18n/et.ts +7 -9
  135. package/src/i18n/fa.ts +7 -9
  136. package/src/i18n/fi.ts +7 -9
  137. package/src/i18n/fo.ts +7 -9
  138. package/src/i18n/fr.ts +6 -8
  139. package/src/i18n/he.ts +199 -0
  140. package/src/i18n/hi.ts +7 -9
  141. package/src/i18n/hr.ts +7 -9
  142. package/src/i18n/hu.ts +7 -9
  143. package/src/i18n/hy.ts +7 -9
  144. package/src/i18n/id.ts +7 -9
  145. package/src/i18n/is.ts +7 -9
  146. package/src/i18n/it.ts +7 -9
  147. package/src/i18n/ja.ts +7 -9
  148. package/src/i18n/ka.ts +7 -9
  149. package/src/i18n/km.ts +7 -9
  150. package/src/i18n/ko.ts +7 -9
  151. package/src/i18n/lo.ts +7 -9
  152. package/src/i18n/lt.ts +7 -9
  153. package/src/i18n/lv.ts +7 -9
  154. package/src/i18n/mk.ts +7 -9
  155. package/src/i18n/mn.ts +7 -9
  156. package/src/i18n/ms.ts +7 -9
  157. package/src/i18n/my.ts +7 -9
  158. package/src/i18n/ne.ts +7 -9
  159. package/src/i18n/nl.ts +7 -9
  160. package/src/i18n/no.ts +7 -9
  161. package/src/i18n/pa.ts +7 -9
  162. package/src/i18n/pl.ts +7 -9
  163. package/src/i18n/ro.ts +7 -9
  164. package/src/i18n/ru.ts +7 -9
  165. package/src/i18n/si.ts +7 -9
  166. package/src/i18n/sk.ts +7 -9
  167. package/src/i18n/sl.ts +7 -9
  168. package/src/i18n/sq.ts +7 -9
  169. package/src/i18n/sr.ts +7 -9
  170. package/src/i18n/sv.ts +7 -9
  171. package/src/i18n/tg.ts +7 -9
  172. package/src/i18n/th.ts +7 -9
  173. package/src/i18n/tk.ts +7 -9
  174. package/src/i18n/tr.ts +7 -9
  175. package/src/i18n/uk.ts +7 -9
  176. package/src/i18n/ur.ts +7 -9
  177. package/src/i18n/uz.ts +7 -9
  178. package/src/i18n/vi.ts +7 -9
  179. package/src/i18n/zh.ts +7 -9
  180. package/src/i18n/zht.ts +7 -9
  181. package/src/{components/icon.tsx → icons/icon/additional-icons.ts} +9 -75
  182. package/src/icons/icon/icon.css +3 -0
  183. package/src/{v2/components → icons/icon}/icon.tsx +96 -12
  184. package/src/{v2/components/divider-v2.tsx → layout/divider/divider.tsx} +3 -3
  185. package/src/{v2/components/menu-v2.css → navigation/menu/menu.css} +124 -2
  186. package/src/{v2/components/menu-v2.tsx → navigation/menu/menu.tsx} +96 -32
  187. package/src/{v2/components/segmented-control-v2.css → navigation/segmented-control/segmented-control.css} +1 -1
  188. package/src/{v2/components/segmented-control-v2.tsx → navigation/segmented-control/segmented-control.tsx} +9 -8
  189. package/src/{v2/components/tabs-v2.css → navigation/tabs/tabs-current.css} +25 -10
  190. package/src/{components → navigation/tabs}/tabs.css +53 -232
  191. package/src/navigation/tabs/tabs.tsx +194 -0
  192. package/src/{v2/components/dialog-v2.css → overlays/dialog/dialog.css} +3 -0
  193. package/src/{v2/components/dialog-v2.tsx → overlays/dialog/dialog.tsx} +11 -13
  194. package/src/{v2/components/tooltip-v2.css → overlays/tooltip/tooltip.css} +33 -0
  195. package/src/{v2/components/tooltip-v2.tsx → overlays/tooltip/tooltip.tsx} +24 -17
  196. package/src/styles/base.css +5 -0
  197. package/src/{v2/components/file-tree-v2.css → styles/file-tree.css} +64 -3
  198. package/src/styles/index.css +4 -20
  199. package/src/styles/tailwind/colors.css +2 -0
  200. package/src/styles/tailwind/index.css +18 -1
  201. package/src/styles/theme.css +2 -2
  202. package/src/{v2/styles → styles/tokens}/colors.css +8 -8
  203. package/src/{v2/styles → styles/tokens}/theme.css +23 -16
  204. package/src/theme/context.tsx +19 -11
  205. package/src/theme/themes/oc-2.json +50 -19
  206. package/src/theme/v2/default-primitives.ts +8 -8
  207. package/src/theme/v2/foreground.ts +1 -0
  208. package/src/theme/v2/mapping.ts +7 -1
  209. package/src/{components → typography/text-shimmer}/text-shimmer.css +2 -1
  210. package/src/{components → typography/text-shimmer}/text-shimmer.tsx +1 -0
  211. package/src/typography/wordmark/wordmark.tsx +39 -0
  212. package/dist/components/avatar.d.ts +0 -9
  213. package/dist/components/button.d.ts +0 -9
  214. package/dist/components/dialog.d.ts +0 -12
  215. package/dist/components/dropdown-menu.d.ts +0 -80
  216. package/dist/components/icon-button.d.ts +0 -10
  217. package/dist/components/keybind.d.ts +0 -6
  218. package/dist/components/radio-group.d.ts +0 -16
  219. package/dist/components/select.d.ts +0 -21
  220. package/dist/components/tag.d.ts +0 -5
  221. package/dist/components/toast.d.ts +0 -56
  222. package/dist/components/tooltip.d.ts +0 -17
  223. package/dist/v2/components/accordion-v2.d.ts +0 -26
  224. package/dist/v2/components/badge-v2.d.ts +0 -6
  225. package/dist/v2/components/button-v2.d.ts +0 -10
  226. package/dist/v2/components/checkbox-v2.d.ts +0 -10
  227. package/dist/v2/components/diff-changes-v2.d.ts +0 -11
  228. package/dist/v2/components/divider-v2.d.ts +0 -5
  229. package/dist/v2/components/icon-button-v2.d.ts +0 -11
  230. package/dist/v2/components/inline-input-v2.d.ts +0 -21
  231. package/dist/v2/components/keybind-v2.d.ts +0 -7
  232. package/dist/v2/components/loader-v2.d.ts +0 -3
  233. package/dist/v2/components/menu-v2.d.ts +0 -52
  234. package/dist/v2/components/progress-circle-v2.d.ts +0 -8
  235. package/dist/v2/components/radio-v2.d.ts +0 -16
  236. package/dist/v2/components/split-button-v2.d.ts +0 -5
  237. package/dist/v2/components/switch-v2.d.ts +0 -7
  238. package/dist/v2/components/tabs-v2.d.ts +0 -34
  239. package/dist/v2/components/text-shimmer-v2.d.ts +0 -9
  240. package/dist/v2/components/textarea-v2.d.ts +0 -7
  241. package/dist/v2/components/toast-v2.d.ts +0 -57
  242. package/dist/v2/components/tooltip-v2.d.ts +0 -13
  243. package/dist/v2/components/wordmark-v2.d.ts +0 -2
  244. package/src/components/avatar.css +0 -49
  245. package/src/components/avatar.tsx +0 -55
  246. package/src/components/button.css +0 -194
  247. package/src/components/dialog.css +0 -181
  248. package/src/components/dialog.tsx +0 -72
  249. package/src/components/diff-changes.tsx +0 -115
  250. package/src/components/dropdown-menu.css +0 -135
  251. package/src/components/dropdown-menu.tsx +0 -308
  252. package/src/components/icon-button.css +0 -181
  253. package/src/components/icon-button.tsx +0 -29
  254. package/src/components/icon.css +0 -39
  255. package/src/components/keybind.css +0 -18
  256. package/src/components/keybind.tsx +0 -20
  257. package/src/components/progress-circle.css +0 -16
  258. package/src/components/progress-circle.tsx +0 -64
  259. package/src/components/radio-group.css +0 -187
  260. package/src/components/radio-group.tsx +0 -83
  261. package/src/components/select.css +0 -201
  262. package/src/components/select.tsx +0 -174
  263. package/src/components/switch.css +0 -136
  264. package/src/components/switch.tsx +0 -29
  265. package/src/components/tabs.tsx +0 -126
  266. package/src/components/tag.css +0 -37
  267. package/src/components/tag.tsx +0 -22
  268. package/src/components/toast.css +0 -236
  269. package/src/components/toast.tsx +0 -185
  270. package/src/components/tooltip.css +0 -74
  271. package/src/components/tooltip.tsx +0 -163
  272. package/src/v2/components/accordion-v2.css +0 -139
  273. package/src/v2/components/accordion-v2.tsx +0 -86
  274. package/src/v2/components/button-v2.tsx +0 -35
  275. package/src/v2/components/checkbox-v2.css +0 -184
  276. package/src/v2/components/checkbox-v2.tsx +0 -65
  277. package/src/v2/components/diff-changes-v2.css +0 -26
  278. package/src/v2/components/icon-button-v2.tsx +0 -37
  279. package/src/v2/components/inline-input-v2.css +0 -225
  280. package/src/v2/components/inline-input-v2.tsx +0 -107
  281. package/src/v2/components/progress-circle-v2.css +0 -13
  282. package/src/v2/components/progress-circle-v2.tsx +0 -52
  283. package/src/v2/components/switch-v2.tsx +0 -28
  284. package/src/v2/components/tabs-v2.tsx +0 -149
  285. package/src/v2/components/text-shimmer-v2.css +0 -125
  286. package/src/v2/components/text-shimmer-v2.tsx +0 -63
  287. package/src/v2/components/wordmark-v2.tsx +0 -71
  288. /package/dist/{components → forms/inline-input}/inline-input.d.ts +0 -0
  289. /package/dist/{v2/components → navigation}/tab-state-indicator.d.ts +0 -0
  290. /package/src/{v2/components/avatar-v2.css → data-display/avatar/avatar.css} +0 -0
  291. /package/src/{v2/components/loader-v2.css → feedback/loader/loader.css} +0 -0
  292. /package/src/{v2/components/toast-v2.css → feedback/toast/toast.css} +0 -0
  293. /package/src/{components → forms/inline-input}/inline-input.css +0 -0
  294. /package/src/{components → forms/inline-input}/inline-input.tsx +0 -0
  295. /package/src/{v2/components/radio-v2.css → forms/radio/radio.css} +0 -0
  296. /package/src/{v2/components/textarea-v2.css → forms/textarea/textarea.css} +0 -0
  297. /package/src/{v2/components/divider-v2.css → layout/divider/divider.css} +0 -0
  298. /package/src/{v2/components → navigation}/tab-state-indicator.tsx +0 -0
  299. /package/src/{v2/styles/tailwind.css → styles/tokens/index.css} +0 -0
@@ -1,14 +1,4 @@
1
- import {
2
- createEffect,
3
- createMemo,
4
- mergeProps,
5
- onCleanup,
6
- onMount,
7
- Show,
8
- splitProps,
9
- type Accessor,
10
- type ComponentProps,
11
- } from "solid-js"
1
+ import { createEffect, mergeProps, onCleanup, onMount, Show, splitProps, type ComponentProps } from "solid-js"
12
2
  import { Portal } from "solid-js/web"
13
3
  import { createResizeObserver } from "@solid-primitives/resize-observer"
14
4
  import { createStore } from "solid-js/store"
@@ -18,7 +8,7 @@ export type ScrollViewThumbVisibility = "hover" | "scroll"
18
8
 
19
9
  export interface ScrollViewProps extends ComponentProps<"div"> {
20
10
  viewportRef?: (el: HTMLDivElement) => void
21
- orientation?: "vertical" | "horizontal" // currently only vertical is fully implemented for thumb
11
+ orientation?: "vertical" | "horizontal" | "both"
22
12
  /**
23
13
  * `hover`: show while hovered or scrolling. `scroll`: show only while scrolling.
24
14
  *
@@ -27,9 +17,9 @@ export interface ScrollViewProps extends ComponentProps<"div"> {
27
17
  * */
28
18
  thumbVisibility?: ScrollViewThumbVisibility
29
19
  /** Mount the thumb into an external track. Scroll metrics still come from this ScrollView. */
30
- thumbContainer?: HTMLElement | Accessor<HTMLElement | undefined>
20
+ thumbContainer?: HTMLElement
31
21
  /** Element whose hover reveals the thumb. Defaults to the ScrollView root when unset. */
32
- thumbHoverTarget?: HTMLElement | Accessor<HTMLElement | undefined>
22
+ thumbHoverTarget?: HTMLElement
33
23
  }
34
24
 
35
25
  export const scrollKey = (event: Pick<KeyboardEvent, "key" | "altKey" | "ctrlKey" | "metaKey" | "shiftKey">) => {
@@ -88,12 +78,37 @@ export function scrollTopFromThumbPointer(input: {
88
78
  thumbHeight: number
89
79
  /** Viewport height used for max scroll. Defaults to `clientHeight` (track == viewport). */
90
80
  scrollClientHeight?: number
81
+ }) {
82
+ return scrollOffsetFromThumbPointer({
83
+ pointer: input.pointer,
84
+ viewportStart: input.viewportTop,
85
+ grabOffset: input.grabOffset,
86
+ clientSize: input.clientHeight,
87
+ scrollSize: input.scrollHeight,
88
+ thumbSize: input.thumbHeight,
89
+ scrollClientSize: input.scrollClientHeight,
90
+ })
91
+ }
92
+
93
+ export function scrollOffsetFromThumbPointer(input: {
94
+ pointer: number
95
+ viewportStart: number
96
+ grabOffset: number
97
+ clientSize: number
98
+ scrollSize: number
99
+ thumbSize: number
100
+ scrollClientSize?: number
101
+ reverse?: boolean
91
102
  }) {
92
103
  const padding = 8
93
- const maxThumbTop = input.clientHeight - padding * 2 - input.thumbHeight
94
- if (maxThumbTop <= 0) return 0
95
- const thumbTop = Math.max(0, Math.min(input.pointer - input.viewportTop - padding - input.grabOffset, maxThumbTop))
96
- return (thumbTop / maxThumbTop) * Math.max(0, input.scrollHeight - (input.scrollClientHeight ?? input.clientHeight))
104
+ const maxThumbStart = input.clientSize - padding * 2 - input.thumbSize
105
+ if (maxThumbStart <= 0) return 0
106
+ const thumbStart = Math.max(
107
+ 0,
108
+ Math.min(input.pointer - input.viewportStart - padding - input.grabOffset, maxThumbStart),
109
+ )
110
+ const progress = input.reverse ? 1 - thumbStart / maxThumbStart : thumbStart / maxThumbStart
111
+ return progress * Math.max(0, input.scrollSize - (input.scrollClientSize ?? input.clientSize))
97
112
  }
98
113
 
99
114
  export function ScrollView(props: ScrollViewProps) {
@@ -126,31 +141,29 @@ export function ScrollView(props: ScrollViewProps) {
126
141
 
127
142
  let rootRef!: HTMLDivElement
128
143
  let viewportRef!: HTMLDivElement
129
- let thumbRef!: HTMLDivElement
130
-
131
- const resolveEl = (value: HTMLElement | Accessor<HTMLElement | undefined> | undefined) => {
132
- if (typeof value === "function") return value()
133
- return value
134
- }
144
+ let verticalThumbRef!: HTMLDivElement
145
+ let horizontalThumbRef!: HTMLDivElement
135
146
 
136
- const thumbMount = createMemo(() => resolveEl(local.thumbContainer))
137
- const thumbHover = createMemo(() => resolveEl(local.thumbHoverTarget))
147
+ const thumbMount = () => local.thumbContainer
148
+ const thumbHover = () => local.thumbHoverTarget
138
149
  const hoverRoot = () => !local.thumbHoverTarget && !local.thumbContainer
139
150
 
140
151
  const [state, setState] = createStore({
141
152
  isHovered: false,
142
- isDragging: false,
153
+ dragging: undefined as "vertical" | "horizontal" | undefined,
143
154
  isScrolling: false,
144
- thumbHeight: 0,
145
- thumbTop: 0,
146
- showThumb: false,
155
+ verticalThumbSize: 0,
156
+ verticalThumbStart: 0,
157
+ showVerticalThumb: false,
158
+ horizontalThumbSize: 0,
159
+ horizontalThumbStart: 0,
160
+ showHorizontalThumb: false,
147
161
  })
148
162
  const isHovered = () => state.isHovered
149
- const isDragging = () => state.isDragging
163
+ const isDragging = () => state.dragging !== undefined
150
164
  const isScrolling = () => state.isScrolling
151
- const thumbHeight = () => state.thumbHeight
152
- const thumbTop = () => state.thumbTop
153
- const showThumb = () => state.showThumb
165
+ const vertical = () => local.orientation === "vertical" || local.orientation === "both"
166
+ const horizontal = () => local.orientation === "horizontal" || local.orientation === "both"
154
167
 
155
168
  let scrollIdleTimer: ReturnType<typeof setTimeout> | undefined
156
169
 
@@ -172,33 +185,42 @@ export function ScrollView(props: ScrollViewProps) {
172
185
 
173
186
  const updateThumb = () => {
174
187
  if (!viewportRef) return
175
- const { scrollTop, scrollHeight, clientHeight } = viewportRef
176
-
177
- if (scrollHeight <= clientHeight || scrollHeight === 0) {
178
- setState("showThumb", false)
179
- return
180
- }
181
-
182
- setState("showThumb", true)
183
188
  const trackPadding = 8
184
- const trackClientHeight = thumbMount()?.clientHeight || clientHeight
185
- const trackHeight = trackClientHeight - trackPadding * 2
186
-
187
- const minThumbHeight = 32
188
- // Calculate raw thumb height based on ratio
189
- let height = (clientHeight / scrollHeight) * trackHeight
190
- height = Math.max(height, minThumbHeight)
191
-
192
- const maxScrollTop = scrollHeight - clientHeight
193
- const maxThumbTop = trackHeight - height
194
-
195
- const top = maxScrollTop > 0 ? (scrollTop / maxScrollTop) * maxThumbTop : 0
196
-
197
- // Ensure thumb stays within bounds (shouldn't be necessary due to math above, but good for safety)
198
- const boundedTop = trackPadding + Math.max(0, Math.min(top, maxThumbTop))
189
+ const minThumbSize = 32
190
+
191
+ if (vertical()) {
192
+ const trackSize = Math.max(0, (thumbMount()?.clientHeight || viewportRef.clientHeight) - trackPadding * 2)
193
+ const size = trackSize
194
+ ? Math.min(trackSize, Math.max((viewportRef.clientHeight / viewportRef.scrollHeight) * trackSize, minThumbSize))
195
+ : 0
196
+ const maxScroll = viewportRef.scrollHeight - viewportRef.clientHeight
197
+ const maxStart = trackSize - size
198
+ setState("showVerticalThumb", maxScroll > 0)
199
+ setState("verticalThumbSize", size)
200
+ setState(
201
+ "verticalThumbStart",
202
+ trackPadding + (maxScroll > 0 ? (viewportRef.scrollTop / maxScroll) * maxStart : 0),
203
+ )
204
+ } else {
205
+ setState("showVerticalThumb", false)
206
+ }
199
207
 
200
- setState("thumbHeight", height)
201
- setState("thumbTop", boundedTop)
208
+ if (horizontal()) {
209
+ const trackSize = Math.max(0, (thumbMount()?.clientWidth || viewportRef.clientWidth) - trackPadding * 2)
210
+ const size = trackSize
211
+ ? Math.min(trackSize, Math.max((viewportRef.clientWidth / viewportRef.scrollWidth) * trackSize, minThumbSize))
212
+ : 0
213
+ const maxScroll = viewportRef.scrollWidth - viewportRef.clientWidth
214
+ const maxStart = trackSize - size
215
+ const rtl = getComputedStyle(viewportRef).direction === "rtl"
216
+ const offset = Math.max(0, Math.min(rtl ? -viewportRef.scrollLeft : viewportRef.scrollLeft, maxScroll))
217
+ const start = maxScroll > 0 ? (offset / maxScroll) * maxStart : 0
218
+ setState("showHorizontalThumb", maxScroll > 0)
219
+ setState("horizontalThumbSize", size)
220
+ setState("horizontalThumbStart", trackPadding + (rtl ? maxStart - start : start))
221
+ } else {
222
+ setState("showHorizontalThumb", false)
223
+ }
202
224
  }
203
225
 
204
226
  onMount(() => {
@@ -219,6 +241,13 @@ export function ScrollView(props: ScrollViewProps) {
219
241
  updateThumb()
220
242
  })
221
243
 
244
+ createEffect(() => {
245
+ if (!horizontal() || !viewportRef) return
246
+ const observer = new MutationObserver(updateThumb)
247
+ observer.observe(viewportRef, { childList: true, subtree: true, characterData: true })
248
+ onCleanup(() => observer.disconnect())
249
+ })
250
+
222
251
  createEffect(() => {
223
252
  const target = thumbHover()
224
253
  if (!target) return
@@ -234,58 +263,88 @@ export function ScrollView(props: ScrollViewProps) {
234
263
  })
235
264
  })
236
265
 
237
- const onThumbPointerDown = (e: PointerEvent) => {
266
+ const onThumbPointerDown = (axis: "vertical" | "horizontal", e: PointerEvent) => {
238
267
  e.preventDefault()
239
268
  e.stopPropagation()
240
- setState("isDragging", true)
241
- const grabOffset = e.clientY - thumbRef.getBoundingClientRect().top
269
+ setState("dragging", axis)
270
+ const thumb = axis === "vertical" ? verticalThumbRef : horizontalThumbRef
271
+ const grabOffset =
272
+ axis === "vertical"
273
+ ? e.clientY - thumb.getBoundingClientRect().top
274
+ : e.clientX - thumb.getBoundingClientRect().left
242
275
  const track = thumbMount() ?? viewportRef
243
276
 
244
- thumbRef.setPointerCapture(e.pointerId)
277
+ thumb.setPointerCapture(e.pointerId)
245
278
 
246
279
  const onPointerMove = (e: PointerEvent) => {
247
- const { scrollHeight, clientHeight } = viewportRef
248
- viewportRef.scrollTop = scrollTopFromThumbPointer({
249
- pointer: e.clientY,
250
- viewportTop: track.getBoundingClientRect().top,
280
+ const vertical = axis === "vertical"
281
+ const rtl = !vertical && getComputedStyle(viewportRef).direction === "rtl"
282
+ const offset = scrollOffsetFromThumbPointer({
283
+ pointer: vertical ? e.clientY : e.clientX,
284
+ viewportStart: vertical ? track.getBoundingClientRect().top : track.getBoundingClientRect().left,
251
285
  grabOffset,
252
- clientHeight: track.clientHeight,
253
- scrollClientHeight: clientHeight,
254
- scrollHeight,
255
- thumbHeight: thumbHeight(),
286
+ clientSize: vertical ? track.clientHeight : track.clientWidth,
287
+ scrollClientSize: vertical ? viewportRef.clientHeight : viewportRef.clientWidth,
288
+ scrollSize: vertical ? viewportRef.scrollHeight : viewportRef.scrollWidth,
289
+ thumbSize: vertical ? state.verticalThumbSize : state.horizontalThumbSize,
290
+ reverse: rtl,
256
291
  })
292
+ if (vertical) {
293
+ viewportRef.scrollTop = offset
294
+ return
295
+ }
296
+ viewportRef.scrollLeft = rtl ? -offset : offset
257
297
  }
258
298
 
259
299
  const done = (e: PointerEvent) => {
260
- setState("isDragging", false)
261
- thumbRef.releasePointerCapture(e.pointerId)
262
- thumbRef.removeEventListener("pointermove", onPointerMove)
263
- thumbRef.removeEventListener("pointerup", done)
264
- thumbRef.removeEventListener("pointercancel", done)
300
+ setState("dragging", undefined)
301
+ thumb.releasePointerCapture(e.pointerId)
302
+ thumb.removeEventListener("pointermove", onPointerMove)
303
+ thumb.removeEventListener("pointerup", done)
304
+ thumb.removeEventListener("pointercancel", done)
265
305
  }
266
306
 
267
- thumbRef.addEventListener("pointermove", onPointerMove)
268
- thumbRef.addEventListener("pointerup", done)
269
- thumbRef.addEventListener("pointercancel", done)
307
+ thumb.addEventListener("pointermove", onPointerMove)
308
+ thumb.addEventListener("pointerup", done)
309
+ thumb.addEventListener("pointercancel", done)
270
310
  }
271
311
 
272
- const renderThumb = () => (
312
+ const renderVerticalThumb = () => (
273
313
  <div
274
314
  ref={(el) => {
275
- thumbRef = el
315
+ verticalThumbRef = el
276
316
  }}
277
- onPointerDown={onThumbPointerDown}
317
+ onPointerDown={(event) => onThumbPointerDown("vertical", event)}
278
318
  class="scroll-view__thumb"
319
+ data-orientation="vertical"
279
320
  data-visible={thumbVisible()}
280
- data-dragging={isDragging()}
321
+ data-dragging={state.dragging === "vertical"}
281
322
  style={{
282
- height: `${thumbHeight()}px`,
283
- transform: `translateY(${thumbTop()}px)`,
323
+ height: `${state.verticalThumbSize}px`,
324
+ transform: `translateY(${state.verticalThumbStart}px)`,
284
325
  "z-index": 100, // ensure it displays over content
285
326
  }}
286
327
  />
287
328
  )
288
329
 
330
+ const renderHorizontalThumb = () => (
331
+ <div
332
+ ref={(el) => {
333
+ horizontalThumbRef = el
334
+ }}
335
+ onPointerDown={(event) => onThumbPointerDown("horizontal", event)}
336
+ class="scroll-view__thumb"
337
+ data-orientation="horizontal"
338
+ data-visible={thumbVisible()}
339
+ data-dragging={state.dragging === "horizontal"}
340
+ style={{
341
+ width: `${state.horizontalThumbSize}px`,
342
+ transform: `translateX(${state.horizontalThumbStart}px)`,
343
+ "z-index": 100,
344
+ }}
345
+ />
346
+ )
347
+
289
348
  // Keybinds implementation
290
349
  // We ensure the viewport has a tabindex so it can receive focus
291
350
  // We can also explicitly catch PageUp/Down if we want smooth scroll or specific behavior,
@@ -335,6 +394,7 @@ export function ScrollView(props: ScrollViewProps) {
335
394
  <div
336
395
  ref={rootRef}
337
396
  class={`scroll-view ${local.class || ""}`}
397
+ data-orientation={local.orientation}
338
398
  style={local.style}
339
399
  onPointerEnter={() => {
340
400
  if (hoverRoot()) setState("isHovered", true)
@@ -378,9 +438,14 @@ export function ScrollView(props: ScrollViewProps) {
378
438
  </div>
379
439
 
380
440
  {/* Thumb Overlay — optionally portaled into an external track */}
381
- <Show when={showThumb()}>
382
- <Show when={thumbMount()} fallback={renderThumb()}>
383
- {(mount) => <Portal mount={mount()}>{renderThumb()}</Portal>}
441
+ <Show when={state.showVerticalThumb}>
442
+ <Show when={thumbMount()} fallback={renderVerticalThumb()}>
443
+ {(mount) => <Portal mount={mount()}>{renderVerticalThumb()}</Portal>}
444
+ </Show>
445
+ </Show>
446
+ <Show when={state.showHorizontalThumb}>
447
+ <Show when={thumbMount()} fallback={renderHorizontalThumb()}>
448
+ {(mount) => <Portal mount={mount()}>{renderHorizontalThumb()}</Portal>}
384
449
  </Show>
385
450
  </Show>
386
451
  </div>
@@ -1,4 +1,4 @@
1
- import { Accordion } from "./accordion"
1
+ import { Accordion } from "@opencode-ai/ui/accordion"
2
2
  import { ParentProps } from "solid-js"
3
3
 
4
4
  export function StickyAccordionHeader(
@@ -2,8 +2,9 @@ import { TextField as Kobalte } from "@kobalte/core/text-field"
2
2
  import { createSignal, Show, splitProps } from "solid-js"
3
3
  import type { ComponentProps } from "solid-js"
4
4
  import { useI18n } from "../context/i18n"
5
- import { IconButton } from "./icon-button"
6
- import { Tooltip } from "./tooltip"
5
+ import { IconButton } from "@opencode-ai/ui/icon-button"
6
+ import { Icon } from "@opencode-ai/ui/icon"
7
+ import { Tooltip } from "@opencode-ai/ui/tooltip"
7
8
 
8
9
  export interface TextFieldProps
9
10
  extends ComponentProps<typeof Kobalte.Input>,
@@ -106,10 +107,17 @@ export function TextField(props: TextFieldProps) {
106
107
  <Kobalte.TextArea {...others} autoResize data-slot="input-input" class={local.class} />
107
108
  </Show>
108
109
  <Show when={local.copyable}>
109
- <Tooltip value={label()} placement="top" gutter={4} forceOpen={copied()} skipDelayDuration={0}>
110
+ <Tooltip
111
+ appearance="standard"
112
+ value={label()}
113
+ placement="top"
114
+ gutter={4}
115
+ forceOpen={copied() ? true : undefined}
116
+ skipDelayDuration={0}
117
+ >
110
118
  <IconButton
111
119
  type="button"
112
- icon={icon()}
120
+ icon={<Icon name={icon()} />}
113
121
  variant="ghost"
114
122
  onClick={handleCopy}
115
123
  tabIndex={-1}
@@ -81,6 +81,7 @@ function init() {
81
81
  let dispose: (() => void) | undefined
82
82
  let setClosing: ((closing: boolean) => void) | undefined
83
83
 
84
+ // Stacked dialogs render as sibling portals, so only the top layer may own the focus trap.
84
85
  const node = runWithOwner(owner, () =>
85
86
  createRoot((d: () => void) => {
86
87
  dispose = d
@@ -1,26 +1,24 @@
1
1
  import { createContext, useContext, type Accessor, type ParentProps } from "solid-js"
2
2
  import { I18nProvider } from "@kobalte/core/i18n"
3
3
  import { dict as en } from "../i18n/en"
4
+ import type { Key, LocaleKey, PluralCategory, PluralKey, PluralLookupKey } from "../i18n/en"
4
5
 
5
- export type UiI18nKey = keyof typeof en
6
-
7
- export const UI_PLURAL_KEYS = [
8
- "ui.sessionTurn.diffs.changed",
9
- "ui.messagePart.context.read",
10
- "ui.messagePart.context.search",
11
- "ui.messagePart.context.list",
12
- ] as const
13
- export type UiI18nPluralKey = (typeof UI_PLURAL_KEYS)[number]
14
- export type UiPluralCategory = "zero" | "one" | "two" | "few" | "many" | "other"
15
- export type UiI18nPluralLookupKey = `${UiI18nPluralKey}.${UiPluralCategory}`
6
+ export type UiI18nKey = Key
7
+ export type UiI18nPluralKey = PluralKey
8
+ export type UiPluralCategory = PluralCategory
9
+ export type UiI18nPluralLookupKey = PluralLookupKey
10
+ export type UiI18nLocaleKey = LocaleKey
11
+ type UiTranslationKey<Value extends string> = Value extends UiI18nPluralLookupKey ? never : Value
16
12
 
17
13
  export type UiI18nParams = Record<string, string | number | boolean>
14
+ export type UiTranslate = <Value extends string>(key: UiTranslationKey<Value>, params?: UiI18nParams) => string
18
15
 
19
16
  export type UiI18n = {
20
17
  locale: Accessor<string>
21
18
  layoutLocale?: Accessor<string>
22
- t: (key: UiI18nKey, params?: UiI18nParams) => string
19
+ t: UiTranslate
23
20
  plural: (key: UiI18nPluralKey, count: number, params?: UiI18nParams) => string
21
+ pluralForm?: (key: UiI18nPluralKey, category: UiPluralCategory, params?: UiI18nParams) => string
24
22
  }
25
23
 
26
24
  const rules = new Map<string, Intl.PluralRules>()
@@ -50,11 +48,16 @@ function resolveTemplate(text: string, params?: UiI18nParams) {
50
48
  const fallback: UiI18n = {
51
49
  locale: () => "en",
52
50
  t: (key, params) => {
53
- const value = en[key] ?? String(key)
51
+ const value = en[key as UiI18nKey] ?? String(key)
54
52
  return resolveTemplate(value, params)
55
53
  },
56
54
  plural: (key, count, params) =>
57
- fallback.t(pluralKey(key, pluralCategory(fallback.locale(), count)), { ...params, count }),
55
+ fallback.pluralForm!(key, pluralCategory(fallback.locale(), count), { ...params, count }),
56
+ pluralForm: (key, category, params) => {
57
+ const values = en as Partial<Record<UiI18nLocaleKey, string>>
58
+ const value = values[pluralKey(key, category)] ?? values[`${key}.other`] ?? `${key}.other`
59
+ return resolveTemplate(value, params)
60
+ },
58
61
  }
59
62
 
60
63
  const Context = createContext<UiI18n>(fallback)
@@ -0,0 +1,27 @@
1
+ import { Marked } from "marked"
2
+
3
+ export function createMarkdownBase() {
4
+ return new Marked({
5
+ renderer: {
6
+ link({ href, title, text }) {
7
+ const titleAttr = title ? ` title="${title}"` : ""
8
+ return `<a href="${href}"${titleAttr} class="external-link" target="_blank" rel="noopener noreferrer">${text}</a>`
9
+ },
10
+ },
11
+ })
12
+ }
13
+
14
+ let smallParser: Marked | undefined
15
+
16
+ export function parseSmallMarkdown(text: string) {
17
+ // Any possible KaTeX delimiter stays on the worker, including escaped ones.
18
+ if (text.length > 1024 || text.includes("\\(") || text.includes("$$")) return
19
+ const parser = (smallParser ??= createMarkdownBase())
20
+ const tokens = parser.lexer(text)
21
+ let code = false
22
+ parser.walkTokens(tokens, (token) => {
23
+ if (token.type === "code") code = true
24
+ })
25
+ if (code) return
26
+ return parser.parser(tokens)
27
+ }
@@ -1,20 +1,10 @@
1
1
  import katex from "katex"
2
- import { Marked, type MarkedExtension, type Tokens } from "marked"
2
+ import type { MarkedExtension, Tokens } from "marked"
3
3
  import markedShiki from "marked-shiki"
4
+ import { createMarkdownBase } from "./marked-base"
4
5
 
5
6
  export function createMarkdownParser(highlight: (code: string, language: string) => string | Promise<string>) {
6
- return new Marked(
7
- {
8
- renderer: {
9
- link({ href, title, text }) {
10
- const titleAttr = title ? ` title="${title}"` : ""
11
- return `<a href="${href}"${titleAttr} class="external-link" target="_blank" rel="noopener noreferrer">${text}</a>`
12
- },
13
- },
14
- },
15
- katexExtension,
16
- markedShiki({ highlight }),
17
- )
7
+ return createMarkdownBase().use(katexExtension, markedShiki({ highlight }))
18
8
  }
19
9
 
20
10
  const inlineMathRegex = /^\\\(((?:\\.|[^\\\n])*?)\\\)/
@@ -36,26 +36,24 @@
36
36
  user-select: none;
37
37
 
38
38
  background-color: var(--v2-background-bg-base);
39
- border: 0.5px solid var(--v2-border-border-base);
39
+ border: 1px solid var(--v2-border-border-base);
40
40
  border-radius: 0;
41
41
  box-shadow: none;
42
42
  overflow: clip;
43
43
  color: var(--v2-text-text-base);
44
44
  transition: background-color 0.15s ease;
45
45
 
46
- /* text-12-regular */
47
46
  font-family: var(--font-family-sans);
48
47
  font-size: var(--font-size-small);
49
48
  font-style: normal;
50
49
  font-weight: var(--font-weight-regular);
51
- line-height: var(--line-height-large); /* 166.667% */
50
+ line-height: var(--line-height-large);
52
51
  letter-spacing: var(--letter-spacing-normal);
53
52
 
54
- &:hover:not([data-disabled]) {
55
- background-color: var(--v2-overlay-simple-overlay-hover);
56
- }
57
- &:active:not([data-disabled]) {
58
- background-color: var(--v2-overlay-simple-overlay-pressed);
53
+ @media (hover: hover) {
54
+ &:hover:not([data-disabled]) {
55
+ background-color: var(--v2-overlay-simple-overlay-hover);
56
+ }
59
57
  }
60
58
  &:focus-visible {
61
59
  outline: none;
@@ -82,7 +80,7 @@
82
80
 
83
81
  &[data-expanded] {
84
82
  [data-slot="accordion-content"] {
85
- border: 0.5px solid var(--v2-border-border-base);
83
+ border: 1px solid var(--v2-border-border-base);
86
84
  border-top: 0;
87
85
  background-color: var(--v2-background-bg-layer-01);
88
86
  }
@@ -104,30 +102,6 @@
104
102
  }
105
103
  }
106
104
 
107
- body:not([data-new-layout]) [data-component="accordion"] {
108
- [data-slot="accordion-item"] [data-slot="accordion-header"] [data-slot="accordion-trigger"] {
109
- background-color: var(--background-stronger);
110
- border-width: 1px;
111
- border-color: var(--border-weak-base);
112
- color: var(--text-strong);
113
-
114
- &:hover:not([data-disabled]) {
115
- background-color: var(--surface-base-hover);
116
- }
117
-
118
- &:active:not([data-disabled]) {
119
- background-color: var(--surface-base-active);
120
- }
121
- }
122
-
123
- [data-slot="accordion-item"][data-expanded] [data-slot="accordion-content"] {
124
- border-width: 1px;
125
- border-color: var(--border-weak-base);
126
- border-top: 0;
127
- background-color: var(--background-stronger);
128
- }
129
- }
130
-
131
105
  @keyframes slideDown {
132
106
  from {
133
107
  height: 0;
@@ -1,17 +1,17 @@
1
- import { Accordion as Kobalte } from "@kobalte/core/accordion"
1
+ import { Content, Header, Item, Root, Trigger } from "@kobalte/core/accordion"
2
2
  import { splitProps } from "solid-js"
3
3
  import type { ComponentProps, ParentProps } from "solid-js"
4
4
 
5
- export interface AccordionProps extends ComponentProps<typeof Kobalte> {}
6
- export interface AccordionItemProps extends ComponentProps<typeof Kobalte.Item> {}
7
- export interface AccordionHeaderProps extends ComponentProps<typeof Kobalte.Header> {}
8
- export interface AccordionTriggerProps extends ComponentProps<typeof Kobalte.Trigger> {}
9
- export interface AccordionContentProps extends ComponentProps<typeof Kobalte.Content> {}
5
+ export interface AccordionProps extends ComponentProps<typeof Root> {}
6
+ export interface AccordionItemProps extends ComponentProps<typeof Item> {}
7
+ export interface AccordionHeaderProps extends ComponentProps<typeof Header> {}
8
+ export interface AccordionTriggerProps extends ComponentProps<typeof Trigger> {}
9
+ export interface AccordionContentProps extends ComponentProps<typeof Content> {}
10
10
 
11
11
  function AccordionRoot(props: AccordionProps) {
12
12
  const [split, rest] = splitProps(props, ["class", "classList"])
13
13
  return (
14
- <Kobalte
14
+ <Root
15
15
  {...rest}
16
16
  data-component="accordion"
17
17
  classList={{
@@ -25,7 +25,7 @@ function AccordionRoot(props: AccordionProps) {
25
25
  function AccordionItem(props: AccordionItemProps) {
26
26
  const [split, rest] = splitProps(props, ["class", "classList"])
27
27
  return (
28
- <Kobalte.Item
28
+ <Item
29
29
  {...rest}
30
30
  data-slot="accordion-item"
31
31
  classList={{
@@ -39,7 +39,7 @@ function AccordionItem(props: AccordionItemProps) {
39
39
  function AccordionHeader(props: ParentProps<AccordionHeaderProps>) {
40
40
  const [split, rest] = splitProps(props, ["class", "classList", "children"])
41
41
  return (
42
- <Kobalte.Header
42
+ <Header
43
43
  {...rest}
44
44
  data-slot="accordion-header"
45
45
  classList={{
@@ -48,14 +48,14 @@ function AccordionHeader(props: ParentProps<AccordionHeaderProps>) {
48
48
  }}
49
49
  >
50
50
  {split.children}
51
- </Kobalte.Header>
51
+ </Header>
52
52
  )
53
53
  }
54
54
 
55
55
  function AccordionTrigger(props: ParentProps<AccordionTriggerProps>) {
56
56
  const [split, rest] = splitProps(props, ["class", "classList", "children"])
57
57
  return (
58
- <Kobalte.Trigger
58
+ <Trigger
59
59
  {...rest}
60
60
  data-slot="accordion-trigger"
61
61
  classList={{
@@ -64,14 +64,14 @@ function AccordionTrigger(props: ParentProps<AccordionTriggerProps>) {
64
64
  }}
65
65
  >
66
66
  {split.children}
67
- </Kobalte.Trigger>
67
+ </Trigger>
68
68
  )
69
69
  }
70
70
 
71
71
  function AccordionContent(props: ParentProps<AccordionContentProps>) {
72
72
  const [split, rest] = splitProps(props, ["class", "classList", "children"])
73
73
  return (
74
- <Kobalte.Content
74
+ <Content
75
75
  {...rest}
76
76
  data-slot="accordion-content"
77
77
  classList={{
@@ -80,7 +80,7 @@ function AccordionContent(props: ParentProps<AccordionContentProps>) {
80
80
  }}
81
81
  >
82
82
  {split.children}
83
- </Kobalte.Content>
83
+ </Content>
84
84
  )
85
85
  }
86
86
 
@@ -1,5 +1,5 @@
1
1
  import { type ComponentProps, splitProps, Show } from "solid-js"
2
- import "./avatar-v2.css"
2
+ import "./avatar.css"
3
3
 
4
4
  const segmenter =
5
5
  typeof Intl !== "undefined" && "Segmenter" in Intl