diff --git a/lib/components/modal-overlay.css b/lib/components/modal-overlay.css index 2e97c89d1..e99c40207 100644 --- a/lib/components/modal-overlay.css +++ b/lib/components/modal-overlay.css @@ -1,13 +1,12 @@ div.modalOverlay { position: fixed; left: 0; top: 0; height: 100%; z-index: 4; width: 100%; - background-color: #000000e6; display: flex; flex-direction: column; align-items: center; justify-content: center; } diff --git a/lib/components/modal-overlay.react.js b/lib/components/modal-overlay.react.js index fe7478896..e779efbf9 100644 --- a/lib/components/modal-overlay.react.js +++ b/lib/components/modal-overlay.react.js @@ -1,64 +1,77 @@ // @flow import FocusTrap from 'focus-trap-react'; import * as React from 'react'; import css from './modal-overlay.css'; type ModalOverlayProps = { +onClose: () => void, +children?: React.Node, + +backgroundColor?: string, }; function ModalOverlay(props: ModalOverlayProps): React.Node { - const { children, onClose } = props; + const { + children, + onClose, + backgroundColor = 'var(--modal-overlay-background-90)', + } = props; const overlayRef = React.useRef(); const firstClickRef = React.useRef(null); React.useLayoutEffect(() => { if (overlayRef.current) { overlayRef.current.focus(); } }, []); const onBackgroundMouseDown = React.useCallback(event => { firstClickRef.current = event.target; }, []); const onBackgroundMouseUp = React.useCallback( event => { if ( event.target === overlayRef.current && firstClickRef.current === overlayRef.current ) { onClose(); } }, [onClose], ); const onKeyDown = React.useCallback( event => { if (event.key === 'Escape') { onClose(); } }, [onClose], ); + const containerStyle = React.useMemo( + () => ({ + backgroundColor, + }), + [backgroundColor], + ); + return (
{children}
); } export default ModalOverlay; diff --git a/web/chat/edit-message-provider.js b/web/chat/edit-message-provider.js index 3fdf20fce..6cafab783 100644 --- a/web/chat/edit-message-provider.js +++ b/web/chat/edit-message-provider.js @@ -1,161 +1,168 @@ // @flow import invariant from 'invariant'; import * as React from 'react'; import ModalOverlay from 'lib/components/modal-overlay.react.js'; import type { ChatMessageInfoItem } from 'lib/selectors/chat-selectors.js'; import type { ThreadInfo } from 'lib/types/thread-types'; import { EditTextMessage } from './edit-text-message.react.js'; export type ModalPosition = { +left: number, +top: number, +width: number, +height: number, }; export type EditState = { +messageInfo: ChatMessageInfoItem, +threadInfo: ThreadInfo, +editedMessageDraft: ?string, +isError: boolean, +position?: ModalPosition, }; type EditModalContextType = { +renderEditModal: (params: EditState) => void, +clearEditModal: () => void, +editState: ?EditState, +setDraft: string => void, +setError: boolean => void, +updatePosition: ModalPosition => void, }; const EditModalContext: React.Context = React.createContext({ renderEditModal: () => {}, clearEditModal: () => {}, editState: null, setDraft: () => {}, setError: () => {}, updatePosition: () => {}, }); type Props = { +children: React.Node, }; function EditModalProvider(props: Props): React.Node { const { children } = props; const [editState, setEditState] = React.useState(null); const clearEditModal = React.useCallback(() => { setEditState(null); }, []); const renderEditModal = React.useCallback((newEditState: EditState): void => { setEditState(newEditState); }, []); const modal = React.useMemo(() => { if (!editState || !editState.position) { return null; } const tooltipNode = ( ); const tooltipContainerStyle = { position: 'fixed', left: editState.position.left, top: editState.position.top, width: editState.position.width, height: editState.position.height, }; return
{tooltipNode}
; }, [editState]); const setDraft = React.useCallback( (draft: ?string) => { if (!editState) { return; } setEditState({ ...editState, editedMessageDraft: draft, }); }, [editState, setEditState], ); const setError = React.useCallback( (isError: boolean) => { invariant(editState, 'editState should be set in setError'); setEditState({ ...editState, isError, }); }, [editState, setEditState], ); const updatePosition = React.useCallback( (position: ModalPosition) => { invariant(editState, 'editState should be set in updatePosition'); setEditState({ ...editState, position, }); }, [editState, setEditState], ); const value = React.useMemo( () => ({ renderEditModal, clearEditModal: clearEditModal, editState, setDraft, setError, updatePosition, }), [ renderEditModal, clearEditModal, editState, setDraft, setError, updatePosition, ], ); const modalOverlay = React.useMemo(() => { if (!modal) { return null; } - return {modal}; + return ( + + {modal} + + ); }, [clearEditModal, modal]); return ( {children} {modalOverlay} ); } function useEditModalContext(): EditModalContextType { const context = React.useContext(EditModalContext); invariant(context, 'EditModalContext not found'); return context; } export { EditModalProvider, useEditModalContext }; diff --git a/web/theme.css b/web/theme.css index 851e8ba99..ebbe459ae 100644 --- a/web/theme.css +++ b/web/theme.css @@ -1,224 +1,226 @@ :root { /* Never use color values defined here directly in CSS. Add color variables to "Color Theme" below The reason we never use color values defined here directly in CSS is 1. It makes changing themes from light / dark / user generated impossible. 2. Gives the programmer context into the color being used. 3. If our color system changes it's much easier to change color values in one place. Add a color value to the theme below, and then use it in your CSS. naming convention: - bg: background. - fg: foreground. - color: text-color */ --shades-white-100: #ffffff; --shades-white-90: #f5f5f5; --shades-white-80: #ebebeb; --shades-white-70: #e0e0e0; --shades-white-60: #cccccc; --shades-black-100: #0a0a0a; --shades-black-90: #1f1f1f; --shades-black-80: #404040; --shades-black-70: #666666; --shades-black-60: #808080; --violet-dark-100: #7e57c2; --violet-dark-80: #6d49ab; --violet-dark-60: #563894; --violet-dark-40: #44297a; --violet-dark-20: #331f5c; --violet-light-100: #ae94db; --violet-light-80: #b9a4df; --violet-light-60: #d3c6ec; --violet-light-40: #e8e0f5; --violet-light-20: #f3f0fa; --success-light-10: #d5f6e3; --success-light-50: #6cdf9c; --success-primary: #00c853; --success-dark-50: #029841; --success-dark-90: #034920; --error-light-10: #feebe6; --error-light-50: #f9947b; --error-primary: #f53100; --error-dark-50: #b62602; --error-dark-90: #4f1203; --logo-bg: #111827; --spoiler-color: #33332c; --loading-foreground: #1b0e38; --bg: var(--shades-black-100); --fg: var(--shades-white-100); --color-disabled: var(--shades-black-60); --text-input-bg: var(--shades-black-80); --text-input-color: var(--shades-white-60); --text-input-placeholder: var(--shades-white-60); --border: var(--shades-black-80); --error: var(--error-primary); --success: var(--success-dark-50); /* Color Theme */ --btn-bg-filled: var(--violet-dark-100); --btn-bg-outline: var(--shades-black-90); --btn-bg-success: var(--success-dark-50); --btn-bg-danger: var(--error-primary); --btn-bg-disabled: var(--shades-black-80); --btn-disabled-color: var(--shades-black-60); --chat-bg: var(--violet-dark-80); --chat-confirmation-icon: var(--violet-dark-100); --keyserver-selection: var(--violet-dark-60); --thread-selection: var(--violet-light-80); --thread-hover-bg: var(--shades-black-80); --thread-active-bg: var(--shades-black-80); --chat-timestamp-color: var(--shades-black-60); --tool-tip-bg: var(--shades-black-80); --tool-tip-color: var(--shades-white-60); --border-color: var(--shades-black-80); --calendar-chevron: var(--shades-black-60); --calendar-day-bg: var(--shades-black-60); --calendar-day-selected-color: var(--violet-dark-80); --community-bg: var(--shades-black-90); --community-settings-selected: var(--violet-dark-60); --unread-bg: var(--error-primary); --settings-btn-bg: var(--violet-dark-100); --community-creation-btn-bg: var(--shades-black-80); --community-creation-ancestry-bg: var(--shades-black-80); --community-creation-ancestry-text: var(--shades-black-60); --community-creation-form-notice: var(--shades-white-60); --community-creation-keyserver-container: var(--shades-black-100); --modal-bg: var(--shades-black-90); --modal-fg: var(--shades-white-60); --join-bg: var(--shades-black-90); --help-color: var(--shades-black-60); --breadcrumb-color: var(--shades-white-60); --breadcrumb-color-unread: var(--shades-white-60); --btn-outline-border: var(--shades-black-60); --thread-color-read: var(--shades-black-60); --thread-preview-secondary: var(--shades-black-70); --relationship-button-green: var(--success-dark-50); --relationship-button-red: var(--error-primary); --relationship-button-text: var(--fg); --disconnected-bar-alert-bg: var(--error-dark-50); --disconnected-bar-alert-color: var(--shades-white-100); --disconnected-bar-connecting-bg: var(--shades-white-70); --disconnected-bar-connecting-color: var(--shades-black-100); --permission-color: var(--shades-white-60); --thread-top-bar-color: var(--shades-white-100); --thread-top-bar-menu-color: var(--shades-white-70); --thread-ancestor-keyserver-border: var(--shades-black-70); --thread-ancestor-color: var(--shades-white-100); --thread-ancestor-separator-color: var(--shades-white-60); --text-message-default-background: var(--shades-black-80); --message-action-tooltip-bg: var(--shades-black-90); --message-action-tooltip-bg-light: var(--shades-black-80); --menu-bg: var(--shades-black-90); --menu-bg-light: var(--shades-black-80); --menu-separator-color: var(--shades-black-80); --menu-color: var(--shades-black-60); --menu-color-light: var(--shades-white-60); --menu-color-hover: var(--shades-white-100); --menu-color-dangerous: var(--error-primary); --menu-color-dangerous-hover: var(--error-light-50); --app-list-icon-read-only-color: var(--shades-black-60); --app-list-icon-enabled-color: var(--success-primary); --app-list-icon-disabled-color: var(--shades-white-80); --account-settings-label: var(--shades-black-60); --account-button-color: var(--violet-dark-100); --chat-thread-list-color-active: var(--shades-white-60); --chat-thread-list-menu-color: var(--shades-white-60); --chat-thread-list-menu-bg: var(--shades-black-80); --chat-thread-list-menu-active-color: var(--shades-white-60); --chat-thread-list-menu-active-bg: var(--shades-black-90); --search-clear-color: var(--shades-white-100); --search-clear-bg: var(--shades-black-70); --search-input-color: var(--shades-white-100); --search-input-placeholder: var(--shades-black-60); --search-icon-color: var(--shades-black-60); --tabs-header-active-color: var(--shades-white-100); --tabs-header-active-border: var(--violet-light-100); --tabs-header-active-background: var(--violet-dark-100); --tabs-header-background-color: var(--shades-black-60); --tabs-header-background-color-pill: var(--shades-white-60); --tabs-header-background-border: var(--shades-black-80); --tabs-header-background-color-hover: var(--shades-white-80); --tabs-header-background-border-hover: var(--shades-black-70); --members-modal-member-text: var(--shades-black-60); --members-modal-member-text-hover: var(--shades-white-100); --label-default-bg: var(--violet-dark-80); --label-default-color: var(--shades-white-80); --subchannels-modal-color: var(--shades-black-60); --subchannels-modal-color-hover: var(--shades-white-100); --color-selector-active-bg: var(--shades-black-80); --relationship-modal-color: var(--shades-black-60); --arrow-extension-color: var(--shades-black-60); --modal-close-color: var(--shades-black-60); --modal-close-color-hover: var(--shades-white-100); --add-members-group-header-color: var(--shades-black-60); --add-members-item-color: var(--shades-black-60); --add-members-item-color-hover: var(--shades-white-100); --add-members-item-disabled-color: var(--shades-black-80); --add-members-item-disabled-color-hover: var(--shades-black-60); --add-members-remove-pending-color: var(--error-primary); --add-members-remove-pending-color-hover: var(--error-light-50); --radio-border: var(--shades-black-70); --radio-color: var(--shades-white-60); --notification-settings-option-selected-bg: var(--shades-black-80); --notification-settings-option-title-color: var(--shades-white-90); --notification-settings-option-color: var(--shades-white-60); --notification-settings-option-invalid-color: var(--shades-black-80); --notification-settings-option-invalid-selected-color: var(--shades-black-60); --danger-zone-subheading-color: var(--shades-white-60); --danger-zone-explanation-color: var(--shades-black-60); --thread-creation-search-container-bg: var(--shades-black-90); --thread-creation-close-search-color: var(--shades-black-60); --thread-creation-search-item-bg-hover: var(--shades-black-80); --thread-creation-search-item-info-color: var(--shades-black-60); --chat-message-list-active-border: #5989d6; --sidebars-modal-color: var(--shades-black-60); --sidebars-modal-color-hover: var(--shades-white-100); --inline-engagement-bg: var(--shades-black-70); --inline-engagement-bg-hover: var(--shades-black-80); --inline-engagement-color: var(--fg); --compose-subchannel-header-fg: var(--shades-black-60); --compose-subchannel-header-bg: var(--shades-black-80); --compose-subchannel-label-color: var(--shades-black-60); --compose-subchannel-mark-color: var(--violet-light-100); --enum-option-icon-color: var(--violet-dark-100); --show-password-bg-hover: var(--shades-black-70); --typeahead-overlay-light: var(--shades-black-80); --typeahead-overlay-dark: var(--shades-black-90); --typeahead-overlay-text: var(--shades-white-100); --typeahead-overlay-shadow-primary: rgba(0, 0, 0, 0.25); --typeahead-overlay-shadow-secondary: rgba(0, 0, 0, 0.4); --spoiler-text-color: var(--spoiler-color); --spoiler-background-color: var(--spoiler-color); --purple-link: var(--violet-light-100); --drawer-expand-button: var(--shades-black-60); --drawer-expand-button-disabled: var(--shades-black-80); --drawer-item-color: var(--shades-white-60); --drawer-active-item-color: var(--shades-white-100); --drawer-open-community-bg: #191919; --active-drawer-item-bg: rgba(0, 0, 0, 0.5); --community-drawer-lines: rgba(255, 255, 255, 0.08); --topbar-button-bg: var(--shades-black-90); --filters-button-bg: var(--shades-black-100); --filters-button-border: var(--shades-black-80); --filters-button-hover-bg: var(--shades-black-90); --filter-panel-fg: var(--shades-black-60); --filter-panel-bg: #0d0d0d; --topbar-button-bg-hover: var(--shades-black-80); --topbar-button-fg: var(--shades-white-60); --message-label-color: var(--shades-black-60); --topbar-lines: rgba(255, 255, 255, 0.08); --pin-message-information-text-color: var(--shades-white-60); --pin-message-modal-border-color: var(--shades-black-80); --pinned-count-banner-color: var(--shades-black-90); --pinned-count-text-color: var(--shades-white-90); + --modal-overlay-background-90: rgba(0, 0, 0, 0.9); + --modal-overlay-background-80: rgba(0, 0, 0, 0.8); }