1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Set tabs scrollable on small window sizes

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
Alex Andreev 2022-03-14 13:01:27 +03:00
parent 265d1076bd
commit 3fb59bf8c2
3 changed files with 46 additions and 14 deletions

View File

@ -6,10 +6,16 @@
.DockTab { .DockTab {
padding: var(--padding); padding: var(--padding);
height: 32px; height: 32px;
margin-right: 4px;
position: relative; position: relative;
background: no-repeat left 50% linear-gradient(0deg, #43424d, #43424d); background: no-repeat left 50% linear-gradient(0deg, #43424d, #43424d);
background-size: 1px 3ch; background-size: 1px 3ch;
overflow: hidden;
/* Allow tabs to shrink and take all parent space */
min-width: var(--min-tab-width);
flex-grow: 1;
flex-basis: 0;
max-width: fit-content;
&.pinned { &.pinned {
padding-right: var(--padding); padding-right: var(--padding);

View File

@ -4,5 +4,12 @@
*/ */
.dockTabs { .dockTabs {
--min-tab-width: 120px;
display: flex; display: flex;
} overflow: hidden;
> div {
width: 100%;
}
}

View File

@ -5,13 +5,15 @@
import styles from "./dock-tabs.module.scss"; import styles from "./dock-tabs.module.scss";
import React, { Fragment } from "react"; import React, { Fragment, useEffect, useRef, useState } from "react";
import { Icon } from "../icon"; import { Icon } from "../icon";
import { Tabs } from "../tabs/tabs"; import { Tabs } from "../tabs/tabs";
import { DockTab } from "./dock-tab"; import { DockTab } from "./dock-tab";
import type { DockTab as DockTabModel } from "./dock/store"; import type { DockTab as DockTabModel } from "./dock/store";
import { TabKind } from "./dock/store"; import { TabKind } from "./dock/store";
import { TerminalTab } from "./terminal/dock-tab"; import { TerminalTab } from "./terminal/dock-tab";
import { useResizeObserver } from "../../hooks";
import { cssVar } from "../../utils";
export interface DockTabsProps { export interface DockTabsProps {
tabs: DockTabModel[]; tabs: DockTabModel[];
@ -21,6 +23,10 @@ export interface DockTabsProps {
} }
export const DockTabs = ({ tabs, autoFocus, selectedTab, onChangeTab }: DockTabsProps) => { export const DockTabs = ({ tabs, autoFocus, selectedTab, onChangeTab }: DockTabsProps) => {
const elem = useRef<HTMLDivElement>();
const minTabSize = useRef<number>(0);
const [showScrollbar, setShowScrollbar] = useState<boolean>(false);
const renderTab = (tab?: DockTabModel) => { const renderTab = (tab?: DockTabModel) => {
if (!tab) { if (!tab) {
return null; return null;
@ -40,18 +46,31 @@ export const DockTabs = ({ tabs, autoFocus, selectedTab, onChangeTab }: DockTabs
} }
}; };
const updateScrollbarVisibility = () => {
const allTabs = Array.from(elem.current?.querySelectorAll(".Tabs .Tab"));
const allTabsShrinked = allTabs.every(tab => tab.clientWidth == minTabSize.current);
setShowScrollbar(allTabsShrinked);
};
useEffect(() => {
const cssVars = cssVar(elem.current);
minTabSize.current = cssVars.get("--min-tab-width").valueOf();
});
useResizeObserver(elem.current, updateScrollbarVisibility);
return ( return (
<div className={styles.dockTabs}> <div className={styles.dockTabs} ref={elem}>
<div> <Tabs
<Tabs autoFocus={autoFocus}
className="DockTabs" value={selectedTab}
autoFocus={autoFocus} onChange={onChangeTab}
value={selectedTab} scrollable={showScrollbar}
onChange={onChangeTab} >
> {tabs.map(tab => <Fragment key={tab.id}>{renderTab(tab)}</Fragment>)}
{tabs.map(tab => <Fragment key={tab.id}>{renderTab(tab)}</Fragment>)} </Tabs>
</Tabs>
</div>
</div> </div>
); );
}; };