:root { --color-twitter-text-gray: #536171; --color-twitter-blue: #1b95e0; /* hsl(203, 78%, 49%) */ --color-twitter-blue-light: #7cc5f6; /* hsl(204, 87%, 73%) */ --color-twitter-blue-extra-light: hsl(204, 95%, 85%); --color-twitter-off-white: #f7f9f9; /* hsl(180, 14%, 97%) */ --color-twitter-off-white-dark: #dae5e5; /* hsl(180, 17%, 88%) */ --color-outline-gray: #dcdcdc; --color-twitter-text-gray: #536471; --color-twitter-danger-red: #f4212e; /* hsl(356, 91%, 54%) */ --color-twitter-danger-red2: #de1b28; /* hsl(356, 78%, 49%) */ --color-twitter-danger-red2-light: #f67e86; /* hsl(356, 87%, 73%) */ --color-twitter-danger-red2-hover: #f2a6aa; /* hsl(357, 75%, 80%);*/ --color-space-purple: #a49bfd; --color-space-purple-outline: #6452fc; /* const QColor COLOR_OUTLINE_GRAY = QColor(220, 220, 220); const QColor COLOR_TWITTER_BLUE = QColor(27, 149, 224); const QColor COLOR_TWITTER_BLUE_LIGHT = QColor(124,197,246); const QColor COLOR_TWITTER_OFF_WHITE = QColor(247,249,249); const QColor COLOR_TWITTER_OFF_WHITE_DARK = QColor(218,229,229); const QColor COLOR_TWITTER_TEXT_GRAY = QColor(83, 100, 113); const QColor COLOR_BACKGROUND_GREEN = QColor(40, 205, 50); const QColor COLOR_RED = QColor(255, 0, 0); const QColor COLOR_SPACE_PURPLE = QColor(164, 155, 253); const QColor COLOR_SPACE_PURPLE_OUTLINE = QColor(100, 82, 252); */ } html { /* Force scrollbar, even when it fits on 1 page. Prevents viewport from resizing -> flickering / stuff moving btw page loads */ overflow-y: scroll; } body { margin: 0 30%; border-color: var(--color-twitter-off-white-dark); border-right-style: solid; border-left-style: solid; border-width: 1px; min-height: 100vh; font-family: "Titillium Web"; } main { padding-top: 4em; } input, select { font-family: inherit; font-size: 1em; padding: 0.2em 0.6em; box-sizing: border-box; border-radius: 0.5em; } h1 { margin: 0.5em 0; text-align: center; } .server-error-msg { position: fixed; margin: 6em 0; left: 0; top: 0; z-index: 1; width: 100%; box-sizing: border-box; display: flex; flex-direction: row; justify-content: center; } .server-error-msg .error-msg-container { width: 30%; background-color: #fee; border: 1px solid red; border-radius: 1em; padding: 1em; color: red; text-align: center; } ul.inline-dotted-list { list-style: none; margin: 0; } ul.inline-dotted-list li { display: inline; } ul.inline-dotted-list li:after { content: " ⋅"; } ul.inline-dotted-list li:last-child:after { content: ""; } .tweet { padding: 0 1.5em; position: relative; z-index: 0; /* Dunno why, but without it, hovering a tweet with a Poll hides the poll fill bars */ } :not(#focused-tweet) > .tweet:hover:not(:has(.tweet:hover)) { background-color: var(--color-twitter-off-white); } :not(#focused-tweet) > .tweet { cursor: pointer; } .htmx-spinner-container { display: none; z-index: 2; /* On top of the search bar, which is z-index of 1 */ } .htmx-request > .htmx-spinner-container { display: revert; font-size: 3em; position: absolute; top: 0; bottom: 0; left: 0; right: 0; } .htmx-spinner-container .htmx-spinner-background { opacity: 0.3; background-color: #7cc5f6; width: 100%; height: 100%; } .htmx-spinner-container .htmx-spinner { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); /* https://codepen.io/sosuke/pen/Pjoqqp */ filter: invert(54%) sepia(17%) saturate(4210%) hue-rotate(176deg) brightness(89%) contrast(98%); } dialog#image_carousel { border-radius: 2em; border: 0.3em solid var(--color-twitter-blue); box-shadow: 0 0 1em var(--color-twitter-blue); outline: none; overflow: visible; padding: 1.4em; } dialog#image_carousel a.close-button { position: absolute; right: -1.3em; top: -1.5em; width: 1em; line-height: 1em; font-size: 2em; justify-content: center; border: 0.1em solid black; } dialog#image_carousel a.close-button:not(:hover):not(:active) { background-color: var(--color-twitter-blue-extra-light); } dialog::backdrop { background: hsla(204, 87%, 73%, 0.3); /* based on --color-twitter-blue-light */ } .quoted-tweet { margin: 1em 0; } .rounded-gray-outline { outline-color: lightgray; outline-style: solid; outline-width: 1px; } .rounded-gray-outline, .rounded-gray-outline > .tweet { border-radius: 20px; } .profile-banner-image { width: 100%; } .unstyled-link { text-decoration: none; color: inherit; } .author-info { display: flex; align-items: center; } .author-info a { line-height: 0; } .author-info, .tweet .text { cursor: default; } .circle-outline { display: flex; border-radius: 50%; outline: 1px solid #777; margin: 0 0.4em; font-size: 0.8em; padding: 0.2em; box-sizing: border-box; } .name-and-handle { padding: 0 0.6em !important; /* !important to make the ".quick-link .span" rule in the login button not overrule it */ } .display-name { font-weight: bold; white-space: nowrap; } .handle { color: var(--color-twitter-text-gray); } .tweet-header-container { display: flex; align-items: center; } .reply-mentions-container { display: flex; align-items: center; cursor: default; flex-grow: 1; justify-content: center; flex-wrap: wrap; } .reply-mentions { padding: 0 0.5em; } .replying-to-label { color: var(--color-twitter-text-gray); } a.entity { text-decoration: none; color: var(--color-twitter-blue); } .tweet .text, .dm-message-text-container .text { display: block; margin-bottom: 0.4em; margin-top: 0; overflow-wrap: anywhere; } .dm-message-text-container .text:last-child { margin-bottom: 0; } #focused-tweet .text { font-size: 1.4em; } #focused-tweet .quoted-tweet .text { font-size: unset; } .tweet-content video { max-width: 100%; max-height: 40em; } .embedded-link { padding: 1.3em; margin-top: 1em; display: flex; flex-direction: column; background-color: var(--color-twitter-off-white); } img.embedded-link-preview { border-radius: 1em; max-width: 100%; } .embedded-link-description { color: var(--color-twitter-text-gray); font-size: 0.8em; margin: 0; } h3 { margin: 0.5em 0; } .embedded-link-domain-container { margin-top: 0.2em } .embedded-link-domain { margin-left: 0.3em; } .thread-parent-tweet:first-child, #focused-tweet:first-child { padding-top: 1em; } .thread-parent-tweet .vertical-reply-line-container, .reply-chain .vertical-reply-line-container { width: 3em; margin-right: 0.5em; } .thread-parent-tweet .vertical-reply-line:not(.quoted-tweet .vertical-reply-line), .reply-chain > :not(:last-child) .vertical-reply-line:not(.quoted-tweet .vertical-reply-line) { width: 2px; background-color: var(--color-twitter-off-white-dark); flex-grow: 1; margin: auto; } .profile-image { border-radius: 50%; width: 3em; height: 3em; display: inline; border: 0.1em solid var(--color-outline-gray); } .user-header { border-bottom: 1px solid var(--color-outline-gray); } .user-header .author-info { font-size: 1.3em; padding: 1em; } .user-header .profile-image { width: 8em; height: 8em; } .tabs-container { outline: 1px solid var(--color-outline-gray); } .tabs-container a.tab { flex-grow: 1; text-align: center; font-size: 1.1em; font-weight: bold; color: var(--color-twitter-text-gray); padding: 0.8em; } .tabs-container a.tab.active-tab { color: var(--color-twitter-blue); border-bottom: 0.2em solid var(--color-twitter-blue); } .tabs-container a.tab:hover { color: var(--color-twitter-blue); } .row { display: flex; flex-direction: row; align-items: center; } .row.spread { justify-content: space-between; } .vertical-reply-line-container { flex-grow: 0; flex-shrink: 0; padding: 0; margin: 0; display: flex; flex-direction: column; align-self: stretch; width: 1em; /* will be overridden by, e.g., parent-thread properties */ } .vertical-container-1 { flex-grow: 1; flex-shrink: 1; } .posted-at-container { flex-grow: 1; min-width: 5em; } p.posted-at { float: right; color: var(--color-twitter-text-gray); font-size: 0.875em; white-space: nowrap; } .interactions-bar { display: flex; flex-direction: row; margin: 0.5em 0; } .interaction-stat { flex-grow: 1; display: flex; } .interaction-stat span { line-height: 1.5em; padding: 0 0.5em; } .interactions-bar .dummy { flex-grow: 5; } #focused-tweet { border-bottom: 1px solid var(--color-twitter-off-white-dark); padding-bottom: 0.5em; } .reply-chain { margin-top: 1em; } .reply-chain > :last-child { padding-bottom: 1em; border-bottom: 1px solid var(--color-twitter-off-white-dark); } .nav-sidebar { display: flex; flex-direction: column; position: fixed; transform: translate(-100%, 0); font-size: 1.4em; } ul.quick-links { display: flex; flex-direction: column; list-style: none; align-items: flex-start; padding: 0 2em; } .quick-link { display: flex; flex-direction: row; align-items: center; padding: 0.5em; margin: 0.2em; border-radius: 100em; /* any large amount, just don't use % because then it makes an ellipse */ cursor: pointer; } .quick-link:hover { background-color: var(--color-twitter-blue-light); } .quick-link:active { transform: translate(0.1em, 0.1em); background-color: var(--color-twitter-blue); } /* TODO: "quick-link" is really more of a button */ .quick-link.danger { background-color: var(--color-twitter-danger-red2); } .quick-link.danger:hover { background-color: var(--color-twitter-danger-red2-light); } .quick-link.danger:active { background-color: var(--color-twitter-danger-red2); } .quick-link span { padding: 0 0.3em; white-space: nowrap; } .followers-count, .following-count { font-weight: bold; } .followers-label, .following-label { color: var(--color-twitter-text-gray); } .bio-info-with-icon { display: flex; flex-direction: row; align-items: center; gap: 0.3em; } .user-header-info-container { padding: 2em; border-bottom: 1px solid var(--color-outline-gray); } .timeline .tweet, .quoted-tweet .tweet { padding-top: 0.8em; padding-bottom: 0.8em; } .timeline > .tweet { /* not for nested (i.e., quoted) tweets */ border-bottom: 1px solid var(--color-twitter-off-white-dark); } .timeline .timeline-bottom-container { text-align: center; font-size: 1.2em; padding: 1em 0; } .timeline .timeline-bottom-container .eof-indicator { color: var(--color-twitter-text-gray); } .timeline .timeline-bottom-container .show-more { padding: 0em 0.8em; display: inline-block; border: 2px solid var(--color-twitter-blue); color: var(--color-twitter-text-gray); font-size: 0.9em; } .timeline .timeline-bottom-container .show-more:not(:hover):not(:active) { background-color: var(--color-twitter-blue-extra-light); } .top-bar { display: flex; flex-direction: row; align-items: center; height: 4em; padding: 0.5em 1em; gap: 1em; border: 1px solid var(--color-outline-gray); position: fixed; background-color: white; width: 40%; left: 30%; box-sizing: border-box; z-index: 1; } .back-button { flex-grow: 0; border-radius: 50%; border: 2px solid black; width: 2em; position: relative; height: 2em; box-sizing: border-box; cursor: pointer; } img.svg-icon { width: 1.5em; height: auto; } svg { width: 1.5em; } .back-button img { color: rgb(239, 243, 244); position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .top-bar form { flex-grow: 1; display: flex; } #search-bar { flex-grow: 1; } .login { width: 60%; margin: 20% auto; } .login-form input { width: 100%; border-radius: 0.5em; padding: 0.5em 0.6em; } .login-form .error { color: #C0392B; font-weight: bold; } .login-form .error + input { border-color: #C0392B; border-width: 2px; } .field-container { padding: 0.5em 0; } .submit-container { text-align: right; } input[type="submit"] { background-color: var(--color-twitter-blue-light); width: 10em; padding: 1em; border-radius: 1em; font-size: 1em; cursor: pointer; } .change-session-form select { display: block; width: 100%; } #logged-in-user-info { font-size: 0.8em; margin-top: 1em; display: flex; flex-direction: column; align-items: center; } .quick-link .author-info { pointer-events: none; } .retweet-info-container { margin-left: 3.5em; display: flex; align-items: center; opacity: 0.8; } .retweet-info-container .svg-icon { width: 1.2em; /* override default from .svg-icon of 1.5em */ opacity: 0.6; margin-right: 0.3em; } .retweeted-by-label { margin: 0 0.2em; } .user-bio { margin: 1.5em 0; } .followers-followees-container { margin-top: 1em; gap: 4em; } .followers-followees-container .spacer { flex-grow: 1; } .user-feed-buttons-container, .tweet-buttons-container { display: flex; flex-direction: row; } .tweet-buttons-container .quick-link { margin: 0; font-size: 0.8em; } .poll { padding: 1em; } .poll-choice { position: relative; margin: 0.3em 0; } .poll-fill-bar { position: absolute; height: 100%; z-index: -1; background-color: var(--color-twitter-off-white-dark); } .poll-fill-bar.poll-winner { background-color: var(--color-twitter-blue-light); } .poll-info-container { width: 100%; line-height: 2em; margin: 0 0.5em; } .poll-choice-label { width: 50%; } .poll-choice-votes { width: 50%; } .poll-metadata { color: var(--color-twitter-text-gray); margin: 0; font-size: 0.9em; } .space { outline: 1px solid var(--color-space-purple-outline); background-color: var(--color-space-purple); border-radius: 1.5em; padding: 1.5em; } .space-title { padding-top: 0.5em; } .space .host-label { color: var(--color-space-purple-outline); } .space-date { color: var(--color-space-purple-outline); font-size: 0.8em; } .space-info-list { padding: 0; } .space .layout-spacer { flex-grow: 1; } ul.space-participants-list { list-style: none; padding: 0; } ul.space-participants-list li { padding: 0.5em 0; display: inline-block; width: 24%; } .space-participants-list .author-info { font-size: 0.9em; line-height: 1.2em; } .space-participants-list .author-info .profile-image { font-size: 0.8em; } .tombstone { outline: 1px solid var(--color-outline-gray); background-color: var(--color-twitter-off-white); padding: 0.5em 1em; border-radius: 0.5em; color: var(--color-twitter-text-gray); } .tweet-image { max-width: 95%; max-height: 30em; width: auto; height: auto; } .tweet video { max-height: 25em; } .like-icon { cursor: pointer; } .like-icon.liked, .like-icon:hover { filter: invert(20%) sepia(97%) saturate(4383%) hue-rotate(321deg) brightness(101%) contrast(95%); } .users-list-previews { border-color: var(--color-twitter-off-white-dark); border-top-style: double; border-width: 4px; } .users-list-preview { padding: 0.5em 1em; border-color: var(--color-twitter-off-white-dark); border-bottom-style: solid; border-width: 1px; } .users-list-preview .list-info-container{ display: flex; align-items: center; font-size: 1.5em; cursor: pointer; } .users-list-preview .list-info-container span.num-users { margin-left: 1em; color: var(--color-twitter-text-gray); } .users-list-preview .list-info-container .first-N-profile-images { display: flex; align-items: flex-end; margin-left: 1.5em; } .users-list-preview .list-info-container .first-N-profile-images a { margin-right: -1.2em; line-height: 0; /* TODO: This is duplicated from `.author-info a` and possibly others */ } .users-list-preview .list-info-container .first-N-profile-images .ellipsis { margin-left: 1.5em; } .users-list-container { display: flex; flex-direction: column; border-color: var(--color-twitter-off-white-dark); border-top-style: double; border-width: 4px; } .users-list-container .author-info .profile-image { width: 4em; height: 4em; } .users-list-container .user { border-color: var(--color-twitter-off-white-dark); border-bottom-style: solid; border-width: 1px; padding: 1em; } .users-list-container .user p.bio { margin: 0 5.3em; font-size: 0.9em; color: var(--color-twitter-text-gray); } .add-users-container { padding: 1em; text-align: center; } .sort-order-container { padding: 1em 1em 1em 3em; margin-bottom: -0.5em; border-bottom: 1px solid var(--color-outline-gray); } .sort-order-container select { text-transform: capitalize; margin: 0 1em; } .sort-order-container .sort-order-label { font-weight: bold; } .chats-container { display: flex; flex-direction: row; /** Setup to allow the two panes to scroll independently **/ height: 100vh; padding-top: 4em; margin-top: -4em; box-sizing: border-box; } .chats-container .chat-list { flex-basis: 0; flex-grow: 4; display: flex; flex-direction: column; overflow-y: scroll; } .chats-container .chat-list .chat { border-bottom: 1px solid var(--color-outline-gray); padding: 1em 1em 0 1em; box-sizing: border-box; cursor: pointer; } .chats-container .chat-list .chat.active-chat { color: var(--color-twitter-blue); border-left: 0.2em solid var(--color-twitter-blue); background-color: var(--color-twitter-off-white); } .chats-container .chat-list .chat.active-chat .profile-image{ box-shadow: 0 0 1em 0em var(--color-twitter-blue); } .chats-container .chat-list .chat .chat-preview-header { display: flex; align-items: center; justify-content: space-between; } .chats-container .chat-list .chat .chat-preview-header .posted-at { margin: 0; } .chats-container .chat-list .chat .groupchat-profile-image-container { display: flex; } .chats-container .chat-list .chat .groupchat-profile-image-container .display-name { padding: 0.6em; font-style: italic; } .chats-container .chat-list .chat .chat-preview { font-size: 0.9em; color: var(--color-twitter-text-gray); padding: 0 1em; border-left: 1px solid var(--color-outline-gray); } .chats-container #chat-view { flex-basis: 0; flex-grow: 7; border-left: 1px solid var(--color-outline-gray); padding: 0.5em; box-sizing: border-box; display: flex; flex-direction: column; } .chats-container #chat-view .chat-messages { flex-grow: 1; overflow-y: auto; } .chats-container #chat-view .our-message { align-items: flex-end; } .dm-message-and-reacts-container { display: flex; flex-direction: column; margin: 1em 0; } .dm-message-text-container { display: inline-block; padding: 1em; background-color: #ddd; border-radius: 1em; margin: 0; } .our-message .dm-message-text-container { background-color: var(--color-twitter-blue-light); } .sender-profile-image-container { display: flex; align-items: flex-end; } .sender-profile-image-container a { line-height: 0; /* TODO: This is redundant with ".author-info a" rule above */ } .dm-message-container { display: flex; align-items: stretch; gap: 0.5em; } .our-message .dm-message-container { flex-direction: row-reverse; } .dm-message-reactions { display: flex; padding: 0 4em; cursor: default; } .our-message .dm-message-reactions { flex-direction: row-reverse; } .dm-message-and-reacts-container p.posted-at { margin: 0 4.5em; } .dm-message-content-container { display: flex; flex-direction: column; align-items: flex-start; max-width: 80%; } .our-message .dm-message-content-container { align-items: flex-end; } .dm-message-content-container .tweet-preview { border-radius: 1em; border: 1px solid var(--color-outline-gray); max-width: 100%; } .dm-message-content-container .replying-to-container { background-color: #f0f0f0f0; border-radius: 1em 1em 1em 0em; padding: 0.5em 1.2em 2em 1.2em; margin: 0 0 -2em 0.2em; font-size: 0.9em; } .our-message .dm-message-content-container .replying-to-container { border-radius: 1em 1em 0em 1em; margin: 0 0.2em -2em; } .dm-message-content-container .replying-to-label { font-size: 0.8em; display: flex; gap: 0.2em; } .dm-message-content-container .replying-to-label img.svg-icon { width: 1em; } .dm-composer-container { padding-top: 0.5em; border-top: 1px solid var(--color-outline-gray); /* position: absolute; bottom: 1em; right: 0.5em; left: 0.5em;*/ } .dm-composer-container form { display: flex; } #composer { flex-grow: 1; border: 1px solid #ccc; font-family: inherit; font-size: inherit; padding: 1px 6px; max-height: 10em; overflow-y: auto; /* scrollbar only if needed */ }