@opencode-ai/ui 0.0.0-dev-202609032018 → 0.0.0-dev-19039

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 (297) 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 +238 -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 +32 -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/{v2/components/button-v2.css → actions/button/button.css} +29 -0
  65. package/src/{components → actions/button}/button.tsx +19 -11
  66. package/src/actions/icon-button/icon-button.tsx +32 -0
  67. package/src/{v2/components/split-button-v2.css → actions/split-button/split-button.css} +1 -6
  68. package/src/{v2/components/split-button-v2.tsx → actions/split-button/split-button.tsx} +4 -4
  69. package/src/components/animated-number.css +29 -11
  70. package/src/components/animated-number.tsx +2 -2
  71. package/src/components/card.css +2 -23
  72. package/src/components/card.tsx +4 -4
  73. package/src/components/collapsible.tsx +2 -2
  74. package/src/components/dock-surface.css +2 -9
  75. package/src/components/image-preview.tsx +3 -2
  76. package/src/components/list.css +5 -5
  77. package/src/components/list.tsx +7 -5
  78. package/src/components/popover.tsx +3 -2
  79. package/src/components/scroll-view.tsx +5 -20
  80. package/src/components/sticky-accordion-header.tsx +1 -1
  81. package/src/components/text-field.tsx +12 -4
  82. package/src/context/dialog.tsx +1 -0
  83. package/src/context/i18n.tsx +17 -14
  84. package/src/context/marked-base.tsx +27 -0
  85. package/src/context/marked-parser.tsx +3 -13
  86. package/src/{components → data-display/accordion}/accordion.css +5 -31
  87. package/src/{components → data-display/accordion}/accordion.tsx +14 -14
  88. package/src/{v2/components/avatar-v2.tsx → data-display/avatar/avatar.tsx} +1 -1
  89. package/src/{v2/components/badge-v2.css → data-display/badge/badge.css} +19 -0
  90. package/src/{v2/components/badge-v2.tsx → data-display/badge/badge.tsx} +6 -4
  91. package/src/{components → data-display/diff-changes}/diff-changes.css +22 -19
  92. package/src/{v2/components/diff-changes-v2.tsx → data-display/diff-changes/diff-changes.tsx} +7 -2
  93. package/src/{v2/components/keybind-v2.css → data-display/keybind/keybind.css} +1 -1
  94. package/src/{v2/components/keybind-v2.tsx → data-display/keybind/keybind.tsx} +3 -3
  95. package/src/{v2/components/line-comment-v2.css → data-display/line-comment/line-comment.css} +4 -4
  96. package/src/{v2/components/line-comment-v2.tsx → data-display/line-comment/line-comment.tsx} +17 -15
  97. package/src/{v2/components/project-avatar-v2.tsx → data-display/project-avatar/project-avatar.tsx} +1 -1
  98. package/src/{v2/components/loader-v2.tsx → feedback/loader/loader.tsx} +2 -2
  99. package/src/feedback/progress-circle/progress-circle.css +28 -0
  100. package/src/feedback/progress-circle/progress-circle.tsx +64 -0
  101. package/src/{v2/components/toast-v2.tsx → feedback/toast/toast.tsx} +60 -58
  102. package/src/{components → forms/checkbox}/checkbox.css +1 -7
  103. package/src/{components → forms/checkbox}/checkbox.tsx +13 -13
  104. package/src/{v2/components/field-v2.css → forms/field/field.css} +1 -1
  105. package/src/{v2/components/field-v2.tsx → forms/field/field.tsx} +9 -11
  106. package/src/{v2/components/radio-v2.tsx → forms/radio/radio.tsx} +30 -20
  107. package/src/{v2/components/select-v2.css → forms/select/select.css} +2 -8
  108. package/src/{v2/components/select-v2.tsx → forms/select/select.tsx} +40 -32
  109. package/src/{v2/components/switch-v2.css → forms/switch/switch.css} +110 -0
  110. package/src/forms/switch/switch.tsx +34 -0
  111. package/src/{v2/components/text-input-v2.css → forms/text-input/text-input.css} +3 -3
  112. package/src/{v2/components/text-input-v2.tsx → forms/text-input/text-input.tsx} +4 -4
  113. package/src/{v2/components/textarea-v2.tsx → forms/textarea/textarea.tsx} +3 -3
  114. package/src/hooks/create-auto-scroll.tsx +20 -0
  115. package/src/i18n/am.ts +7 -9
  116. package/src/i18n/ar.ts +7 -9
  117. package/src/i18n/az.ts +7 -9
  118. package/src/i18n/bg.ts +7 -9
  119. package/src/i18n/bn.ts +7 -9
  120. package/src/i18n/br.ts +7 -9
  121. package/src/i18n/bs.ts +7 -9
  122. package/src/i18n/ca.ts +7 -9
  123. package/src/i18n/cs.ts +7 -9
  124. package/src/i18n/da.ts +7 -9
  125. package/src/i18n/de.ts +1 -3
  126. package/src/i18n/dv.ts +7 -9
  127. package/src/i18n/dz.ts +5 -7
  128. package/src/i18n/el.ts +7 -9
  129. package/src/i18n/en.ts +54 -11
  130. package/src/i18n/es.ts +6 -8
  131. package/src/i18n/et.ts +7 -9
  132. package/src/i18n/fa.ts +7 -9
  133. package/src/i18n/fi.ts +7 -9
  134. package/src/i18n/fo.ts +7 -9
  135. package/src/i18n/fr.ts +6 -8
  136. package/src/i18n/he.ts +199 -0
  137. package/src/i18n/hi.ts +7 -9
  138. package/src/i18n/hr.ts +7 -9
  139. package/src/i18n/hu.ts +7 -9
  140. package/src/i18n/hy.ts +7 -9
  141. package/src/i18n/id.ts +7 -9
  142. package/src/i18n/is.ts +7 -9
  143. package/src/i18n/it.ts +7 -9
  144. package/src/i18n/ja.ts +7 -9
  145. package/src/i18n/ka.ts +7 -9
  146. package/src/i18n/km.ts +7 -9
  147. package/src/i18n/ko.ts +7 -9
  148. package/src/i18n/lo.ts +7 -9
  149. package/src/i18n/lt.ts +7 -9
  150. package/src/i18n/lv.ts +7 -9
  151. package/src/i18n/mk.ts +7 -9
  152. package/src/i18n/mn.ts +7 -9
  153. package/src/i18n/ms.ts +7 -9
  154. package/src/i18n/my.ts +7 -9
  155. package/src/i18n/ne.ts +7 -9
  156. package/src/i18n/nl.ts +7 -9
  157. package/src/i18n/no.ts +7 -9
  158. package/src/i18n/pa.ts +7 -9
  159. package/src/i18n/pl.ts +7 -9
  160. package/src/i18n/ro.ts +7 -9
  161. package/src/i18n/ru.ts +7 -9
  162. package/src/i18n/si.ts +7 -9
  163. package/src/i18n/sk.ts +7 -9
  164. package/src/i18n/sl.ts +7 -9
  165. package/src/i18n/sq.ts +7 -9
  166. package/src/i18n/sr.ts +7 -9
  167. package/src/i18n/sv.ts +7 -9
  168. package/src/i18n/tg.ts +7 -9
  169. package/src/i18n/th.ts +7 -9
  170. package/src/i18n/tk.ts +7 -9
  171. package/src/i18n/tr.ts +7 -9
  172. package/src/i18n/uk.ts +7 -9
  173. package/src/i18n/ur.ts +7 -9
  174. package/src/i18n/uz.ts +7 -9
  175. package/src/i18n/vi.ts +7 -9
  176. package/src/i18n/zh.ts +7 -9
  177. package/src/i18n/zht.ts +7 -9
  178. package/src/{components/icon.tsx → icons/icon/additional-icons.ts} +8 -74
  179. package/src/icons/icon/icon.css +3 -0
  180. package/src/{v2/components → icons/icon}/icon.tsx +67 -12
  181. package/src/{v2/components/divider-v2.tsx → layout/divider/divider.tsx} +3 -3
  182. package/src/{v2/components/menu-v2.css → navigation/menu/menu.css} +124 -2
  183. package/src/{v2/components/menu-v2.tsx → navigation/menu/menu.tsx} +96 -32
  184. package/src/{v2/components/segmented-control-v2.css → navigation/segmented-control/segmented-control.css} +1 -1
  185. package/src/{v2/components/segmented-control-v2.tsx → navigation/segmented-control/segmented-control.tsx} +9 -8
  186. package/src/{v2/components/tabs-v2.css → navigation/tabs/tabs-current.css} +25 -10
  187. package/src/{components → navigation/tabs}/tabs.css +53 -232
  188. package/src/navigation/tabs/tabs.tsx +194 -0
  189. package/src/{v2/components/dialog-v2.css → overlays/dialog/dialog.css} +3 -0
  190. package/src/{v2/components/dialog-v2.tsx → overlays/dialog/dialog.tsx} +11 -13
  191. package/src/{v2/components/tooltip-v2.css → overlays/tooltip/tooltip.css} +26 -0
  192. package/src/{v2/components/tooltip-v2.tsx → overlays/tooltip/tooltip.tsx} +24 -17
  193. package/src/styles/base.css +5 -0
  194. package/src/styles/index.css +4 -20
  195. package/src/styles/tailwind/colors.css +1 -0
  196. package/src/styles/tailwind/index.css +18 -1
  197. package/src/styles/theme.css +2 -2
  198. package/src/{v2/styles → styles/tokens}/colors.css +8 -8
  199. package/src/{v2/styles → styles/tokens}/theme.css +20 -16
  200. package/src/theme/context.tsx +19 -11
  201. package/src/theme/themes/oc-2.json +48 -19
  202. package/src/theme/v2/default-primitives.ts +8 -8
  203. package/src/theme/v2/foreground.ts +1 -0
  204. package/src/theme/v2/mapping.ts +5 -1
  205. package/src/{components → typography/text-shimmer}/text-shimmer.css +2 -1
  206. package/src/{components → typography/text-shimmer}/text-shimmer.tsx +1 -0
  207. package/src/{v2/components/wordmark-v2.tsx → typography/wordmark/wordmark.tsx} +2 -2
  208. package/dist/components/avatar.d.ts +0 -9
  209. package/dist/components/button.d.ts +0 -9
  210. package/dist/components/dialog.d.ts +0 -12
  211. package/dist/components/dropdown-menu.d.ts +0 -80
  212. package/dist/components/icon-button.d.ts +0 -10
  213. package/dist/components/keybind.d.ts +0 -6
  214. package/dist/components/radio-group.d.ts +0 -16
  215. package/dist/components/select.d.ts +0 -21
  216. package/dist/components/tag.d.ts +0 -5
  217. package/dist/components/toast.d.ts +0 -56
  218. package/dist/components/tooltip.d.ts +0 -17
  219. package/dist/v2/components/accordion-v2.d.ts +0 -26
  220. package/dist/v2/components/badge-v2.d.ts +0 -6
  221. package/dist/v2/components/button-v2.d.ts +0 -10
  222. package/dist/v2/components/checkbox-v2.d.ts +0 -10
  223. package/dist/v2/components/diff-changes-v2.d.ts +0 -11
  224. package/dist/v2/components/divider-v2.d.ts +0 -5
  225. package/dist/v2/components/icon-button-v2.d.ts +0 -11
  226. package/dist/v2/components/inline-input-v2.d.ts +0 -21
  227. package/dist/v2/components/keybind-v2.d.ts +0 -7
  228. package/dist/v2/components/loader-v2.d.ts +0 -3
  229. package/dist/v2/components/menu-v2.d.ts +0 -52
  230. package/dist/v2/components/progress-circle-v2.d.ts +0 -8
  231. package/dist/v2/components/radio-v2.d.ts +0 -16
  232. package/dist/v2/components/split-button-v2.d.ts +0 -5
  233. package/dist/v2/components/switch-v2.d.ts +0 -7
  234. package/dist/v2/components/tabs-v2.d.ts +0 -34
  235. package/dist/v2/components/text-shimmer-v2.d.ts +0 -9
  236. package/dist/v2/components/textarea-v2.d.ts +0 -7
  237. package/dist/v2/components/toast-v2.d.ts +0 -57
  238. package/dist/v2/components/tooltip-v2.d.ts +0 -13
  239. package/dist/v2/components/wordmark-v2.d.ts +0 -2
  240. package/src/components/avatar.css +0 -49
  241. package/src/components/avatar.tsx +0 -55
  242. package/src/components/button.css +0 -194
  243. package/src/components/dialog.css +0 -181
  244. package/src/components/dialog.tsx +0 -72
  245. package/src/components/diff-changes.tsx +0 -115
  246. package/src/components/dropdown-menu.css +0 -135
  247. package/src/components/dropdown-menu.tsx +0 -308
  248. package/src/components/icon-button.css +0 -181
  249. package/src/components/icon-button.tsx +0 -29
  250. package/src/components/icon.css +0 -39
  251. package/src/components/keybind.css +0 -18
  252. package/src/components/keybind.tsx +0 -20
  253. package/src/components/progress-circle.css +0 -16
  254. package/src/components/progress-circle.tsx +0 -64
  255. package/src/components/radio-group.css +0 -187
  256. package/src/components/radio-group.tsx +0 -83
  257. package/src/components/select.css +0 -201
  258. package/src/components/select.tsx +0 -174
  259. package/src/components/switch.css +0 -136
  260. package/src/components/switch.tsx +0 -29
  261. package/src/components/tabs.tsx +0 -126
  262. package/src/components/tag.css +0 -37
  263. package/src/components/tag.tsx +0 -22
  264. package/src/components/toast.css +0 -236
  265. package/src/components/toast.tsx +0 -185
  266. package/src/components/tooltip.css +0 -74
  267. package/src/components/tooltip.tsx +0 -163
  268. package/src/v2/components/accordion-v2.css +0 -139
  269. package/src/v2/components/accordion-v2.tsx +0 -86
  270. package/src/v2/components/button-v2.tsx +0 -35
  271. package/src/v2/components/checkbox-v2.css +0 -184
  272. package/src/v2/components/checkbox-v2.tsx +0 -65
  273. package/src/v2/components/diff-changes-v2.css +0 -26
  274. package/src/v2/components/icon-button-v2.tsx +0 -37
  275. package/src/v2/components/inline-input-v2.css +0 -225
  276. package/src/v2/components/inline-input-v2.tsx +0 -107
  277. package/src/v2/components/progress-circle-v2.css +0 -13
  278. package/src/v2/components/progress-circle-v2.tsx +0 -52
  279. package/src/v2/components/switch-v2.tsx +0 -28
  280. package/src/v2/components/tabs-v2.tsx +0 -149
  281. package/src/v2/components/text-shimmer-v2.css +0 -125
  282. package/src/v2/components/text-shimmer-v2.tsx +0 -63
  283. /package/dist/{components → forms/inline-input}/inline-input.d.ts +0 -0
  284. /package/dist/{v2/components → navigation}/tab-state-indicator.d.ts +0 -0
  285. /package/src/{v2/components/icon-button-v2.css → actions/icon-button/icon-button.css} +0 -0
  286. /package/src/{v2/components/avatar-v2.css → data-display/avatar/avatar.css} +0 -0
  287. /package/src/{v2/components/project-avatar-v2.css → data-display/project-avatar/project-avatar.css} +0 -0
  288. /package/src/{v2/components/loader-v2.css → feedback/loader/loader.css} +0 -0
  289. /package/src/{v2/components/toast-v2.css → feedback/toast/toast.css} +0 -0
  290. /package/src/{components → forms/inline-input}/inline-input.css +0 -0
  291. /package/src/{components → forms/inline-input}/inline-input.tsx +0 -0
  292. /package/src/{v2/components/radio-v2.css → forms/radio/radio.css} +0 -0
  293. /package/src/{v2/components/textarea-v2.css → forms/textarea/textarea.css} +0 -0
  294. /package/src/{v2/components/divider-v2.css → layout/divider/divider.css} +0 -0
  295. /package/src/{v2/components → navigation}/tab-state-indicator.tsx +0 -0
  296. /package/src/{v2/components/file-tree-v2.css → styles/file-tree.css} +0 -0
  297. /package/src/{v2/styles/tailwind.css → styles/tokens/index.css} +0 -0
@@ -18,15 +18,13 @@
18
18
  display: flex;
19
19
  align-items: center;
20
20
  overflow-x: auto;
21
-
22
- /* Hide scrollbar */
23
21
  scrollbar-width: none;
24
22
  -ms-overflow-style: none;
23
+
25
24
  &::-webkit-scrollbar {
26
25
  display: none;
27
26
  }
28
27
 
29
- /* After element to fill remaining space */
30
28
  &::after {
31
29
  content: "";
32
30
  display: block;
@@ -48,15 +46,12 @@
48
46
  align-items: center;
49
47
  gap: 12px;
50
48
  color: var(--text-base);
51
-
52
- /* text-14-medium */
53
49
  font-family: var(--font-family-sans);
54
50
  font-size: 14px;
55
51
  font-style: normal;
56
52
  font-weight: var(--font-weight-medium);
57
- line-height: var(--line-height-large); /* 142.857% */
53
+ line-height: var(--line-height-large);
58
54
  letter-spacing: var(--letter-spacing-normal);
59
-
60
55
  white-space: nowrap;
61
56
  flex-shrink: 0;
62
57
  max-width: 280px;
@@ -86,6 +81,13 @@
86
81
  justify-content: center;
87
82
  }
88
83
 
84
+ [data-slot="tabs-close-button"] {
85
+ padding: 0;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ }
90
+
89
91
  [data-component="icon-button"] {
90
92
  margin: -0.25rem;
91
93
  }
@@ -94,14 +96,17 @@
94
96
  pointer-events: none;
95
97
  color: var(--text-weaker);
96
98
  }
99
+
97
100
  &:focus-visible {
98
101
  outline: none;
99
102
  box-shadow: none;
100
103
  }
104
+
101
105
  &:has([data-selected]) {
102
106
  color: var(--text-strong);
103
107
  background-color: transparent;
104
108
  border-bottom-color: transparent;
109
+
105
110
  [data-slot="tabs-trigger-close-button"] {
106
111
  opacity: 1;
107
112
  }
@@ -110,6 +115,7 @@
110
115
  &:hover:not(:disabled):not([data-selected]) {
111
116
  color: var(--text-strong);
112
117
  }
118
+
113
119
  &:has([data-slot="tabs-trigger-close-button"]) {
114
120
  padding-inline-end: 12px;
115
121
 
@@ -122,10 +128,9 @@
122
128
  [data-slot="tabs-content"] {
123
129
  overflow-y: auto;
124
130
  flex: 1;
125
-
126
- /* Hide scrollbar */
127
131
  scrollbar-width: none;
128
132
  -ms-overflow-style: none;
133
+
129
134
  &::-webkit-scrollbar {
130
135
  display: none;
131
136
  }
@@ -218,6 +223,7 @@
218
223
 
219
224
  &:has([data-slot="tabs-trigger-close-button"]) {
220
225
  padding-inline-end: 5px;
226
+
221
227
  [data-slot="tabs-trigger"] {
222
228
  padding-inline-end: 0 !important;
223
229
  }
@@ -239,10 +245,6 @@
239
245
  background-color: var(--surface-base-hover);
240
246
  }
241
247
 
242
- /*
243
- File tabs: use monochrome icon by default.
244
- Full-color icon is shown on hover/selected.
245
- */
246
248
  [data-slot="tabs-trigger"] {
247
249
  .tab-fileicon-color,
248
250
  .tab-fileicon-mono {
@@ -329,9 +331,6 @@
329
331
  border: none;
330
332
  background-color: transparent;
331
333
  }
332
- &:empty::after {
333
- display: none;
334
- }
335
334
  }
336
335
 
337
336
  [data-slot="tabs-trigger-wrapper"] {
@@ -342,13 +341,11 @@
342
341
  border-bottom-style: solid;
343
342
  border-bottom-color: transparent;
344
343
  gap: 4px;
345
-
346
- /* text-14-regular */
347
344
  font-family: var(--font-family-sans);
348
345
  font-size: var(--font-size-base);
349
346
  font-style: normal;
350
347
  font-weight: var(--font-weight-regular);
351
- line-height: var(--line-height-x-large); /* 171.429% */
348
+ line-height: var(--line-height-x-large);
352
349
  letter-spacing: var(--letter-spacing-normal);
353
350
 
354
351
  [data-slot="tabs-trigger"] {
@@ -359,18 +356,6 @@
359
356
  border-bottom-color: transparent;
360
357
  }
361
358
 
362
- [data-slot="tabs-trigger-close-button"] {
363
- display: flex;
364
- align-items: center;
365
- justify-content: center;
366
- }
367
-
368
- [data-component="icon-button"] {
369
- width: 16px;
370
- height: 16px;
371
- margin: 0;
372
- }
373
-
374
359
  &:has([data-selected]) {
375
360
  color: var(--text-strong);
376
361
  background-color: transparent;
@@ -383,14 +368,12 @@
383
368
 
384
369
  &:has([data-slot="tabs-trigger-close-button"]) {
385
370
  padding-inline-end: 0;
371
+
386
372
  [data-slot="tabs-trigger"] {
387
373
  padding-inline-end: 0;
388
374
  }
389
375
  }
390
376
  }
391
-
392
- /* [data-slot="tabs-content"] { */
393
- /* } */
394
377
  }
395
378
 
396
379
  &[data-variant="pill"][data-orientation="horizontal"] {
@@ -413,8 +396,6 @@
413
396
  border-radius: var(--radius-sm);
414
397
  background-color: transparent;
415
398
  gap: 0;
416
-
417
- /* text-13-medium */
418
399
  font-family: var(--font-family-sans);
419
400
  font-size: var(--font-size-small);
420
401
  font-style: normal;
@@ -434,17 +415,13 @@
434
415
  color: var(--text-strong);
435
416
  }
436
417
 
437
- &:active:not(:disabled) {
418
+ &:active:not(:disabled),
419
+ &:has([data-selected]) {
438
420
  background-color: var(--surface-base-active);
439
421
  }
440
422
 
441
423
  &:has([data-selected]) {
442
- background-color: var(--surface-base-active);
443
424
  color: var(--text-strong);
444
-
445
- &:hover:not(:disabled) {
446
- background-color: var(--surface-base-active);
447
- }
448
425
  }
449
426
  }
450
427
  }
@@ -481,170 +458,6 @@
481
458
  }
482
459
  }
483
460
  }
484
-
485
- &[data-orientation="vertical"] {
486
- flex-direction: row;
487
-
488
- [data-slot="tabs-list"] {
489
- flex-direction: column;
490
- width: auto;
491
- height: 100%;
492
- overflow-x: hidden;
493
- overflow-y: auto;
494
- padding: 8px;
495
- gap: 4px;
496
- background-color: var(--background-base);
497
- border-inline-end: 1px solid var(--border-weak-base);
498
-
499
- &::after {
500
- display: none;
501
- }
502
- }
503
-
504
- [data-slot="tabs-trigger-wrapper"] {
505
- width: 100%;
506
- height: 32px;
507
- border: none;
508
- border-radius: 8px;
509
- background-color: transparent;
510
-
511
- [data-slot="tabs-trigger"] {
512
- height: 100%;
513
- padding: 0 8px;
514
- gap: 8px;
515
- justify-content: flex-start;
516
- }
517
-
518
- &:hover:not(:disabled) {
519
- background-color: var(--surface-base-hover);
520
- }
521
-
522
- &:has([data-selected]) {
523
- background-color: var(--surface-base-active);
524
- color: var(--text-strong);
525
- }
526
- }
527
-
528
- [data-slot="tabs-content"] {
529
- overflow-x: auto;
530
- overflow-y: auto;
531
- }
532
-
533
- &[data-variant="alt"] {
534
- [data-slot="tabs-list"] {
535
- padding: 8px;
536
- gap: 4px;
537
- border: none;
538
-
539
- &::after {
540
- display: none;
541
- }
542
- }
543
-
544
- [data-slot="tabs-trigger-wrapper"] {
545
- height: 32px;
546
- border: none;
547
- border-radius: 8px;
548
-
549
- [data-slot="tabs-trigger"] {
550
- border: none;
551
- padding: 0 8px;
552
- gap: 8px;
553
- justify-content: flex-start;
554
- }
555
-
556
- &:hover:not(:disabled) {
557
- background-color: var(--surface-base-hover);
558
- }
559
-
560
- &:has([data-selected]) {
561
- background-color: var(--surface-base-hover);
562
- color: var(--text-strong);
563
- }
564
- }
565
- }
566
-
567
- &[data-variant="settings"] {
568
- [data-slot="tabs-list"] {
569
- width: 150px;
570
- min-width: 150px;
571
-
572
- @media (min-width: 640px) {
573
- width: 200px;
574
- min-width: 200px;
575
- }
576
- padding: 12px;
577
- gap: 0;
578
- background-color: var(--background-base);
579
- border-inline-end: 1px solid var(--border-weak-base);
580
-
581
- &::after {
582
- display: none;
583
- }
584
- }
585
-
586
- [data-slot="tabs-section-title"] {
587
- width: 100%;
588
- padding: 0;
589
- padding-inline-start: 4px;
590
- font-family: var(--font-family-sans);
591
- font-size: var(--font-size-small);
592
- font-weight: var(--font-weight-medium);
593
- color: var(--text-weak);
594
- }
595
-
596
- [data-slot="tabs-trigger-wrapper"] {
597
- height: 32px;
598
- border: none;
599
- border-radius: var(--radius-md);
600
-
601
- /* text-14-medium */
602
- font-family: var(--font-family-sans);
603
- font-size: var(--font-size-base);
604
- font-weight: var(--font-weight-medium);
605
- line-height: var(--line-height-large);
606
-
607
- [data-slot="tabs-trigger"] {
608
- border: none;
609
- padding: 0 8px;
610
- gap: 12px;
611
- justify-content: flex-start;
612
- width: 100%;
613
- height: 100%;
614
- }
615
-
616
- [data-component="icon"] {
617
- color: var(--icon-base);
618
- }
619
-
620
- &:hover:not(:disabled) {
621
- background-color: var(--surface-base-hover);
622
- }
623
-
624
- &:has([data-slot="tabs-trigger"]:focus-visible) {
625
- background-color: var(--surface-base-hover);
626
- box-shadow: var(--shadow-xs-border-focus);
627
- }
628
-
629
- &:has([data-selected]) {
630
- background-color: var(--surface-base-active);
631
- color: var(--text-strong);
632
-
633
- [data-component="icon"] {
634
- color: var(--icon-strong-base);
635
- }
636
-
637
- &:hover:not(:disabled) {
638
- background-color: var(--surface-base-active);
639
- }
640
- }
641
- }
642
-
643
- [data-slot="tabs-content"] {
644
- background-color: var(--surface-stronger-non-alpha);
645
- }
646
- }
647
- }
648
461
  }
649
462
 
650
463
  [data-component="tabs-drag-preview"] {
@@ -685,10 +498,10 @@
685
498
  position: relative;
686
499
  }
687
500
 
688
- body[data-new-layout] #review-panel [data-component="tabs"],
689
- body[data-new-layout] #terminal-panel [data-component="tabs"],
690
- body[data-new-layout] #review-panel [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"],
691
- body[data-new-layout] #terminal-panel [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"] {
501
+ :root body #review-panel [data-component="tabs"],
502
+ :root body #terminal-panel [data-component="tabs"],
503
+ :root body #review-panel [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"],
504
+ :root body #terminal-panel [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"] {
692
505
  background-color: var(--v2-background-bg-base);
693
506
 
694
507
  [data-slot="tabs-list"] {
@@ -708,7 +521,7 @@ body[data-new-layout] #terminal-panel [data-component="tabs"][data-variant="norm
708
521
  }
709
522
  }
710
523
 
711
- body[data-new-layout] #review-panel [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"] {
524
+ :root body #review-panel [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"] {
712
525
  [data-slot="tabs-list"] {
713
526
  height: 52px;
714
527
  padding-inline-end: 12px;
@@ -739,6 +552,17 @@ body[data-new-layout] #review-panel [data-component="tabs"][data-variant="normal
739
552
  }
740
553
  }
741
554
 
555
+ &[data-value="open-file"],
556
+ &[data-value^="file://"]
557
+ {
558
+ gap: 8px;
559
+ padding-inline-end: 4px;
560
+
561
+ [data-slot="tabs-trigger-close-button"] {
562
+ margin-inline-start: 0;
563
+ }
564
+ }
565
+
742
566
  &:has([data-selected]) {
743
567
  background-color: var(--v2-background-bg-layer-02);
744
568
  box-shadow: none;
@@ -756,25 +580,24 @@ body[data-new-layout] #review-panel [data-component="tabs"][data-variant="normal
756
580
  font-variation-settings: "slnt" 0;
757
581
  font-variant-numeric: tabular-nums;
758
582
 
759
- &[data-selected] {
583
+ &[data-selected]:not([data-value="open-file"]) {
760
584
  color: var(--v2-text-text-base);
761
585
  }
762
586
 
763
587
  .tab-fileicon-color,
764
- .tab-fileicon-mono,
765
- [data-slot="icon-svg"] {
588
+ .tab-fileicon-mono {
766
589
  margin-inline-start: -2px;
767
590
  }
768
- }
769
591
 
770
- /* Preview/temporary tabs: beat trigger + .text-14-medium upright defaults */
771
- [data-slot="tabs-trigger"] .italic {
772
- font-style: italic !important;
773
- font-variation-settings: "slnt" -10 !important;
592
+ .italic {
593
+ font-style: italic !important;
594
+ font-variation-settings: "slnt" -10 !important;
595
+ padding-inline-end: 2px;
596
+ }
774
597
  }
775
598
  }
776
599
 
777
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-tabs-bar {
600
+ :root body #review-panel [data-component="tabs"] .session-review-v2-tabs-bar {
778
601
  width: 100%;
779
602
  min-width: 0;
780
603
  gap: 8px;
@@ -783,8 +606,9 @@ body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-t
783
606
  background-color: var(--v2-background-bg-base);
784
607
  }
785
608
 
786
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-tabs-bar [data-slot="tabs-list"],
787
- body[data-new-layout]
609
+ :root body #review-panel [data-component="tabs"] .session-review-v2-tabs-bar [data-slot="tabs-list"],
610
+ :root
611
+ body
788
612
  #review-panel
789
613
  [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"]
790
614
  .session-review-v2-tabs-bar
@@ -795,12 +619,7 @@ body[data-new-layout]
795
619
  border-bottom: none;
796
620
  }
797
621
 
798
- body[data-new-layout]
799
- #review-panel
800
- [data-component="tabs"]
801
- .session-review-v2-tabs-bar
802
- [data-slot="tabs-list"]
803
- > .sticky {
622
+ :root body #review-panel [data-component="tabs"] .session-review-v2-tabs-bar [data-slot="tabs-list"] > .sticky {
804
623
  padding-inline-end: 0;
805
624
 
806
625
  [data-component="icon-button-v2"] {
@@ -820,7 +639,8 @@ body[data-new-layout]
820
639
  }
821
640
  }
822
641
 
823
- body[data-new-layout]
642
+ :root
643
+ body
824
644
  #review-panel
825
645
  [data-component="tabs"]
826
646
  .session-review-v2-tabs-bar
@@ -831,7 +651,8 @@ body[data-new-layout]
831
651
  inset-inline-end: 0;
832
652
  }
833
653
 
834
- body[data-new-layout]
654
+ :root
655
+ body
835
656
  #review-panel
836
657
  [data-component="tabs"]
837
658
  .session-review-v2-tabs-bar
@@ -879,11 +700,11 @@ body[data-new-layout]
879
700
  }
880
701
  }
881
702
 
882
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-open-in-app-slot {
703
+ :root body #review-panel [data-component="tabs"] .session-review-v2-open-in-app-slot {
883
704
  flex-shrink: 0;
884
705
  margin-inline-start: auto;
885
706
  }
886
707
 
887
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-open-in-app {
708
+ :root body #review-panel [data-component="tabs"] .session-review-v2-open-in-app {
888
709
  flex-shrink: 0;
889
710
  }
@@ -0,0 +1,194 @@
1
+ import { Content, List, Root, Trigger } from "@kobalte/core/tabs"
2
+ import { createContext, Show, splitProps, useContext, type JSX } from "solid-js"
3
+ import type { Component, ComponentProps, ParentProps } from "solid-js"
4
+ import { useI18n } from "../../context/i18n"
5
+ import "./tabs-current.css"
6
+
7
+ export type TabsVariant = "panel" | "underline" | "surface" | "line" | "pill" | "settings"
8
+
9
+ export interface TabsProps extends ComponentProps<typeof Root> {
10
+ variant?: TabsVariant
11
+ orientation?: "horizontal" | "vertical"
12
+ }
13
+ export interface TabsListProps extends ComponentProps<typeof List> {}
14
+ export interface TabsTriggerProps extends ComponentProps<typeof Trigger> {
15
+ classes?: { button?: string }
16
+ closeButton?: JSX.Element
17
+ hideCloseButton?: boolean
18
+ onMiddleClick?: () => void
19
+ subtext?: JSX.Element | string
20
+ }
21
+ export interface TabsCloseButtonProps extends ComponentProps<"button"> {}
22
+ export interface TabsContentProps extends ComponentProps<typeof Content> {}
23
+
24
+ const TabsContext = createContext<{ current: () => boolean }>({ current: () => false })
25
+
26
+ function TabsRoot(props: TabsProps) {
27
+ const [local, rest] = splitProps(props, ["class", "classList", "variant", "orientation", "children"])
28
+ const variant = () => local.variant ?? "panel"
29
+ const current = () => variant() === "line" || variant() === "pill" || variant() === "settings"
30
+ const dataVariant = () => {
31
+ if (variant() === "panel" || variant() === "line") return "normal"
32
+ if (variant() === "underline") return "alt"
33
+ if (variant() === "surface") return "pill"
34
+ return variant()
35
+ }
36
+ return (
37
+ <TabsContext.Provider value={{ current }}>
38
+ <Root
39
+ {...rest}
40
+ orientation={local.orientation}
41
+ data-component={current() ? "tabs-v2" : "tabs"}
42
+ data-variant={dataVariant()}
43
+ data-orientation={local.orientation || "horizontal"}
44
+ classList={{
45
+ ...local.classList,
46
+ [local.class ?? ""]: !!local.class,
47
+ }}
48
+ >
49
+ {local.children}
50
+ </Root>
51
+ </TabsContext.Provider>
52
+ )
53
+ }
54
+
55
+ function TabsList(props: TabsListProps) {
56
+ const ctx = useContext(TabsContext)
57
+ const [local, rest] = splitProps(props, ["class", "classList"])
58
+ return (
59
+ <List
60
+ {...rest}
61
+ data-slot={ctx.current() ? "tabs-v2-list" : "tabs-list"}
62
+ classList={{
63
+ ...local.classList,
64
+ [local.class ?? ""]: !!local.class,
65
+ }}
66
+ />
67
+ )
68
+ }
69
+
70
+ function TabsTrigger(props: ParentProps<TabsTriggerProps>) {
71
+ const ctx = useContext(TabsContext)
72
+ const [local, rest] = splitProps(props, [
73
+ "class",
74
+ "classList",
75
+ "classes",
76
+ "children",
77
+ "closeButton",
78
+ "hideCloseButton",
79
+ "onMiddleClick",
80
+ "subtext",
81
+ "dir",
82
+ ])
83
+ const wrapperSlot = () => (ctx.current() ? "tabs-v2-trigger-wrapper" : "tabs-trigger-wrapper")
84
+ const triggerSlot = () => (ctx.current() ? "tabs-v2-trigger" : "tabs-trigger")
85
+ const closeSlot = () => (ctx.current() ? "tabs-v2-trigger-close-button" : "tabs-trigger-close-button")
86
+ return (
87
+ <div
88
+ data-slot={wrapperSlot()}
89
+ data-value={props.value}
90
+ classList={{
91
+ ...local.classList,
92
+ [local.class ?? ""]: !!local.class,
93
+ }}
94
+ onMouseDown={(event) => {
95
+ if (event.button !== 1 || !local.onMiddleClick) return
96
+ event.preventDefault()
97
+ }}
98
+ onAuxClick={(event) => {
99
+ if (event.button !== 1 || !local.onMiddleClick) return
100
+ event.preventDefault()
101
+ local.onMiddleClick()
102
+ }}
103
+ >
104
+ <Trigger
105
+ {...rest}
106
+ dir={local.dir ?? "auto"}
107
+ data-slot={triggerSlot()}
108
+ data-value={props.value}
109
+ classList={{ [local.classes?.button ?? ""]: !!local.classes?.button }}
110
+ >
111
+ <Show when={ctx.current()} fallback={local.children}>
112
+ <span class="inline-flex items-center gap-2" data-slot="tabs-v2-trigger-content">
113
+ {local.children}
114
+ <Show when={local.subtext}>
115
+ {(subtext) => (
116
+ <span data-slot="tabs-v2-subtext" class="ms-2 text-xs text-text-weak">
117
+ {subtext()}
118
+ </span>
119
+ )}
120
+ </Show>
121
+ </span>
122
+ </Show>
123
+ </Trigger>
124
+ <Show when={local.closeButton}>
125
+ {(closeButton) => (
126
+ <div data-slot={closeSlot()} data-hidden={local.hideCloseButton ? "" : undefined}>
127
+ {closeButton()}
128
+ </div>
129
+ )}
130
+ </Show>
131
+ </div>
132
+ )
133
+ }
134
+
135
+ function TabsCloseButton(props: TabsCloseButtonProps) {
136
+ const i18n = useI18n()
137
+ const [local, rest] = splitProps(props, ["class", "classList", "onClick", "onPointerDown", "aria-label"])
138
+ return (
139
+ <button
140
+ type="button"
141
+ {...rest}
142
+ aria-label={local["aria-label"] ?? i18n.t("ui.tabs.close")}
143
+ data-slot="tabs-close-button"
144
+ classList={{
145
+ [local.class ?? ""]: !!local.class,
146
+ ...local.classList,
147
+ }}
148
+ onPointerDown={(event) => {
149
+ event.stopPropagation()
150
+ if (typeof local.onPointerDown === "function") local.onPointerDown(event)
151
+ }}
152
+ onClick={(event) => {
153
+ event.preventDefault()
154
+ event.stopPropagation()
155
+ if (typeof local.onClick === "function") local.onClick(event)
156
+ }}
157
+ >
158
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
159
+ <path d="M10.8889 3.11108L3.11108 10.8889" stroke="currentColor" stroke-linejoin="round" />
160
+ <path d="M3.11108 3.11108L10.8889 10.8889" stroke="currentColor" stroke-linejoin="round" />
161
+ </svg>
162
+ </button>
163
+ )
164
+ }
165
+
166
+ function TabsContent(props: ParentProps<TabsContentProps>) {
167
+ const ctx = useContext(TabsContext)
168
+ const [local, rest] = splitProps(props, ["class", "classList", "children"])
169
+ return (
170
+ <Content
171
+ {...rest}
172
+ data-slot={ctx.current() ? "tabs-v2-content" : "tabs-content"}
173
+ classList={{
174
+ ...local.classList,
175
+ [local.class ?? ""]: !!local.class,
176
+ }}
177
+ >
178
+ {local.children}
179
+ </Content>
180
+ )
181
+ }
182
+
183
+ const TabsSectionTitle: Component<ParentProps> = (props) => {
184
+ const ctx = useContext(TabsContext)
185
+ return <div data-slot={ctx.current() ? "tabs-v2-section-title" : "tabs-section-title"}>{props.children}</div>
186
+ }
187
+
188
+ export const Tabs = Object.assign(TabsRoot, {
189
+ List: TabsList,
190
+ Trigger: TabsTrigger,
191
+ CloseButton: TabsCloseButton,
192
+ Content: TabsContent,
193
+ SectionTitle: TabsSectionTitle,
194
+ })
@@ -93,6 +93,9 @@
93
93
  [data-slot="dialog-description"] {
94
94
  flex: none;
95
95
  flex-grow: 0;
96
+ min-width: 0;
97
+ max-width: 100%;
98
+ overflow-wrap: anywhere;
96
99
  user-select: none;
97
100
  font-weight: 440;
98
101
  font-size: 13px;