diff --git a/web/chat/chat-thread-list-item.react.js b/web/chat/chat-thread-list-item.react.js index 902b16193..ddb801887 100644 --- a/web/chat/chat-thread-list-item.react.js +++ b/web/chat/chat-thread-list-item.react.js @@ -1,114 +1,115 @@ // @flow import classNames from 'classnames'; import * as React from 'react'; import type { ChatThreadItem } from 'lib/selectors/chat-selectors'; import { shortAbsoluteDate } from 'lib/utils/date-utils'; import { useSelector } from '../redux/redux-utils'; import { useOnClickThread, useThreadIsActive, } from '../selectors/nav-selectors'; import ChatThreadListItemMenu from './chat-thread-list-item-menu.react'; import ChatThreadListSeeMoreSidebars from './chat-thread-list-see-more-sidebars.react'; import ChatThreadListSidebar from './chat-thread-list-sidebar.react'; import css from './chat-thread-list.css'; import MessagePreview from './message-preview.react'; type Props = {| +item: ChatThreadItem, +setModal: (modal: ?React.Node) => void, |}; function ChatThreadListItem(props: Props) { const { item, setModal } = props; const threadID = item.threadInfo.id; const onClick = useOnClickThread(threadID); const timeZone = useSelector((state) => state.timeZone); const lastActivity = shortAbsoluteDate(item.lastUpdatedTime, timeZone); const active = useThreadIsActive(threadID); const containerClassName = React.useMemo( () => classNames({ [css.thread]: true, [css.activeThread]: active, }), [active], ); const { unread } = item.threadInfo.currentUser; const titleClassName = React.useMemo( () => classNames({ [css.title]: true, [css.unread]: unread, }), [unread], ); const lastActivityClassName = React.useMemo( () => classNames({ [css.lastActivity]: true, [css.unread]: unread, [css.dark]: !unread, }), [unread], ); const { color } = item.threadInfo; const colorSplotchStyle = React.useMemo( () => ({ backgroundColor: `#${color}` }), [color], ); const sidebars = item.sidebars.map((sidebarItem) => { if (sidebarItem.type === 'sidebar') { const { type, ...sidebarInfo } = sidebarItem; return ( ); } else { return ( ); } }); return ( <>
{item.threadInfo.uiName}
{lastActivity}
{sidebars} ); } export default ChatThreadListItem; diff --git a/web/chat/chat-thread-list-see-more-sidebars.react.js b/web/chat/chat-thread-list-see-more-sidebars.react.js index ef6b7b878..c8efdec9c 100644 --- a/web/chat/chat-thread-list-see-more-sidebars.react.js +++ b/web/chat/chat-thread-list-see-more-sidebars.react.js @@ -1,39 +1,45 @@ // @flow import classNames from 'classnames'; import * as React from 'react'; import DotsThreeHorizontal from 'react-entypo-icons/lib/entypo/DotsThreeHorizontal'; +import type { ThreadInfo } from 'lib/types/thread-types'; + import SidebarListModal from '../modals/chat/sidebar-list-modal.react'; import css from './chat-thread-list.css'; type Props = {| + +threadInfo: ThreadInfo, +unread: boolean, +setModal: (modal: ?React.Node) => void, |}; function ChatThreadListSeeMoreSidebars(props: Props) { - const { unread, setModal } = props; + const { unread, setModal, threadInfo } = props; const onClick = React.useCallback( - () => setModal(), - [setModal], + () => + setModal( + , + ), + [setModal, threadInfo], ); return ( ); } export default ChatThreadListSeeMoreSidebars; diff --git a/web/chat/chat-thread-list.css b/web/chat/chat-thread-list.css index b339d6281..296cab791 100644 --- a/web/chat/chat-thread-list.css +++ b/web/chat/chat-thread-list.css @@ -1,135 +1,140 @@ div.thread { display: flex; flex-direction: row; padding: 5px 5px 5px 15px; } div.thread:hover { background-color: #EEEEEE; } div.activeThread { background-color: #EEEEEE; } div.thread div.title { font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: black; } a.threadButton { flex: 1; cursor: pointer; overflow: hidden; } div.threadRow { display: flex; justify-content: space-between; align-items: center; } div.colorSplotch { height: 20px; width: 20px; } div.lastActivity { font-size: 15px; white-space: nowrap; } div.lastMessage { font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; } div.unread { color: black; font-weight: 600; } .black { color: black; } div.dark { color: #666666; } .light { color: #AAAAAA; } div.italic { font-style: italic; } div.thread div.sidebarTitle { flex: 1; font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: black; align-self: flex-start; } div.sidebarLastActivity { white-space: nowrap; font-size: 14px; } svg.sidebarIcon { color: black; padding: 0 6px; font-size: 20px; } div.sidebar .menu > button svg { font-size: 16px; } .menu { position: relative; display: flex; margin: 0 5px; } .menu > button { background-color: transparent; border: none; border-radius: 5px; cursor: pointer; padding: 0 10px; } .menu > button:hover { background-color: #DDDDDD; } .menu > button:focus { outline: none; } .menu > button svg { font-size: 20px; } .menuContent { display: none; position: absolute; top: calc(100% + 1px); right: 0; z-index: 1; width: max-content; overflow: hidden; background-color: #EEEEEE; border-radius: 5px; box-shadow: 1px 1px 5px 2px #00000022; } .menuContentVisible { display: block; } .menuContent ul { list-style: none; } .menuContent li:not(:last-child) { border-bottom: 1px solid #DDDDDD; } .menuContent button { border: none; cursor: pointer; padding: 10px; font-size: 16px; } .menuContent button:hover { background-color: #DDDDDD; } + +ul.list { + margin: 5px 3px 10px 0px; + overflow: auto; +} diff --git a/web/modals/chat/sidebar-list-modal.react.js b/web/modals/chat/sidebar-list-modal.react.js index 2a7f66fda..68b4e084e 100644 --- a/web/modals/chat/sidebar-list-modal.react.js +++ b/web/modals/chat/sidebar-list-modal.react.js @@ -1,27 +1,61 @@ // @flow +import classNames from 'classnames'; import * as React from 'react'; -import css from '../../style.css'; +import { sidebarInfoSelector } from 'lib/selectors/thread-selectors'; +import type { ThreadInfo } from 'lib/types/thread-types'; + +import chatThreadListCSS from '../../chat/chat-thread-list.css'; +import SidebarItem from '../../chat/sidebar-item.react'; +import { useSelector } from '../../redux/redux-utils'; +import globalCSS from '../../style.css'; import Modal from '../modal.react'; type Props = {| +setModal: (modal: ?React.Node) => void, + +threadInfo: ThreadInfo, |}; function SidebarsListModal(props: Props) { - const { setModal } = props; + const { setModal, threadInfo } = props; const clearModal = React.useCallback(() => { setModal(null); }, [setModal]); + const sidebarInfos = useSelector( + (state) => sidebarInfoSelector(state)[threadInfo.id] ?? [], + ); + + const sidebars = React.useMemo( + () => + sidebarInfos.map((item) => ( +
+ +
+ )), + [clearModal, sidebarInfos], + ); + return ( - -
-

Sidebars will be displayed here

+ +
+
    {sidebars}
); } export default SidebarsListModal; diff --git a/web/modals/history/history.css b/web/modals/history/history.css index 348505894..0c9642987 100644 --- a/web/modals/history/history.css +++ b/web/modals/history/history.css @@ -1,222 +1,222 @@ div.modalBody { position: relative; - height: 240px; + min-height: 240px; overflow: hidden; padding: 6px 6px; width: 100%; box-sizing: border-box; background-color: white; border-bottom-left-radius: 15px; border-bottom-right-radius: 15px; } span.loading { position: absolute; right: 8px; top: 6px; } span.error { position: absolute; line-height: 16px; font-size: 16px; right: 12px; top: 6px; } div.entryHistory { position: absolute; width: 100%; top: 27px; box-sizing: border-box; } div.entryHistoryVisible { left: 0; } div.entryHistoryInvisible { left: 100%; } @keyframes entry-history-visible-animation { from { left: 100%; } to { left: 0; } } div.entryHistoryVisibleAnimate { left: 0; animation-name: entry-history-visible-animation; animation-duration: 0.5s; } @keyframes entry-history-invisible-animation { from { left: 0; } to { left: 100%; } } div.entryHistoryInvisibleAnimate { left: 100%; animation-name: entry-history-invisible-animation; animation-duration: 0.5s; } div.header { position: absolute; left: 0; top: 0; width: 100%; padding: 5px; font-size: 12px; font-family: 'Open Sans', sans-serif; font-weight: 600; background-color: #F4F4F4; box-sizing: border-box; } a.allHistoryButton { position: absolute; top: 5px; left: 7px; } span.date { float: left; width: 100%; text-align: center; } div.entryHistory ul { overflow: auto; height: 211px; } div.entryHistory li { border-bottom: 2px solid lightgray; margin: 5px; padding-bottom: 8px; padding-top: 1px; } div.entryHistory li:last-child { border-bottom: none; } span.entryAuthor { float: left; padding-left: 11px; font-size: 12px; color: gray; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; max-width: 50%; box-sizing: border-box; } span.entryUsername { color: #2A5DB0; } time.entryTime { float: right; padding-right: 11px; font-size: 12px; color: gray; } span.entryThread { float: right; padding-right: 11px; font-size: 12px; font-family: 'Open Sans', sans-serif; font-weight: 600; margin-top: -2px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; max-width: 50%; padding-left: 10px; box-sizing: border-box; } div.clear { clear: both; } div.entry { padding: 5px; box-shadow: inset 0px 0px 0px 2px white; border-radius: 5px; position: relative; margin: 5px; font-size: 13px; word-break: break-all; white-space: pre-wrap; } div.darkEntry { color: white; } div.dayHistory { position: absolute; width: 100%; top: 27px; box-sizing: border-box; } div.dayHistoryVisible { left: 0; } div.dayHistoryInvisible { left: -100%; } @keyframes day-history-visible-animation { from { left: -100%; } to { left: 0; } } div.dayHistoryVisibleAnimate { left: 0; animation-name: day-history-visible-animation; animation-duration: 0.5s; } @keyframes day-history-invisible-animation { from { left: 0; } to { left: -100%; } } div.dayHistoryInvisibleAnimate { left: -100%; animation-name: day-history-invisible-animation; animation-duration: 0.5s; } div.dayHistory ul { overflow: auto; height: 211px; } div.dayHistory li { padding-bottom: 2px; } div.dayHistory li:last-child { padding-bottom: 8px; } span.deletedEntry { float: left; padding-top: 2px; padding-left: 11px; font-size: 12px; line-height: 17px; } span.deletedEntryLabel { color: red; font-style: italic; } span.restoreEntryLabel { padding-left: 5px; } span.restoreLoading { position: relative; top: 2px; left: 5px; width: 12px; } span.restoreError { position: relative; top: 1px; left: 7px; font-size: 15px; } a.revisionHistoryButton { float: right; padding-top: 2px; padding-right: 11px; font-size: 12px; font-weight: bold; } div.restored { font-style: italic; font-size: 13px; padding-left: 11px; } div.deleted { font-style: italic; font-size: 13px; padding-left: 11px; color: red; } diff --git a/web/modals/modal.react.js b/web/modals/modal.react.js index 8b2f8eddd..77a5c4796 100644 --- a/web/modals/modal.react.js +++ b/web/modals/modal.react.js @@ -1,82 +1,87 @@ // @flow import classNames from 'classnames'; import invariant from 'invariant'; import PropTypes from 'prop-types'; import * as React from 'react'; import css from '../style.css'; export type ModalSize = 'small' | 'large'; type Props = { name: string, onClose: () => void, children?: React.Node, size?: ModalSize, + fixedHeight?: boolean, }; class Modal extends React.PureComponent { - static defaultProps = { size: 'small' }; + static defaultProps = { size: 'small', fixedHeight: true }; overlay: ?HTMLDivElement; componentDidMount() { invariant(this.overlay, 'overlay ref unset'); this.overlay.focus(); } render() { const overlayClasses = classNames( css['modal-overlay'], { [css['small-modal-overlay']]: this.props.size === 'small' }, { [css['large-modal-overlay']]: this.props.size === 'large' }, + { [css['resizable-modal-overlay']]: !this.props.fixedHeight }, ); const modalContainerClasses = classNames(css['modal-container'], { [css['large-modal-container']]: this.props.size === 'large', }); + const modalClasses = classNames(css['modal'], { + [css['fixed-height-modal']]: this.props.fixedHeight, + }); return (
-
+
×

{this.props.name}

{this.props.children}
); } overlayRef = (overlay: ?HTMLDivElement) => { this.overlay = overlay; }; onBackgroundClick = (event: SyntheticEvent) => { if (event.target === this.overlay) { this.props.onClose(); } }; onKeyDown = (event: SyntheticKeyboardEvent) => { if (event.keyCode === 27) { this.props.onClose(); } }; } Modal.propTypes = { name: PropTypes.string.isRequired, onClose: PropTypes.func.isRequired, size: PropTypes.oneOf(['small', 'large']), }; export default Modal; diff --git a/web/style.css b/web/style.css index cc613f990..d2f7a0cbd 100644 --- a/web/style.css +++ b/web/style.css @@ -1,613 +1,636 @@ * { padding: 0; margin: 0; -ms-overflow-style: -ms-autohiding-scrollbar; } html { height: 100%; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; background-image: url(../images/background.png); background-size: 3000px 2000px; background-attachment: fixed; height: 100%; overflow: hidden; } a { text-decoration: none; color: #2A5DB0; } img, iframe { display: block; } input[type='text'], input[type='password'], textarea { -webkit-appearance: none; -moz-appearance: none; -webkit-border-radius: 0; border: 1px solid #DDDDDD; border-radius: 1px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; } input[type='submit'] { -webkit-appearance: none; -moz-appearance: none; -webkit-border-radius: 0; } input[type='submit']::-moz-focus-inner { border: 0; padding: 0; } :global(#react-root) { display: flex; flex-direction: column; height: 100%; } header.header { flex: 0 1 auto; background-image: url(../images/background.png); background-size: 3000px 2000px; background-attachment: fixed; z-index: 1; } div.main-header { font-family: 'Anaheim', sans-serif; height: 62px; } div.main-header > h1 { position: absolute; padding-top: 5px; padding-left: 16px; color: white; font-size: 38px; } ul.nav-bar { position: absolute; padding-left: 180px; } ul.nav-bar > li { display: inline-block; list-style-type: none; font-family: 'Open Sans', sans-serif; font-size: 18px; font-weight: 600; cursor: pointer; text-transform: uppercase; } ul.nav-bar > li.current-tab { background-image: url(../images/background.png); background-size: 3000px 2000px; background-attachment: fixed; cursor: default; } ul.nav-bar > li > div { padding: 3px 20px 3px 20px; } ul.nav-bar > li > div > a { color: #FFFFFF; } ul.nav-bar > li.current-tab > div > a { color: #444444; } ul.nav-bar > li.current-tab > div { background-color: rgba(255,255,255,0.84); padding: 18px 20px 19px 20px; height: 25px; } svg.nav-bar-icon { padding-right: 8px; font-size: 20px; } div.chatBadge { display: inline-block; box-sizing: border-box; width: 25px; height: 25px; margin-left: 8px; color: white; background-color: red; border-radius: 13px; font-size: 18px; text-align: center; } div.main-content-container { flex: 1 0 0; position: relative; min-height: 0; } div.main-content { background-color: rgba(255,255,255,0.84); height: 100%; overflow-x: hidden; } div.upper-right { position: absolute; top: 0; right: 0; padding: 15px 16px; } span.loading-indicator-loading { display: inline-block; } @keyframes loading-indicator-loading { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } span.loading-indicator-loading { display: inline-block; } span.loading-indicator-loading-medium:after { content: " "; display: block; width: 15px; height: 15px; border-radius: 50%; border: 3px solid #fff; border-color: #fff transparent #fff transparent; animation-name: loading-indicator-loading; animation-duration: 1.2s; animation-iteration-count: infinite; animation-timing-function: linear; } span.loading-indicator-loading-large:after { content: " "; display: block; width: 25px; height: 25px; border-radius: 50%; border: 3px solid #fff; border-color: #fff transparent #fff transparent; animation-name: loading-indicator-loading; animation-duration: 1.2s; animation-iteration-count: infinite; animation-timing-function: linear; } span.loading-indicator-loading-small:after { content: " "; display: block; width: 9px; height: 9px; border-radius: 50%; border: 2px solid #fff; border-color: #fff transparent #fff transparent; animation-name: loading-indicator-loading; animation-duration: 1.2s; animation-iteration-count: infinite; animation-timing-function: linear; } span.loading-indicator-black:after { border-color: #000 transparent #000 transparent; } span.loading-indicator-error { font-weight: bold; color: white; line-height: 0; } span.loading-indicator-error-black { font-weight: bold; color: red; line-height: 0; } div.account-bar { background-color: #F8F8F8; border: 1px solid #C8C8C8; border-radius: 5px; font-family: 'Open Sans', sans-serif; font-weight: 600; padding: 0 6px; cursor: pointer; float: right; } div.account-button { padding: 3px 4px 3px 8px; } div.account-button > span { font-size: 16px; } div.account-menu { outline: none; } div.account-menu > div { border-top: 1px solid #C8C8C8; padding: 3px 4px 3px 8px; } span.username { display: inline-block; color: #2A5DB0; cursor: pointer; } svg.account-caret { padding-left: 6px; fill: #2A5DB0; cursor: pointer; height: 10px; width: 10px; } div.modal-overlay { position: fixed; left: 0; top: 0; + bottom: 0; z-index: 4; width: 100%; - height: 100%; background-color: rgba(0,0,0,0.4); + display: flex; + flex-direction: column; + align-items: center; overflow: auto; } +div.resizable-modal-overlay { + min-height: 60px; +} div.small-modal-overlay { padding-top: 100px; } div.large-modal-overlay { padding-top: 50px; } div.modal-container { background-image: url(../images/background.png); background-size: 3000px 2000px; - background-attachment: fixed; - margin: auto; max-width: 330px; border-radius: 15px; + display: flex; + min-height: 0; + max-height: 500px; } div.large-modal-container { max-width: 500px; } div.modal { position: relative; box-shadow: 0 4px 20px rgba(0, 0, 0, .3), 0 0 0 1px rgba(0, 0, 0, .1); - background-color: rgba(255,255,255,0.71); + background-color: rgba(255,255,255,0.61); border-radius: 15px; + flex: 1; + display: flex; + flex-direction: column; + width: 330px; +} +div.large-modal-container div.modal { + width: 500px; +} +div.fixed-height-modal { + height: 100%; } span.modal-close { float: right; font-size: 32px; font-weight: 300; line-height: 30px; } span.modal-close:hover { color: black; cursor: pointer; } div.modal-header { padding: 8px 15px; font-family: 'Open Sans', sans-serif; } div.modal-header > h2 { font-size: 22px; font-weight: 300; } div.modal-body { padding: 6px 6px; width: 100%; box-sizing: border-box; background-color: white; border-bottom-left-radius: 15px; border-bottom-right-radius: 15px; + flex: 1; + display: flex; + flex-direction: column; +} +div.resized-modal-body { + min-height: 250px; } div.modal-body p { padding: 1px 3px 4px 3px; font-size: 14px; text-align: center; } div.modal-body p.form-pre-footer { padding-top: 5px; font-size: 12px; font-style: italic; } div.modal-body input, div.modal-body textarea { margin: 3px; } div.modal-body input[type='text'], div.modal-body input[type='password'], div.modal-body textarea { font-size: 14px; padding: 1px; width: 175px; } div.large-modal-container div.modal-body input[type='text'], div.large-modal-container div.modal-body input[type='password'], div.large-modal-container div.modal-body textarea { width: 275px; } div.modal-body input[type='submit'] { padding: 3px 9px; font-size: 12px; margin-right: 3px; border-radius: 3px; border: 1px solid #C8C8C8; background-color: #F8F8F8; font-family: 'Open Sans', sans-serif; font-weight: 600; color: #444444; margin-top: 1px; cursor: pointer; } div.modal-body input[type='submit']:hover { text-decoration: underline; } div.modal-body input[type='submit']:disabled { cursor: initial; text-decoration: none; color: #999999; } div.modal-body div.form-title { display: inline-block; text-align: right; padding-right: 5px; padding-top: 5px; font-size: 14px; font-family: 'Open Sans', sans-serif; font-weight: 600; vertical-align: top; width: 110px; } div.large-modal-container div.modal-body div.form-title { width: 140px; } div.modal-body div.form-content { display: inline-block; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 15px; } div.modal-body div.form-subtitle { font-size: 12px; padding-left: 4px; font-style: italic; } div.form-enum-selector { display: inline-block; padding-bottom: 4px; } div.form-enum-selector > div.form-enum-container { padding-top: 5px; } div.form-enum-selector > div.form-enum-container > input { vertical-align: top; margin-top: 4px; } div.form-enum-selector div.form-enum-option { font-weight: bold; display: inline-block; font-size: 15px; font-family: 'Open Sans', sans-serif; font-weight: 600; padding-left: 3px; } div.form-enum-selector span.form-enum-description { display: block; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-weight: normal; font-size: 13px; max-width: 260px; color: gray; } div.color-title { margin-top: 4px; } div.modal-body div.form-footer { display: flex; flex-direction: row-reverse; justify-content: space-between; align-items: start; margin-top: 5px; border-top: 2px solid #EFEFEF; min-height: 26px; padding: 7px 4px 4px 0; } div.modal-body div.form-footer div.modal-form-error { font-size: 12px; color: red; font-style: italic; padding-left: 6px; align-self: center; } div.modal-body div.form-footer div.modal-form-error ol { padding-left: 20px; } div.form-text > div.form-title { vertical-align: initial; } div.form-text > div.form-content { margin-left: 3px; margin-bottom: 3px; } div.form-text > div.form-float-title { float: left; text-align: right; padding-right: 5px; font-size: 14px; font-family: 'Open Sans', sans-serif; font-weight: 600; width: 110px; } div.form-text > div.form-float-content { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 14px; padding: 1px 20px 3px 4px; margin-top: 5px; } .verified-status-true { color: green; } .verified-status-false { color: red; } .hidden { display: none; } .italic { font-style: italic; } div.edit-thread-color-container { margin-top: -5px; } div.form-textarea-container { margin-top: 1px; } div.edit-thread-privacy-container { margin-bottom: 6px; } div.edit-thread-account-password { border-top: 2px solid #EFEFEF; padding-top: 4px; margin-top: 2px; } div.user-settings-current-password { border-top: 2px solid #EFEFEF; padding-top: 4px; margin-top: 5px; } div.modal-body p.confirm-account-password { padding: 3px 0px 5px 0px; font-style: italic; font-size: 13px; color: #777777; } ul.tab-panel { background-color: #F4F4F4; padding-left: 10px; padding-top: 5px; } ul.tab-panel > li { display: inline-block; list-style-type: none; font-family: 'Open Sans', sans-serif; font-size: 13px; font-weight: 600; cursor: pointer; padding: 3px 10px 3px 10px; } ul.tab-panel > li.current-tab { background-color: white; border-radius: 5px 5px 0 0; cursor: default; } ul.tab-panel > li > a { color: #555555; } ul.tab-panel > li.current-tab > a { color: #123a7b; cursor: default; } ul.tab-panel > li.delete-tab > a { color: #ff0000 !important; } div.new-thread-privacy-container { margin-bottom: 3px; margin-top: -6px; } span.page-loading { margin-top: 5px; margin-right: 12px; float: left; } span.page-error { margin: 15px; font-size: 42px; float: left; color: red; } div.color-picker-container { outline: none; position: relative; } div.color-picker-button { margin: 6px 3px; overflow: hidden; cursor: pointer; padding: 4px; display: inline-block; border: solid 1px darkgray; background: #eee; color: #333; vertical-align: middle; border-radius: 3px; } div.color-picker-preview { width: 25px; height: 16px; border: solid 1px #222; margin-right: 5px; float: left; z-index: 0; } div.color-picker-down-symbol { padding: 1px 0; height: 16px; line-height: 16px; float: left; font-size: 10px; } div.color-picker-selector { position: absolute; left: 4px; top: 34px; } div.intro-modal { padding: 10px 21px 12px 21px; border-radius: 5px; border: 1px solid #C8C8C8; background-color: #F8F8F8; width: 310px; position: fixed; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; margin-top: 100px; box-shadow: 2px 3px 6px 0px rgba(0, 0, 0, 0.1); } @media only screen and (-webkit-min-device-pixel-ratio: 2.0), only screen and (min--moz-device-pixel-ratio: 2.0), only screen and (-o-min-device-pixel-ratio: 2.0/1), only screen and (min-device-pixel-ratio: 2.0), only screen and (min-resolution: 320dpi), only screen and (min-resolution: 2.0dppx) { header.header, header.main-header, div.splash-header-container, div.splash-top-container, div.splash-bottom, div.modal-container, ul.nav-bar > li.current-tab, div.calendar-filters-container { background-image: url(../images/background@2x.png); } } @media (hover: none) { div.splash-header-container, div.splash-top-container, div.splash-bottom { background-attachment: initial; } }