Added simple extra popover to keep other controls out of display (#2880)

* Added simple extra popover to keep other controls out of display

* Removed extra change

* Fixed part of tests

* Added extra comments

* Updated version & changelog
main
Boris Sekachev 5 years ago committed by GitHub
parent 5bd61a43a4
commit 55b20e197d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Persistent queue added to logstash (<https://github.com/openvinotoolkit/cvat/pull/2744>) - Persistent queue added to logstash (<https://github.com/openvinotoolkit/cvat/pull/2744>)
- Improved maintanance of popups visibility (<https://github.com/openvinotoolkit/cvat/pull/2809>) - Improved maintanance of popups visibility (<https://github.com/openvinotoolkit/cvat/pull/2809>)
- Image visualizations settings on canvas for faster access (<https://github.com/openvinotoolkit/cvat/pull/2872>) - Image visualizations settings on canvas for faster access (<https://github.com/openvinotoolkit/cvat/pull/2872>)
- Better scale management of left panel when screen is too small (<https://github.com/openvinotoolkit/cvat/pull/2880>)
### Deprecated ### Deprecated

@ -1,6 +1,6 @@
{ {
"name": "cvat-ui", "name": "cvat-ui",
"version": "1.15.0", "version": "1.15.1",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -1335,6 +1335,11 @@
"redux": "^4.0.0" "redux": "^4.0.0"
} }
}, },
"@types/resize-observer-browser": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz",
"integrity": "sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ=="
},
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz",
@ -15392,7 +15397,7 @@
"cvat-data": { "cvat-data": {
"version": "file:../cvat-data", "version": "file:../cvat-data",
"requires": { "requires": {
"async-mutex": "^0.2.6", "async-mutex": "^0.3.0",
"jszip": "3.5.0" "jszip": "3.5.0"
}, },
"dependencies": { "dependencies": {

@ -1,6 +1,6 @@
{ {
"name": "cvat-ui", "name": "cvat-ui",
"version": "1.15.0", "version": "1.15.1",
"description": "CVAT single-page application", "description": "CVAT single-page application",
"main": "src/index.tsx", "main": "src/index.tsx",
"scripts": { "scripts": {
@ -59,6 +59,7 @@
"@types/react-router-dom": "^5.1.7", "@types/react-router-dom": "^5.1.7",
"@types/react-share": "^3.0.3", "@types/react-share": "^3.0.3",
"@types/redux-logger": "^3.0.8", "@types/redux-logger": "^3.0.8",
"@types/resize-observer-browser": "^0.1.5",
"antd": "^4.12.2", "antd": "^4.12.2",
"copy-to-clipboard": "^3.3.1", "copy-to-clipboard": "^3.3.1",
"cvat-canvas": "file:../cvat-canvas", "cvat-canvas": "file:../cvat-canvas",

@ -39,7 +39,7 @@ export default function AnnotationPageComponent(props: Props): JSX.Element {
saveLogs(); saveLogs();
const root = window.document.getElementById('root'); const root = window.document.getElementById('root');
if (root) { if (root) {
root.style.minHeight = '768px'; root.style.minHeight = '600px';
} }
return () => { return () => {

@ -0,0 +1,114 @@
// Copyright (C) 2021 Intel Corporation
//
// SPDX-License-Identifier: MIT
/// <reference types="resize-observer-browser" />
import { SmallDashOutlined } from '@ant-design/icons';
import Popover from 'antd/lib/popover';
import React, { useEffect, useRef, useState } from 'react';
import ReactDOM from 'react-dom';
const extraControlsContentClassName = 'cvat-extra-controls-control-content';
let onUpdateChildren: Function | null = null;
export function ExtraControlsControl(): JSX.Element {
const [hasChildren, setHasChildren] = useState(false);
const [initialized, setInitialized] = useState(false);
useEffect(() => {
if (!initialized) {
setInitialized(true);
}
window.document.body.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
}, []);
onUpdateChildren = () => {
const contentElement = window.document.getElementsByClassName(extraControlsContentClassName)[0];
if (contentElement) {
setHasChildren(contentElement.children.length > 0);
}
};
return (
<Popover
defaultVisible // we must render it at least one between using
trigger={initialized ? 'hover' : 'click'} // trigger='hover' allows to close the popover by body click
placement='right'
overlayStyle={{ display: initialized ? '' : 'none' }}
content={<div className={extraControlsContentClassName} />}
>
<SmallDashOutlined
style={{ visibility: hasChildren ? 'visible' : 'hidden' }}
className='cvat-extra-controls-control'
/>
</Popover>
);
}
export default function ControlVisibilityObserver<P = {}>(
ControlComponent: React.FunctionComponent<P>,
): React.FunctionComponent<P> {
let visibilityHeightThreshold = 0; // minimum value of height when element can be pushed to main panel
return (props: P): JSX.Element | null => {
const ref = useRef<HTMLDivElement>(null);
const [visible, setVisible] = useState(true);
useEffect(() => {
if (ref && ref.current) {
const wrapper = ref.current;
const parentElement = ref.current.parentElement as HTMLElement;
const reservedHeight = 45; // for itself
const observer = new ResizeObserver(() => {
// when parent size was changed, check again can we put the control
// into the side panel or not
const availableHeight = parentElement.offsetHeight;
setVisible(availableHeight - reservedHeight >= visibilityHeightThreshold);
});
if (ref && ref.current) {
const availableHeight = parentElement.offsetHeight;
// when first mount, remember bottom coordinate which equal to minimum parent width
// to put the control into side panel
visibilityHeightThreshold = wrapper.offsetTop + wrapper.offsetHeight;
// start observing parent size
observer.observe(ref.current.parentElement as HTMLElement);
// then put it to extra controls if parent height is not enought
setVisible(availableHeight - reservedHeight >= visibilityHeightThreshold);
}
return () => {
observer.disconnect();
};
}
return () => {};
}, []);
useEffect(() => {
// when visibility changed, we notify extra content element because now its children changed
if (onUpdateChildren) {
onUpdateChildren();
}
}, [visible]);
if (!visible) {
const extraControlsContent = window.document.getElementsByClassName(extraControlsContentClassName)[0];
if (extraControlsContent) {
return ReactDOM.createPortal(<ControlComponent {...props} />, extraControlsContent);
}
return null;
}
// first mount always to side panel
return (
<div ref={ref}>
<ControlComponent {...props} />
</div>
);
};
}

@ -9,22 +9,23 @@ import Layout from 'antd/lib/layout';
import { ActiveControl, Rotation } from 'reducers/interfaces'; import { ActiveControl, Rotation } from 'reducers/interfaces';
import { Canvas } from 'cvat-canvas-wrapper'; import { Canvas } from 'cvat-canvas-wrapper';
import RotateControl from './rotate-control'; import ControlVisibilityObserver, { ExtraControlsControl } from './control-visibility-observer';
import CursorControl from './cursor-control'; import RotateControl, { Props as RotateControlProps } from './rotate-control';
import MoveControl from './move-control'; import CursorControl, { Props as CursorControlProps } from './cursor-control';
import FitControl from './fit-control'; import MoveControl, { Props as MoveControlProps } from './move-control';
import ResizeControl from './resize-control'; import FitControl, { Props as FitControlProps } from './fit-control';
import ResizeControl, { Props as ResizeControlProps } from './resize-control';
import ToolsControl from './tools-control'; import ToolsControl from './tools-control';
import OpenCVControl from './opencv-control'; import OpenCVControl from './opencv-control';
import DrawRectangleControl from './draw-rectangle-control'; import DrawRectangleControl, { Props as DrawRectangleControlProps } from './draw-rectangle-control';
import DrawPolygonControl from './draw-polygon-control'; import DrawPolygonControl, { Props as DrawPolygonControlProps } from './draw-polygon-control';
import DrawPolylineControl from './draw-polyline-control'; import DrawPolylineControl, { Props as DrawPolylineControlProps } from './draw-polyline-control';
import DrawPointsControl from './draw-points-control'; import DrawPointsControl, { Props as DrawPointsControlProps } from './draw-points-control';
import DrawCuboidControl from './draw-cuboid-control'; import DrawCuboidControl, { Props as DrawCuboidControlProps } from './draw-cuboid-control';
import SetupTagControl from './setup-tag-control'; import SetupTagControl, { Props as SetupTagControlProps } from './setup-tag-control';
import MergeControl from './merge-control'; import MergeControl, { Props as MergeControlProps } from './merge-control';
import GroupControl from './group-control'; import GroupControl, { Props as GroupControlProps } from './group-control';
import SplitControl from './split-control'; import SplitControl, { Props as SplitControlProps } from './split-control';
interface Props { interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
@ -42,6 +43,25 @@ interface Props {
redrawShape(): void; redrawShape(): void;
} }
// We use the observer to see if these controls are in the viewport
// They automatically put to extra if not
const ObservedCursorControl = ControlVisibilityObserver<CursorControlProps>(CursorControl);
const ObservedMoveControl = ControlVisibilityObserver<MoveControlProps>(MoveControl);
const ObservedRotateControl = ControlVisibilityObserver<RotateControlProps>(RotateControl);
const ObservedFitControl = ControlVisibilityObserver<FitControlProps>(FitControl);
const ObservedResizeControl = ControlVisibilityObserver<ResizeControlProps>(ResizeControl);
const ObservedToolsControl = ControlVisibilityObserver(ToolsControl);
const ObservedOpenCVControl = ControlVisibilityObserver(OpenCVControl);
const ObservedDrawRectangleControl = ControlVisibilityObserver<DrawRectangleControlProps>(DrawRectangleControl);
const ObservedDrawPolygonControl = ControlVisibilityObserver<DrawPolygonControlProps>(DrawPolygonControl);
const ObservedDrawPolylineControl = ControlVisibilityObserver<DrawPolylineControlProps>(DrawPolylineControl);
const ObservedDrawPointsControl = ControlVisibilityObserver<DrawPointsControlProps>(DrawPointsControl);
const ObservedDrawCuboidControl = ControlVisibilityObserver<DrawCuboidControlProps>(DrawCuboidControl);
const ObservedSetupTagControl = ControlVisibilityObserver<SetupTagControlProps>(SetupTagControl);
const ObservedMergeControl = ControlVisibilityObserver<MergeControlProps>(MergeControl);
const ObservedGroupControl = ControlVisibilityObserver<GroupControlProps>(GroupControl);
const ObservedSplitControl = ControlVisibilityObserver<SplitControlProps>(SplitControl);
export default function ControlsSideBarComponent(props: Props): JSX.Element { export default function ControlsSideBarComponent(props: Props): JSX.Element {
const { const {
canvasInstance, canvasInstance,
@ -170,13 +190,13 @@ export default function ControlsSideBarComponent(props: Props): JSX.Element {
return ( return (
<Layout.Sider className='cvat-canvas-controls-sidebar' theme='light' width={44}> <Layout.Sider className='cvat-canvas-controls-sidebar' theme='light' width={44}>
<GlobalHotKeys keyMap={subKeyMap} handlers={handlers} /> <GlobalHotKeys keyMap={subKeyMap} handlers={handlers} />
<CursorControl <ObservedCursorControl
cursorShortkey={normalizedKeyMap.CANCEL} cursorShortkey={normalizedKeyMap.CANCEL}
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
activeControl={activeControl} activeControl={activeControl}
/> />
<MoveControl canvasInstance={canvasInstance} activeControl={activeControl} /> <ObservedMoveControl canvasInstance={canvasInstance} activeControl={activeControl} />
<RotateControl <ObservedRotateControl
anticlockwiseShortcut={normalizedKeyMap.ANTICLOCKWISE_ROTATION} anticlockwiseShortcut={normalizedKeyMap.ANTICLOCKWISE_ROTATION}
clockwiseShortcut={normalizedKeyMap.CLOCKWISE_ROTATION} clockwiseShortcut={normalizedKeyMap.CLOCKWISE_ROTATION}
rotateFrame={rotateFrame} rotateFrame={rotateFrame}
@ -184,55 +204,57 @@ export default function ControlsSideBarComponent(props: Props): JSX.Element {
<hr /> <hr />
<FitControl canvasInstance={canvasInstance} /> <ObservedFitControl canvasInstance={canvasInstance} />
<ResizeControl canvasInstance={canvasInstance} activeControl={activeControl} /> <ObservedResizeControl canvasInstance={canvasInstance} activeControl={activeControl} />
<hr /> <hr />
<ToolsControl /> <ObservedToolsControl />
<OpenCVControl /> <ObservedOpenCVControl />
<DrawRectangleControl <ObservedDrawRectangleControl
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
isDrawing={activeControl === ActiveControl.DRAW_RECTANGLE} isDrawing={activeControl === ActiveControl.DRAW_RECTANGLE}
/> />
<DrawPolygonControl <ObservedDrawPolygonControl
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
isDrawing={activeControl === ActiveControl.DRAW_POLYGON} isDrawing={activeControl === ActiveControl.DRAW_POLYGON}
/> />
<DrawPolylineControl <ObservedDrawPolylineControl
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
isDrawing={activeControl === ActiveControl.DRAW_POLYLINE} isDrawing={activeControl === ActiveControl.DRAW_POLYLINE}
/> />
<DrawPointsControl <ObservedDrawPointsControl
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
isDrawing={activeControl === ActiveControl.DRAW_POINTS} isDrawing={activeControl === ActiveControl.DRAW_POINTS}
/> />
<DrawCuboidControl <ObservedDrawCuboidControl
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
isDrawing={activeControl === ActiveControl.DRAW_CUBOID} isDrawing={activeControl === ActiveControl.DRAW_CUBOID}
/> />
<SetupTagControl canvasInstance={canvasInstance} isDrawing={false} /> <ObservedSetupTagControl canvasInstance={canvasInstance} isDrawing={false} />
<hr /> <hr />
<MergeControl <ObservedMergeControl
switchMergeShortcut={normalizedKeyMap.SWITCH_MERGE_MODE} switchMergeShortcut={normalizedKeyMap.SWITCH_MERGE_MODE}
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
activeControl={activeControl} activeControl={activeControl}
mergeObjects={mergeObjects} mergeObjects={mergeObjects}
/> />
<GroupControl <ObservedGroupControl
switchGroupShortcut={normalizedKeyMap.SWITCH_GROUP_MODE} switchGroupShortcut={normalizedKeyMap.SWITCH_GROUP_MODE}
resetGroupShortcut={normalizedKeyMap.RESET_GROUP} resetGroupShortcut={normalizedKeyMap.RESET_GROUP}
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
activeControl={activeControl} activeControl={activeControl}
groupObjects={groupObjects} groupObjects={groupObjects}
/> />
<SplitControl <ObservedSplitControl
canvasInstance={canvasInstance} canvasInstance={canvasInstance}
switchSplitShortcut={normalizedKeyMap.SWITCH_SPLIT_MODE} switchSplitShortcut={normalizedKeyMap.SWITCH_SPLIT_MODE}
activeControl={activeControl} activeControl={activeControl}
splitTrack={splitTrack} splitTrack={splitTrack}
/> />
<ExtraControlsControl />
</Layout.Sider> </Layout.Sider>
); );
} }

@ -10,7 +10,7 @@ import { ActiveControl } from 'reducers/interfaces';
import { Canvas } from 'cvat-canvas-wrapper'; import { Canvas } from 'cvat-canvas-wrapper';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
cursorShortkey: string; cursorShortkey: string;
activeControl: ActiveControl; activeControl: ActiveControl;

@ -14,7 +14,7 @@ import { CubeIcon } from 'icons';
import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover'; import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover';
import withVisibilityHandling from './handle-popover-visibility'; import withVisibilityHandling from './handle-popover-visibility';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
isDrawing: boolean; isDrawing: boolean;
} }

@ -13,7 +13,7 @@ import { ShapeType } from 'reducers/interfaces';
import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover'; import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover';
import withVisibilityHandling from './handle-popover-visibility'; import withVisibilityHandling from './handle-popover-visibility';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
isDrawing: boolean; isDrawing: boolean;
} }

@ -13,7 +13,7 @@ import { ShapeType } from 'reducers/interfaces';
import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover'; import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover';
import withVisibilityHandling from './handle-popover-visibility'; import withVisibilityHandling from './handle-popover-visibility';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
isDrawing: boolean; isDrawing: boolean;
} }

@ -13,7 +13,7 @@ import { ShapeType } from 'reducers/interfaces';
import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover'; import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover';
import withVisibilityHandling from './handle-popover-visibility'; import withVisibilityHandling from './handle-popover-visibility';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
isDrawing: boolean; isDrawing: boolean;
} }

@ -13,7 +13,7 @@ import { ShapeType } from 'reducers/interfaces';
import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover'; import DrawShapePopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/draw-shape-popover';
import withVisibilityHandling from './handle-popover-visibility'; import withVisibilityHandling from './handle-popover-visibility';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
isDrawing: boolean; isDrawing: boolean;
} }

@ -9,7 +9,7 @@ import { FitIcon } from 'icons';
import { Canvas } from 'cvat-canvas-wrapper'; import { Canvas } from 'cvat-canvas-wrapper';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
} }

@ -10,7 +10,7 @@ import { Canvas } from 'cvat-canvas-wrapper';
import { ActiveControl } from 'reducers/interfaces'; import { ActiveControl } from 'reducers/interfaces';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
activeControl: ActiveControl; activeControl: ActiveControl;
switchGroupShortcut: string; switchGroupShortcut: string;

@ -10,7 +10,7 @@ import { Canvas } from 'cvat-canvas-wrapper';
import { ActiveControl } from 'reducers/interfaces'; import { ActiveControl } from 'reducers/interfaces';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
activeControl: ActiveControl; activeControl: ActiveControl;
switchMergeShortcut: string; switchMergeShortcut: string;

@ -10,7 +10,7 @@ import { ActiveControl } from 'reducers/interfaces';
import { Canvas } from 'cvat-canvas-wrapper'; import { Canvas } from 'cvat-canvas-wrapper';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
activeControl: ActiveControl; activeControl: ActiveControl;
} }

@ -10,7 +10,7 @@ import { ActiveControl } from 'reducers/interfaces';
import { Canvas } from 'cvat-canvas-wrapper'; import { Canvas } from 'cvat-canvas-wrapper';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
activeControl: ActiveControl; activeControl: ActiveControl;
} }

@ -11,7 +11,7 @@ import { Rotation } from 'reducers/interfaces';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
import withVisibilityHandling from './handle-popover-visibility'; import withVisibilityHandling from './handle-popover-visibility';
interface Props { export interface Props {
clockwiseShortcut: string; clockwiseShortcut: string;
anticlockwiseShortcut: string; anticlockwiseShortcut: string;
rotateFrame(rotation: Rotation): void; rotateFrame(rotation: Rotation): void;

@ -12,7 +12,7 @@ import { TagIcon } from 'icons';
import SetupTagPopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/setup-tag-popover'; import SetupTagPopoverContainer from 'containers/annotation-page/standard-workspace/controls-side-bar/setup-tag-popover';
import withVisibilityHandling from './handle-popover-visibility'; import withVisibilityHandling from './handle-popover-visibility';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
isDrawing: boolean; isDrawing: boolean;
} }

@ -10,7 +10,7 @@ import { Canvas } from 'cvat-canvas-wrapper';
import { ActiveControl } from 'reducers/interfaces'; import { ActiveControl } from 'reducers/interfaces';
import CVATTooltip from 'components/common/cvat-tooltip'; import CVATTooltip from 'components/common/cvat-tooltip';
interface Props { export interface Props {
canvasInstance: Canvas; canvasInstance: Canvas;
activeControl: ActiveControl; activeControl: ActiveControl;
switchSplitShortcut: string; switchSplitShortcut: string;

@ -36,8 +36,7 @@
.cvat-canvas-controls-sidebar { .cvat-canvas-controls-sidebar {
background-color: $background-color-2; background-color: $background-color-2;
border-right: 1px solid $border-color-1; border-right: 1px solid $border-color-1;
overflow-y: auto; overflow: hidden;
overflow-x: hidden;
} }
.cvat-cursor-control, .cvat-cursor-control,
@ -56,6 +55,7 @@
.cvat-split-track-control, .cvat-split-track-control,
.cvat-issue-control, .cvat-issue-control,
.cvat-tools-control, .cvat-tools-control,
.cvat-extra-controls-control,
.cvat-opencv-control { .cvat-opencv-control {
border-radius: 3.3px; border-radius: 3.3px;
transform: scale(0.65); transform: scale(0.65);
@ -75,6 +75,13 @@
} }
} }
.cvat-extra-controls-control {
> svg {
width: 40px;
height: 40px;
}
}
.cvat-active-canvas-control { .cvat-active-canvas-control {
background: $header-color; background: $header-color;
transform: scale(0.75); transform: scale(0.75);

Loading…
Cancel
Save