tabs.css 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. [data-component="tabs"] {
  2. --tabs-bar-height: 48px;
  3. --tabs-compact-pill-height: 24px;
  4. --tabs-compact-pill-radius: 6px;
  5. --tabs-compact-pill-padding-x: 4px;
  6. width: 100%;
  7. height: 100%;
  8. display: flex;
  9. flex-direction: column;
  10. background-color: var(--background-stronger);
  11. overflow: clip;
  12. [data-slot="tabs-list"] {
  13. height: 48px;
  14. width: 100%;
  15. position: relative;
  16. display: flex;
  17. align-items: center;
  18. overflow-x: auto;
  19. /* Hide scrollbar */
  20. scrollbar-width: none;
  21. -ms-overflow-style: none;
  22. &::-webkit-scrollbar {
  23. display: none;
  24. }
  25. /* After element to fill remaining space */
  26. &::after {
  27. content: "";
  28. display: block;
  29. flex-grow: 1;
  30. height: 100%;
  31. border-bottom: 1px solid var(--border-weak-base);
  32. background-color: var(--background-base);
  33. }
  34. &:empty::after {
  35. display: none;
  36. }
  37. }
  38. [data-slot="tabs-trigger-wrapper"] {
  39. position: relative;
  40. height: 100%;
  41. display: flex;
  42. align-items: center;
  43. gap: 12px;
  44. color: var(--text-base);
  45. /* text-14-medium */
  46. font-family: var(--font-family-sans);
  47. font-size: 14px;
  48. font-style: normal;
  49. font-weight: var(--font-weight-medium);
  50. line-height: var(--line-height-large); /* 142.857% */
  51. letter-spacing: var(--letter-spacing-normal);
  52. white-space: nowrap;
  53. flex-shrink: 0;
  54. max-width: 280px;
  55. border-bottom: 1px solid var(--border-weak-base);
  56. border-right: 1px solid var(--border-weak-base);
  57. background-color: var(--background-base);
  58. [data-slot="tabs-trigger"] {
  59. display: flex;
  60. align-items: center;
  61. justify-content: center;
  62. padding: 14px 24px 14px 12px;
  63. outline: none;
  64. min-width: 0;
  65. overflow: hidden;
  66. text-overflow: ellipsis;
  67. &:focus-visible {
  68. outline: none;
  69. box-shadow: none;
  70. }
  71. }
  72. [data-slot="tabs-trigger-close-button"] {
  73. display: flex;
  74. align-items: center;
  75. justify-content: center;
  76. }
  77. [data-component="icon-button"] {
  78. margin: -0.25rem;
  79. }
  80. &:disabled {
  81. pointer-events: none;
  82. color: var(--text-weaker);
  83. }
  84. &:focus-visible {
  85. outline: none;
  86. box-shadow: none;
  87. }
  88. &:has([data-selected]) {
  89. color: var(--text-strong);
  90. background-color: transparent;
  91. border-bottom-color: transparent;
  92. [data-slot="tabs-trigger-close-button"] {
  93. opacity: 1;
  94. }
  95. }
  96. &:hover:not(:disabled):not([data-selected]) {
  97. color: var(--text-strong);
  98. }
  99. &:has([data-slot="tabs-trigger-close-button"]) {
  100. padding-right: 12px;
  101. [data-slot="tabs-trigger"] {
  102. padding-right: 0;
  103. }
  104. }
  105. }
  106. [data-slot="tabs-content"] {
  107. overflow-y: auto;
  108. flex: 1;
  109. /* Hide scrollbar */
  110. scrollbar-width: none;
  111. -ms-overflow-style: none;
  112. &::-webkit-scrollbar {
  113. display: none;
  114. }
  115. &:focus-visible {
  116. outline: none;
  117. }
  118. }
  119. #review-panel &[data-variant="normal"][data-orientation="horizontal"] {
  120. background-color: var(--background-stronger);
  121. [data-slot="tabs-list"] {
  122. height: var(--tabs-bar-height);
  123. padding-left: 12px;
  124. padding-right: 0;
  125. --tabs-review-gap: 16px;
  126. --tabs-review-fade: 16px;
  127. gap: var(--tabs-review-gap);
  128. background-color: var(--background-stronger);
  129. border-bottom: 1px solid var(--border-weaker-base);
  130. &::after {
  131. display: none;
  132. }
  133. > .sticky {
  134. border-bottom: none;
  135. background-color: var(--background-stronger);
  136. &::before {
  137. content: "";
  138. position: absolute;
  139. top: 0;
  140. bottom: 0;
  141. left: calc(var(--tabs-review-fade) * -1);
  142. width: var(--tabs-review-fade);
  143. pointer-events: none;
  144. background: linear-gradient(90deg, transparent, var(--background-stronger));
  145. }
  146. }
  147. }
  148. [data-slot="tabs-trigger-wrapper"] {
  149. height: var(--tabs-compact-pill-height);
  150. margin-block: 0;
  151. max-width: 320px;
  152. padding-inline: var(--tabs-compact-pill-padding-x);
  153. box-sizing: border-box;
  154. border: 1px solid transparent;
  155. border-radius: var(--tabs-compact-pill-radius);
  156. background-color: transparent;
  157. gap: 8px;
  158. color: var(--text-weak);
  159. transition:
  160. color 120ms ease,
  161. background-color 120ms ease,
  162. border-color 120ms ease;
  163. &::after {
  164. content: "";
  165. position: absolute;
  166. left: 0;
  167. right: 0;
  168. bottom: calc((var(--tabs-compact-pill-height) - var(--tabs-bar-height)) / 2);
  169. height: 1px;
  170. background-color: var(--text-strong);
  171. opacity: 0;
  172. transform: scaleX(0.75);
  173. transform-origin: center;
  174. transition:
  175. opacity 120ms ease,
  176. transform 120ms ease;
  177. }
  178. &[data-value="review"] {
  179. padding-left: 8px;
  180. padding-right: 8px;
  181. }
  182. [data-slot="tabs-trigger"] {
  183. height: 100%;
  184. padding: 0 !important;
  185. }
  186. &:has([data-slot="tabs-trigger-close-button"]) {
  187. padding-right: 5px;
  188. [data-slot="tabs-trigger"] {
  189. padding-right: 0 !important;
  190. }
  191. }
  192. &:has([data-selected]) {
  193. color: var(--text-strong);
  194. background-color: var(--surface-base-active);
  195. border-color: var(--border-weak-base);
  196. &::after {
  197. opacity: 1;
  198. transform: scaleX(1);
  199. }
  200. }
  201. &:hover:not(:disabled):not(:has([data-selected])) {
  202. color: var(--text-base);
  203. background-color: var(--surface-base-hover);
  204. }
  205. /*
  206. File tabs: use monochrome icon by default.
  207. Full-color icon is shown on hover/selected.
  208. */
  209. [data-slot="tabs-trigger"] {
  210. .tab-fileicon-color,
  211. .tab-fileicon-mono {
  212. pointer-events: none;
  213. }
  214. .tab-fileicon-color {
  215. display: none;
  216. }
  217. .tab-fileicon-mono {
  218. display: block;
  219. color: currentColor;
  220. }
  221. &[data-selected],
  222. &:hover {
  223. .tab-fileicon-color {
  224. display: block;
  225. }
  226. .tab-fileicon-mono {
  227. display: none;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. &[data-variant="alt"] {
  234. [data-slot="tabs-list"] {
  235. padding-left: 24px;
  236. padding-right: 24px;
  237. gap: 12px;
  238. border-bottom: 1px solid var(--border-weak-base);
  239. background-color: transparent;
  240. &::after {
  241. border: none;
  242. background-color: transparent;
  243. }
  244. &:empty::after {
  245. display: none;
  246. }
  247. }
  248. [data-slot="tabs-trigger-wrapper"] {
  249. border: none;
  250. color: var(--text-base);
  251. background-color: transparent;
  252. border-bottom-width: 2px;
  253. border-bottom-style: solid;
  254. border-bottom-color: transparent;
  255. gap: 4px;
  256. /* text-14-regular */
  257. font-family: var(--font-family-sans);
  258. font-size: var(--font-size-base);
  259. font-style: normal;
  260. font-weight: var(--font-weight-regular);
  261. line-height: var(--line-height-x-large); /* 171.429% */
  262. letter-spacing: var(--letter-spacing-normal);
  263. [data-slot="tabs-trigger"] {
  264. height: 100%;
  265. padding: 4px;
  266. background-color: transparent;
  267. border-bottom-width: 2px;
  268. border-bottom-color: transparent;
  269. }
  270. [data-slot="tabs-trigger-close-button"] {
  271. display: flex;
  272. align-items: center;
  273. justify-content: center;
  274. }
  275. [data-component="icon-button"] {
  276. width: 16px;
  277. height: 16px;
  278. margin: 0;
  279. }
  280. &:has([data-selected]) {
  281. color: var(--text-strong);
  282. background-color: transparent;
  283. border-bottom-color: var(--icon-strong-base);
  284. }
  285. &:hover:not(:disabled):not([data-selected]) {
  286. color: var(--text-strong);
  287. }
  288. &:has([data-slot="tabs-trigger-close-button"]) {
  289. padding-right: 0;
  290. [data-slot="tabs-trigger"] {
  291. padding-right: 0;
  292. }
  293. }
  294. }
  295. /* [data-slot="tabs-content"] { */
  296. /* } */
  297. }
  298. &[data-variant="pill"][data-orientation="horizontal"] {
  299. background-color: transparent;
  300. [data-slot="tabs-list"] {
  301. height: auto;
  302. padding: 6px 0;
  303. gap: 4px;
  304. background-color: var(--background-base);
  305. &::after {
  306. display: none;
  307. }
  308. }
  309. [data-slot="tabs-trigger-wrapper"] {
  310. height: 32px;
  311. border: none;
  312. border-radius: var(--radius-sm);
  313. background-color: transparent;
  314. gap: 0;
  315. /* text-13-medium */
  316. font-family: var(--font-family-sans);
  317. font-size: var(--font-size-small);
  318. font-style: normal;
  319. font-weight: var(--font-weight-medium);
  320. line-height: var(--line-height-large);
  321. letter-spacing: var(--letter-spacing-normal);
  322. [data-slot="tabs-trigger"] {
  323. height: 100%;
  324. width: 100%;
  325. padding: 0 12px;
  326. background-color: transparent;
  327. }
  328. &:hover:not(:disabled) {
  329. background-color: var(--surface-base-hover);
  330. color: var(--text-strong);
  331. }
  332. &:active:not(:disabled) {
  333. background-color: var(--surface-base-active);
  334. }
  335. &:has([data-selected]) {
  336. background-color: var(--surface-base-active);
  337. color: var(--text-strong);
  338. &:hover:not(:disabled) {
  339. background-color: var(--surface-base-active);
  340. }
  341. }
  342. }
  343. }
  344. &[data-variant="pill"][data-orientation="horizontal"][data-scope="filetree"] {
  345. [data-slot="tabs-list"] {
  346. height: 48px;
  347. padding-inline: 12px;
  348. gap: 8px;
  349. align-items: center;
  350. background-color: var(--background-stronger);
  351. box-sizing: border-box;
  352. border-bottom: 1px solid var(--border-weak-base);
  353. }
  354. [data-slot="tabs-trigger-wrapper"] {
  355. height: var(--tabs-compact-pill-height);
  356. border-radius: var(--tabs-compact-pill-radius);
  357. color: var(--text-weak);
  358. box-sizing: border-box;
  359. border: 1px solid transparent;
  360. transition:
  361. color 120ms ease,
  362. background-color 120ms ease,
  363. border-color 120ms ease;
  364. &:not(:has([data-selected])):hover:not(:disabled) {
  365. color: var(--text-base);
  366. }
  367. &:has([data-selected]) {
  368. color: var(--text-strong);
  369. border-color: var(--border-weak-base);
  370. }
  371. }
  372. }
  373. &[data-orientation="vertical"] {
  374. flex-direction: row;
  375. [data-slot="tabs-list"] {
  376. flex-direction: column;
  377. width: auto;
  378. height: 100%;
  379. overflow-x: hidden;
  380. overflow-y: auto;
  381. padding: 8px;
  382. gap: 4px;
  383. background-color: var(--background-base);
  384. border-right: 1px solid var(--border-weak-base);
  385. &::after {
  386. display: none;
  387. }
  388. }
  389. [data-slot="tabs-trigger-wrapper"] {
  390. width: 100%;
  391. height: 32px;
  392. border: none;
  393. border-radius: 8px;
  394. background-color: transparent;
  395. [data-slot="tabs-trigger"] {
  396. height: 100%;
  397. padding: 0 8px;
  398. gap: 8px;
  399. justify-content: flex-start;
  400. }
  401. &:hover:not(:disabled) {
  402. background-color: var(--surface-base-hover);
  403. }
  404. &:has([data-selected]) {
  405. background-color: var(--surface-base-active);
  406. color: var(--text-strong);
  407. }
  408. }
  409. [data-slot="tabs-content"] {
  410. overflow-x: auto;
  411. overflow-y: auto;
  412. }
  413. &[data-variant="alt"] {
  414. [data-slot="tabs-list"] {
  415. padding: 8px;
  416. gap: 4px;
  417. border: none;
  418. &::after {
  419. display: none;
  420. }
  421. }
  422. [data-slot="tabs-trigger-wrapper"] {
  423. height: 32px;
  424. border: none;
  425. border-radius: 8px;
  426. [data-slot="tabs-trigger"] {
  427. border: none;
  428. padding: 0 8px;
  429. gap: 8px;
  430. justify-content: flex-start;
  431. }
  432. &:hover:not(:disabled) {
  433. background-color: var(--surface-base-hover);
  434. }
  435. &:has([data-selected]) {
  436. background-color: var(--surface-base-hover);
  437. color: var(--text-strong);
  438. }
  439. }
  440. }
  441. &[data-variant="settings"] {
  442. [data-slot="tabs-list"] {
  443. width: 150px;
  444. min-width: 150px;
  445. @media (min-width: 640px) {
  446. width: 200px;
  447. min-width: 200px;
  448. }
  449. padding: 12px;
  450. gap: 0;
  451. background-color: var(--background-base);
  452. border-right: 1px solid var(--border-weak-base);
  453. &::after {
  454. display: none;
  455. }
  456. }
  457. [data-slot="tabs-section-title"] {
  458. width: 100%;
  459. padding: 0 0 0 4px;
  460. font-family: var(--font-family-sans);
  461. font-size: var(--font-size-small);
  462. font-weight: var(--font-weight-medium);
  463. color: var(--text-weak);
  464. }
  465. [data-slot="tabs-trigger-wrapper"] {
  466. height: 32px;
  467. border: none;
  468. border-radius: var(--radius-md);
  469. /* text-14-medium */
  470. font-family: var(--font-family-sans);
  471. font-size: var(--font-size-base);
  472. font-weight: var(--font-weight-medium);
  473. line-height: var(--line-height-large);
  474. [data-slot="tabs-trigger"] {
  475. border: none;
  476. padding: 0 8px;
  477. gap: 12px;
  478. justify-content: flex-start;
  479. width: 100%;
  480. height: 100%;
  481. }
  482. [data-component="icon"] {
  483. color: var(--icon-base);
  484. }
  485. &:hover:not(:disabled) {
  486. background-color: var(--surface-base-hover);
  487. }
  488. &:has([data-slot="tabs-trigger"]:focus-visible) {
  489. background-color: var(--surface-base-hover);
  490. box-shadow: var(--shadow-xs-border-focus);
  491. }
  492. &:has([data-selected]) {
  493. background-color: var(--surface-base-active);
  494. color: var(--text-strong);
  495. [data-component="icon"] {
  496. color: var(--icon-strong-base);
  497. }
  498. &:hover:not(:disabled) {
  499. background-color: var(--surface-base-active);
  500. }
  501. }
  502. }
  503. [data-slot="tabs-content"] {
  504. background-color: var(--surface-stronger-non-alpha);
  505. }
  506. }
  507. }
  508. }
  509. [data-component="tabs-drag-preview"] {
  510. position: relative;
  511. display: flex;
  512. align-items: center;
  513. height: var(--tabs-bar-height, 48px);
  514. max-width: 320px;
  515. padding-inline: var(--tabs-compact-pill-padding-x, 4px);
  516. overflow: hidden;
  517. color: var(--text-strong);
  518. opacity: 0.6;
  519. }
  520. [data-component="tabs-drag-preview"]::before {
  521. content: "";
  522. position: absolute;
  523. left: 0;
  524. right: 0;
  525. top: calc((var(--tabs-bar-height, 48px) - var(--tabs-compact-pill-height, 24px)) / 2);
  526. height: var(--tabs-compact-pill-height, 24px);
  527. border: 1px solid var(--border-weak-base);
  528. border-radius: var(--tabs-compact-pill-radius, 6px);
  529. background-color: var(--surface-base-active);
  530. }
  531. [data-component="tabs-drag-preview"]::after {
  532. content: "";
  533. position: absolute;
  534. left: 0;
  535. right: 0;
  536. bottom: 0;
  537. height: 1px;
  538. background-color: var(--text-strong);
  539. }
  540. [data-component="tabs-drag-preview"] > * {
  541. position: relative;
  542. }