fix: some minor ui issues (#1783)

This commit is contained in:
Peng Xiao
2023-04-03 13:24:53 +08:00
committed by GitHub
parent 95879cc1d0
commit 487ef35563
10 changed files with 90 additions and 79 deletions

View File

@@ -1,2 +1,2 @@
pnpm-lock.yaml pnpm-lock.yaml
apps/electron/layers/preload/preload.d.ts

View File

@@ -1,16 +1,12 @@
interface Window { interface Window {
/** /**
* After analyzing the `exposeInMainWorld` calls, * After analyzing the `exposeInMainWorld` calls,
* `packages/preload/exposedInMainWorld.d.ts` file will be generated. * `packages/preload/exposedInMainWorld.d.ts` file will be generated.
* It contains all interfaces. * It contains all interfaces.
* `packages/preload/exposedInMainWorld.d.ts` file is required for TS is `renderer` * `packages/preload/exposedInMainWorld.d.ts` file is required for TS is `renderer`
* *
* @see https://github.com/cawa-93/dts-for-context-bridge * @see https://github.com/cawa-93/dts-for-context-bridge
*/ */
readonly apis: { readonly apis: { workspaceSync: (id: string) => Promise<any>; onThemeChange: (theme: string) => Promise<any>; onSidebarVisibilityChange: (visible: boolean) => Promise<any>; };
workspaceSync: (id: string) => Promise<any>; readonly appInfo: { electron: boolean; isMacOS: boolean; };
onThemeChange: (theme: string) => Promise<any>;
onSidebarVisibilityChange: (visible: boolean) => Promise<any>;
};
readonly appInfo: { electron: boolean; isMacOS: boolean };
} }

View File

@@ -8,11 +8,11 @@ import {
SettingsIcon, SettingsIcon,
} from '@blocksuite/icons'; } from '@blocksuite/icons';
import type { Page, PageMeta } from '@blocksuite/store'; import type { Page, PageMeta } from '@blocksuite/store';
import { useMediaQuery, useTheme } from '@mui/material';
import type React from 'react'; import type React from 'react';
import { useCallback, useEffect } from 'react'; import { useCallback, useEffect } from 'react';
import { import {
useSidebarFloating,
useSidebarResizing, useSidebarResizing,
useSidebarStatus, useSidebarStatus,
useSidebarWidth, useSidebarWidth,
@@ -80,16 +80,11 @@ export const WorkSpaceSliderBar: React.FC<WorkSpaceSliderBarProps> = ({
const page = await createPage(); const page = await createPage();
openPage(page.id); openPage(page.id);
}, [createPage, openPage]); }, [createPage, openPage]);
const theme = useTheme(); const floatingSlider = useSidebarFloating();
const floatingSlider = useMediaQuery(theme.breakpoints.down('md'));
const [sliderWidth, setSliderWidth] = useSidebarWidth(); const [sliderWidth, setSliderWidth] = useSidebarWidth();
const [isResizing, setIsResizing] = useSidebarResizing(); const [isResizing, setIsResizing] = useSidebarResizing();
const show = isPublicWorkspace ? false : sidebarOpen; const show = isPublicWorkspace ? false : sidebarOpen;
const actualWidth = show const actualWidth = floatingSlider ? 'calc(10vw + 400px)' : sliderWidth;
? floatingSlider
? 'calc(10vw + 400px)'
: sliderWidth
: 0;
const onResizeStart = useCallback(() => { const onResizeStart = useCallback(() => {
let resized = false; let resized = false;
function onMouseMove(e: MouseEvent) { function onMouseMove(e: MouseEvent) {
@@ -117,13 +112,13 @@ export const WorkSpaceSliderBar: React.FC<WorkSpaceSliderBarProps> = ({
}, [sidebarOpen]); }, [sidebarOpen]);
return ( return (
<> <>
<StyledSliderBarWrapper data-testid="sliderBar-root"> <StyledSliderBarWrapper
<StyledSliderBar floating={floatingSlider}
resizing={isResizing} show={show}
floating={floatingSlider} style={{ width: actualWidth }}
style={{ width: actualWidth }} data-testid="sliderBar-root"
show={show} >
> <StyledSliderBar>
<StyledSidebarSwitchWrapper> <StyledSidebarSwitchWrapper>
<SidebarSwitch <SidebarSwitch
visible={sidebarOpen} visible={sidebarOpen}

View File

@@ -1,41 +1,39 @@
import { displayFlex, styled } from '@affine/component'; import { displayFlex, styled } from '@affine/component';
import { getEnvironment } from '@affine/env';
import Link from 'next/link'; import Link from 'next/link';
export const StyledSliderBarWrapper = styled('div')(() => { const macosElectron = environment.isDesktop && environment.isMacOs;
export const StyledSliderBarWrapper = styled('div')<{
show: boolean;
floating: boolean;
}>(({ theme, show, floating }) => {
return { return {
height: '100%', height: '100%',
width: 'auto', position: 'absolute',
position: 'relative',
'button, a': { 'button, a': {
userSelect: 'none', userSelect: 'none',
}, },
zIndex: theme.zIndex.modal,
transition: 'transform .25s',
transform: show ? 'translateX(0)' : 'translateX(-100%)',
maxWidth: floating ? undefined : 'calc(100vw - 698px)',
background:
!floating && macosElectron ? 'transparent' : theme.colors.hubBackground,
borderRight: '1px solid',
borderColor: theme.colors.borderColor,
}; };
}); });
export const StyledSliderBar = styled('div')<{ export const StyledSliderBar = styled('div')(({ theme }) => {
resizing: boolean;
show: boolean;
floating: boolean;
}>(({ theme, show, floating, resizing }) => {
const env = getEnvironment();
const macosElectron = env.isDesktop && env.isMacOs;
return { return {
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
width: '100%',
height: '100%', height: '100%',
background: padding: '0 4px',
!floating && macosElectron ? 'transparent' : theme.colors.hubBackground,
zIndex: theme.zIndex.modal,
transition: !resizing ? 'width .15s, padding .15s' : '',
padding: show ? '0 4px' : '0',
flexShrink: 0, flexShrink: 0,
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
overflow: 'hidden', overflow: 'hidden',
position: floating ? 'absolute' : 'relative',
maxWidth: floating ? undefined : 'calc(100vw - 698px)',
borderRight: '1px solid',
borderColor: theme.colors.borderColor,
}; };
}); });
export const StyledSidebarSwitchWrapper = styled('div')(() => { export const StyledSidebarSwitchWrapper = styled('div')(() => {
@@ -43,7 +41,7 @@ export const StyledSidebarSwitchWrapper = styled('div')(() => {
height: '52px', height: '52px',
flexShrink: 0, flexShrink: 0,
padding: '0 16px', padding: '0 16px',
...displayFlex('flex-end', 'center'), ...displayFlex(macosElectron ? 'flex-end' : 'flex-start', 'center'),
}; };
}); });
export const StyledSliderBarInnerWrapper = styled('div')(() => { export const StyledSliderBarInnerWrapper = styled('div')(() => {
@@ -92,11 +90,10 @@ export const StyledSliderModalBackground = styled('div')<{ active: boolean }>(
transition: 'opacity .15s', transition: 'opacity .15s',
pointerEvents: active ? 'auto' : 'none', pointerEvents: active ? 'auto' : 'none',
opacity: active ? 1 : 0, opacity: active ? 1 : 0,
display: active ? 'block' : 'none',
position: 'fixed', position: 'fixed',
top: 0, top: 0,
left: 0, left: 0,
right: 0, right: active ? 0 : '100%',
bottom: 0, bottom: 0,
zIndex: theme.zIndex.modal - 1, zIndex: theme.zIndex.modal - 1,
background: theme.colors.modalBackground, background: theme.colors.modalBackground,
@@ -104,7 +101,7 @@ export const StyledSliderModalBackground = styled('div')<{ active: boolean }>(
} }
); );
export const StyledSliderResizer = styled('div')<{ isResizing: boolean }>( export const StyledSliderResizer = styled('div')<{ isResizing: boolean }>(
({ theme }) => { () => {
return { return {
position: 'absolute', position: 'absolute',
top: 0, top: 0,
@@ -113,7 +110,7 @@ export const StyledSliderResizer = styled('div')<{ isResizing: boolean }>(
width: '12px', width: '12px',
transform: 'translateX(50%)', transform: 'translateX(50%)',
cursor: 'col-resize', cursor: 'col-resize',
zIndex: theme.zIndex.modal + 1, zIndex: 1,
userSelect: 'none', userSelect: 'none',
':hover > *': { ':hover > *': {
background: 'rgba(0, 0, 0, 0.1)', background: 'rgba(0, 0, 0, 0.1)',

View File

@@ -1,4 +1,5 @@
import { atomWithSyncStorage } from '@affine/jotai'; import { atomWithSyncStorage } from '@affine/jotai';
import { useMediaQuery, useTheme } from '@mui/material';
import { atom, useAtom } from 'jotai'; import { atom, useAtom } from 'jotai';
const sideBarOpenAtom = atomWithSyncStorage('sidebarOpen', true); const sideBarOpenAtom = atomWithSyncStorage('sidebarOpen', true);
@@ -13,6 +14,11 @@ export function useSidebarWidth() {
return useAtom(sideBarWidthAtom); return useAtom(sideBarWidthAtom);
} }
export function useSidebarFloating() {
const theme = useTheme();
return useMediaQuery(theme.breakpoints.down('md'));
}
export function useSidebarResizing() { export function useSidebarResizing() {
return useAtom(sidebarResizingAtom); return useAtom(sidebarResizingAtom);
} }

View File

@@ -26,7 +26,12 @@ import { HelpIsland } from '../components/pure/help-island';
import { PageLoading } from '../components/pure/loading'; import { PageLoading } from '../components/pure/loading';
import WorkSpaceSliderBar from '../components/pure/workspace-slider-bar'; import WorkSpaceSliderBar from '../components/pure/workspace-slider-bar';
import { useAffineRefreshAuthToken } from '../hooks/affine/use-affine-refresh-auth-token'; import { useAffineRefreshAuthToken } from '../hooks/affine/use-affine-refresh-auth-token';
import { useSidebarResizing } from '../hooks/affine/use-sidebar-status'; import {
useSidebarFloating,
useSidebarResizing,
useSidebarStatus,
useSidebarWidth,
} from '../hooks/affine/use-sidebar-status';
import { useCurrentPageId } from '../hooks/current/use-current-page-id'; import { useCurrentPageId } from '../hooks/current/use-current-page-id';
import { useCurrentWorkspace } from '../hooks/current/use-current-workspace'; import { useCurrentWorkspace } from '../hooks/current/use-current-workspace';
import { useBlockSuiteWorkspaceHelper } from '../hooks/use-blocksuite-workspace-helper'; import { useBlockSuiteWorkspaceHelper } from '../hooks/use-blocksuite-workspace-helper';
@@ -246,14 +251,18 @@ export const WorkspaceLayoutInner: React.FC<React.PropsWithChildren> = ({
setOpenWorkspacesModal(true); setOpenWorkspacesModal(true);
}, [setOpenWorkspacesModal]); }, [setOpenWorkspacesModal]);
const [openQuickSearchModal, setOpenQuickSearchModalAtom] = useAtom( const [, setOpenQuickSearchModalAtom] = useAtom(openQuickSearchModalAtom);
openQuickSearchModalAtom
);
const handleOpenQuickSearchModal = useCallback(() => { const handleOpenQuickSearchModal = useCallback(() => {
setOpenQuickSearchModalAtom(true); setOpenQuickSearchModalAtom(true);
}, [setOpenQuickSearchModalAtom]); }, [setOpenQuickSearchModalAtom]);
const [resizingSidebar] = useSidebarResizing(); const [resizingSidebar] = useSidebarResizing();
const lock = useAtomValue(workspaceLockAtom); const lock = useAtomValue(workspaceLockAtom);
const [sidebarOpen] = useSidebarStatus();
const sidebarFloating = useSidebarFloating();
const [sidebarWidth] = useSidebarWidth();
const paddingLeft =
sidebarFloating || !sidebarOpen ? '0' : `${sidebarWidth}px`;
const [resizing] = useSidebarResizing();
if (lock) { if (lock) {
return <PageLoading />; return <PageLoading />;
} }
@@ -275,7 +284,10 @@ export const WorkspaceLayoutInner: React.FC<React.PropsWithChildren> = ({
currentPath={router.asPath.split('?')[0]} currentPath={router.asPath.split('?')[0]}
paths={isPublicWorkspace ? publicPathGenerator : pathGenerator} paths={isPublicWorkspace ? publicPathGenerator : pathGenerator}
/> />
<MainContainerWrapper> <MainContainerWrapper
resizing={resizing}
style={{ paddingLeft: paddingLeft }}
>
<MainContainer className="main-container"> <MainContainer className="main-container">
<AffineWorkspaceEffect /> <AffineWorkspaceEffect />
{children} {children}

View File

@@ -4,6 +4,8 @@ export const StyledPage = styled('div')<{ resizing?: boolean }>(
({ theme, resizing }) => { ({ theme, resizing }) => {
return { return {
cursor: resizing ? 'col-resize' : 'default', cursor: resizing ? 'col-resize' : 'default',
width: '100%',
position: 'relative',
height: '100vh', height: '100vh',
transition: 'background-color .5s', transition: 'background-color .5s',
display: 'flex', display: 'flex',
@@ -24,21 +26,24 @@ export const StyledWrapper = styled('div')(() => {
}; };
}); });
export const MainContainerWrapper = styled('div')(({ theme }) => { export const MainContainerWrapper = styled('div')<{ resizing: boolean }>(
return { ({ theme, resizing }) => {
display: 'flex', return {
flexGrow: 1, display: 'flex',
position: 'relative', flexGrow: 1,
maxWidth: '100vw', position: 'relative',
overflow: 'auto', maxWidth: '100vw',
backgroundColor: theme.colors.pageBackground, overflow: 'auto',
}; transition: resizing ? '' : 'padding-left .25s',
}); };
}
);
export const MainContainer = styled('div')(({ theme }) => { export const MainContainer = styled('div')(({ theme }) => {
return { return {
position: 'relative', position: 'relative',
flexGrow: 1, flexGrow: 1,
backgroundColor: theme.colors.pageBackground,
[theme.breakpoints.up('md')]: { [theme.breakpoints.up('md')]: {
minWidth: '686px', minWidth: '686px',
}, },

View File

@@ -9,8 +9,8 @@ test.describe('Layout ui', () => {
await openHomePage(page); await openHomePage(page);
await waitMarkdownImported(page); await waitMarkdownImported(page);
await page.getByTestId('sliderBar-arrowButton-collapse').click(); await page.getByTestId('sliderBar-arrowButton-collapse').click();
const sliderBarArea = page.getByTestId('sliderBar-inner'); const sliderBarArea = page.getByTestId('sliderBar-root');
await expect(sliderBarArea).not.toBeVisible(); await expect(sliderBarArea).not.toBeInViewport();
}); });
test('Expand Sidebar', async ({ page }) => { test('Expand Sidebar', async ({ page }) => {
@@ -18,10 +18,10 @@ test.describe('Layout ui', () => {
await waitMarkdownImported(page); await waitMarkdownImported(page);
await page.getByTestId('sliderBar-arrowButton-collapse').click(); await page.getByTestId('sliderBar-arrowButton-collapse').click();
const sliderBarArea = page.getByTestId('sliderBar-inner'); const sliderBarArea = page.getByTestId('sliderBar-inner');
await expect(sliderBarArea).not.toBeVisible(); await expect(sliderBarArea).not.toBeInViewport();
await page.getByTestId('sliderBar-arrowButton-expand').click(); await page.getByTestId('sliderBar-arrowButton-expand').click();
await expect(sliderBarArea).toBeVisible(); await expect(sliderBarArea).toBeInViewport();
}); });
test('Click resizer can close sidebar', async ({ page }) => { test('Click resizer can close sidebar', async ({ page }) => {
@@ -31,7 +31,7 @@ test.describe('Layout ui', () => {
await expect(sliderBarArea).toBeVisible(); await expect(sliderBarArea).toBeVisible();
await page.getByTestId('sliderBar-resizer').click(); await page.getByTestId('sliderBar-resizer').click();
await expect(sliderBarArea).not.toBeVisible(); await expect(sliderBarArea).not.toBeInViewport();
}); });
test('Drag resizer can resize sidebar', async ({ page }) => { test('Drag resizer can resize sidebar', async ({ page }) => {
@@ -58,7 +58,7 @@ test.describe('Layout ui', () => {
const sliderBarModalBackground = page.getByTestId( const sliderBarModalBackground = page.getByTestId(
'sliderBar-modalBackground' 'sliderBar-modalBackground'
); );
await expect(sliderBarArea).toBeVisible(); await expect(sliderBarArea).toBeInViewport();
await expect(sliderBarModalBackground).not.toBeVisible(); await expect(sliderBarModalBackground).not.toBeVisible();
await page.setViewportSize({ await page.setViewportSize({
@@ -72,6 +72,6 @@ test.describe('Layout ui', () => {
force: true, force: true,
position: { x: 600, y: 150 }, position: { x: 600, y: 150 },
}); });
await expect(sliderBarArea).not.toBeVisible(); await expect(sliderBarArea).not.toBeInViewport();
}); });
}); });

View File

@@ -181,7 +181,7 @@ test.describe('Novice guidance for quick search', () => {
await expect(quickSearchTips).not.toBeVisible(); await expect(quickSearchTips).not.toBeVisible();
await page.getByTestId('sliderBar-arrowButton-collapse').click(); await page.getByTestId('sliderBar-arrowButton-collapse').click();
const sliderBarArea = page.getByTestId('sliderBar-inner'); const sliderBarArea = page.getByTestId('sliderBar-inner');
await expect(sliderBarArea).not.toBeVisible(); await expect(sliderBarArea).not.toBeInViewport();
await expect(quickSearchTips).toBeVisible(); await expect(quickSearchTips).toBeVisible();
await page.locator('[data-testid=quick-search-got-it]').click(); await page.locator('[data-testid=quick-search-got-it]').click();
await expect(quickSearchTips).not.toBeVisible(); await expect(quickSearchTips).not.toBeVisible();

View File

@@ -10,6 +10,6 @@ test.describe('subpage', () => {
await waitMarkdownImported(page); await waitMarkdownImported(page);
await page.getByTestId('sliderBar-arrowButton-collapse').click(); await page.getByTestId('sliderBar-arrowButton-collapse').click();
const sliderBarArea = page.getByTestId('sliderBar-inner'); const sliderBarArea = page.getByTestId('sliderBar-inner');
await expect(sliderBarArea).not.toBeVisible(); await expect(sliderBarArea).not.toBeInViewport();
}); });
}); });