@opencode-ai/ui 0.0.0-dev-202609010135 → 0.0.0-dev-18786

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 (295) 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 +3 -3
  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} +4 -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 +230 -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 +24 -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 +2 -0
  63. package/package.json +140 -34
  64. package/src/{components → actions/button}/button.tsx +10 -11
  65. package/src/actions/icon-button/icon-button.tsx +32 -0
  66. package/src/{v2/components/split-button-v2.css → actions/split-button/split-button.css} +1 -6
  67. package/src/{v2/components/split-button-v2.tsx → actions/split-button/split-button.tsx} +4 -4
  68. package/src/components/animated-number.css +29 -11
  69. package/src/components/animated-number.tsx +2 -2
  70. package/src/components/card.css +2 -23
  71. package/src/components/card.tsx +4 -4
  72. package/src/components/collapsible.tsx +2 -2
  73. package/src/components/dock-surface.css +2 -9
  74. package/src/components/image-preview.tsx +3 -2
  75. package/src/components/list.css +5 -5
  76. package/src/components/list.tsx +7 -5
  77. package/src/components/popover.tsx +3 -2
  78. package/src/components/scroll-view.tsx +5 -20
  79. package/src/components/sticky-accordion-header.tsx +1 -1
  80. package/src/components/text-field.tsx +12 -4
  81. package/src/context/dialog.tsx +1 -0
  82. package/src/context/i18n.tsx +17 -14
  83. package/src/context/marked-base.tsx +27 -0
  84. package/src/context/marked-parser.tsx +3 -13
  85. package/src/{components → data-display/accordion}/accordion.css +5 -31
  86. package/src/{components → data-display/accordion}/accordion.tsx +14 -14
  87. package/src/{v2/components/avatar-v2.tsx → data-display/avatar/avatar.tsx} +1 -1
  88. package/src/{v2/components/badge-v2.css → data-display/badge/badge.css} +19 -0
  89. package/src/{v2/components/badge-v2.tsx → data-display/badge/badge.tsx} +6 -4
  90. package/src/{components → data-display/diff-changes}/diff-changes.css +22 -19
  91. package/src/{v2/components/diff-changes-v2.tsx → data-display/diff-changes/diff-changes.tsx} +7 -2
  92. package/src/{v2/components/keybind-v2.css → data-display/keybind/keybind.css} +1 -1
  93. package/src/{v2/components/keybind-v2.tsx → data-display/keybind/keybind.tsx} +3 -3
  94. package/src/{v2/components/line-comment-v2.css → data-display/line-comment/line-comment.css} +3 -3
  95. package/src/{v2/components/line-comment-v2.tsx → data-display/line-comment/line-comment.tsx} +17 -15
  96. package/src/{v2/components/project-avatar-v2.tsx → data-display/project-avatar/project-avatar.tsx} +1 -1
  97. package/src/{v2/components/loader-v2.tsx → feedback/loader/loader.tsx} +2 -2
  98. package/src/feedback/progress-circle/progress-circle.css +28 -0
  99. package/src/feedback/progress-circle/progress-circle.tsx +64 -0
  100. package/src/{v2/components/toast-v2.tsx → feedback/toast/toast.tsx} +60 -58
  101. package/src/{components → forms/checkbox}/checkbox.css +1 -7
  102. package/src/{components → forms/checkbox}/checkbox.tsx +13 -13
  103. package/src/{v2/components/field-v2.css → forms/field/field.css} +1 -1
  104. package/src/{v2/components/field-v2.tsx → forms/field/field.tsx} +9 -11
  105. package/src/{v2/components/radio-v2.tsx → forms/radio/radio.tsx} +30 -20
  106. package/src/{v2/components/select-v2.css → forms/select/select.css} +2 -8
  107. package/src/{v2/components/select-v2.tsx → forms/select/select.tsx} +38 -32
  108. package/src/{v2/components/switch-v2.css → forms/switch/switch.css} +110 -0
  109. package/src/forms/switch/switch.tsx +34 -0
  110. package/src/{v2/components/text-input-v2.css → forms/text-input/text-input.css} +1 -1
  111. package/src/{v2/components/text-input-v2.tsx → forms/text-input/text-input.tsx} +4 -4
  112. package/src/{v2/components/textarea-v2.tsx → forms/textarea/textarea.tsx} +3 -3
  113. package/src/hooks/create-auto-scroll.tsx +20 -0
  114. package/src/i18n/am.ts +1 -3
  115. package/src/i18n/ar.ts +1 -3
  116. package/src/i18n/az.ts +1 -3
  117. package/src/i18n/bg.ts +1 -3
  118. package/src/i18n/bn.ts +1 -3
  119. package/src/i18n/br.ts +1 -3
  120. package/src/i18n/bs.ts +1 -3
  121. package/src/i18n/ca.ts +1 -3
  122. package/src/i18n/cs.ts +1 -3
  123. package/src/i18n/da.ts +1 -3
  124. package/src/i18n/de.ts +1 -3
  125. package/src/i18n/dv.ts +1 -3
  126. package/src/i18n/dz.ts +1 -3
  127. package/src/i18n/el.ts +1 -3
  128. package/src/i18n/en.ts +40 -5
  129. package/src/i18n/es.ts +1 -3
  130. package/src/i18n/et.ts +1 -3
  131. package/src/i18n/fa.ts +1 -3
  132. package/src/i18n/fi.ts +1 -3
  133. package/src/i18n/fo.ts +1 -3
  134. package/src/i18n/fr.ts +1 -3
  135. package/src/i18n/he.ts +199 -0
  136. package/src/i18n/hi.ts +1 -3
  137. package/src/i18n/hr.ts +1 -3
  138. package/src/i18n/hu.ts +1 -3
  139. package/src/i18n/hy.ts +1 -3
  140. package/src/i18n/id.ts +1 -3
  141. package/src/i18n/is.ts +1 -3
  142. package/src/i18n/it.ts +1 -3
  143. package/src/i18n/ja.ts +1 -3
  144. package/src/i18n/ka.ts +1 -3
  145. package/src/i18n/km.ts +1 -3
  146. package/src/i18n/ko.ts +1 -3
  147. package/src/i18n/lo.ts +1 -3
  148. package/src/i18n/lt.ts +1 -3
  149. package/src/i18n/lv.ts +1 -3
  150. package/src/i18n/mk.ts +1 -3
  151. package/src/i18n/mn.ts +1 -3
  152. package/src/i18n/ms.ts +1 -3
  153. package/src/i18n/my.ts +1 -3
  154. package/src/i18n/ne.ts +1 -3
  155. package/src/i18n/nl.ts +1 -3
  156. package/src/i18n/no.ts +1 -3
  157. package/src/i18n/pa.ts +1 -3
  158. package/src/i18n/pl.ts +1 -3
  159. package/src/i18n/ro.ts +1 -3
  160. package/src/i18n/ru.ts +1 -3
  161. package/src/i18n/si.ts +1 -3
  162. package/src/i18n/sk.ts +1 -3
  163. package/src/i18n/sl.ts +1 -3
  164. package/src/i18n/sq.ts +1 -3
  165. package/src/i18n/sr.ts +1 -3
  166. package/src/i18n/sv.ts +1 -3
  167. package/src/i18n/tg.ts +1 -3
  168. package/src/i18n/th.ts +1 -3
  169. package/src/i18n/tk.ts +1 -3
  170. package/src/i18n/tr.ts +1 -3
  171. package/src/i18n/uk.ts +1 -3
  172. package/src/i18n/ur.ts +1 -3
  173. package/src/i18n/uz.ts +1 -3
  174. package/src/i18n/vi.ts +1 -3
  175. package/src/i18n/zh.ts +1 -3
  176. package/src/i18n/zht.ts +1 -3
  177. package/src/{components/icon.tsx → icons/icon/additional-icons.ts} +8 -74
  178. package/src/icons/icon/icon.css +3 -0
  179. package/src/{v2/components → icons/icon}/icon.tsx +50 -9
  180. package/src/{v2/components/divider-v2.tsx → layout/divider/divider.tsx} +3 -3
  181. package/src/{v2/components/menu-v2.css → navigation/menu/menu.css} +123 -2
  182. package/src/{v2/components/menu-v2.tsx → navigation/menu/menu.tsx} +96 -32
  183. package/src/{v2/components/segmented-control-v2.css → navigation/segmented-control/segmented-control.css} +1 -1
  184. package/src/{v2/components/segmented-control-v2.tsx → navigation/segmented-control/segmented-control.tsx} +9 -8
  185. package/src/{v2/components/tabs-v2.css → navigation/tabs/tabs-current.css} +25 -10
  186. package/src/{components → navigation/tabs}/tabs.css +39 -229
  187. package/src/navigation/tabs/tabs.tsx +194 -0
  188. package/src/{v2/components/dialog-v2.css → overlays/dialog/dialog.css} +3 -0
  189. package/src/{v2/components/dialog-v2.tsx → overlays/dialog/dialog.tsx} +11 -13
  190. package/src/{v2/components/tooltip-v2.css → overlays/tooltip/tooltip.css} +26 -0
  191. package/src/{v2/components/tooltip-v2.tsx → overlays/tooltip/tooltip.tsx} +24 -17
  192. package/src/styles/base.css +5 -0
  193. package/src/styles/index.css +4 -20
  194. package/src/styles/tailwind/colors.css +1 -0
  195. package/src/styles/tailwind/index.css +18 -1
  196. package/src/styles/theme.css +2 -2
  197. package/src/{v2/styles → styles/tokens}/theme.css +10 -14
  198. package/src/theme/context.tsx +19 -11
  199. package/src/theme/themes/oc-2.json +3 -1
  200. package/src/theme/v2/foreground.ts +1 -0
  201. package/src/{components → typography/text-shimmer}/text-shimmer.css +2 -1
  202. package/src/{components → typography/text-shimmer}/text-shimmer.tsx +1 -0
  203. package/src/{v2/components/wordmark-v2.tsx → typography/wordmark/wordmark.tsx} +1 -1
  204. package/dist/components/avatar.d.ts +0 -9
  205. package/dist/components/button.d.ts +0 -9
  206. package/dist/components/dialog.d.ts +0 -12
  207. package/dist/components/dropdown-menu.d.ts +0 -80
  208. package/dist/components/icon-button.d.ts +0 -10
  209. package/dist/components/keybind.d.ts +0 -6
  210. package/dist/components/radio-group.d.ts +0 -16
  211. package/dist/components/select.d.ts +0 -21
  212. package/dist/components/tag.d.ts +0 -5
  213. package/dist/components/toast.d.ts +0 -56
  214. package/dist/components/tooltip.d.ts +0 -17
  215. package/dist/v2/components/accordion-v2.d.ts +0 -26
  216. package/dist/v2/components/badge-v2.d.ts +0 -6
  217. package/dist/v2/components/button-v2.d.ts +0 -10
  218. package/dist/v2/components/checkbox-v2.d.ts +0 -10
  219. package/dist/v2/components/diff-changes-v2.d.ts +0 -11
  220. package/dist/v2/components/divider-v2.d.ts +0 -5
  221. package/dist/v2/components/icon-button-v2.d.ts +0 -11
  222. package/dist/v2/components/inline-input-v2.d.ts +0 -21
  223. package/dist/v2/components/keybind-v2.d.ts +0 -7
  224. package/dist/v2/components/loader-v2.d.ts +0 -3
  225. package/dist/v2/components/menu-v2.d.ts +0 -52
  226. package/dist/v2/components/progress-circle-v2.d.ts +0 -8
  227. package/dist/v2/components/radio-v2.d.ts +0 -16
  228. package/dist/v2/components/split-button-v2.d.ts +0 -5
  229. package/dist/v2/components/switch-v2.d.ts +0 -7
  230. package/dist/v2/components/tabs-v2.d.ts +0 -34
  231. package/dist/v2/components/text-shimmer-v2.d.ts +0 -9
  232. package/dist/v2/components/textarea-v2.d.ts +0 -7
  233. package/dist/v2/components/toast-v2.d.ts +0 -57
  234. package/dist/v2/components/tooltip-v2.d.ts +0 -13
  235. package/dist/v2/components/wordmark-v2.d.ts +0 -2
  236. package/src/components/avatar.css +0 -49
  237. package/src/components/avatar.tsx +0 -55
  238. package/src/components/button.css +0 -194
  239. package/src/components/dialog.css +0 -181
  240. package/src/components/dialog.tsx +0 -72
  241. package/src/components/diff-changes.tsx +0 -115
  242. package/src/components/dropdown-menu.css +0 -135
  243. package/src/components/dropdown-menu.tsx +0 -308
  244. package/src/components/icon-button.css +0 -181
  245. package/src/components/icon-button.tsx +0 -29
  246. package/src/components/icon.css +0 -39
  247. package/src/components/keybind.css +0 -18
  248. package/src/components/keybind.tsx +0 -20
  249. package/src/components/progress-circle.css +0 -16
  250. package/src/components/progress-circle.tsx +0 -64
  251. package/src/components/radio-group.css +0 -187
  252. package/src/components/radio-group.tsx +0 -83
  253. package/src/components/select.css +0 -201
  254. package/src/components/select.tsx +0 -174
  255. package/src/components/switch.css +0 -136
  256. package/src/components/switch.tsx +0 -29
  257. package/src/components/tabs.tsx +0 -126
  258. package/src/components/tag.css +0 -37
  259. package/src/components/tag.tsx +0 -22
  260. package/src/components/toast.css +0 -236
  261. package/src/components/toast.tsx +0 -185
  262. package/src/components/tooltip.css +0 -74
  263. package/src/components/tooltip.tsx +0 -163
  264. package/src/v2/components/accordion-v2.css +0 -139
  265. package/src/v2/components/accordion-v2.tsx +0 -86
  266. package/src/v2/components/button-v2.tsx +0 -35
  267. package/src/v2/components/checkbox-v2.css +0 -184
  268. package/src/v2/components/checkbox-v2.tsx +0 -65
  269. package/src/v2/components/diff-changes-v2.css +0 -26
  270. package/src/v2/components/icon-button-v2.tsx +0 -37
  271. package/src/v2/components/inline-input-v2.css +0 -225
  272. package/src/v2/components/inline-input-v2.tsx +0 -107
  273. package/src/v2/components/progress-circle-v2.css +0 -13
  274. package/src/v2/components/progress-circle-v2.tsx +0 -52
  275. package/src/v2/components/switch-v2.tsx +0 -28
  276. package/src/v2/components/tabs-v2.tsx +0 -149
  277. package/src/v2/components/text-shimmer-v2.css +0 -125
  278. package/src/v2/components/text-shimmer-v2.tsx +0 -63
  279. /package/dist/{components → forms/inline-input}/inline-input.d.ts +0 -0
  280. /package/dist/{v2/components → navigation}/tab-state-indicator.d.ts +0 -0
  281. /package/src/{v2/components/button-v2.css → actions/button/button.css} +0 -0
  282. /package/src/{v2/components/icon-button-v2.css → actions/icon-button/icon-button.css} +0 -0
  283. /package/src/{v2/components/avatar-v2.css → data-display/avatar/avatar.css} +0 -0
  284. /package/src/{v2/components/project-avatar-v2.css → data-display/project-avatar/project-avatar.css} +0 -0
  285. /package/src/{v2/components/loader-v2.css → feedback/loader/loader.css} +0 -0
  286. /package/src/{v2/components/toast-v2.css → feedback/toast/toast.css} +0 -0
  287. /package/src/{components → forms/inline-input}/inline-input.css +0 -0
  288. /package/src/{components → forms/inline-input}/inline-input.tsx +0 -0
  289. /package/src/{v2/components/radio-v2.css → forms/radio/radio.css} +0 -0
  290. /package/src/{v2/components/textarea-v2.css → forms/textarea/textarea.css} +0 -0
  291. /package/src/{v2/components/divider-v2.css → layout/divider/divider.css} +0 -0
  292. /package/src/{v2/components → navigation}/tab-state-indicator.tsx +0 -0
  293. /package/src/{v2/components/file-tree-v2.css → styles/file-tree.css} +0 -0
  294. /package/src/{v2/styles → styles/tokens}/colors.css +0 -0
  295. /package/src/{v2/styles/tailwind.css → styles/tokens/index.css} +0 -0
@@ -6,18 +6,27 @@
6
6
  justify-content: flex-end;
7
7
  align-items: center;
8
8
 
9
- [data-slot="diff-changes-additions"] {
10
- font-family: var(--font-family-mono);
11
- font-feature-settings: var(--font-family-mono--font-feature-settings);
12
- font-size: 14px;
9
+ [data-slot="diff-changes-additions"],
10
+ [data-slot="diff-changes-deletions"] {
11
+ font-size: 11px;
13
12
  font-style: normal;
14
- font-weight: var(--font-weight-regular);
15
- line-height: var(--line-height-large);
16
- letter-spacing: var(--letter-spacing-normal);
13
+ font-weight: 440;
14
+ line-height: 1;
15
+ letter-spacing: 0.05px;
17
16
  text-align: right;
18
- color: var(--text-diff-add-base);
17
+ }
18
+
19
+ [data-slot="diff-changes-additions"] {
20
+ color: var(--v2-state-fg-success);
19
21
  }
20
22
 
23
+ [data-slot="diff-changes-deletions"] {
24
+ color: var(--v2-state-fg-danger);
25
+ }
26
+ }
27
+
28
+ [data-component="diff-changes"][data-appearance="standard"] {
29
+ [data-slot="diff-changes-additions"],
21
30
  [data-slot="diff-changes-deletions"] {
22
31
  font-family: var(--font-family-mono);
23
32
  font-feature-settings: var(--font-family-mono--font-feature-settings);
@@ -26,19 +35,13 @@
26
35
  font-weight: var(--font-weight-regular);
27
36
  line-height: var(--line-height-large);
28
37
  letter-spacing: var(--letter-spacing-normal);
29
- text-align: right;
30
- color: var(--text-diff-delete-base);
31
38
  }
32
- }
33
39
 
34
- [data-component="diff-changes"][data-variant="bars"] {
35
- width: 18px;
36
- height: 14px;
37
- flex-shrink: 0;
40
+ [data-slot="diff-changes-additions"] {
41
+ color: var(--text-diff-add-base);
42
+ }
38
43
 
39
- svg {
40
- display: block;
41
- width: 100%;
42
- height: 100%;
44
+ [data-slot="diff-changes-deletions"] {
45
+ color: var(--text-diff-delete-base);
43
46
  }
44
47
  }
@@ -1,8 +1,9 @@
1
1
  import { createMemo, Show } from "solid-js"
2
- import "./diff-changes-v2.css"
2
+ import "./diff-changes.css"
3
3
 
4
4
  export function DiffChanges(props: {
5
5
  class?: string
6
+ appearance?: "standard" | "compact"
6
7
  changes: { additions: number; deletions: number } | { additions: number; deletions: number }[]
7
8
  }) {
8
9
  const additions = createMemo(() =>
@@ -19,7 +20,11 @@ export function DiffChanges(props: {
19
20
 
20
21
  return (
21
22
  <Show when={total() > 0}>
22
- <div data-component="diff-changes" classList={{ [props.class ?? ""]: true }}>
23
+ <div
24
+ data-component="diff-changes"
25
+ data-appearance={props.appearance ?? "compact"}
26
+ classList={{ [props.class ?? ""]: true }}
27
+ >
23
28
  <span data-slot="diff-changes-additions">{`+${additions()}`}</span>
24
29
  <span data-slot="diff-changes-deletions">{`-${deletions()}`}</span>
25
30
  </div>
@@ -27,6 +27,7 @@
27
27
  justify-content: center;
28
28
  align-items: center;
29
29
  padding: 0;
30
+ padding-inline: 4px;
30
31
  gap: 4px;
31
32
  min-width: 14px;
32
33
  height: 14px;
@@ -48,7 +49,6 @@
48
49
  flex-direction: row;
49
50
  justify-content: center;
50
51
  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-v2.css"
2
+ import "./keybind.css"
3
3
 
4
- export interface KeybindV2Props extends ComponentProps<"div"> {
4
+ export interface KeybindProps extends ComponentProps<"div"> {
5
5
  keys: string[]
6
6
  variant?: "neutral" | "ghost"
7
7
  }
8
8
 
9
- export function KeybindV2(props: KeybindV2Props) {
9
+ export function Keybind(props: KeybindProps) {
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: 1;
52
+ line-height: var(--line-height-compact);
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: 1;
62
+ line-height: var(--line-height-tight);
63
63
  letter-spacing: 0.05px;
64
64
  color: var(--v2-text-text-faint);
65
65
  font-variation-settings: "slnt" 0;
@@ -138,7 +138,7 @@
138
138
  font-size: 13px;
139
139
  font-style: normal;
140
140
  font-weight: 530;
141
- line-height: 1;
141
+ line-height: var(--line-height-compact);
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 "../../components/file-icon"
2
+ import { FileIcon } from "@opencode-ai/ui/file-icon"
3
3
  import { useI18n } from "../../context/i18n"
4
4
  import { useFilteredList } from "../../hooks"
5
- import { ButtonV2 } from "./button-v2"
6
- import "./line-comment-v2.css"
5
+ import { Button } from "@opencode-ai/ui/button"
6
+ import "./line-comment.css"
7
7
 
8
8
  /** Horizontal “more” glyph for the display-card overflow control (Figma outline-dots). */
9
- export function LineCommentV2OverflowIcon(props: ComponentProps<"svg">) {
9
+ export function LineCommentOverflowIcon(props: ComponentProps<"svg">) {
10
10
  return (
11
11
  <svg
12
12
  {...props}
@@ -24,16 +24,16 @@ export function LineCommentV2OverflowIcon(props: ComponentProps<"svg">) {
24
24
  )
25
25
  }
26
26
 
27
- export interface LineCommentV2Props extends ComponentProps<"div"> {
27
+ export interface LineCommentProps 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 `LineCommentV2OverflowIcon` inside `line-comment-v2-overflow`. */
32
+ /** Typically an overflow menu trigger; use `LineCommentOverflowIcon` inside `line-comment-v2-overflow`. */
33
33
  actions?: JSX.Element
34
34
  }
35
35
 
36
- export function LineCommentV2(props: LineCommentV2Props) {
36
+ export function LineComment(props: LineCommentProps) {
37
37
  const [local, rest] = splitProps(props, ["comment", "selection", "actions", "class", "classList"])
38
38
  return (
39
39
  <div
@@ -56,11 +56,11 @@ export function LineCommentV2(props: LineCommentV2Props) {
56
56
  )
57
57
  }
58
58
 
59
- export type LineCommentEditorV2Mention = {
59
+ export type LineCommentEditorMention = {
60
60
  items: (query: string) => string[] | Promise<string[]>
61
61
  }
62
62
 
63
- export interface LineCommentEditorV2Props extends Omit<ComponentProps<"div">, "children" | "onInput" | "onSubmit"> {
63
+ export interface LineCommentEditorProps 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 LineCommentEditorV2Props extends Omit<ComponentProps<"div">, "c
73
73
  cancelLabel?: string
74
74
  submitLabel?: string
75
75
  autofocus?: boolean
76
- mention?: LineCommentEditorV2Mention
76
+ mention?: LineCommentEditorMention
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 LineCommentEditorV2(props: LineCommentEditorV2Props) {
89
+ export function LineCommentEditor(props: LineCommentEditorProps) {
90
90
  const i18n = useI18n()
91
91
  let textareaRef: HTMLTextAreaElement | undefined
92
92
  const [mentionOpen, setMentionOpen] = createSignal(false)
@@ -212,9 +212,11 @@ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
212
212
  textareaRef = el
213
213
  }}
214
214
  data-slot="line-comment-v2-textarea"
215
+ dir="auto"
215
216
  rows={local.rows ?? 3}
216
217
  placeholder={local.placeholder ?? i18n.t("ui.lineComment.contextPlaceholder")}
217
218
  value={local.value}
219
+ style={{ "unicode-bidi": "plaintext", "text-align": "start" }}
218
220
  onInput={(e) => {
219
221
  local.onInput(e.currentTarget.value)
220
222
  syncMention()
@@ -292,12 +294,12 @@ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
292
294
  <div data-slot="line-comment-v2-footer">
293
295
  <div data-slot="line-comment-v2-footer-meta">{local.selection}</div>
294
296
  <div data-slot="line-comment-v2-footer-actions">
295
- <ButtonV2 type="button" size="normal" variant="neutral" onClick={() => local.onCancel()}>
297
+ <Button type="button" size="normal" variant="neutral" onClick={() => local.onCancel()}>
296
298
  {local.cancelLabel ?? i18n.t("ui.lineComment.cancel")}
297
- </ButtonV2>
298
- <ButtonV2 type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
299
+ </Button>
300
+ <Button type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
299
301
  {local.submitLabel ?? i18n.t("ui.lineComment.submit")}
300
- </ButtonV2>
302
+ </Button>
301
303
  </div>
302
304
  </div>
303
305
  </div>
@@ -1,5 +1,5 @@
1
1
  import { type ComponentProps, splitProps, Show } from "solid-js"
2
- import "./project-avatar-v2.css"
2
+ import "./project-avatar.css"
3
3
 
4
4
  const segmenter =
5
5
  typeof Intl !== "undefined" && "Segmenter" in Intl
@@ -1,7 +1,7 @@
1
1
  import { splitProps, type ComponentProps } from "solid-js"
2
- import "./loader-v2.css"
2
+ import "./loader.css"
3
3
 
4
- export function LoaderV2(props: ComponentProps<"svg">) {
4
+ export function Loader(props: ComponentProps<"svg">) {
5
5
  const [local, rest] = splitProps(props, ["class", "classList", "width", "height"])
6
6
  return (
7
7
  <svg
@@ -0,0 +1,28 @@
1
+ [data-component="progress-circle"] {
2
+ display: block;
3
+ transform: rotate(-90deg);
4
+ }
5
+
6
+ [data-component="progress-circle"][data-appearance="compact"] [data-slot="progress-circle-background"] {
7
+ stroke: var(--v2-background-bg-layer-04);
8
+ }
9
+
10
+ [data-component="progress-circle"][data-appearance="compact"] [data-slot="progress-circle-progress"] {
11
+ stroke: var(--v2-icon-icon-base);
12
+ }
13
+
14
+ [data-component="progress-circle"][data-appearance="indicator"] [data-slot="progress-circle-background"] {
15
+ stroke: var(--progress-circle-background, var(--border-weak-base));
16
+ }
17
+
18
+ [data-component="progress-circle"][data-appearance="indicator"] [data-slot="progress-circle-background-overlay"] {
19
+ stroke: var(--progress-circle-background-overlay, transparent);
20
+ }
21
+
22
+ [data-component="progress-circle"][data-appearance="indicator"] [data-slot="progress-circle-progress"] {
23
+ stroke: var(--progress-circle-progress, var(--border-active));
24
+ }
25
+
26
+ [data-component="progress-circle"] [data-slot="progress-circle-progress"] {
27
+ transition: stroke-dashoffset 0.35s cubic-bezier(0.65, 0, 0.35, 1);
28
+ }
@@ -0,0 +1,64 @@
1
+ import { type ComponentProps, createMemo, Show, splitProps } from "solid-js"
2
+ import "./progress-circle.css"
3
+
4
+ export interface ProgressCircleProps extends Pick<ComponentProps<"svg">, "class" | "classList" | "style"> {
5
+ percentage: number
6
+ appearance?: "compact" | "indicator"
7
+ size?: number
8
+ strokeWidth?: number
9
+ }
10
+
11
+ export function ProgressCircle(props: ProgressCircleProps) {
12
+ const [local, rest] = splitProps(props, ["percentage", "appearance", "size", "strokeWidth", "class", "classList"])
13
+
14
+ const appearance = () => local.appearance ?? "compact"
15
+ const viewBoxSize = () => (appearance() === "indicator" ? 16 : 14)
16
+ const size = () => local.size ?? viewBoxSize()
17
+ const strokeWidth = () => local.strokeWidth ?? (appearance() === "indicator" ? 3 : 1.5)
18
+ const center = () => viewBoxSize() / 2
19
+ const radius = () => center() - strokeWidth() / 2
20
+ const circumference = createMemo(() => 2 * Math.PI * radius())
21
+ const offset = createMemo(() => circumference() * (1 - Math.max(0, Math.min(100, local.percentage || 0)) / 100))
22
+
23
+ return (
24
+ <svg
25
+ {...rest}
26
+ width={size()}
27
+ height={size()}
28
+ viewBox={`0 0 ${viewBoxSize()} ${viewBoxSize()}`}
29
+ fill="none"
30
+ data-component="progress-circle"
31
+ data-appearance={appearance()}
32
+ classList={{
33
+ ...local.classList,
34
+ [local.class ?? ""]: !!local.class,
35
+ }}
36
+ >
37
+ <circle
38
+ cx={center()}
39
+ cy={center()}
40
+ r={radius()}
41
+ data-slot="progress-circle-background"
42
+ stroke-width={strokeWidth()}
43
+ />
44
+ <Show when={appearance() === "indicator"}>
45
+ <circle
46
+ cx={center()}
47
+ cy={center()}
48
+ r={radius()}
49
+ data-slot="progress-circle-background-overlay"
50
+ stroke-width={strokeWidth()}
51
+ />
52
+ </Show>
53
+ <circle
54
+ cx={center()}
55
+ cy={center()}
56
+ r={radius()}
57
+ data-slot="progress-circle-progress"
58
+ stroke-width={strokeWidth()}
59
+ stroke-dasharray={circumference().toString()}
60
+ stroke-dashoffset={offset()}
61
+ />
62
+ </svg>
63
+ )
64
+ }
@@ -4,12 +4,12 @@ import type { ComponentProps, JSX } from "solid-js"
4
4
  import { createContext, onCleanup, onMount, splitProps, useContext } from "solid-js"
5
5
  import { Portal } from "solid-js/web"
6
6
  import { useI18n } from "../../context/i18n"
7
- import "./button-v2.css"
8
- import "./toast-v2.css"
7
+ import "../../actions/button/button.css"
8
+ import "./toast.css"
9
9
 
10
- export interface ToastV2RegionProps extends ToasterProps {}
10
+ export interface ToastRegionProps extends ToasterProps {}
11
11
 
12
- function ToastV2Region(props: ToastV2RegionProps) {
12
+ function ToastRegion(props: ToastRegionProps) {
13
13
  const i18n = useI18n()
14
14
  const [local, rest] = splitProps(props, ["class", "className", "style", "toastOptions", "swipeDirections"])
15
15
  onMount(() => {
@@ -67,40 +67,40 @@ function ToastV2Region(props: ToastV2RegionProps) {
67
67
  )
68
68
  }
69
69
 
70
- const ToastV2Context = createContext<number>()
70
+ const ToastContext = createContext<number>()
71
71
 
72
- export interface ToastV2RootComponentProps {
72
+ export interface ToastRootComponentProps {
73
73
  toastId: number
74
74
  children?: JSX.Element
75
75
  }
76
76
 
77
- function ToastV2Root(props: ToastV2RootComponentProps) {
78
- return <ToastV2Context.Provider value={props.toastId}>{props.children}</ToastV2Context.Provider>
77
+ function ToastRoot(props: ToastRootComponentProps) {
78
+ return <ToastContext.Provider value={props.toastId}>{props.children}</ToastContext.Provider>
79
79
  }
80
80
 
81
- function ToastV2Icon(props: ComponentProps<"div">) {
81
+ function ToastIcon(props: ComponentProps<"div">) {
82
82
  return <div data-slot="toast-v2-icon" {...props} />
83
83
  }
84
84
 
85
- function ToastV2Content(props: ComponentProps<"div">) {
85
+ function ToastContent(props: ComponentProps<"div">) {
86
86
  return <div data-slot="toast-v2-content" {...props} />
87
87
  }
88
88
 
89
- function ToastV2Title(props: ComponentProps<"div">) {
89
+ function ToastTitle(props: ComponentProps<"div">) {
90
90
  return <div data-slot="toast-v2-title" {...props} />
91
91
  }
92
92
 
93
- function ToastV2Description(props: ComponentProps<"div">) {
93
+ function ToastDescription(props: ComponentProps<"div">) {
94
94
  return <div data-slot="toast-v2-description" {...props} />
95
95
  }
96
96
 
97
- function ToastV2Actions(props: ComponentProps<"div">) {
97
+ function ToastActions(props: ComponentProps<"div">) {
98
98
  return <div data-slot="toast-v2-actions" {...props} />
99
99
  }
100
100
 
101
- function ToastV2CloseButton(props: ComponentProps<"button">) {
101
+ function ToastCloseButton(props: ComponentProps<"button">) {
102
102
  const i18n = useI18n()
103
- const toastId = useContext(ToastV2Context)
103
+ const toastId = useContext(ToastContext)
104
104
  const [local, rest] = splitProps(props, ["children", "onClick"])
105
105
  return (
106
106
  <button
@@ -110,7 +110,7 @@ function ToastV2CloseButton(props: ComponentProps<"button">) {
110
110
  {...rest}
111
111
  onClick={(event) => {
112
112
  if (typeof local.onClick === "function") local.onClick(event)
113
- if (!event.defaultPrevented && toastId !== undefined) toasterV2.dismiss(toastId)
113
+ if (!event.defaultPrevented && toastId !== undefined) toaster.dismiss(toastId)
114
114
  }}
115
115
  >
116
116
  {local.children ?? <CloseIcon />}
@@ -127,19 +127,19 @@ function CloseIcon() {
127
127
  )
128
128
  }
129
129
 
130
- export const ToastV2 = Object.assign(ToastV2Root, {
131
- Region: ToastV2Region,
132
- Icon: ToastV2Icon,
133
- Content: ToastV2Content,
134
- Title: ToastV2Title,
135
- Description: ToastV2Description,
136
- Actions: ToastV2Actions,
137
- CloseButton: ToastV2CloseButton,
130
+ export const Toast = Object.assign(ToastRoot, {
131
+ Region: ToastRegion,
132
+ Icon: ToastIcon,
133
+ Content: ToastContent,
134
+ Title: ToastTitle,
135
+ Description: ToastDescription,
136
+ Actions: ToastActions,
137
+ CloseButton: ToastCloseButton,
138
138
  })
139
139
 
140
140
  let toastV2Id = 0
141
141
 
142
- export const toasterV2 = {
142
+ export const toaster = {
143
143
  show(render: (props: { toastId: number }) => JSX.Element, options?: { duration?: number; persistent?: boolean }) {
144
144
  const toastId = --toastV2Id
145
145
  toast.custom((id) => render({ toastId: Number(id) }), {
@@ -152,43 +152,43 @@ export const toasterV2 = {
152
152
  },
153
153
  dismiss(toastId?: number) {
154
154
  if (toastId === undefined) {
155
- activeToastV2ByKey.clear()
156
- activeToastV2ById.clear()
155
+ activeToastByKey.clear()
156
+ activeToastById.clear()
157
157
  } else {
158
- releaseToastV2(activeToastV2ById.get(toastId))
158
+ releaseToast(activeToastById.get(toastId))
159
159
  }
160
160
  return toast.dismiss(toastId)
161
161
  },
162
162
  }
163
163
 
164
- export interface ToastV2Action {
164
+ export interface ToastAction {
165
165
  label: string
166
166
  variant?: "primary" | "secondary"
167
167
  onClick: "dismiss" | (() => void)
168
168
  }
169
169
 
170
- export interface ToastV2Options {
170
+ export interface ToastOptions {
171
171
  title?: string
172
172
  description?: string
173
173
  icon?: JSX.Element
174
174
  variant?: "default" | "success" | "error" | "loading"
175
175
  duration?: number
176
176
  persistent?: boolean
177
- actions?: ToastV2Action[]
177
+ actions?: ToastAction[]
178
178
  }
179
179
 
180
- interface ActiveToastV2 {
180
+ interface ActiveToast {
181
181
  id: number
182
182
  key: string
183
- options: ToastV2Options
183
+ options: ToastOptions
184
184
  actions?: JSX.Element
185
185
  }
186
186
 
187
- const activeToastV2ByKey = new Map<string, ActiveToastV2>()
188
- const activeToastV2ById = new Map<number, ActiveToastV2>()
187
+ const activeToastByKey = new Map<string, ActiveToast>()
188
+ const activeToastById = new Map<number, ActiveToast>()
189
189
 
190
- export function showToastV2(options: ToastV2Options | string) {
191
- const opts: ToastV2Options = typeof options === "string" ? { description: options } : options
190
+ export function showToast(options: ToastOptions | string) {
191
+ const opts: ToastOptions = typeof options === "string" ? { description: options } : options
192
192
  const key = JSON.stringify({
193
193
  title: opts.title,
194
194
  description: opts.description,
@@ -197,29 +197,29 @@ export function showToastV2(options: ToastV2Options | string) {
197
197
  persistent: opts.persistent,
198
198
  actions: opts.actions?.map((action) => [action.label, action.variant]),
199
199
  })
200
- const active = activeToastV2ByKey.get(key)
200
+ const active = activeToastByKey.get(key)
201
201
  const toasts = toast.getToasts()
202
202
 
203
203
  if (active && toasts.at(-1)?.id === active.id) {
204
204
  active.options = opts
205
- publishToastV2(active)
206
- pulseToastV2(active.id)
205
+ publishToast(active)
206
+ pulseToast(active.id)
207
207
  return active.id
208
208
  }
209
209
 
210
- if (active && toasts.some((item) => item.id === active.id)) toasterV2.dismiss(active.id)
211
- releaseToastV2(active)
210
+ if (active && toasts.some((item) => item.id === active.id)) toaster.dismiss(active.id)
211
+ releaseToast(active)
212
212
 
213
- const entry: ActiveToastV2 = { id: --toastV2Id, key, options: opts }
214
- entry.actions = createToastV2Actions(entry)
215
- activeToastV2ByKey.set(key, entry)
216
- activeToastV2ById.set(entry.id, entry)
217
- publishToastV2(entry)
213
+ const entry: ActiveToast = { id: --toastV2Id, key, options: opts }
214
+ entry.actions = createToastActions(entry)
215
+ activeToastByKey.set(key, entry)
216
+ activeToastById.set(entry.id, entry)
217
+ publishToast(entry)
218
218
  return entry.id
219
219
  }
220
220
 
221
- function publishToastV2(entry: ActiveToastV2) {
222
- const release = () => releaseToastV2(entry)
221
+ function publishToast(entry: ActiveToast) {
222
+ const release = () => releaseToast(entry)
223
223
  toast(entry.options.title ?? "", {
224
224
  id: entry.id,
225
225
  description: entry.options.description,
@@ -235,10 +235,12 @@ function publishToastV2(entry: ActiveToastV2) {
235
235
  })
236
236
  }
237
237
 
238
- function createToastV2Actions(entry: ActiveToastV2) {
238
+ function createToastActions(entry: ActiveToast) {
239
239
  if (!entry.options.actions?.length) return undefined
240
240
  return (
241
- <ToastV2.Actions>
241
+ <Toast.Actions>
242
+ {/* Static map, not <For>: this JSX is created imperatively outside any Solid
243
+ root, where a <For> computation would never be disposed. */}
242
244
  {entry.options.actions.map((action, index) => (
243
245
  <button
244
246
  type="button"
@@ -249,17 +251,17 @@ function createToastV2Actions(entry: ActiveToastV2) {
249
251
  onClick={() => {
250
252
  const onClick = entry.options.actions?.[index]?.onClick
251
253
  if (typeof onClick === "function") onClick()
252
- toasterV2.dismiss(entry.id)
254
+ toaster.dismiss(entry.id)
253
255
  }}
254
256
  >
255
257
  {action.label}
256
258
  </button>
257
259
  ))}
258
- </ToastV2.Actions>
260
+ </Toast.Actions>
259
261
  )
260
262
  }
261
263
 
262
- function pulseToastV2(toastId: number) {
264
+ function pulseToast(toastId: number) {
263
265
  if (typeof document === "undefined" || typeof requestAnimationFrame === "undefined") return
264
266
  requestAnimationFrame(() => {
265
267
  const element = document.querySelector<HTMLElement>(`[data-testid="toast-v2-${toastId}"]`)
@@ -268,13 +270,13 @@ function pulseToastV2(toastId: number) {
268
270
  })
269
271
  }
270
272
 
271
- function releaseToastV2(entry: ActiveToastV2 | undefined) {
273
+ function releaseToast(entry: ActiveToast | undefined) {
272
274
  if (!entry) return
273
- if (activeToastV2ByKey.get(entry.key) === entry) activeToastV2ByKey.delete(entry.key)
274
- if (activeToastV2ById.get(entry.id) === entry) activeToastV2ById.delete(entry.id)
275
+ if (activeToastByKey.get(entry.key) === entry) activeToastByKey.delete(entry.key)
276
+ if (activeToastById.get(entry.id) === entry) activeToastById.delete(entry.id)
275
277
  }
276
278
 
277
- export interface ToastV2PromiseOptions<T, U = unknown> {
279
+ export interface ToastPromiseOptions<T, U = unknown> {
278
280
  loading?: JSX.Element
279
281
  success?: (data: T) => JSX.Element
280
282
  error?: (error: U) => JSX.Element
@@ -32,7 +32,6 @@
32
32
  border-color 220ms var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1)),
33
33
  background-color 220ms var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1)),
34
34
  box-shadow 220ms var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
35
- /* background-color: var(--surface-weak); */
36
35
  }
37
36
 
38
37
  [data-slot="checkbox-checkbox-indicator"] {
@@ -49,19 +48,14 @@
49
48
  transform 220ms var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
50
49
  }
51
50
 
52
- /* [data-slot="checkbox-checkbox-content"] { */
53
- /* } */
54
-
55
51
  [data-slot="checkbox-checkbox-label"] {
56
52
  user-select: none;
57
53
  color: var(--text-base);
58
-
59
- /* text-12-regular */
60
54
  font-family: var(--font-family-sans);
61
55
  font-size: var(--font-size-small);
62
56
  font-style: normal;
63
57
  font-weight: var(--font-weight-regular);
64
- line-height: var(--line-height-large); /* 166.667% */
58
+ line-height: var(--line-height-large);
65
59
  letter-spacing: var(--letter-spacing-normal);
66
60
  }
67
61