From 0f26be3c179313c105b53f2644e66c0f68afc63d Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Sat, 12 Jun 2021 23:10:38 +0200 Subject: [PATCH] style: quick fixes small improvements in app style - fade in splash screen - notifications without sound - change header style - non selectable text app wide - change logo - lock button more accessible - link to help - tooltip on collapse delay - tooltip on private / public event toggle --- client/src/App.css | 3 +++ .../components/buttons/ApplyIconBtn.jsx | 19 +++++++------ .../common/components/buttons/LockIconBtn.jsx | 4 +-- .../components/buttons/PublicIconBtn.jsx | 22 +++++++++++++++ .../common/components/text/NumberedText.jsx | 11 -------- .../components/text/NumberedText.module.css | 13 --------- .../src/common/input/EditableText.module.css | 5 +++- client/src/features/editors/Editor.jsx | 25 +++--------------- client/src/features/editors/Editor.module.css | 6 +++++ .../features/editors/list/ActionButtons.jsx | 4 +-- .../src/features/editors/list/EventBlock.jsx | 6 ++--- .../editors/list/EventBlock.module.css | 2 ++ .../src/features/menu/MenuActionButtons.jsx | 12 +++------ client/src/features/menu/MenuBar.jsx | 7 +---- server/assets/logo.png | Bin 0 -> 8285 bytes server/electron/splash/splash.html | 20 +++++++++++--- server/main.js | 4 ++- 17 files changed, 82 insertions(+), 81 deletions(-) create mode 100644 client/src/common/components/buttons/PublicIconBtn.jsx delete mode 100644 client/src/common/components/text/NumberedText.jsx delete mode 100644 client/src/common/components/text/NumberedText.module.css create mode 100644 server/assets/logo.png diff --git a/client/src/App.css b/client/src/App.css index bd24333c6..71293f8c2 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -10,4 +10,7 @@ html, overflow: hidden; overflow: clip; height: 100vh; + -webkit-user-select: none; + user-select: none; + -webkit-app-region: drag; } diff --git a/client/src/common/components/buttons/ApplyIconBtn.jsx b/client/src/common/components/buttons/ApplyIconBtn.jsx index 67a4e2f3a..57a7e4609 100644 --- a/client/src/common/components/buttons/ApplyIconBtn.jsx +++ b/client/src/common/components/buttons/ApplyIconBtn.jsx @@ -1,16 +1,19 @@ import { IconButton } from '@chakra-ui/button'; +import { Tooltip } from '@chakra-ui/tooltip'; import { FiChevronsDown } from 'react-icons/fi'; export default function ApplyIconBtn(props) { const { clickhandler, ...rest } = props; return ( - } - colorScheme='orange' - onClick={clickhandler} - _focus={{ boxShadow: 'none' }} - {...rest} - /> + + } + colorScheme='orange' + onClick={clickhandler} + _focus={{ boxShadow: 'none' }} + {...rest} + /> + ); } diff --git a/client/src/common/components/buttons/LockIconBtn.jsx b/client/src/common/components/buttons/LockIconBtn.jsx index c499594d0..55ab04b35 100644 --- a/client/src/common/components/buttons/LockIconBtn.jsx +++ b/client/src/common/components/buttons/LockIconBtn.jsx @@ -6,13 +6,13 @@ export default function LockIconBtn(props) { const { clickhandler, active, ref } = props; return ( - } color={active ? 'pink.100' : 'pink.300'} borderColor={active ? undefined : 'pink.300'} - backgroundColor={active ? 'pink.300' : undefined} + backgroundColor={active ? 'pink.400' : undefined} variant={active ? 'solid' : 'outline'} onClick={clickhandler} _focus={{ boxShadow: 'none' }} diff --git a/client/src/common/components/buttons/PublicIconBtn.jsx b/client/src/common/components/buttons/PublicIconBtn.jsx new file mode 100644 index 000000000..598090e93 --- /dev/null +++ b/client/src/common/components/buttons/PublicIconBtn.jsx @@ -0,0 +1,22 @@ +import { IconButton } from '@chakra-ui/button'; +import { Tooltip } from '@chakra-ui/tooltip'; +import { FiUsers } from 'react-icons/fi'; + +export default function PublicIconBtn(props) { + const { actionHandler, active, ...rest } = props; + return ( + + } + colorScheme='blue' + variant={active ? 'solid' : 'outline'} + onClick={() => + actionHandler('update', { field: 'isPublic', value: !active }) + } + _focus={{ boxShadow: 'none' }} + {...rest} + /> + + ); +} diff --git a/client/src/common/components/text/NumberedText.jsx b/client/src/common/components/text/NumberedText.jsx deleted file mode 100644 index a2f3b8896..000000000 --- a/client/src/common/components/text/NumberedText.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Flex, Text } from '@chakra-ui/layout'; -import styles from './NumberedText.module.css'; - -export default function NumberedText({ number = 1, text = '' }) { - return ( - -
{number}
- {text} -
- ); -} diff --git a/client/src/common/components/text/NumberedText.module.css b/client/src/common/components/text/NumberedText.module.css deleted file mode 100644 index 16d6f39ca..000000000 --- a/client/src/common/components/text/NumberedText.module.css +++ /dev/null @@ -1,13 +0,0 @@ -.stylednumber { - display: inline; - text-align: center; - color: white; - font-weight: 600; - - background-color: #ff5b7e; - border: 1px solid rgba(255,255,255,0.17); - width: 1.5em; - border-radius: 1em; - - margin-right: 0.5em; -} diff --git a/client/src/common/input/EditableText.module.css b/client/src/common/input/EditableText.module.css index d1edacc92..7cd579d4b 100644 --- a/client/src/common/input/EditableText.module.css +++ b/client/src/common/input/EditableText.module.css @@ -8,9 +8,12 @@ .block { display: 'block'; - overflow-x: hidden; + overflow: hidden; } .inline { display: inline; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } diff --git a/client/src/features/editors/Editor.jsx b/client/src/features/editors/Editor.jsx index fc2660a54..d1be42873 100644 --- a/client/src/features/editors/Editor.jsx +++ b/client/src/features/editors/Editor.jsx @@ -1,6 +1,4 @@ -import { Heading } from '@chakra-ui/layout'; import { Box } from '@chakra-ui/layout'; -import NumberedText from 'common/components/text/NumberedText'; import PlaybackControl from '../control/PlaybackControl'; import MessageControl from '../control/MessageControl'; import styles from './Editor.module.css'; @@ -28,43 +26,28 @@ export default function Editor() { - - Event List - - +

Event List

- - Display Messages - - +

Display Messages

- - Time Control - - +

Timer Control

- - Info - - +

Info

diff --git a/client/src/features/editors/Editor.module.css b/client/src/features/editors/Editor.module.css index 00186eecf..6e365d546 100644 --- a/client/src/features/editors/Editor.module.css +++ b/client/src/features/editors/Editor.module.css @@ -69,6 +69,12 @@ } } +h1 { + font-size: 2.5vh; + color: rgba(255, 255, 255, 0.63); + padding-bottom: 0.25em; +} + .mainContainer > div { border-radius: 0.5em; height: 100%; diff --git a/client/src/features/editors/list/ActionButtons.jsx b/client/src/features/editors/list/ActionButtons.jsx index ddd673728..f571be840 100644 --- a/client/src/features/editors/list/ActionButtons.jsx +++ b/client/src/features/editors/list/ActionButtons.jsx @@ -1,6 +1,6 @@ import { Menu, MenuButton, MenuItem, MenuList } from '@chakra-ui/menu'; import { IconButton } from '@chakra-ui/button'; -import { FiZap, FiPlus, FiMinusCircle, FiClock } from 'react-icons/fi'; +import { FiPlus, FiMinusCircle, FiClock } from 'react-icons/fi'; export default function ActionButtons(props) { const { showAdd, showDelay, showBlock, actionHandler } = props; @@ -16,7 +16,7 @@ export default function ActionButtons(props) { as={IconButton} aria-label='Options' size='xs' - icon={} + icon={} _expanded={{ bg: 'orange.300', color: 'white' }} _focus={{ boxShadow: 'none' }} backgroundColor={'orange.200'} diff --git a/client/src/features/editors/list/EventBlock.jsx b/client/src/features/editors/list/EventBlock.jsx index 9b26ea583..210f55828 100644 --- a/client/src/features/editors/list/EventBlock.jsx +++ b/client/src/features/editors/list/EventBlock.jsx @@ -6,7 +6,7 @@ import EventTimes from 'common/components/eventTimes/EventTimes'; import EventTimesVertical from 'common/components/eventTimes/EventTimesVertical'; import EditableText from 'common/input/EditableText'; import ActionButtons from './ActionButtons'; -import VisibleIconBtn from 'common/components/buttons/VisibleIconBtn'; +import PublicIconBtn from 'common/components/buttons/PublicIconBtn'; import DeleteIconBtn from 'common/components/buttons/DeleteIconBtn'; import { millisToMinutes } from 'common/dateConfig'; import style from './EventBlock.module.css'; @@ -93,7 +93,7 @@ const ExpandedBlock = (props) => { onClick={() => props.setCollapsed(true)} />
- + { onClick={() => props.setCollapsed(false)} />
- + } + icon={} _expanded={{ bg: 'orange.300', color: 'white' }} _focus={{ boxShadow: 'none' }} backgroundColor={'orange.200'} diff --git a/client/src/features/menu/MenuBar.jsx b/client/src/features/menu/MenuBar.jsx index 1dae90257..fe68cf990 100644 --- a/client/src/features/menu/MenuBar.jsx +++ b/client/src/features/menu/MenuBar.jsx @@ -1,9 +1,5 @@ import { useMutation, useQueryClient } from 'react-query'; -import { - downloadEvents, - uploadEvents, - uploadEventsWithPath, -} from 'app/api/ontimeApi'; +import { downloadEvents, uploadEvents } from 'app/api/ontimeApi'; import { EVENTS_TABLE } from 'app/api/apiConstants'; import DownloadIconBtn from './buttons/DownloadIconBtn'; import SettingsIconBtn from './buttons/SettingsIconBtn'; @@ -87,7 +83,6 @@ export default function MenuBar(props) { style={{ fontSize: '1.5em' }} size='lg' clickhandler={() => handleIPC('help')} - disabled />
diff --git a/server/assets/logo.png b/server/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..91ffece1ee024da342e38b9d63cf406514fbb670 GIT binary patch literal 8285 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