POC: follow mode indicator styling

This commit is contained in:
barnabasmolnar 2023-07-28 15:09:53 +02:00
parent a9cfd97cc4
commit 1777b4566c
5 changed files with 104 additions and 30 deletions

View File

@ -331,6 +331,7 @@ import { actionWrapTextInContainer } from "../actions/actionBoundText";
import BraveMeasureTextError from "./BraveMeasureTextError"; import BraveMeasureTextError from "./BraveMeasureTextError";
import { activeEyeDropperAtom } from "./EyeDropper"; import { activeEyeDropperAtom } from "./EyeDropper";
import { isSidebarDockedAtom } from "./Sidebar/Sidebar"; import { isSidebarDockedAtom } from "./Sidebar/Sidebar";
import FollowMode from "./FollowMode/FollowMode";
const AppContext = React.createContext<AppClassProperties>(null!); const AppContext = React.createContext<AppClassProperties>(null!);
const AppPropsContext = React.createContext<AppProps>(null!); const AppPropsContext = React.createContext<AppProps>(null!);
@ -549,12 +550,38 @@ class App extends React.Component<AppProps, AppState> {
const canvasHeight = canvasDOMHeight * canvasScale; const canvasHeight = canvasDOMHeight * canvasScale;
if (viewModeEnabled) { if (viewModeEnabled) {
return ( return (
<FollowMode width={canvasDOMWidth} height={canvasDOMHeight}>
<canvas
className="excalidraw__canvas"
style={{
width: canvasDOMWidth,
height: canvasDOMHeight,
cursor: CURSOR_TYPE.GRAB,
}}
width={canvasWidth}
height={canvasHeight}
ref={this.handleCanvasRef}
onContextMenu={(event: React.PointerEvent<HTMLCanvasElement>) =>
this.handleCanvasContextMenu(event)
}
onPointerMove={this.handleCanvasPointerMove}
onPointerUp={this.handleCanvasPointerUp}
onPointerCancel={this.removePointer}
onTouchMove={this.handleTouchMove}
onPointerDown={this.handleCanvasPointerDown}
>
{t("labels.drawingCanvas")}
</canvas>
</FollowMode>
);
}
return (
<FollowMode width={canvasDOMWidth} height={canvasDOMHeight}>
<canvas <canvas
className="excalidraw__canvas" className="excalidraw__canvas"
style={{ style={{
width: canvasDOMWidth, width: canvasDOMWidth,
height: canvasDOMHeight, height: canvasDOMHeight,
cursor: CURSOR_TYPE.GRAB,
}} }}
width={canvasWidth} width={canvasWidth}
height={canvasHeight} height={canvasHeight}
@ -562,38 +589,16 @@ class App extends React.Component<AppProps, AppState> {
onContextMenu={(event: React.PointerEvent<HTMLCanvasElement>) => onContextMenu={(event: React.PointerEvent<HTMLCanvasElement>) =>
this.handleCanvasContextMenu(event) this.handleCanvasContextMenu(event)
} }
onPointerDown={this.handleCanvasPointerDown}
onDoubleClick={this.handleCanvasDoubleClick}
onPointerMove={this.handleCanvasPointerMove} onPointerMove={this.handleCanvasPointerMove}
onPointerUp={this.handleCanvasPointerUp} onPointerUp={this.handleCanvasPointerUp}
onPointerCancel={this.removePointer} onPointerCancel={this.removePointer}
onTouchMove={this.handleTouchMove} onTouchMove={this.handleTouchMove}
onPointerDown={this.handleCanvasPointerDown}
> >
{t("labels.drawingCanvas")} {t("labels.drawingCanvas")}
</canvas> </canvas>
); </FollowMode>
}
return (
<canvas
className="excalidraw__canvas"
style={{
width: canvasDOMWidth,
height: canvasDOMHeight,
}}
width={canvasWidth}
height={canvasHeight}
ref={this.handleCanvasRef}
onContextMenu={(event: React.PointerEvent<HTMLCanvasElement>) =>
this.handleCanvasContextMenu(event)
}
onPointerDown={this.handleCanvasPointerDown}
onDoubleClick={this.handleCanvasDoubleClick}
onPointerMove={this.handleCanvasPointerMove}
onPointerUp={this.handleCanvasPointerUp}
onPointerCancel={this.removePointer}
onTouchMove={this.handleTouchMove}
>
{t("labels.drawingCanvas")}
</canvas>
); );
} }

View File

@ -32,10 +32,8 @@
border-radius: 100%; border-radius: 100%;
} }
&--is-followed { &--is-followed::before {
&::before { border-color: var(--color-primary-hover);
border-color: red;
}
} }
} }
} }

View File

@ -0,0 +1,45 @@
.excalidraw {
.follow-mode {
position: absolute;
box-sizing: border-box;
pointer-events: none;
border: 2px solid var(--color-primary-hover);
z-index: 9999;
display: flex;
align-items: flex-end;
justify-content: center;
&__badge {
background-color: var(--color-primary-hover);
color: var(--color-primary-light);
padding: 0.25rem 0.5rem;
margin-bottom: 0.5rem;
border-radius: 0.5rem;
pointer-events: all;
font-size: 0.75rem;
display: flex;
gap: 0.5rem;
align-items: center;
}
&__disconnect-btn {
all: unset;
cursor: pointer;
border-radius: 0.25rem;
&:hover {
background-color: var(--color-primary-darker);
}
&:active {
background-color: var(--color-primary-darkest);
}
svg {
display: block;
width: 1rem;
height: 1rem;
}
}
}
}

View File

@ -0,0 +1,24 @@
import { CloseIcon } from "../icons";
import "./FollowMode.scss";
interface FollowModeProps {
width: number;
height: number;
children: React.ReactNode;
}
const FollowMode = ({ children, height, width }: FollowModeProps) => {
return (
<div style={{ position: "relative" }}>
<div className="follow-mode" style={{ width, height }}>
<div className="follow-mode__badge">
<span>Following Handsome Swan</span>
<button className="follow-mode__disconnect-btn">{CloseIcon}</button>
</div>
</div>
{children}
</div>
);
};
export default FollowMode;

View File

@ -81,6 +81,7 @@
--color-primary-darkest: #4a47b1; --color-primary-darkest: #4a47b1;
--color-primary-light: #e3e2fe; --color-primary-light: #e3e2fe;
--color-primary-light-darker: #d7d5ff; --color-primary-light-darker: #d7d5ff;
--color-primary-hover: #5753d0;
--color-gray-10: #f5f5f5; --color-gray-10: #f5f5f5;
--color-gray-20: #ebebeb; --color-gray-20: #ebebeb;
@ -193,6 +194,7 @@
--color-primary-darkest: #beb9ff; --color-primary-darkest: #beb9ff;
--color-primary-light: #4f4d6f; --color-primary-light: #4f4d6f;
--color-primary-light-darker: #43415e; --color-primary-light-darker: #43415e;
--color-primary-hover: #bbb8ff;
--color-text-warning: var(--color-gray-80); --color-text-warning: var(--color-gray-80);