@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,194 @@
1
+ [data-component="button"] {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ border-style: solid;
6
+ border-width: 1px;
7
+ border-radius: var(--radius-md);
8
+ text-decoration: none;
9
+ user-select: none;
10
+ cursor: default;
11
+ outline: none;
12
+ white-space: nowrap;
13
+
14
+ &[data-variant="primary"] {
15
+ background-color: var(--button-primary-base);
16
+ border-color: var(--border-weak-base);
17
+ color: var(--icon-invert-base);
18
+
19
+ [data-slot="icon-svg"] {
20
+ color: var(--icon-invert-base);
21
+ }
22
+
23
+ &:hover:not(:disabled) {
24
+ background-color: var(--icon-strong-hover);
25
+ }
26
+ &:focus:not(:disabled) {
27
+ background-color: var(--icon-strong-focus);
28
+ }
29
+ &:active:not(:disabled) {
30
+ background-color: var(--icon-strong-active);
31
+ }
32
+ &:disabled {
33
+ background-color: var(--icon-strong-disabled);
34
+
35
+ [data-slot="icon-svg"] {
36
+ color: var(--icon-invert-base);
37
+ }
38
+ }
39
+ }
40
+
41
+ &[data-variant="ghost"] {
42
+ border-color: transparent;
43
+ background-color: transparent;
44
+ color: var(--text-strong);
45
+
46
+ [data-slot="icon-svg"] {
47
+ color: var(--icon-base);
48
+ }
49
+
50
+ &:hover:not(:disabled) {
51
+ background-color: var(--surface-base-hover);
52
+ }
53
+ &:focus-visible:not(:disabled) {
54
+ background-color: var(--surface-base-hover);
55
+ }
56
+ &:active:not(:disabled) {
57
+ background-color: var(--surface-base-active);
58
+ }
59
+ &:disabled {
60
+ color: var(--text-weak);
61
+ cursor: not-allowed;
62
+
63
+ [data-slot="icon-svg"] {
64
+ color: var(--icon-disabled);
65
+ }
66
+ }
67
+ &[data-selected="true"]:not(:disabled) {
68
+ background-color: var(--surface-base-hover);
69
+ }
70
+ &[data-active="true"] {
71
+ background-color: var(--surface-base-active);
72
+ }
73
+ }
74
+
75
+ &[data-variant="secondary"] {
76
+ border: transparent;
77
+ background-color: var(--button-secondary-base);
78
+ color: var(--text-strong);
79
+ box-shadow: var(--shadow-xs-border-base);
80
+
81
+ &:hover:not(:disabled) {
82
+ background-color: var(--button-secondary-hover);
83
+ }
84
+ &:focus:not(:disabled) {
85
+ background-color: var(--button-secondary-base);
86
+ }
87
+ &:focus-visible:not(:active) {
88
+ background-color: var(--button-secondary-base);
89
+ box-shadow: var(--shadow-xs-border-focus);
90
+ }
91
+ &:focus-visible:active {
92
+ box-shadow: none;
93
+ }
94
+ &:active:not(:disabled) {
95
+ background-color: var(--button-secondary-base);
96
+ }
97
+ &:disabled {
98
+ border-color: var(--border-disabled);
99
+ background-color: var(--surface-disabled);
100
+ color: var(--text-weak);
101
+ cursor: not-allowed;
102
+ }
103
+
104
+ [data-slot="icon-svg"] {
105
+ color: var(--icon-base);
106
+ }
107
+ }
108
+
109
+ &[data-size="small"] {
110
+ height: 24px;
111
+ padding: 0 8px;
112
+ &[data-icon] {
113
+ padding: 0 12px 0 4px;
114
+ }
115
+
116
+ font-size: var(--font-size-small);
117
+ line-height: var(--line-height-large);
118
+ gap: 8px;
119
+
120
+ /* text-12-medium */
121
+ font-family: var(--font-family-sans);
122
+ font-size: var(--font-size-small);
123
+ font-style: normal;
124
+ font-weight: var(--font-weight-medium);
125
+ line-height: var(--line-height-large); /* 166.667% */
126
+ letter-spacing: var(--letter-spacing-normal);
127
+ }
128
+
129
+ &[data-size="normal"] {
130
+ height: 28px;
131
+ line-height: 28px;
132
+ padding: 0 6px;
133
+ &[data-icon] {
134
+ padding: 0 12px 0 4px;
135
+ }
136
+
137
+ font-size: var(--font-size-small);
138
+ gap: 8px;
139
+
140
+ /* text-12-medium */
141
+ font-family: var(--font-family-sans);
142
+ font-size: var(--font-size-small);
143
+ font-style: normal;
144
+ font-weight: var(--font-weight-medium);
145
+ letter-spacing: var(--letter-spacing-normal);
146
+ }
147
+
148
+ &[data-size="large"] {
149
+ height: 32px;
150
+ padding: 6px 12px;
151
+
152
+ &[data-icon] {
153
+ padding: 0 12px 0 8px;
154
+ }
155
+
156
+ gap: 8px;
157
+
158
+ /* text-14-medium */
159
+ font-family: var(--font-family-sans);
160
+ font-size: 14px;
161
+ font-style: normal;
162
+ font-weight: var(--font-weight-medium);
163
+ line-height: var(--line-height-large); /* 142.857% */
164
+ letter-spacing: var(--letter-spacing-normal);
165
+ }
166
+
167
+ &:focus {
168
+ outline: none;
169
+ }
170
+ }
171
+
172
+ [data-component="button"].titlebar-icon[data-variant="ghost"][aria-expanded="true"] {
173
+ background-color: var(--surface-base-active);
174
+ }
175
+
176
+ [data-component="button"].titlebar-icon[data-variant="ghost"][aria-expanded="true"] [data-slot="icon-svg"] {
177
+ color: var(--icon-strong-base);
178
+ }
179
+
180
+ [data-component="button"].titlebar-icon[data-variant="ghost"][aria-expanded="true"]:hover:not(:disabled) {
181
+ background-color: var(--surface-base-active);
182
+ }
183
+
184
+ [data-component="button"].titlebar-icon[data-variant="ghost"][aria-current="page"] {
185
+ background-color: var(--surface-base-active);
186
+ }
187
+
188
+ [data-component="button"].titlebar-icon[data-variant="ghost"][aria-current="page"] [data-slot="icon-svg"] {
189
+ color: var(--icon-strong-base);
190
+ }
191
+
192
+ [data-component="button"].titlebar-icon[data-variant="ghost"][aria-current="page"]:hover:not(:disabled) {
193
+ background-color: var(--surface-base-active);
194
+ }
@@ -1,41 +1,33 @@
1
- import { Root } from "@kobalte/core/button"
1
+ import { Button as Kobalte } from "@kobalte/core/button"
2
2
  import { type ComponentProps, Show, splitProps } from "solid-js"
3
- import { Icon, type IconProps } from "@opencode-ai/ui/icon"
4
- import "./button.css"
3
+ import { Icon, IconProps } from "./icon"
5
4
 
6
5
  export interface ButtonProps
7
- extends ComponentProps<typeof Root>,
6
+ extends ComponentProps<typeof Kobalte>,
8
7
  Pick<ComponentProps<"button">, "class" | "classList" | "children"> {
9
8
  size?: "small" | "normal" | "large"
10
- variant?:
11
- | "neutral"
12
- | "danger"
13
- | "warning"
14
- | "outline"
15
- | "contrast"
16
- | "ghost"
17
- | "ghost-muted"
18
- | "ghost-faint"
19
- | "loading"
9
+ variant?: "primary" | "secondary" | "ghost"
20
10
  icon?: IconProps["name"]
21
11
  }
22
12
 
23
13
  export function Button(props: ButtonProps) {
24
14
  const [split, rest] = splitProps(props, ["variant", "size", "icon", "class", "classList"])
25
15
  return (
26
- <Root
16
+ <Kobalte
27
17
  {...rest}
28
- data-component="button-v2"
18
+ data-component="button"
29
19
  data-size={split.size || "normal"}
30
- data-variant={split.variant || "neutral"}
20
+ data-variant={split.variant || "secondary"}
31
21
  data-icon={split.icon}
32
22
  classList={{
33
23
  ...split.classList,
34
24
  [split.class ?? ""]: !!split.class,
35
25
  }}
36
26
  >
37
- <Show when={split.icon}>{(icon) => <Icon name={icon()} />}</Show>
27
+ <Show when={split.icon}>
28
+ <Icon name={split.icon!} size="small" />
29
+ </Show>
38
30
  {props.children}
39
- </Root>
31
+ </Kobalte>
40
32
  )
41
33
  }
@@ -58,7 +58,7 @@
58
58
  gap: var(--card-gap);
59
59
  }
60
60
 
61
- :where([data-slot="card-title"]) [data-slot="icon-svg"] {
61
+ :where([data-slot="card-title"]) [data-component="icon"] {
62
62
  color: var(--card-accent);
63
63
  }
64
64
 
@@ -71,7 +71,7 @@
71
71
  flex: 0 0 auto;
72
72
  }
73
73
 
74
- :where([data-slot="card-title-icon"][data-placeholder]) [data-slot="icon-svg"] {
74
+ :where([data-slot="card-title-icon"][data-placeholder]) [data-component="icon"] {
75
75
  color: var(--v2-text-text-faint);
76
76
  }
77
77
 
@@ -92,3 +92,24 @@
92
92
  padding-left: var(--card-indent);
93
93
  }
94
94
  }
95
+
96
+ body:not([data-new-layout]) [data-component="card"] {
97
+ color: var(--text-strong);
98
+ --card-accent: var(--icon-active);
99
+
100
+ :where([data-card="title"], [data-slot="card-title"]) {
101
+ color: var(--text-strong);
102
+ }
103
+
104
+ :where([data-slot="card-title-icon"][data-placeholder]) [data-component="icon"] {
105
+ color: var(--text-weak);
106
+ }
107
+
108
+ :where([data-card="description"], [data-slot="card-description"]) {
109
+ color: var(--text-base);
110
+ }
111
+
112
+ &[data-variant="error"] {
113
+ --card-accent: var(--icon-critical-base) !important;
114
+ }
115
+ }
@@ -1,5 +1,5 @@
1
- import { type ComponentProps, Show, splitProps } from "solid-js"
2
- import { Icon, type IconProps } from "@opencode-ai/ui/icon"
1
+ import { type ComponentProps, splitProps } from "solid-js"
2
+ import { Icon, type IconProps } from "./icon"
3
3
 
4
4
  type Variant = "normal" | "error" | "warning" | "success" | "info"
5
5
 
@@ -80,11 +80,11 @@ export function CardTitle(props: CardTitleProps) {
80
80
  [split.class ?? ""]: !!split.class,
81
81
  }}
82
82
  >
83
- <Show when={show()}>
83
+ {show() ? (
84
84
  <span data-slot="card-title-icon" data-placeholder={placeholder() || undefined}>
85
85
  <Icon name={name() ?? "dash"} size="small" />
86
86
  </span>
87
- </Show>
87
+ ) : null}
88
88
  {split.children}
89
89
  </div>
90
90
  )
@@ -32,6 +32,7 @@
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); */
35
36
  }
36
37
 
37
38
  [data-slot="checkbox-checkbox-indicator"] {
@@ -48,14 +49,19 @@
48
49
  transform 220ms var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
49
50
  }
50
51
 
52
+ /* [data-slot="checkbox-checkbox-content"] { */
53
+ /* } */
54
+
51
55
  [data-slot="checkbox-checkbox-label"] {
52
56
  user-select: none;
53
57
  color: var(--text-base);
58
+
59
+ /* text-12-regular */
54
60
  font-family: var(--font-family-sans);
55
61
  font-size: var(--font-size-small);
56
62
  font-style: normal;
57
63
  font-weight: var(--font-weight-regular);
58
- line-height: var(--line-height-large);
64
+ line-height: var(--line-height-large); /* 166.667% */
59
65
  letter-spacing: var(--letter-spacing-normal);
60
66
  }
61
67
 
@@ -1,8 +1,8 @@
1
- import { Control, Description, ErrorMessage, Indicator, Input, Label, Root } from "@kobalte/core/checkbox"
1
+ import { Checkbox as Kobalte } from "@kobalte/core/checkbox"
2
2
  import { Show, splitProps } from "solid-js"
3
3
  import type { ComponentProps, JSX, ParentProps } from "solid-js"
4
4
 
5
- export interface CheckboxProps extends ParentProps<ComponentProps<typeof Root>> {
5
+ export interface CheckboxProps extends ParentProps<ComponentProps<typeof Kobalte>> {
6
6
  hideLabel?: boolean
7
7
  description?: string
8
8
  icon?: JSX.Element
@@ -11,10 +11,10 @@ export interface CheckboxProps extends ParentProps<ComponentProps<typeof Root>>
11
11
  export function Checkbox(props: CheckboxProps) {
12
12
  const [local, others] = splitProps(props, ["children", "class", "label", "hideLabel", "description", "icon"])
13
13
  return (
14
- <Root {...others} data-component="checkbox">
15
- <Input data-slot="checkbox-checkbox-input" />
16
- <Control data-slot="checkbox-checkbox-control">
17
- <Indicator data-slot="checkbox-checkbox-indicator">
14
+ <Kobalte {...others} data-component="checkbox">
15
+ <Kobalte.Input data-slot="checkbox-checkbox-input" />
16
+ <Kobalte.Control data-slot="checkbox-checkbox-control">
17
+ <Kobalte.Indicator data-slot="checkbox-checkbox-indicator">
18
18
  {local.icon || (
19
19
  <svg viewBox="0 0 12 12" fill="none" width="10" height="10" xmlns="http://www.w3.org/2000/svg">
20
20
  <path
@@ -25,19 +25,19 @@ export function Checkbox(props: CheckboxProps) {
25
25
  />
26
26
  </svg>
27
27
  )}
28
- </Indicator>
29
- </Control>
28
+ </Kobalte.Indicator>
29
+ </Kobalte.Control>
30
30
  <div data-slot="checkbox-checkbox-content">
31
31
  <Show when={props.children}>
32
- <Label data-slot="checkbox-checkbox-label" classList={{ "sr-only": local.hideLabel }}>
32
+ <Kobalte.Label data-slot="checkbox-checkbox-label" classList={{ "sr-only": local.hideLabel }}>
33
33
  {props.children}
34
- </Label>
34
+ </Kobalte.Label>
35
35
  </Show>
36
36
  <Show when={local.description}>
37
- <Description data-slot="checkbox-checkbox-description">{local.description}</Description>
37
+ <Kobalte.Description data-slot="checkbox-checkbox-description">{local.description}</Kobalte.Description>
38
38
  </Show>
39
- <ErrorMessage data-slot="checkbox-checkbox-error" />
39
+ <Kobalte.ErrorMessage data-slot="checkbox-checkbox-error" />
40
40
  </div>
41
- </Root>
41
+ </Kobalte>
42
42
  )
43
43
  }
@@ -1,6 +1,6 @@
1
1
  import { Collapsible as Kobalte, CollapsibleRootProps } from "@kobalte/core/collapsible"
2
2
  import { ComponentProps, ParentProps, splitProps } from "solid-js"
3
- import { Icon } from "@opencode-ai/ui/icon"
3
+ import { Icon } from "./icon"
4
4
 
5
5
  export interface CollapsibleProps extends ParentProps<CollapsibleRootProps> {
6
6
  class?: string
@@ -35,7 +35,7 @@ function CollapsibleArrow(props?: ComponentProps<"div">) {
35
35
  return (
36
36
  <div data-slot="collapsible-arrow" {...(props || {})}>
37
37
  <span data-slot="collapsible-arrow-icon">
38
- <Icon name="fill-triangle-down" size="small" />
38
+ <Icon name="chevron-down" size="small" />
39
39
  </span>
40
40
  </div>
41
41
  )
@@ -0,0 +1,181 @@
1
+ /* [data-component="dialog-trigger"] { } */
2
+
3
+ [data-component="dialog-overlay"] {
4
+ position: fixed;
5
+ inset: 0;
6
+ z-index: 50;
7
+ background-color: hsl(from var(--background-base) h s l / 0.2);
8
+ }
9
+
10
+ [data-component="dialog"] {
11
+ position: fixed;
12
+ inset: 0;
13
+ z-index: 50;
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ pointer-events: none;
18
+
19
+ [data-slot="dialog-container"] {
20
+ position: relative;
21
+ z-index: 50;
22
+ width: min(calc(100vw - 16px), 640px);
23
+ height: min(calc(100vh - 16px), 512px);
24
+ display: flex;
25
+ flex-direction: column;
26
+ align-items: center;
27
+ justify-items: start;
28
+ overflow: visible;
29
+
30
+ [data-slot="dialog-content"] {
31
+ display: flex;
32
+ flex-direction: column;
33
+ align-items: flex-start;
34
+ align-self: stretch;
35
+ width: 100%;
36
+ max-height: 100%;
37
+ min-height: 280px;
38
+ overflow: auto;
39
+ pointer-events: auto;
40
+
41
+ /* Hide scrollbar */
42
+ scrollbar-width: none;
43
+ -ms-overflow-style: none;
44
+ &::-webkit-scrollbar {
45
+ display: none;
46
+ }
47
+
48
+ /* padding: 8px; */
49
+ /* padding: 8px 8px 0 8px; */
50
+ border-radius: var(--radius-xl);
51
+ background: var(--surface-raised-stronger-non-alpha);
52
+ background-clip: padding-box;
53
+ box-shadow: var(--shadow-lg-border-base);
54
+
55
+ [data-slot="dialog-header"] {
56
+ display: flex;
57
+ padding: 16px 20px;
58
+ justify-content: space-between;
59
+ align-items: center;
60
+ flex-shrink: 0;
61
+ align-self: stretch;
62
+
63
+ [data-slot="dialog-title"] {
64
+ color: var(--text-strong);
65
+
66
+ /* text-16-medium */
67
+ font-family: var(--font-family-sans);
68
+ font-size: var(--font-size-large);
69
+ font-style: normal;
70
+ font-weight: var(--font-weight-medium);
71
+ line-height: var(--line-height-x-large); /* 150% */
72
+ letter-spacing: var(--letter-spacing-tight);
73
+ }
74
+ /* [data-slot="dialog-close-button"] {} */
75
+ }
76
+
77
+ [data-slot="dialog-description"] {
78
+ display: flex;
79
+ padding: 16px;
80
+ padding-left: 24px;
81
+ padding-top: 0;
82
+ margin-top: -8px;
83
+ justify-content: space-between;
84
+ align-items: center;
85
+ flex-shrink: 0;
86
+ align-self: stretch;
87
+
88
+ color: var(--text-base);
89
+
90
+ /* text-14-regular */
91
+ font-family: var(--font-family-sans);
92
+ font-size: 14px;
93
+ font-style: normal;
94
+ font-weight: var(--font-weight-regular);
95
+ line-height: var(--line-height-large); /* 142.857% */
96
+ letter-spacing: var(--letter-spacing-normal);
97
+ }
98
+
99
+ [data-slot="dialog-body"] {
100
+ width: 100%;
101
+ position: relative;
102
+ display: flex;
103
+ flex-direction: column;
104
+ flex: 1;
105
+ overflow: hidden;
106
+
107
+ &:focus-visible {
108
+ outline: none;
109
+ }
110
+ }
111
+ &:focus-visible {
112
+ outline: none;
113
+ }
114
+ }
115
+ }
116
+
117
+ &[data-fit] {
118
+ [data-slot="dialog-container"] {
119
+ height: auto;
120
+
121
+ [data-slot="dialog-content"] {
122
+ min-height: 0;
123
+ }
124
+ }
125
+ }
126
+
127
+ &[data-size="large"] [data-slot="dialog-container"] {
128
+ width: min(calc(100vw - 32px), 800px);
129
+ height: min(calc(100vh - 32px), 600px);
130
+ }
131
+
132
+ &[data-size="x-large"] [data-slot="dialog-container"] {
133
+ width: min(calc(100vw - 32px), 980px);
134
+ height: min(calc(100vh - 92px), 600px);
135
+ }
136
+ }
137
+
138
+ [data-component="dialog"][data-transition] [data-slot="dialog-content"] {
139
+ animation: contentHide 100ms ease-in forwards;
140
+
141
+ &[data-expanded] {
142
+ animation: contentShow 150ms ease-out;
143
+ }
144
+ }
145
+
146
+ @keyframes overlayShow {
147
+ from {
148
+ opacity: 0;
149
+ }
150
+ to {
151
+ opacity: 1;
152
+ }
153
+ }
154
+ @keyframes overlayHide {
155
+ from {
156
+ opacity: 1;
157
+ }
158
+ to {
159
+ opacity: 0;
160
+ }
161
+ }
162
+ @keyframes contentShow {
163
+ from {
164
+ opacity: 0;
165
+ transform: scale(0.98);
166
+ }
167
+ to {
168
+ opacity: 1;
169
+ transform: scale(1);
170
+ }
171
+ }
172
+ @keyframes contentHide {
173
+ from {
174
+ opacity: 1;
175
+ transform: scale(1);
176
+ }
177
+ to {
178
+ opacity: 0;
179
+ transform: scale(0.98);
180
+ }
181
+ }
@@ -0,0 +1,72 @@
1
+ import { Dialog as Kobalte } from "@kobalte/core/dialog"
2
+ import { ComponentProps, JSXElement, Match, ParentProps, Show, Switch } from "solid-js"
3
+ import { useI18n } from "../context/i18n"
4
+ import { IconButton } from "./icon-button"
5
+
6
+ export interface DialogProps extends ParentProps {
7
+ title?: JSXElement
8
+ description?: JSXElement
9
+ action?: JSXElement
10
+ size?: "normal" | "large" | "x-large"
11
+ class?: ComponentProps<"div">["class"]
12
+ classList?: ComponentProps<"div">["classList"]
13
+ fit?: boolean
14
+ transition?: boolean
15
+ }
16
+
17
+ export function Dialog(props: DialogProps) {
18
+ const i18n = useI18n()
19
+ return (
20
+ <div
21
+ data-component="dialog"
22
+ data-fit={props.fit ? true : undefined}
23
+ data-size={props.size || "normal"}
24
+ data-transition={props.transition ? true : undefined}
25
+ >
26
+ <div data-slot="dialog-container">
27
+ <Kobalte.Content
28
+ data-slot="dialog-content"
29
+ data-no-header={!props.title && !props.action ? "" : undefined}
30
+ classList={{
31
+ ...props.classList,
32
+ [props.class ?? ""]: !!props.class,
33
+ }}
34
+ onOpenAutoFocus={(e) => {
35
+ const target = e.currentTarget as HTMLElement | null
36
+ const autofocusEl = target?.querySelector("[autofocus]") as HTMLElement | null
37
+ if (autofocusEl) {
38
+ e.preventDefault()
39
+ autofocusEl.focus()
40
+ }
41
+ }}
42
+ >
43
+ <Show when={props.title || props.action}>
44
+ <div data-slot="dialog-header">
45
+ <Show when={props.title}>
46
+ <Kobalte.Title data-slot="dialog-title">{props.title}</Kobalte.Title>
47
+ </Show>
48
+ <Switch>
49
+ <Match when={props.action}>{props.action}</Match>
50
+ <Match when={true}>
51
+ <Kobalte.CloseButton
52
+ data-slot="dialog-close-button"
53
+ as={IconButton}
54
+ icon="close"
55
+ variant="ghost"
56
+ aria-label={i18n.t("ui.common.close")}
57
+ />
58
+ </Match>
59
+ </Switch>
60
+ </div>
61
+ </Show>
62
+ <Show when={props.description}>
63
+ <Kobalte.Description data-slot="dialog-description" style={{ "margin-left": "-4px" }}>
64
+ {props.description}
65
+ </Kobalte.Description>
66
+ </Show>
67
+ <div data-slot="dialog-body">{props.children}</div>
68
+ </Kobalte.Content>
69
+ </div>
70
+ </div>
71
+ )
72
+ }