tabs.css 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  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-weak-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. [data-component="file-icon"] {
  202. filter: grayscale(1) !important;
  203. transition: filter 120ms ease;
  204. }
  205. &:has([data-selected]) {
  206. [data-component="file-icon"] {
  207. filter: grayscale(0) !important;
  208. }
  209. }
  210. &:hover:not(:disabled):not(:has([data-selected])) {
  211. color: var(--text-base);
  212. background-color: var(--surface-base-hover);
  213. }
  214. }
  215. }
  216. &[data-variant="alt"] {
  217. [data-slot="tabs-list"] {
  218. padding-left: 24px;
  219. padding-right: 24px;
  220. gap: 12px;
  221. border-bottom: 1px solid var(--border-weak-base);
  222. background-color: transparent;
  223. &::after {
  224. border: none;
  225. background-color: transparent;
  226. }
  227. &:empty::after {
  228. display: none;
  229. }
  230. }
  231. [data-slot="tabs-trigger-wrapper"] {
  232. border: none;
  233. color: var(--text-base);
  234. background-color: transparent;
  235. border-bottom-width: 2px;
  236. border-bottom-style: solid;
  237. border-bottom-color: transparent;
  238. gap: 4px;
  239. /* text-14-regular */
  240. font-family: var(--font-family-sans);
  241. font-size: var(--font-size-base);
  242. font-style: normal;
  243. font-weight: var(--font-weight-regular);
  244. line-height: var(--line-height-x-large); /* 171.429% */
  245. letter-spacing: var(--letter-spacing-normal);
  246. [data-slot="tabs-trigger"] {
  247. height: 100%;
  248. padding: 4px;
  249. background-color: transparent;
  250. border-bottom-width: 2px;
  251. border-bottom-color: transparent;
  252. }
  253. [data-slot="tabs-trigger-close-button"] {
  254. display: flex;
  255. align-items: center;
  256. justify-content: center;
  257. }
  258. [data-component="icon-button"] {
  259. width: 16px;
  260. height: 16px;
  261. margin: 0;
  262. }
  263. &:has([data-selected]) {
  264. color: var(--text-strong);
  265. background-color: transparent;
  266. border-bottom-color: var(--icon-strong-base);
  267. }
  268. &:hover:not(:disabled):not([data-selected]) {
  269. color: var(--text-strong);
  270. }
  271. &:has([data-slot="tabs-trigger-close-button"]) {
  272. padding-right: 0;
  273. [data-slot="tabs-trigger"] {
  274. padding-right: 0;
  275. }
  276. }
  277. }
  278. /* [data-slot="tabs-content"] { */
  279. /* } */
  280. }
  281. &[data-variant="pill"][data-orientation="horizontal"] {
  282. background-color: transparent;
  283. [data-slot="tabs-list"] {
  284. height: auto;
  285. padding: 6px 0;
  286. gap: 4px;
  287. background-color: var(--background-base);
  288. &::after {
  289. display: none;
  290. }
  291. }
  292. [data-slot="tabs-trigger-wrapper"] {
  293. height: 32px;
  294. border: none;
  295. border-radius: var(--radius-sm);
  296. background-color: transparent;
  297. gap: 0;
  298. /* text-13-medium */
  299. font-family: var(--font-family-sans);
  300. font-size: var(--font-size-small);
  301. font-style: normal;
  302. font-weight: var(--font-weight-medium);
  303. line-height: var(--line-height-large);
  304. letter-spacing: var(--letter-spacing-normal);
  305. [data-slot="tabs-trigger"] {
  306. height: 100%;
  307. width: 100%;
  308. padding: 0 12px;
  309. background-color: transparent;
  310. }
  311. &:hover:not(:disabled) {
  312. background-color: var(--surface-base-hover);
  313. color: var(--text-strong);
  314. }
  315. &:active:not(:disabled) {
  316. background-color: var(--surface-base-active);
  317. }
  318. &:has([data-selected]) {
  319. background-color: var(--surface-base-active);
  320. color: var(--text-strong);
  321. &:hover:not(:disabled) {
  322. background-color: var(--surface-base-active);
  323. }
  324. }
  325. }
  326. }
  327. &[data-variant="pill"][data-orientation="horizontal"][data-scope="filetree"] {
  328. [data-slot="tabs-list"] {
  329. height: 48px;
  330. padding-inline: 12px;
  331. gap: 8px;
  332. align-items: center;
  333. background-color: var(--background-stronger);
  334. }
  335. [data-slot="tabs-trigger-wrapper"] {
  336. height: var(--tabs-compact-pill-height);
  337. border-radius: var(--tabs-compact-pill-radius);
  338. color: var(--text-weak);
  339. box-sizing: border-box;
  340. border: 1px solid transparent;
  341. transition:
  342. color 120ms ease,
  343. background-color 120ms ease,
  344. border-color 120ms ease;
  345. &:not(:has([data-selected])):hover:not(:disabled) {
  346. color: var(--text-base);
  347. }
  348. &:has([data-selected]) {
  349. color: var(--text-strong);
  350. border-color: var(--border-weak-base);
  351. }
  352. }
  353. }
  354. &[data-orientation="vertical"] {
  355. flex-direction: row;
  356. [data-slot="tabs-list"] {
  357. flex-direction: column;
  358. width: auto;
  359. height: 100%;
  360. overflow-x: hidden;
  361. overflow-y: auto;
  362. padding: 8px;
  363. gap: 4px;
  364. background-color: var(--background-base);
  365. border-right: 1px solid var(--border-weak-base);
  366. &::after {
  367. display: none;
  368. }
  369. }
  370. [data-slot="tabs-trigger-wrapper"] {
  371. width: 100%;
  372. height: 32px;
  373. border: none;
  374. border-radius: 8px;
  375. background-color: transparent;
  376. [data-slot="tabs-trigger"] {
  377. height: 100%;
  378. padding: 0 8px;
  379. gap: 8px;
  380. justify-content: flex-start;
  381. }
  382. &:hover:not(:disabled) {
  383. background-color: var(--surface-base-hover);
  384. }
  385. &:has([data-selected]) {
  386. background-color: var(--surface-base-active);
  387. color: var(--text-strong);
  388. }
  389. }
  390. [data-slot="tabs-content"] {
  391. overflow-x: auto;
  392. overflow-y: auto;
  393. }
  394. &[data-variant="alt"] {
  395. [data-slot="tabs-list"] {
  396. padding: 8px;
  397. gap: 4px;
  398. border: none;
  399. &::after {
  400. display: none;
  401. }
  402. }
  403. [data-slot="tabs-trigger-wrapper"] {
  404. height: 32px;
  405. border: none;
  406. border-radius: 8px;
  407. [data-slot="tabs-trigger"] {
  408. border: none;
  409. padding: 0 8px;
  410. gap: 8px;
  411. justify-content: flex-start;
  412. }
  413. &:hover:not(:disabled) {
  414. background-color: var(--surface-base-hover);
  415. }
  416. &:has([data-selected]) {
  417. background-color: var(--surface-base-hover);
  418. color: var(--text-strong);
  419. }
  420. }
  421. }
  422. &[data-variant="settings"] {
  423. [data-slot="tabs-list"] {
  424. width: 150px;
  425. min-width: 150px;
  426. @media (min-width: 640px) {
  427. width: 200px;
  428. min-width: 200px;
  429. }
  430. padding: 12px;
  431. gap: 0;
  432. background-color: var(--background-base);
  433. border-right: 1px solid var(--border-weak-base);
  434. &::after {
  435. display: none;
  436. }
  437. }
  438. [data-slot="tabs-section-title"] {
  439. width: 100%;
  440. padding: 0 0 0 4px;
  441. font-family: var(--font-family-sans);
  442. font-size: var(--font-size-small);
  443. font-weight: var(--font-weight-medium);
  444. color: var(--text-weak);
  445. }
  446. [data-slot="tabs-trigger-wrapper"] {
  447. height: 32px;
  448. border: none;
  449. border-radius: var(--radius-md);
  450. /* text-14-medium */
  451. font-family: var(--font-family-sans);
  452. font-size: var(--font-size-base);
  453. font-weight: var(--font-weight-medium);
  454. line-height: var(--line-height-large);
  455. [data-slot="tabs-trigger"] {
  456. border: none;
  457. padding: 0 8px;
  458. gap: 12px;
  459. justify-content: flex-start;
  460. width: 100%;
  461. height: 100%;
  462. }
  463. [data-component="icon"] {
  464. color: var(--icon-base);
  465. }
  466. &:hover:not(:disabled) {
  467. background-color: var(--surface-base-hover);
  468. }
  469. &:has([data-slot="tabs-trigger"]:focus-visible) {
  470. background-color: var(--surface-base-hover);
  471. box-shadow: var(--shadow-xs-border-focus);
  472. }
  473. &:has([data-selected]) {
  474. background-color: var(--surface-base-active);
  475. color: var(--text-strong);
  476. [data-component="icon"] {
  477. color: var(--icon-strong-base);
  478. }
  479. &:hover:not(:disabled) {
  480. background-color: var(--surface-base-active);
  481. }
  482. }
  483. }
  484. [data-slot="tabs-content"] {
  485. background-color: var(--surface-stronger-non-alpha);
  486. }
  487. }
  488. }
  489. }
  490. [data-component="tabs-drag-preview"] {
  491. position: relative;
  492. display: flex;
  493. align-items: center;
  494. height: var(--tabs-bar-height, 48px);
  495. max-width: 320px;
  496. padding-inline: var(--tabs-compact-pill-padding-x, 4px);
  497. overflow: hidden;
  498. color: var(--text-strong);
  499. opacity: 0.6;
  500. }
  501. [data-component="tabs-drag-preview"]::before {
  502. content: "";
  503. position: absolute;
  504. left: 0;
  505. right: 0;
  506. top: calc((var(--tabs-bar-height, 48px) - var(--tabs-compact-pill-height, 24px)) / 2);
  507. height: var(--tabs-compact-pill-height, 24px);
  508. border: 1px solid var(--border-weak-base);
  509. border-radius: var(--tabs-compact-pill-radius, 6px);
  510. background-color: var(--surface-base-active);
  511. }
  512. [data-component="tabs-drag-preview"]::after {
  513. content: "";
  514. position: absolute;
  515. left: 0;
  516. right: 0;
  517. bottom: 0;
  518. height: 1px;
  519. background-color: var(--text-strong);
  520. }
  521. [data-component="tabs-drag-preview"] > * {
  522. position: relative;
  523. }