@opencode-ai/ui 0.0.0-dev-19219 → 0.0.0-dev-202609070344

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/{data-display/accordion → components}/accordion.d.ts +6 -6
  2. package/dist/components/avatar.d.ts +9 -0
  3. package/dist/components/button.d.ts +9 -0
  4. package/dist/components/card.d.ts +1 -1
  5. package/dist/{forms/checkbox → components}/checkbox.d.ts +2 -2
  6. package/dist/components/dialog.d.ts +12 -0
  7. package/dist/{data-display/diff-changes → components}/diff-changes.d.ts +1 -2
  8. package/dist/components/dropdown-menu.d.ts +80 -0
  9. package/dist/components/icon-button.d.ts +10 -0
  10. package/dist/{icons/icon/additional-icons.d.ts → components/icon.d.ts} +8 -8
  11. package/dist/components/keybind.d.ts +6 -0
  12. package/dist/components/list.d.ts +1 -1
  13. package/dist/{feedback/progress-circle → components}/progress-circle.d.ts +0 -2
  14. package/dist/components/radio-group.d.ts +16 -0
  15. package/dist/components/scroll-view.d.ts +4 -14
  16. package/dist/components/select.d.ts +21 -0
  17. package/dist/{forms/switch → components}/switch.d.ts +2 -4
  18. package/dist/{navigation/tabs → components}/tabs.d.ts +8 -15
  19. package/dist/components/tag.d.ts +5 -0
  20. package/dist/{typography/text-shimmer → components}/text-shimmer.d.ts +0 -1
  21. package/dist/components/toast.d.ts +56 -0
  22. package/dist/components/tooltip.d.ts +17 -0
  23. package/dist/context/i18n.d.ts +7 -10
  24. package/dist/context/marked-parser.d.ts +2 -1
  25. package/dist/hooks/use-filtered-list.d.ts +0 -9
  26. package/dist/i18n/ar.d.ts +2 -0
  27. package/dist/i18n/bg.d.ts +2 -0
  28. package/dist/i18n/br.d.ts +2 -0
  29. package/dist/i18n/bs.d.ts +2 -0
  30. package/dist/i18n/da.d.ts +2 -0
  31. package/dist/i18n/de.d.ts +2 -0
  32. package/dist/i18n/en.d.ts +1 -242
  33. package/dist/i18n/es.d.ts +2 -0
  34. package/dist/i18n/fr.d.ts +2 -0
  35. package/dist/i18n/ja.d.ts +2 -0
  36. package/dist/i18n/km.d.ts +2 -0
  37. package/dist/i18n/ko.d.ts +2 -0
  38. package/dist/i18n/lo.d.ts +2 -0
  39. package/dist/i18n/mk.d.ts +2 -0
  40. package/dist/i18n/mn.d.ts +2 -0
  41. package/dist/i18n/my.d.ts +2 -0
  42. package/dist/i18n/pl.d.ts +2 -0
  43. package/dist/i18n/ru.d.ts +2 -0
  44. package/dist/i18n/sr.d.ts +2 -0
  45. package/dist/i18n/tg.d.ts +2 -0
  46. package/dist/i18n/th.d.ts +2 -0
  47. package/dist/i18n/tr.d.ts +2 -0
  48. package/dist/i18n/zh.d.ts +2 -0
  49. package/dist/i18n/zht.d.ts +2 -0
  50. package/dist/v2/components/accordion-v2.d.ts +26 -0
  51. package/dist/{data-display/avatar/avatar.d.ts → v2/components/avatar-v2.d.ts} +1 -1
  52. package/dist/v2/components/badge-v2.d.ts +6 -0
  53. package/dist/v2/components/button-v2.d.ts +10 -0
  54. package/dist/v2/components/checkbox-v2.d.ts +10 -0
  55. package/dist/{overlays/dialog/dialog.d.ts → v2/components/dialog-v2.d.ts} +2 -1
  56. package/dist/v2/components/diff-changes-v2.d.ts +11 -0
  57. package/dist/v2/components/divider-v2.d.ts +5 -0
  58. package/dist/{forms/field/field.d.ts → v2/components/field-v2.d.ts} +10 -4
  59. package/dist/v2/components/icon-button-v2.d.ts +11 -0
  60. package/dist/{icons/icon → v2/components}/icon.d.ts +1 -52
  61. package/dist/v2/components/inline-input-v2.d.ts +21 -0
  62. package/dist/v2/components/keybind-v2.d.ts +7 -0
  63. package/dist/{data-display/line-comment/line-comment.d.ts → v2/components/line-comment-v2.d.ts} +9 -9
  64. package/dist/v2/components/loader-v2.d.ts +3 -0
  65. package/dist/v2/components/menu-v2.d.ts +52 -0
  66. package/dist/v2/components/progress-circle-v2.d.ts +8 -0
  67. package/dist/{data-display/project-avatar/project-avatar.d.ts → v2/components/project-avatar-v2.d.ts} +1 -1
  68. package/dist/v2/components/radio-v2.d.ts +16 -0
  69. package/dist/{navigation/segmented-control/segmented-control.d.ts → v2/components/segmented-control-v2.d.ts} +5 -5
  70. package/dist/{forms/select/select.d.ts → v2/components/select-v2.d.ts} +6 -5
  71. package/dist/v2/components/split-button-v2.d.ts +5 -0
  72. package/dist/v2/components/switch-v2.d.ts +7 -0
  73. package/dist/v2/components/tabs-v2.d.ts +34 -0
  74. package/dist/{forms/text-input/text-input.d.ts → v2/components/text-input-v2.d.ts} +3 -3
  75. package/dist/v2/components/text-shimmer-v2.d.ts +9 -0
  76. package/dist/v2/components/textarea-v2.d.ts +7 -0
  77. package/dist/v2/components/toast-v2.d.ts +57 -0
  78. package/dist/v2/components/tooltip-v2.d.ts +13 -0
  79. package/dist/v2/components/wordmark-v2.d.ts +2 -0
  80. package/package.json +35 -141
  81. package/src/{data-display/accordion → components}/accordion.css +33 -7
  82. package/src/{data-display/accordion → components}/accordion.tsx +14 -14
  83. package/src/components/animated-number.css +11 -29
  84. package/src/components/animated-number.tsx +2 -2
  85. package/src/components/avatar.css +49 -0
  86. package/src/components/avatar.tsx +55 -0
  87. package/src/components/button.css +194 -0
  88. package/src/{actions/button → components}/button.tsx +11 -19
  89. package/src/components/card.css +23 -2
  90. package/src/components/card.tsx +4 -4
  91. package/src/{forms/checkbox → components}/checkbox.css +7 -1
  92. package/src/{forms/checkbox → components}/checkbox.tsx +13 -13
  93. package/src/components/collapsible.tsx +2 -2
  94. package/src/components/dialog.css +181 -0
  95. package/src/components/dialog.tsx +72 -0
  96. package/src/{data-display/diff-changes → components}/diff-changes.css +19 -22
  97. package/src/components/diff-changes.tsx +115 -0
  98. package/src/components/dock-surface.css +9 -2
  99. package/src/components/dropdown-menu.css +135 -0
  100. package/src/components/dropdown-menu.tsx +308 -0
  101. package/src/components/icon-button.css +181 -0
  102. package/src/components/icon-button.tsx +29 -0
  103. package/src/components/icon.css +39 -0
  104. package/src/{icons/icon/additional-icons.ts → components/icon.tsx} +74 -8
  105. package/src/components/image-preview.tsx +2 -3
  106. package/src/components/keybind.css +18 -0
  107. package/src/components/keybind.tsx +20 -0
  108. package/src/components/list.css +5 -5
  109. package/src/components/list.tsx +5 -7
  110. package/src/components/popover.tsx +2 -3
  111. package/src/components/progress-circle.css +16 -0
  112. package/src/components/progress-circle.tsx +64 -0
  113. package/src/components/radio-group.css +187 -0
  114. package/src/components/radio-group.tsx +83 -0
  115. package/src/components/scroll-view.css +4 -36
  116. package/src/components/scroll-view.tsx +88 -153
  117. package/src/components/select.css +201 -0
  118. package/src/components/select.tsx +174 -0
  119. package/src/components/sticky-accordion-header.tsx +1 -1
  120. package/src/components/switch.css +136 -0
  121. package/src/components/switch.tsx +29 -0
  122. package/src/{navigation/tabs → components}/tabs.css +232 -53
  123. package/src/components/tabs.tsx +126 -0
  124. package/src/components/tag.css +37 -0
  125. package/src/components/tag.tsx +22 -0
  126. package/src/components/text-field.tsx +4 -12
  127. package/src/{typography/text-shimmer → components}/text-shimmer.css +1 -2
  128. package/src/{typography/text-shimmer → components}/text-shimmer.tsx +0 -1
  129. package/src/components/toast.css +236 -0
  130. package/src/components/toast.tsx +185 -0
  131. package/src/components/tooltip.css +74 -0
  132. package/src/components/tooltip.tsx +163 -0
  133. package/src/context/dialog.tsx +0 -1
  134. package/src/context/i18n.tsx +14 -17
  135. package/src/context/marked-parser.tsx +13 -3
  136. package/src/hooks/create-auto-scroll.tsx +0 -20
  137. package/src/i18n/am.ts +9 -7
  138. package/src/i18n/ar.ts +9 -7
  139. package/src/i18n/az.ts +9 -7
  140. package/src/i18n/bg.ts +9 -7
  141. package/src/i18n/bn.ts +9 -7
  142. package/src/i18n/br.ts +9 -7
  143. package/src/i18n/bs.ts +9 -7
  144. package/src/i18n/ca.ts +9 -7
  145. package/src/i18n/cs.ts +9 -7
  146. package/src/i18n/da.ts +9 -7
  147. package/src/i18n/de.ts +3 -1
  148. package/src/i18n/dv.ts +9 -7
  149. package/src/i18n/dz.ts +7 -5
  150. package/src/i18n/el.ts +9 -7
  151. package/src/i18n/en.ts +12 -59
  152. package/src/i18n/es.ts +8 -6
  153. package/src/i18n/et.ts +9 -7
  154. package/src/i18n/fa.ts +9 -7
  155. package/src/i18n/fi.ts +9 -7
  156. package/src/i18n/fo.ts +9 -7
  157. package/src/i18n/fr.ts +8 -6
  158. package/src/i18n/hi.ts +9 -7
  159. package/src/i18n/hr.ts +9 -7
  160. package/src/i18n/hu.ts +9 -7
  161. package/src/i18n/hy.ts +9 -7
  162. package/src/i18n/id.ts +9 -7
  163. package/src/i18n/is.ts +9 -7
  164. package/src/i18n/it.ts +9 -7
  165. package/src/i18n/ja.ts +9 -7
  166. package/src/i18n/ka.ts +9 -7
  167. package/src/i18n/km.ts +9 -7
  168. package/src/i18n/ko.ts +9 -7
  169. package/src/i18n/lo.ts +9 -7
  170. package/src/i18n/lt.ts +9 -7
  171. package/src/i18n/lv.ts +9 -7
  172. package/src/i18n/mk.ts +9 -7
  173. package/src/i18n/mn.ts +9 -7
  174. package/src/i18n/ms.ts +9 -7
  175. package/src/i18n/my.ts +9 -7
  176. package/src/i18n/ne.ts +9 -7
  177. package/src/i18n/nl.ts +9 -7
  178. package/src/i18n/no.ts +9 -7
  179. package/src/i18n/pa.ts +9 -7
  180. package/src/i18n/pl.ts +9 -7
  181. package/src/i18n/ro.ts +9 -7
  182. package/src/i18n/ru.ts +9 -7
  183. package/src/i18n/si.ts +9 -7
  184. package/src/i18n/sk.ts +9 -7
  185. package/src/i18n/sl.ts +9 -7
  186. package/src/i18n/sq.ts +9 -7
  187. package/src/i18n/sr.ts +9 -7
  188. package/src/i18n/sv.ts +9 -7
  189. package/src/i18n/tg.ts +9 -7
  190. package/src/i18n/th.ts +9 -7
  191. package/src/i18n/tk.ts +9 -7
  192. package/src/i18n/tr.ts +9 -7
  193. package/src/i18n/uk.ts +9 -7
  194. package/src/i18n/ur.ts +9 -7
  195. package/src/i18n/uz.ts +9 -7
  196. package/src/i18n/vi.ts +9 -7
  197. package/src/i18n/zh.ts +9 -7
  198. package/src/i18n/zht.ts +9 -7
  199. package/src/styles/base.css +0 -5
  200. package/src/styles/index.css +20 -4
  201. package/src/styles/tailwind/colors.css +0 -2
  202. package/src/styles/tailwind/index.css +1 -18
  203. package/src/styles/theme.css +2 -2
  204. package/src/theme/context.tsx +11 -19
  205. package/src/theme/themes/oc-2.json +19 -50
  206. package/src/theme/v2/default-primitives.ts +8 -8
  207. package/src/theme/v2/foreground.ts +0 -1
  208. package/src/theme/v2/mapping.ts +1 -7
  209. package/src/v2/components/accordion-v2.css +139 -0
  210. package/src/v2/components/accordion-v2.tsx +86 -0
  211. package/src/{data-display/avatar/avatar.tsx → v2/components/avatar-v2.tsx} +1 -1
  212. package/src/{data-display/badge/badge.css → v2/components/badge-v2.css} +0 -19
  213. package/src/{data-display/badge/badge.tsx → v2/components/badge-v2.tsx} +4 -6
  214. package/src/{actions/button/button.css → v2/components/button-v2.css} +0 -30
  215. package/src/v2/components/button-v2.tsx +35 -0
  216. package/src/v2/components/checkbox-v2.css +184 -0
  217. package/src/v2/components/checkbox-v2.tsx +65 -0
  218. package/src/{overlays/dialog/dialog.css → v2/components/dialog-v2.css} +0 -3
  219. package/src/{overlays/dialog/dialog.tsx → v2/components/dialog-v2.tsx} +13 -11
  220. package/src/v2/components/diff-changes-v2.css +26 -0
  221. package/src/{data-display/diff-changes/diff-changes.tsx → v2/components/diff-changes-v2.tsx} +2 -7
  222. package/src/{layout/divider/divider.tsx → v2/components/divider-v2.tsx} +3 -3
  223. package/src/{forms/field/field.css → v2/components/field-v2.css} +1 -1
  224. package/src/{forms/field/field.tsx → v2/components/field-v2.tsx} +11 -9
  225. package/src/{styles/file-tree.css → v2/components/file-tree-v2.css} +3 -64
  226. package/src/{actions/icon-button/icon-button.css → v2/components/icon-button-v2.css} +9 -27
  227. package/src/v2/components/icon-button-v2.tsx +37 -0
  228. package/src/{icons/icon → v2/components}/icon.tsx +12 -88
  229. package/src/v2/components/inline-input-v2.css +225 -0
  230. package/src/v2/components/inline-input-v2.tsx +107 -0
  231. package/src/{data-display/keybind/keybind.css → v2/components/keybind-v2.css} +1 -1
  232. package/src/{data-display/keybind/keybind.tsx → v2/components/keybind-v2.tsx} +3 -3
  233. package/src/{data-display/line-comment/line-comment.css → v2/components/line-comment-v2.css} +4 -4
  234. package/src/{data-display/line-comment/line-comment.tsx → v2/components/line-comment-v2.tsx} +15 -17
  235. package/src/{feedback/loader/loader.tsx → v2/components/loader-v2.tsx} +2 -2
  236. package/src/{navigation/menu/menu.css → v2/components/menu-v2.css} +2 -124
  237. package/src/{navigation/menu/menu.tsx → v2/components/menu-v2.tsx} +32 -96
  238. package/src/v2/components/progress-circle-v2.css +13 -0
  239. package/src/v2/components/progress-circle-v2.tsx +52 -0
  240. package/src/{data-display/project-avatar/project-avatar.css → v2/components/project-avatar-v2.css} +4 -4
  241. package/src/{data-display/project-avatar/project-avatar.tsx → v2/components/project-avatar-v2.tsx} +1 -1
  242. package/src/{forms/radio/radio.tsx → v2/components/radio-v2.tsx} +20 -30
  243. package/src/{navigation/segmented-control/segmented-control.css → v2/components/segmented-control-v2.css} +1 -1
  244. package/src/{navigation/segmented-control/segmented-control.tsx → v2/components/segmented-control-v2.tsx} +8 -9
  245. package/src/{forms/select/select.css → v2/components/select-v2.css} +8 -2
  246. package/src/{forms/select/select.tsx → v2/components/select-v2.tsx} +32 -42
  247. package/src/{actions/split-button/split-button.css → v2/components/split-button-v2.css} +6 -2
  248. package/src/{actions/split-button/split-button.tsx → v2/components/split-button-v2.tsx} +4 -4
  249. package/src/{forms/switch/switch.css → v2/components/switch-v2.css} +0 -110
  250. package/src/v2/components/switch-v2.tsx +28 -0
  251. package/src/{navigation/tabs/tabs-current.css → v2/components/tabs-v2.css} +10 -25
  252. package/src/v2/components/tabs-v2.tsx +149 -0
  253. package/src/{forms/text-input/text-input.css → v2/components/text-input-v2.css} +3 -3
  254. package/src/{forms/text-input/text-input.tsx → v2/components/text-input-v2.tsx} +4 -4
  255. package/src/v2/components/text-shimmer-v2.css +125 -0
  256. package/src/v2/components/text-shimmer-v2.tsx +63 -0
  257. package/src/{forms/textarea/textarea.tsx → v2/components/textarea-v2.tsx} +3 -3
  258. package/src/{feedback/toast/toast.tsx → v2/components/toast-v2.tsx} +58 -60
  259. package/src/{overlays/tooltip/tooltip.css → v2/components/tooltip-v2.css} +0 -33
  260. package/src/{overlays/tooltip/tooltip.tsx → v2/components/tooltip-v2.tsx} +17 -24
  261. package/src/v2/components/wordmark-v2.tsx +71 -0
  262. package/src/{styles/tokens → v2/styles}/colors.css +8 -8
  263. package/src/{styles/tokens → v2/styles}/theme.css +16 -23
  264. package/dist/actions/button/button.d.ts +0 -10
  265. package/dist/actions/icon-button/icon-button.d.ts +0 -11
  266. package/dist/actions/split-button/split-button.d.ts +0 -5
  267. package/dist/context/marked-base.d.ts +0 -3
  268. package/dist/data-display/badge/badge.d.ts +0 -7
  269. package/dist/data-display/keybind/keybind.d.ts +0 -7
  270. package/dist/feedback/loader/loader.d.ts +0 -3
  271. package/dist/feedback/toast/toast.d.ts +0 -57
  272. package/dist/forms/radio/radio.d.ts +0 -16
  273. package/dist/forms/textarea/textarea.d.ts +0 -7
  274. package/dist/i18n/he.d.ts +0 -197
  275. package/dist/layout/divider/divider.d.ts +0 -5
  276. package/dist/navigation/menu/menu.d.ts +0 -59
  277. package/dist/overlays/tooltip/tooltip.d.ts +0 -15
  278. package/dist/typography/wordmark/wordmark.d.ts +0 -5
  279. package/src/actions/icon-button/icon-button.tsx +0 -32
  280. package/src/context/marked-base.tsx +0 -27
  281. package/src/feedback/progress-circle/progress-circle.css +0 -28
  282. package/src/feedback/progress-circle/progress-circle.tsx +0 -64
  283. package/src/forms/switch/switch.tsx +0 -34
  284. package/src/i18n/he.ts +0 -199
  285. package/src/icons/icon/icon.css +0 -3
  286. package/src/navigation/tabs/tabs.tsx +0 -194
  287. package/src/typography/wordmark/wordmark.tsx +0 -39
  288. /package/dist/{forms/inline-input → components}/inline-input.d.ts +0 -0
  289. /package/dist/{navigation → v2/components}/tab-state-indicator.d.ts +0 -0
  290. /package/src/{forms/inline-input → components}/inline-input.css +0 -0
  291. /package/src/{forms/inline-input → components}/inline-input.tsx +0 -0
  292. /package/src/{data-display/avatar/avatar.css → v2/components/avatar-v2.css} +0 -0
  293. /package/src/{layout/divider/divider.css → v2/components/divider-v2.css} +0 -0
  294. /package/src/{feedback/loader/loader.css → v2/components/loader-v2.css} +0 -0
  295. /package/src/{forms/radio/radio.css → v2/components/radio-v2.css} +0 -0
  296. /package/src/{navigation → v2/components}/tab-state-indicator.tsx +0 -0
  297. /package/src/{forms/textarea/textarea.css → v2/components/textarea-v2.css} +0 -0
  298. /package/src/{feedback/toast/toast.css → v2/components/toast-v2.css} +0 -0
  299. /package/src/{styles/tokens/index.css → v2/styles/tailwind.css} +0 -0
@@ -0,0 +1,107 @@
1
+ import { type ComponentProps, type JSX, Show, splitProps } from "solid-js"
2
+ import { Icon } from "./icon"
3
+ import { useI18n } from "../../context/i18n"
4
+ import "./inline-input-v2.css"
5
+
6
+ export interface InlineInputV2Props extends Omit<ComponentProps<"input">, "type" | "prefix"> {
7
+ /** Inline label shown before the field (prefix segment). */
8
+ prefix: JSX.Element
9
+ /** Fixed width for the prefix segment (px number or CSS length). Omit for fit-content. */
10
+ labelWidth?: number | string
11
+ /** Show the trailing copy action. */
12
+ showCopyButton?: boolean
13
+ /** Accessible label for the copy button. */
14
+ copyLabel?: string
15
+ onCopyClick?: (event: MouseEvent) => void
16
+ /** Apply tabular numerals to the prefix and field value. */
17
+ numeric?: boolean
18
+ /** Error styling for the field and value text. */
19
+ invalid?: boolean
20
+ /** `base` is 28px tall; `large` is 32px tall. */
21
+ appearance?: "base" | "large"
22
+ type?: ComponentProps<"input">["type"]
23
+ }
24
+
25
+ export function InlineInputV2(props: InlineInputV2Props) {
26
+ const i18n = useI18n()
27
+ const [local, inputProps] = splitProps(props, [
28
+ "class",
29
+ "classList",
30
+ "prefix",
31
+ "labelWidth",
32
+ "showCopyButton",
33
+ "copyLabel",
34
+ "onCopyClick",
35
+ "numeric",
36
+ "invalid",
37
+ "appearance",
38
+ "disabled",
39
+ "style",
40
+ ])
41
+
42
+ let input: HTMLInputElement | undefined
43
+
44
+ return (
45
+ <div
46
+ data-component="inline-input-v2"
47
+ data-disabled={local.disabled ? "" : undefined}
48
+ data-invalid={local.invalid ? "" : undefined}
49
+ data-numeric={local.numeric ? "" : undefined}
50
+ data-appearance={local.appearance ?? "base"}
51
+ data-label-width={local.labelWidth != null ? "" : undefined}
52
+ classList={{
53
+ ...local.classList,
54
+ [local.class ?? ""]: !!local.class,
55
+ }}
56
+ style={{
57
+ ...(typeof local.style === "object" && local.style != null ? local.style : {}),
58
+ ...(local.labelWidth != null
59
+ ? {
60
+ "--inline-input-v2-label-width":
61
+ typeof local.labelWidth === "number" ? `${local.labelWidth}px` : local.labelWidth,
62
+ }
63
+ : {}),
64
+ }}
65
+ >
66
+ <div
67
+ data-slot="inline-input-v2-prefix"
68
+ onMouseDown={(event) => {
69
+ if (local.disabled || event.button !== 0) return
70
+ // Keep focus on the input without using a native <label>, so external labels still work.
71
+ event.preventDefault()
72
+ input?.focus()
73
+ }}
74
+ >
75
+ <span data-slot="inline-input-v2-prefix-text">{local.prefix}</span>
76
+ </div>
77
+ <div data-slot="inline-input-v2-divider" aria-hidden="true" />
78
+ <div data-slot="inline-input-v2-field">
79
+ <div data-slot="inline-input-v2-value">
80
+ <input
81
+ {...inputProps}
82
+ ref={(el) => {
83
+ input = el
84
+ const ref = inputProps.ref
85
+ if (typeof ref === "function") ref(el)
86
+ }}
87
+ type={inputProps.type ?? "text"}
88
+ disabled={local.disabled}
89
+ aria-invalid={local.invalid ? true : undefined}
90
+ data-slot="inline-input-v2-input"
91
+ />
92
+ </div>
93
+ <Show when={local.showCopyButton}>
94
+ <button
95
+ type="button"
96
+ data-slot="inline-input-v2-icon-button"
97
+ aria-label={local.copyLabel ?? i18n.t("ui.message.copy")}
98
+ disabled={local.disabled}
99
+ onClick={local.onCopyClick}
100
+ >
101
+ <Icon name="copy" />
102
+ </button>
103
+ </Show>
104
+ </div>
105
+ </div>
106
+ )
107
+ }
@@ -27,7 +27,6 @@
27
27
  justify-content: center;
28
28
  align-items: center;
29
29
  padding: 0;
30
- padding-inline: 4px;
31
30
  gap: 4px;
32
31
  min-width: 14px;
33
32
  height: 14px;
@@ -49,6 +48,7 @@
49
48
  flex-direction: row;
50
49
  justify-content: center;
51
50
  align-items: center;
51
+ min-width: 14px;
52
52
  height: 11px;
53
53
  padding: 0;
54
54
  flex: none;
@@ -1,12 +1,12 @@
1
1
  import { type ComponentProps, For, splitProps } from "solid-js"
2
- import "./keybind.css"
2
+ import "./keybind-v2.css"
3
3
 
4
- export interface KeybindProps extends ComponentProps<"div"> {
4
+ export interface KeybindV2Props extends ComponentProps<"div"> {
5
5
  keys: string[]
6
6
  variant?: "neutral" | "ghost"
7
7
  }
8
8
 
9
- export function Keybind(props: KeybindProps) {
9
+ export function KeybindV2(props: KeybindV2Props) {
10
10
  const [local, rest] = splitProps(props, ["keys", "variant", "class", "classList"])
11
11
  return (
12
12
  <div
@@ -49,7 +49,7 @@
49
49
  font-size: 13px;
50
50
  font-style: normal;
51
51
  font-weight: 440;
52
- line-height: var(--line-height-compact);
52
+ line-height: 1;
53
53
  letter-spacing: -0.04px;
54
54
  color: var(--v2-text-text-base);
55
55
  font-variation-settings: "slnt" 0;
@@ -59,7 +59,7 @@
59
59
  font-size: 11px;
60
60
  font-style: normal;
61
61
  font-weight: 530;
62
- line-height: var(--line-height-tight);
62
+ line-height: 1;
63
63
  letter-spacing: 0.05px;
64
64
  color: var(--v2-text-text-faint);
65
65
  font-variation-settings: "slnt" 0;
@@ -103,7 +103,7 @@
103
103
  background-color: var(--v2-overlay-simple-overlay-hover);
104
104
  }
105
105
 
106
- [data-slot="line-comment-v2-overflow"]:is(:active, [data-state="pressed"], [data-expanded]) {
106
+ [data-slot="line-comment-v2-overflow"]:is(:active, [data-state="pressed"]) {
107
107
  background-color: var(--v2-overlay-simple-overlay-pressed);
108
108
  }
109
109
 
@@ -138,7 +138,7 @@
138
138
  font-size: 13px;
139
139
  font-style: normal;
140
140
  font-weight: 530;
141
- line-height: var(--line-height-compact);
141
+ line-height: 1;
142
142
  letter-spacing: -0.04px;
143
143
  color: var(--v2-text-text-base);
144
144
  user-select: none;
@@ -1,12 +1,12 @@
1
1
  import { For, Show, createSignal, onMount, splitProps, type ComponentProps, type JSX } from "solid-js"
2
- import { FileIcon } from "@opencode-ai/ui/file-icon"
2
+ import { FileIcon } from "../../components/file-icon"
3
3
  import { useI18n } from "../../context/i18n"
4
4
  import { useFilteredList } from "../../hooks"
5
- import { Button } from "@opencode-ai/ui/button"
6
- import "./line-comment.css"
5
+ import { ButtonV2 } from "./button-v2"
6
+ import "./line-comment-v2.css"
7
7
 
8
8
  /** Horizontal “more” glyph for the display-card overflow control (Figma outline-dots). */
9
- export function LineCommentOverflowIcon(props: ComponentProps<"svg">) {
9
+ export function LineCommentV2OverflowIcon(props: ComponentProps<"svg">) {
10
10
  return (
11
11
  <svg
12
12
  {...props}
@@ -24,16 +24,16 @@ export function LineCommentOverflowIcon(props: ComponentProps<"svg">) {
24
24
  )
25
25
  }
26
26
 
27
- export interface LineCommentProps extends ComponentProps<"div"> {
27
+ export interface LineCommentV2Props extends ComponentProps<"div"> {
28
28
  /** Main comment body (text or rich content). */
29
29
  comment: JSX.Element
30
30
  /** Line / selection context (e.g. “Comment on line 40”). */
31
31
  selection: JSX.Element
32
- /** Typically an overflow menu trigger; use `LineCommentOverflowIcon` inside `line-comment-v2-overflow`. */
32
+ /** Typically an overflow menu trigger; use `LineCommentV2OverflowIcon` inside `line-comment-v2-overflow`. */
33
33
  actions?: JSX.Element
34
34
  }
35
35
 
36
- export function LineComment(props: LineCommentProps) {
36
+ export function LineCommentV2(props: LineCommentV2Props) {
37
37
  const [local, rest] = splitProps(props, ["comment", "selection", "actions", "class", "classList"])
38
38
  return (
39
39
  <div
@@ -56,11 +56,11 @@ export function LineComment(props: LineCommentProps) {
56
56
  )
57
57
  }
58
58
 
59
- export type LineCommentEditorMention = {
59
+ export type LineCommentEditorV2Mention = {
60
60
  items: (query: string) => string[] | Promise<string[]>
61
61
  }
62
62
 
63
- export interface LineCommentEditorProps extends Omit<ComponentProps<"div">, "children" | "onInput" | "onSubmit"> {
63
+ export interface LineCommentEditorV2Props extends Omit<ComponentProps<"div">, "children" | "onInput" | "onSubmit"> {
64
64
  /** Visible field label above the textarea (default: “Comment”). */
65
65
  heading?: JSX.Element | string
66
66
  value: string
@@ -73,7 +73,7 @@ export interface LineCommentEditorProps extends Omit<ComponentProps<"div">, "chi
73
73
  cancelLabel?: string
74
74
  submitLabel?: string
75
75
  autofocus?: boolean
76
- mention?: LineCommentEditorMention
76
+ mention?: LineCommentEditorV2Mention
77
77
  }
78
78
 
79
79
  function pathFilename(path: string) {
@@ -86,7 +86,7 @@ function pathDirectory(path: string) {
86
86
  return index === -1 ? "" : path.slice(0, index + 1)
87
87
  }
88
88
 
89
- export function LineCommentEditor(props: LineCommentEditorProps) {
89
+ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
90
90
  const i18n = useI18n()
91
91
  let textareaRef: HTMLTextAreaElement | undefined
92
92
  const [mentionOpen, setMentionOpen] = createSignal(false)
@@ -212,11 +212,9 @@ export function LineCommentEditor(props: LineCommentEditorProps) {
212
212
  textareaRef = el
213
213
  }}
214
214
  data-slot="line-comment-v2-textarea"
215
- dir="auto"
216
215
  rows={local.rows ?? 3}
217
216
  placeholder={local.placeholder ?? i18n.t("ui.lineComment.contextPlaceholder")}
218
217
  value={local.value}
219
- style={{ "unicode-bidi": "plaintext", "text-align": "start" }}
220
218
  onInput={(e) => {
221
219
  local.onInput(e.currentTarget.value)
222
220
  syncMention()
@@ -294,12 +292,12 @@ export function LineCommentEditor(props: LineCommentEditorProps) {
294
292
  <div data-slot="line-comment-v2-footer">
295
293
  <div data-slot="line-comment-v2-footer-meta">{local.selection}</div>
296
294
  <div data-slot="line-comment-v2-footer-actions">
297
- <Button type="button" size="normal" variant="ghost" onClick={() => local.onCancel()}>
295
+ <ButtonV2 type="button" size="normal" variant="neutral" onClick={() => local.onCancel()}>
298
296
  {local.cancelLabel ?? i18n.t("ui.lineComment.cancel")}
299
- </Button>
300
- <Button type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
297
+ </ButtonV2>
298
+ <ButtonV2 type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
301
299
  {local.submitLabel ?? i18n.t("ui.lineComment.submit")}
302
- </Button>
300
+ </ButtonV2>
303
301
  </div>
304
302
  </div>
305
303
  </div>
@@ -1,7 +1,7 @@
1
1
  import { splitProps, type ComponentProps } from "solid-js"
2
- import "./loader.css"
2
+ import "./loader-v2.css"
3
3
 
4
- export function Loader(props: ComponentProps<"svg">) {
4
+ export function LoaderV2(props: ComponentProps<"svg">) {
5
5
  const [local, rest] = splitProps(props, ["class", "classList", "width", "height"])
6
6
  return (
7
7
  <svg
@@ -31,10 +31,6 @@
31
31
  }
32
32
  }
33
33
 
34
- :dir(rtl) [data-slot="menu-v2-item-chevron"] {
35
- transform: scaleX(-1);
36
- }
37
-
38
34
  [data-component="menu-v2-item"] {
39
35
  --menu-v2-fg: var(--v2-text-text-base);
40
36
  --menu-v2-fg-muted: var(--v2-text-text-faint);
@@ -51,13 +47,11 @@
51
47
 
52
48
  box-sizing: border-box;
53
49
  display: flex;
54
- flex-shrink: 0;
55
50
  flex-direction: row;
56
51
  align-items: center;
57
52
  gap: 8px;
58
53
  height: 28px;
59
54
  padding: 0 12px;
60
- padding-inline-end: 6px;
61
55
  background: transparent;
62
56
  border-radius: 4px;
63
57
  outline: none;
@@ -78,7 +72,7 @@
78
72
 
79
73
  font-size: 13px;
80
74
  font-weight: 440;
81
- line-height: var(--line-height-compact);
75
+ line-height: 100%;
82
76
  letter-spacing: -0.04px;
83
77
  color: var(--menu-v2-fg);
84
78
  }
@@ -177,129 +171,13 @@
177
171
 
178
172
  font-size: 11px;
179
173
  font-weight: 530;
174
+ line-height: 100%;
180
175
  letter-spacing: 0.05px;
181
176
  color: var(--v2-text-text-faint);
182
177
  user-select: none;
183
178
  font-variant-numeric: tabular-nums;
184
179
  }
185
180
 
186
- [data-component="menu-v2-content"][data-appearance="standard"] {
187
- min-width: 8rem;
188
- padding: 4px;
189
- overflow: hidden;
190
- border: 1px solid color-mix(in oklch, var(--border-base) 50%, transparent);
191
- border-radius: var(--radius-md);
192
- background: var(--surface-raised-stronger-non-alpha);
193
- background-clip: padding-box;
194
- box-shadow: var(--shadow-md);
195
- z-index: 60;
196
- animation: dropdown-menu-open 150ms ease-out;
197
-
198
- &[data-closed] {
199
- animation: dropdown-menu-close 150ms ease-out;
200
- }
201
-
202
- [data-component="menu-v2-item"] {
203
- position: relative;
204
- height: auto;
205
- min-height: 0;
206
- padding: 4px 8px;
207
- border-radius: var(--radius-sm);
208
- color: var(--text-strong);
209
- font-family: var(--font-family-sans);
210
- font-size: var(--font-size-small);
211
- font-weight: var(--font-weight-medium);
212
- line-height: var(--line-height-large);
213
- letter-spacing: var(--letter-spacing-normal);
214
- font-variant-numeric: normal;
215
- -webkit-font-smoothing: auto;
216
- text-rendering: auto;
217
-
218
- [data-slot="menu-v2-item-content"] {
219
- font-family: inherit;
220
- font-size: inherit;
221
- font-weight: inherit;
222
- line-height: inherit;
223
- letter-spacing: inherit;
224
- color: inherit;
225
- }
226
-
227
- &[data-highlighted] {
228
- background: var(--surface-raised-base-hover);
229
- }
230
-
231
- &[data-disabled] {
232
- color: var(--text-weak);
233
- opacity: 1;
234
- }
235
-
236
- &[data-checked] {
237
- padding-inline-end: 28px;
238
- }
239
-
240
- &[data-checked] [data-slot="menu-v2-item-content"] {
241
- font-weight: inherit;
242
- color: inherit;
243
- }
244
-
245
- [data-slot="menu-v2-item-indicator"] {
246
- position: absolute;
247
- inset-inline-end: 8px;
248
- top: 50%;
249
- width: 16px;
250
- height: 16px;
251
- transform: translateY(-50%);
252
- color: var(--icon-base);
253
- }
254
-
255
- [data-slot="menu-v2-item-chevron"] {
256
- margin-inline-start: auto;
257
- color: var(--icon-base);
258
- }
259
- }
260
-
261
- [data-slot="menu-v2-separator"] {
262
- width: calc(100% + 8px);
263
- height: 1px;
264
- margin: 4px -4px;
265
- background: var(--border-weak-base);
266
- }
267
-
268
- [data-slot="menu-v2-group-label"] {
269
- height: auto;
270
- padding: 4px 8px;
271
- color: var(--text-weak);
272
- font-family: var(--font-family-sans);
273
- font-size: var(--font-size-x-small);
274
- font-weight: var(--font-weight-medium);
275
- line-height: var(--line-height-large);
276
- letter-spacing: var(--letter-spacing-normal);
277
- font-variant-numeric: normal;
278
- }
279
- }
280
-
281
- @keyframes dropdown-menu-open {
282
- from {
283
- opacity: 0;
284
- transform: scale(0.96);
285
- }
286
- to {
287
- opacity: 1;
288
- transform: scale(1);
289
- }
290
- }
291
-
292
- @keyframes dropdown-menu-close {
293
- from {
294
- opacity: 1;
295
- transform: scale(1);
296
- }
297
- to {
298
- opacity: 0;
299
- transform: scale(0.96);
300
- }
301
- }
302
-
303
181
  @keyframes menu-v2-in {
304
182
  from {
305
183
  opacity: 0;