1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00

fixed editor buttons appearance

This commit is contained in:
Fedor Katurov 2022-01-25 16:16:13 +07:00
parent 097b091abd
commit 8b3e118a7b
4 changed files with 172 additions and 88 deletions

View file

@ -0,0 +1,53 @@
import React, { VFC } from 'react';
import classNames from 'classnames';
import { Icon } from '~/components/input/Icon';
import styles from './styles.module.scss';
interface NodeEditMenuProps {
canStar: boolean;
isHeroic: boolean;
isLocked: boolean;
onStar: () => void;
onLock: () => void;
onEdit: () => void;
}
const NodeEditMenu: VFC<NodeEditMenuProps> = ({
canStar,
isHeroic,
isLocked,
onStar,
onLock,
onEdit,
}) => (
<div className={styles.editor_menu}>
<div className={styles.editor_menu_button}>
<Icon icon="dots-vertical" size={24} />
</div>
<div className={styles.editor_buttons}>
{canStar && (
<div className={classNames(styles.star, { [styles.is_heroic]: isHeroic })}>
{isHeroic ? (
<Icon icon="star_full" size={24} onClick={onStar} />
) : (
<Icon icon="star" size={24} onClick={onStar} />
)}
</div>
)}
<div>
<Icon icon={isLocked ? 'locked' : 'unlocked'} size={24} onClick={onLock} />
</div>
<Icon icon="edit" size={24} onClick={onEdit} />
</div>
</div>
);
export { NodeEditMenu };

View file

@ -0,0 +1,109 @@
@import "src/styles/variables";
@import "src/styles/mixins";
@mixin button {
margin: 0 $gap;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
svg {
fill: darken(white, 50%);
transition: fill 0.25s;
}
&:hover {
svg {
fill: $red;
}
}
&::after {
content: ' ';
flex: 0 0 6px;
height: $gap;
width: 6px;
border-radius: 4px;
background: transparentize(black, 0.7);
margin-left: $gap * 2;
}
}
.editor_buttons {
flex: 0;
padding-right: $gap;
fill: transparentize(white, 0.7);
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
& > * {
@include button;
}
@include tablet {
align-self: center;
display: none;
& > * {
&:last-child {
margin-right: 0;
&::after {
display: none;
}
}
&:first-child {
margin-left: 0;
}
}
}
}
.star {
transition: fill, stroke 0.25s;
will-change: transform;
.is_heroic {
svg {
fill: $orange;
}
}
&:hover {
fill: $orange;
}
}
.editor_menu_button {
display: none !important;
@include button();
@include tablet {
display: flex !important;
}
}
.editor_menu {
&:hover {
.editor_buttons {
@include tablet {
display: flex;
position: absolute;
right: 0;
top: 100%;
background: darken($content_bg, 4%);
padding: $gap * 2;
border-radius: $radius;
box-shadow: transparentize(black, 0.8) 5px 5px 5px;
transform: translate(0, -10px);
z-index: 10;
}
}
}
}

View file

@ -3,6 +3,7 @@ import React, { memo, VFC } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Icon } from '~/components/input/Icon'; import { Icon } from '~/components/input/Icon';
import { NodeEditMenu } from '~/components/node/NodeEditMenu';
import { Placeholder } from '~/components/placeholders/Placeholder'; import { Placeholder } from '~/components/placeholders/Placeholder';
import { getPrettyDate } from '~/utils/dom'; import { getPrettyDate } from '~/utils/dom';
@ -74,29 +75,14 @@ const NodeTitle: VFC<IProps> = memo(
</div> </div>
{canEdit && ( {canEdit && (
<div className={styles.editor_menu}> <NodeEditMenu
<div className={styles.editor_menu_button}> canStar={canStar}
<Icon icon="dots-vertical" size={24} /> isHeroic={isHeroic}
</div> isLocked={isLocked}
onStar={onStar}
<div className={styles.editor_buttons}> onLock={onLock}
{canStar && ( onEdit={onEdit}
<div className={classNames(styles.star, { [styles.is_heroic]: isHeroic })}> />
{isHeroic ? (
<Icon icon="star_full" size={24} onClick={onStar} />
) : (
<Icon icon="star" size={24} onClick={onStar} />
)}
</div>
)}
<div>
<Icon icon={isLocked ? 'locked' : 'unlocked'} size={24} onClick={onLock} />
</div>
{!!id && <Icon icon="edit" size={24} onClick={onEdit} />}
</div>
</div>
)} )}
<div className={styles.buttons}> <div className={styles.buttons}>

View file

@ -95,8 +95,7 @@
min-width: 0; min-width: 0;
} }
.buttons, .buttons {
.editor_buttons {
flex: 0; flex: 0;
padding-right: $gap; padding-right: $gap;
fill: transparentize(white, 0.7); fill: transparentize(white, 0.7);
@ -126,26 +125,6 @@
} }
} }
.editor_buttons {
@include tablet {
display: none;
& > * {
&:last-child {
margin-right: 0;
&::after {
display: none;
}
}
&:first-child {
margin-left: 0;
}
}
}
}
.mark { .mark {
flex: 0 0 32px; flex: 0 0 32px;
position: relative; position: relative;
@ -233,46 +212,3 @@
pointer-events: none; pointer-events: none;
touch-action: none; touch-action: none;
} }
.star {
transition: fill, stroke 0.25s;
will-change: transform;
.is_heroic {
svg {
fill: $orange;
}
}
&:hover {
fill: $orange;
}
}
.editor_menu_button {
display: none !important;
@include button();
@include tablet {
display: flex !important;
}
}
.editor_menu {
&:hover {
.editor_buttons {
@include tablet {
display: flex;
position: absolute;
right: 0;
top: 100%;
background: darken($content_bg, 4%);
padding: $gap * 2;
border-radius: $radius;
box-shadow: transparentize(black, 0.8) 5px 5px 5px;
transform: translate(0, -10px);
}
}
}
}