@opencode-ai/ui 0.0.0-dev-202608241310 → 0.0.0-dev-18092

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 (288) 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/{components → data-display/accordion}/accordion.d.ts +6 -6
  9. package/dist/{v2/components/avatar-v2.d.ts → data-display/avatar/avatar.d.ts} +1 -1
  10. package/dist/data-display/badge/badge.d.ts +7 -0
  11. package/dist/{components → data-display/diff-changes}/diff-changes.d.ts +2 -1
  12. package/dist/data-display/keybind/keybind.d.ts +7 -0
  13. package/dist/{v2/components/line-comment-v2.d.ts → data-display/line-comment/line-comment.d.ts} +9 -9
  14. package/dist/{v2/components/project-avatar-v2.d.ts → data-display/project-avatar/project-avatar.d.ts} +1 -1
  15. package/dist/feedback/loader/loader.d.ts +3 -0
  16. package/dist/{components → feedback/progress-circle}/progress-circle.d.ts +2 -0
  17. package/dist/feedback/toast/toast.d.ts +57 -0
  18. package/dist/{components → forms/checkbox}/checkbox.d.ts +2 -2
  19. package/dist/{v2/components/field-v2.d.ts → forms/field/field.d.ts} +4 -10
  20. package/dist/forms/radio/radio.d.ts +16 -0
  21. package/dist/{v2/components/select-v2.d.ts → forms/select/select.d.ts} +4 -6
  22. package/dist/{components → forms/switch}/switch.d.ts +4 -2
  23. package/dist/{v2/components/text-input-v2.d.ts → forms/text-input/text-input.d.ts} +3 -3
  24. package/dist/forms/textarea/textarea.d.ts +7 -0
  25. package/dist/i18n/ar.d.ts +0 -2
  26. package/dist/i18n/bg.d.ts +0 -2
  27. package/dist/i18n/br.d.ts +0 -2
  28. package/dist/i18n/bs.d.ts +0 -2
  29. package/dist/i18n/da.d.ts +0 -2
  30. package/dist/i18n/de.d.ts +0 -2
  31. package/dist/i18n/en.d.ts +219 -1
  32. package/dist/i18n/es.d.ts +0 -2
  33. package/dist/i18n/fr.d.ts +0 -2
  34. package/dist/i18n/he.d.ts +197 -0
  35. package/dist/i18n/ja.d.ts +0 -2
  36. package/dist/i18n/km.d.ts +0 -2
  37. package/dist/i18n/ko.d.ts +0 -2
  38. package/dist/i18n/lo.d.ts +0 -2
  39. package/dist/i18n/mk.d.ts +0 -2
  40. package/dist/i18n/mn.d.ts +0 -2
  41. package/dist/i18n/my.d.ts +0 -2
  42. package/dist/i18n/pl.d.ts +0 -2
  43. package/dist/i18n/ru.d.ts +0 -2
  44. package/dist/i18n/sr.d.ts +0 -2
  45. package/dist/i18n/tg.d.ts +0 -2
  46. package/dist/i18n/th.d.ts +0 -2
  47. package/dist/i18n/tr.d.ts +0 -2
  48. package/dist/i18n/zh.d.ts +0 -2
  49. package/dist/i18n/zht.d.ts +0 -2
  50. package/dist/{components/icon.d.ts → icons/icon/additional-icons.d.ts} +8 -8
  51. package/dist/{v2/components → icons/icon}/icon.d.ts +20 -1
  52. package/dist/layout/divider/divider.d.ts +5 -0
  53. package/dist/navigation/menu/menu.d.ts +59 -0
  54. package/dist/{v2/components/segmented-control-v2.d.ts → navigation/segmented-control/segmented-control.d.ts} +5 -5
  55. package/dist/{components → navigation/tabs}/tabs.d.ts +15 -8
  56. package/dist/{v2/components/dialog-v2.d.ts → overlays/dialog/dialog.d.ts} +1 -2
  57. package/dist/overlays/tooltip/tooltip.d.ts +15 -0
  58. package/dist/{components → typography/text-shimmer}/text-shimmer.d.ts +1 -0
  59. package/dist/typography/wordmark/wordmark.d.ts +2 -0
  60. package/package.json +131 -13
  61. package/src/{components → actions/button}/button.tsx +10 -11
  62. package/src/actions/icon-button/icon-button.tsx +32 -0
  63. package/src/{v2/components/split-button-v2.css → actions/split-button/split-button.css} +1 -6
  64. package/src/{v2/components/split-button-v2.tsx → actions/split-button/split-button.tsx} +4 -4
  65. package/src/components/animated-number.css +29 -11
  66. package/src/components/animated-number.tsx +2 -2
  67. package/src/components/card.css +2 -23
  68. package/src/components/card.tsx +4 -4
  69. package/src/components/collapsible.tsx +2 -2
  70. package/src/components/dock-surface.css +2 -9
  71. package/src/components/image-preview.tsx +3 -2
  72. package/src/components/list.css +5 -5
  73. package/src/components/list.tsx +7 -5
  74. package/src/components/popover.tsx +3 -2
  75. package/src/components/scroll-view.tsx +5 -20
  76. package/src/components/sticky-accordion-header.tsx +1 -1
  77. package/src/components/text-field.tsx +12 -4
  78. package/src/context/dialog.tsx +2 -1
  79. package/src/context/i18n.tsx +17 -14
  80. package/src/{components → data-display/accordion}/accordion.css +1 -26
  81. package/src/{components → data-display/accordion}/accordion.tsx +14 -14
  82. package/src/{v2/components/avatar-v2.tsx → data-display/avatar/avatar.tsx} +1 -1
  83. package/src/{v2/components/badge-v2.css → data-display/badge/badge.css} +19 -0
  84. package/src/{v2/components/badge-v2.tsx → data-display/badge/badge.tsx} +6 -4
  85. package/src/{components → data-display/diff-changes}/diff-changes.css +22 -19
  86. package/src/{v2/components/diff-changes-v2.tsx → data-display/diff-changes/diff-changes.tsx} +7 -2
  87. package/src/{v2/components/keybind-v2.css → data-display/keybind/keybind.css} +1 -1
  88. package/src/{v2/components/keybind-v2.tsx → data-display/keybind/keybind.tsx} +3 -3
  89. package/src/{v2/components/line-comment-v2.css → data-display/line-comment/line-comment.css} +3 -3
  90. package/src/{v2/components/line-comment-v2.tsx → data-display/line-comment/line-comment.tsx} +17 -15
  91. package/src/{v2/components/project-avatar-v2.tsx → data-display/project-avatar/project-avatar.tsx} +1 -1
  92. package/src/{v2/components/loader-v2.tsx → feedback/loader/loader.tsx} +2 -2
  93. package/src/feedback/progress-circle/progress-circle.css +28 -0
  94. package/src/feedback/progress-circle/progress-circle.tsx +64 -0
  95. package/src/{v2/components/toast-v2.tsx → feedback/toast/toast.tsx} +60 -58
  96. package/src/{components → forms/checkbox}/checkbox.css +1 -7
  97. package/src/{components → forms/checkbox}/checkbox.tsx +13 -13
  98. package/src/{v2/components/field-v2.css → forms/field/field.css} +1 -1
  99. package/src/{v2/components/field-v2.tsx → forms/field/field.tsx} +9 -11
  100. package/src/{v2/components/radio-v2.tsx → forms/radio/radio.tsx} +30 -20
  101. package/src/{v2/components/select-v2.css → forms/select/select.css} +2 -8
  102. package/src/{v2/components/select-v2.tsx → forms/select/select.tsx} +38 -32
  103. package/src/{v2/components/switch-v2.css → forms/switch/switch.css} +110 -0
  104. package/src/forms/switch/switch.tsx +34 -0
  105. package/src/{v2/components/text-input-v2.css → forms/text-input/text-input.css} +1 -1
  106. package/src/{v2/components/text-input-v2.tsx → forms/text-input/text-input.tsx} +4 -4
  107. package/src/{v2/components/textarea-v2.tsx → forms/textarea/textarea.tsx} +3 -3
  108. package/src/hooks/create-auto-scroll.tsx +20 -0
  109. package/src/i18n/am.ts +1 -3
  110. package/src/i18n/ar.ts +1 -3
  111. package/src/i18n/az.ts +1 -3
  112. package/src/i18n/bg.ts +1 -3
  113. package/src/i18n/bn.ts +1 -3
  114. package/src/i18n/br.ts +1 -3
  115. package/src/i18n/bs.ts +1 -3
  116. package/src/i18n/ca.ts +1 -3
  117. package/src/i18n/cs.ts +1 -3
  118. package/src/i18n/da.ts +1 -3
  119. package/src/i18n/de.ts +1 -3
  120. package/src/i18n/dv.ts +1 -3
  121. package/src/i18n/dz.ts +1 -3
  122. package/src/i18n/el.ts +1 -3
  123. package/src/i18n/en.ts +29 -5
  124. package/src/i18n/es.ts +1 -3
  125. package/src/i18n/et.ts +1 -3
  126. package/src/i18n/fa.ts +1 -3
  127. package/src/i18n/fi.ts +1 -3
  128. package/src/i18n/fo.ts +1 -3
  129. package/src/i18n/fr.ts +1 -3
  130. package/src/i18n/he.ts +199 -0
  131. package/src/i18n/hi.ts +1 -3
  132. package/src/i18n/hr.ts +1 -3
  133. package/src/i18n/hu.ts +1 -3
  134. package/src/i18n/hy.ts +1 -3
  135. package/src/i18n/id.ts +1 -3
  136. package/src/i18n/is.ts +1 -3
  137. package/src/i18n/it.ts +1 -3
  138. package/src/i18n/ja.ts +1 -3
  139. package/src/i18n/ka.ts +1 -3
  140. package/src/i18n/km.ts +1 -3
  141. package/src/i18n/ko.ts +1 -3
  142. package/src/i18n/lo.ts +1 -3
  143. package/src/i18n/lt.ts +1 -3
  144. package/src/i18n/lv.ts +1 -3
  145. package/src/i18n/mk.ts +1 -3
  146. package/src/i18n/mn.ts +1 -3
  147. package/src/i18n/ms.ts +1 -3
  148. package/src/i18n/my.ts +1 -3
  149. package/src/i18n/ne.ts +1 -3
  150. package/src/i18n/nl.ts +1 -3
  151. package/src/i18n/no.ts +1 -3
  152. package/src/i18n/pa.ts +1 -3
  153. package/src/i18n/pl.ts +1 -3
  154. package/src/i18n/ro.ts +1 -3
  155. package/src/i18n/ru.ts +1 -3
  156. package/src/i18n/si.ts +1 -3
  157. package/src/i18n/sk.ts +1 -3
  158. package/src/i18n/sl.ts +1 -3
  159. package/src/i18n/sq.ts +1 -3
  160. package/src/i18n/sr.ts +1 -3
  161. package/src/i18n/sv.ts +1 -3
  162. package/src/i18n/tg.ts +1 -3
  163. package/src/i18n/th.ts +1 -3
  164. package/src/i18n/tk.ts +1 -3
  165. package/src/i18n/tr.ts +1 -3
  166. package/src/i18n/uk.ts +1 -3
  167. package/src/i18n/ur.ts +1 -3
  168. package/src/i18n/uz.ts +1 -3
  169. package/src/i18n/vi.ts +1 -3
  170. package/src/i18n/zh.ts +1 -3
  171. package/src/i18n/zht.ts +1 -3
  172. package/src/{components/icon.tsx → icons/icon/additional-icons.ts} +8 -74
  173. package/src/icons/icon/icon.css +3 -0
  174. package/src/{v2/components → icons/icon}/icon.tsx +46 -9
  175. package/src/{v2/components/divider-v2.tsx → layout/divider/divider.tsx} +3 -3
  176. package/src/{v2/components/menu-v2.css → navigation/menu/menu.css} +122 -1
  177. package/src/{v2/components/menu-v2.tsx → navigation/menu/menu.tsx} +96 -32
  178. package/src/{v2/components/segmented-control-v2.css → navigation/segmented-control/segmented-control.css} +1 -1
  179. package/src/{v2/components/segmented-control-v2.tsx → navigation/segmented-control/segmented-control.tsx} +9 -8
  180. package/src/{v2/components/tabs-v2.css → navigation/tabs/tabs-current.css} +25 -10
  181. package/src/{components → navigation/tabs}/tabs.css +39 -229
  182. package/src/navigation/tabs/tabs.tsx +194 -0
  183. package/src/{v2/components/dialog-v2.css → overlays/dialog/dialog.css} +3 -0
  184. package/src/{v2/components/dialog-v2.tsx → overlays/dialog/dialog.tsx} +11 -13
  185. package/src/{v2/components/tooltip-v2.css → overlays/tooltip/tooltip.css} +26 -0
  186. package/src/{v2/components/tooltip-v2.tsx → overlays/tooltip/tooltip.tsx} +21 -14
  187. package/src/styles/index.css +4 -20
  188. package/src/styles/tailwind/colors.css +1 -0
  189. package/src/styles/tailwind/index.css +18 -1
  190. package/src/{v2/styles → styles/tokens}/theme.css +8 -12
  191. package/src/theme/context.tsx +19 -11
  192. package/src/theme/themes/oc-2.json +3 -1
  193. package/src/theme/v2/foreground.ts +1 -0
  194. package/src/{components → typography/text-shimmer}/text-shimmer.css +2 -1
  195. package/src/{components → typography/text-shimmer}/text-shimmer.tsx +1 -0
  196. package/src/{v2/components/wordmark-v2.tsx → typography/wordmark/wordmark.tsx} +1 -1
  197. package/dist/components/avatar.d.ts +0 -9
  198. package/dist/components/button.d.ts +0 -9
  199. package/dist/components/dialog.d.ts +0 -12
  200. package/dist/components/dropdown-menu.d.ts +0 -80
  201. package/dist/components/icon-button.d.ts +0 -10
  202. package/dist/components/keybind.d.ts +0 -6
  203. package/dist/components/radio-group.d.ts +0 -16
  204. package/dist/components/select.d.ts +0 -21
  205. package/dist/components/tag.d.ts +0 -5
  206. package/dist/components/toast.d.ts +0 -56
  207. package/dist/components/tooltip.d.ts +0 -17
  208. package/dist/v2/components/accordion-v2.d.ts +0 -26
  209. package/dist/v2/components/badge-v2.d.ts +0 -6
  210. package/dist/v2/components/button-v2.d.ts +0 -10
  211. package/dist/v2/components/checkbox-v2.d.ts +0 -10
  212. package/dist/v2/components/diff-changes-v2.d.ts +0 -11
  213. package/dist/v2/components/divider-v2.d.ts +0 -5
  214. package/dist/v2/components/icon-button-v2.d.ts +0 -11
  215. package/dist/v2/components/inline-input-v2.d.ts +0 -21
  216. package/dist/v2/components/keybind-v2.d.ts +0 -7
  217. package/dist/v2/components/loader-v2.d.ts +0 -3
  218. package/dist/v2/components/menu-v2.d.ts +0 -52
  219. package/dist/v2/components/progress-circle-v2.d.ts +0 -8
  220. package/dist/v2/components/radio-v2.d.ts +0 -16
  221. package/dist/v2/components/split-button-v2.d.ts +0 -5
  222. package/dist/v2/components/switch-v2.d.ts +0 -7
  223. package/dist/v2/components/tabs-v2.d.ts +0 -34
  224. package/dist/v2/components/text-shimmer-v2.d.ts +0 -9
  225. package/dist/v2/components/textarea-v2.d.ts +0 -7
  226. package/dist/v2/components/toast-v2.d.ts +0 -57
  227. package/dist/v2/components/tooltip-v2.d.ts +0 -13
  228. package/dist/v2/components/wordmark-v2.d.ts +0 -2
  229. package/src/components/avatar.css +0 -49
  230. package/src/components/avatar.tsx +0 -55
  231. package/src/components/button.css +0 -194
  232. package/src/components/dialog.css +0 -181
  233. package/src/components/dialog.tsx +0 -72
  234. package/src/components/diff-changes.tsx +0 -115
  235. package/src/components/dropdown-menu.css +0 -135
  236. package/src/components/dropdown-menu.tsx +0 -308
  237. package/src/components/icon-button.css +0 -181
  238. package/src/components/icon-button.tsx +0 -29
  239. package/src/components/icon.css +0 -39
  240. package/src/components/keybind.css +0 -18
  241. package/src/components/keybind.tsx +0 -20
  242. package/src/components/progress-circle.css +0 -16
  243. package/src/components/progress-circle.tsx +0 -64
  244. package/src/components/radio-group.css +0 -187
  245. package/src/components/radio-group.tsx +0 -83
  246. package/src/components/select.css +0 -201
  247. package/src/components/select.tsx +0 -174
  248. package/src/components/switch.css +0 -136
  249. package/src/components/switch.tsx +0 -29
  250. package/src/components/tabs.tsx +0 -126
  251. package/src/components/tag.css +0 -37
  252. package/src/components/tag.tsx +0 -22
  253. package/src/components/toast.css +0 -236
  254. package/src/components/toast.tsx +0 -185
  255. package/src/components/tooltip.css +0 -74
  256. package/src/components/tooltip.tsx +0 -163
  257. package/src/v2/components/accordion-v2.css +0 -139
  258. package/src/v2/components/accordion-v2.tsx +0 -86
  259. package/src/v2/components/button-v2.tsx +0 -35
  260. package/src/v2/components/checkbox-v2.css +0 -184
  261. package/src/v2/components/checkbox-v2.tsx +0 -65
  262. package/src/v2/components/diff-changes-v2.css +0 -26
  263. package/src/v2/components/icon-button-v2.tsx +0 -37
  264. package/src/v2/components/inline-input-v2.css +0 -225
  265. package/src/v2/components/inline-input-v2.tsx +0 -107
  266. package/src/v2/components/progress-circle-v2.css +0 -13
  267. package/src/v2/components/progress-circle-v2.tsx +0 -52
  268. package/src/v2/components/switch-v2.tsx +0 -28
  269. package/src/v2/components/tabs-v2.tsx +0 -149
  270. package/src/v2/components/text-shimmer-v2.css +0 -125
  271. package/src/v2/components/text-shimmer-v2.tsx +0 -63
  272. /package/dist/{components → forms/inline-input}/inline-input.d.ts +0 -0
  273. /package/dist/{v2/components → navigation}/tab-state-indicator.d.ts +0 -0
  274. /package/src/{v2/components/button-v2.css → actions/button/button.css} +0 -0
  275. /package/src/{v2/components/icon-button-v2.css → actions/icon-button/icon-button.css} +0 -0
  276. /package/src/{v2/components/avatar-v2.css → data-display/avatar/avatar.css} +0 -0
  277. /package/src/{v2/components/project-avatar-v2.css → data-display/project-avatar/project-avatar.css} +0 -0
  278. /package/src/{v2/components/loader-v2.css → feedback/loader/loader.css} +0 -0
  279. /package/src/{v2/components/toast-v2.css → feedback/toast/toast.css} +0 -0
  280. /package/src/{components → forms/inline-input}/inline-input.css +0 -0
  281. /package/src/{components → forms/inline-input}/inline-input.tsx +0 -0
  282. /package/src/{v2/components/radio-v2.css → forms/radio/radio.css} +0 -0
  283. /package/src/{v2/components/textarea-v2.css → forms/textarea/textarea.css} +0 -0
  284. /package/src/{v2/components/divider-v2.css → layout/divider/divider.css} +0 -0
  285. /package/src/{v2/components → navigation}/tab-state-indicator.tsx +0 -0
  286. /package/src/{v2/components/file-tree-v2.css → styles/file-tree.css} +0 -0
  287. /package/src/{v2/styles → styles/tokens}/colors.css +0 -0
  288. /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;
@@ -765,16 +578,15 @@ body[data-new-layout] #review-panel [data-component="tabs"][data-variant="normal
765
578
  [data-slot="icon-svg"] {
766
579
  margin-inline-start: -2px;
767
580
  }
768
- }
769
581
 
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;
582
+ .italic {
583
+ font-style: italic !important;
584
+ font-variation-settings: "slnt" -10 !important;
585
+ }
774
586
  }
775
587
  }
776
588
 
777
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-tabs-bar {
589
+ :root body #review-panel [data-component="tabs"] .session-review-v2-tabs-bar {
778
590
  width: 100%;
779
591
  min-width: 0;
780
592
  gap: 8px;
@@ -783,8 +595,9 @@ body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-t
783
595
  background-color: var(--v2-background-bg-base);
784
596
  }
785
597
 
786
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-tabs-bar [data-slot="tabs-list"],
787
- body[data-new-layout]
598
+ :root body #review-panel [data-component="tabs"] .session-review-v2-tabs-bar [data-slot="tabs-list"],
599
+ :root
600
+ body
788
601
  #review-panel
789
602
  [data-component="tabs"][data-variant="normal"][data-orientation="horizontal"]
790
603
  .session-review-v2-tabs-bar
@@ -795,12 +608,7 @@ body[data-new-layout]
795
608
  border-bottom: none;
796
609
  }
797
610
 
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 {
611
+ :root body #review-panel [data-component="tabs"] .session-review-v2-tabs-bar [data-slot="tabs-list"] > .sticky {
804
612
  padding-inline-end: 0;
805
613
 
806
614
  [data-component="icon-button-v2"] {
@@ -820,7 +628,8 @@ body[data-new-layout]
820
628
  }
821
629
  }
822
630
 
823
- body[data-new-layout]
631
+ :root
632
+ body
824
633
  #review-panel
825
634
  [data-component="tabs"]
826
635
  .session-review-v2-tabs-bar
@@ -831,7 +640,8 @@ body[data-new-layout]
831
640
  inset-inline-end: 0;
832
641
  }
833
642
 
834
- body[data-new-layout]
643
+ :root
644
+ body
835
645
  #review-panel
836
646
  [data-component="tabs"]
837
647
  .session-review-v2-tabs-bar
@@ -879,11 +689,11 @@ body[data-new-layout]
879
689
  }
880
690
  }
881
691
 
882
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-open-in-app-slot {
692
+ :root body #review-panel [data-component="tabs"] .session-review-v2-open-in-app-slot {
883
693
  flex-shrink: 0;
884
694
  margin-inline-start: auto;
885
695
  }
886
696
 
887
- body[data-new-layout] #review-panel [data-component="tabs"] .session-review-v2-open-in-app {
697
+ :root body #review-panel [data-component="tabs"] .session-review-v2-open-in-app {
888
698
  flex-shrink: 0;
889
699
  }
@@ -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;