refactor progress

This commit is contained in:
Hampus Kraft
2026-02-17 12:22:36 +00:00
parent cb31608523
commit d5abd1a7e4
8257 changed files with 1190207 additions and 761040 deletions

View File

@@ -42,7 +42,7 @@
@media (hover: hover) {
.deleteButton:hover {
background-color: var(--status-danger);
color: white;
color: var(--text-on-brand-primary);
}
}
@@ -57,7 +57,6 @@
border: 1px solid var(--background-modifier-accent);
background-color: var(--background-secondary);
padding: 0.75rem;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
.iconContainer {
@@ -114,8 +113,8 @@
flex-shrink: 0;
border-radius: 8px;
background-color: var(--brand-primary);
color: white;
transition: background-color 150ms ease;
color: var(--text-on-brand-primary);
transition: background-color 0.1s ease;
cursor: pointer;
}
@@ -148,3 +147,147 @@
width: 14px;
height: 14px;
}
.textualPreview {
display: flex;
flex-direction: column;
border-radius: var(--radius-md);
background-color: var(--background-secondary);
border: 1px solid var(--border-color);
overflow: hidden;
}
.previewContent {
position: relative;
background-color: var(--bg-code-block);
min-height: 5rem;
}
.previewContentInner {
display: flex;
flex-direction: column;
gap: 0.5rem;
padding: 0.75rem;
}
.previewContentLoading {
display: flex;
align-items: center;
justify-content: center;
min-height: 6rem;
color: var(--text-tertiary);
}
.codeBlock {
margin: 0;
padding: 0;
font-family: var(--font-mono);
font-size: 0.75rem;
line-height: 1rem;
white-space: pre;
color: var(--text-code);
overflow-x: auto;
scrollbar-width: thin;
}
.wrapMode {
white-space: pre-wrap !important;
word-break: break-word;
}
.previewTruncationNote {
color: var(--text-tertiary);
font-size: 0.75rem;
line-height: 1rem;
font-family: var(--font-mono);
}
.previewFooter {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0.5rem 0.75rem;
background-color: var(--background-secondary);
border-top: 1px solid var(--border-color);
}
.previewFooterLeft {
display: flex;
flex-direction: column;
gap: 0.15rem;
min-width: 0;
flex: 1;
}
.previewFilename {
font-size: 0.875rem;
font-weight: 500;
color: var(--text-primary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.previewFileSize {
font-size: 0.75rem;
color: var(--text-tertiary);
}
.previewControls {
display: inline-flex;
align-items: center;
gap: 0.25rem;
}
.previewControlButton {
border: none;
background: transparent;
color: var(--text-secondary);
width: 2rem;
height: 2rem;
border-radius: 4px;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition:
background-color 0.1s ease,
color 0.1s ease;
text-decoration: none;
}
@media (hover: hover) {
.previewControlButton:hover {
background-color: var(--background-modifier-hover);
color: var(--text-primary);
}
}
.previewError {
padding: 1rem;
display: flex;
align-items: center;
gap: 0.45rem;
color: var(--status-danger);
}
.previewLoadingState {
padding: 1rem;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
color: var(--text-tertiary);
}
.srOnly {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}

View File

@@ -0,0 +1,178 @@
/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
.gridItem {
position: relative;
background-color: var(--background-secondary);
border: none;
padding: 0;
margin: 0;
font: inherit;
color: inherit;
text-align: inherit;
line-height: inherit;
max-width: 100%;
width: 100%;
height: auto;
min-height: 1px;
min-width: 1px;
overflow: hidden;
border-radius: var(--media-border-radius);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.clickableButton {
cursor: pointer;
height: 100%;
width: 100%;
border: 0;
background-color: transparent;
padding: 0;
}
.mediaContainer {
position: relative;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.loadingOverlay {
position: relative;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.placeholderImage {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
display: block;
min-width: 100%;
min-height: 100%;
max-width: 100%;
}
.mediaImage {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
display: block;
min-width: 100%;
min-height: 100%;
max-width: 100%;
transition: opacity 0.2s;
opacity: 1;
}
.mediaImageHidden {
opacity: 0;
}
.mediaBlurred {
filter: blur(12px);
opacity: 0.15;
}
.nsfwOverlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--spoiler-overlay-color);
backdrop-filter: blur(12px);
z-index: 3;
padding: 0.5rem;
text-align: center;
}
.playButtonOverlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
pointer-events: none;
z-index: 2;
}
.playButton {
display: flex;
align-items: center;
justify-content: center;
width: 56px;
height: 56px;
border-radius: 50%;
background-color: rgba(0, 0, 0, 0.75);
}
.playButton svg {
color: var(--text-on-brand-primary);
}
.audioPlaceholder {
width: 100%;
height: 100%;
max-width: 100%;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, var(--background-tertiary) 0%, var(--background-secondary-alt) 100%);
overflow: hidden;
position: relative;
}
.audioPlaceholder svg {
width: 40%;
height: 40%;
max-width: 80px;
max-height: 80px;
opacity: 0.6;
color: var(--text-tertiary);
flex-shrink: 0;
}
.gifIndicator {
position: absolute;
top: 8px;
left: 8px;
z-index: 10;
border-radius: 4px;
background-color: rgba(0, 0, 0, 0.6);
padding: 4px 8px;
font-size: 0.875rem;
font-weight: 600;
color: var(--text-on-brand-primary);
line-height: 1;
}

View File

@@ -0,0 +1,191 @@
/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
.twoImageGrid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px;
width: 100%;
}
.threeImageGrid {
display: grid;
grid-template-columns: 2fr 1fr;
grid-template-rows: auto auto;
gap: 4px;
width: 100%;
}
.threeImageGrid > :first-child {
grid-row: 1 / 3;
}
.fourImageGrid {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: auto auto;
gap: 4px;
width: 100%;
}
.fiveImageGrid {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: auto auto;
gap: 4px;
width: 100%;
}
.fiveImageGrid > :nth-child(1) {
grid-column: 1 / 4;
grid-row: 1;
}
.fiveImageGrid > :nth-child(2) {
grid-column: 4 / 7;
grid-row: 1;
}
.fiveImageGrid > :nth-child(3) {
grid-column: 1 / 3;
grid-row: 2;
}
.fiveImageGrid > :nth-child(4) {
grid-column: 3 / 5;
grid-row: 2;
}
.fiveImageGrid > :nth-child(5) {
grid-column: 5 / 7;
grid-row: 2;
}
.sixImageGrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 4px;
width: 100%;
}
.sevenImageContainer {
display: flex;
flex-direction: column;
gap: 4px;
width: 100%;
}
.sevenHero {
display: grid;
width: 100%;
}
.sevenGrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 4px;
width: 100%;
}
.eightImageContainer {
display: flex;
flex-direction: column;
gap: 4px;
width: 100%;
}
.eightTopRow {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px;
width: 100%;
}
.eightBottomGrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 4px;
width: 100%;
}
.nineImageGrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 4px;
width: 100%;
}
.tenImageContainer {
display: flex;
flex-direction: column;
gap: 4px;
width: 100%;
}
.tenHero {
display: grid;
width: 100%;
}
.tenGrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 4px;
width: 100%;
}
.twoImageGrid,
.threeImageGrid,
.fourImageGrid,
.fiveImageGrid,
.sixImageGrid,
.sevenImageContainer,
.sevenHero,
.sevenGrid,
.eightImageContainer,
.eightTopRow,
.eightBottomGrid,
.nineImageGrid,
.tenImageContainer,
.tenHero,
.tenGrid {
max-width: 100%;
min-width: 0;
overflow: hidden;
}
@media (max-width: 640px) {
.twoImageGrid > *,
.threeImageGrid > *,
.fourImageGrid > *,
.fiveImageGrid > *,
.sixImageGrid > *,
.sevenGrid > *,
.eightTopRow > *,
.eightBottomGrid > *,
.nineImageGrid > *,
.tenGrid > * {
aspect-ratio: 1 / 1 !important;
}
}

View File

@@ -134,9 +134,9 @@
.oneByOneGrid {
width: 100%;
max-width: 550px;
max-height: 400px;
overflow: visible;
max-width: min(100%, var(--message-media-max-width, var(--attachment-media-max-width, 550px)));
max-height: var(--attachment-media-max-height, 400px);
overflow: hidden;
position: relative;
display: flex;
}
@@ -195,10 +195,10 @@
.mosaicContainerWrapper {
position: relative;
overflow: visible;
overflow: hidden;
display: block;
width: 100%;
max-width: 550px;
max-width: min(100%, var(--message-media-max-width, var(--attachment-media-max-width, 550px)));
}
.mosaicExpiryBadge {
@@ -325,7 +325,7 @@
}
.playButton svg {
color: white;
color: var(--text-on-brand-primary);
}
.audioPlaceholder {
@@ -362,7 +362,7 @@
}
.oneByOneGrid {
max-height: 300px;
max-height: min(var(--attachment-media-max-height, 400px), 300px);
max-width: 100%;
}
@@ -392,9 +392,10 @@
}
.mosaicContainer {
height: 100%;
max-width: 550px;
max-width: min(100%, var(--message-media-max-width, var(--attachment-media-max-width, 550px)));
width: 100%;
height: auto;
overflow: hidden;
}
.clickableButton {
@@ -415,7 +416,7 @@
padding: 4px 8px;
font-size: 0.875rem;
font-weight: 600;
color: white;
color: var(--text-on-brand-primary);
line-height: 1;
}

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
.relativeWrapper {
position: relative;
width: 100%;
max-width: min(100%, var(--message-media-max-width, var(--attachment-media-max-width, 550px)));
}
.singleMediaContainer {
position: relative;
width: 100%;
max-width: min(100%, var(--message-media-max-width, var(--attachment-media-max-width, 550px)));
max-height: var(--attachment-media-max-height, 400px);
display: flex;
flex-direction: column;
overflow: hidden;
}
.cropIndicator {
position: absolute;
top: 8px;
right: 8px;
padding: 4px 8px;
background: rgba(0, 0, 0, 0.7);
color: var(--text-on-brand-primary);
font-size: 0.75rem;
font-weight: 600;
border-radius: 4px;
display: flex;
align-items: center;
gap: 4px;
z-index: 10;
line-height: 1;
}
.cropIndicator svg {
flex-shrink: 0;
}
@media (max-width: 640px) {
.relativeWrapper,
.singleMediaContainer {
max-width: 100%;
max-height: min(var(--attachment-media-max-height, 400px), 300px);
}
}

View File

@@ -281,10 +281,11 @@
}
.searchResultItem {
--message-media-max-width: 100%;
position: relative;
margin-bottom: 12px;
cursor: pointer;
overflow: hidden;
overflow: visible;
user-select: none;
-webkit-user-select: none;
background-color: var(--background-modifier-hover);

View File

@@ -20,7 +20,7 @@
.markup {
font-size: inherit;
line-height: 1.5;
color: var(--text-chat);
color: inherit;
word-wrap: break-word;
overflow-wrap: break-word;
hyphens: none;
@@ -86,30 +86,30 @@
}
.markup h1 {
font-size: 1.75rem;
font-size: 1.375rem;
letter-spacing: -0.02em;
padding-bottom: 0.25rem;
border-bottom: 1px solid var(--border-color);
}
.markup h2 {
font-size: 1.5rem;
font-size: 1.25rem;
letter-spacing: -0.015em;
padding-bottom: 0.25rem;
border-bottom: 1px solid var(--border-color);
}
.markup h3 {
font-size: 1.25rem;
font-size: 1.125rem;
letter-spacing: -0.01em;
}
.markup h4 {
font-size: 1.125rem;
font-size: 1rem;
}
.markup h5 {
font-size: 1rem;
font-size: 0.9375rem;
}
.markup h6 {
@@ -137,9 +137,10 @@
.markup ul,
.markup ol {
margin: 0.25rem 0 0 0;
margin-block: 0.25rem 0;
margin-inline: 1rem 0;
padding: 0;
list-style: none;
list-style-position: outside;
}
.markup li {
@@ -150,32 +151,13 @@
margin-bottom: 0;
}
.markup ul > li {
position: relative;
padding-left: 1em;
}
.markup ul > li::before {
content: '•';
position: absolute;
left: 0;
font-weight: 900;
}
.markup ol {
counter-reset: list-counter;
list-style-type: decimal;
margin-inline-start: calc(0.4em + var(--totalCharacters, 1) * 0.6em);
}
.markup ol > li {
position: relative;
padding-left: 1.25em;
counter-increment: list-counter;
}
.markup ol > li::before {
content: counter(list-counter) '.';
position: absolute;
left: 0;
.markup ul {
list-style-type: disc;
}
.markup li > ul,
@@ -184,37 +166,20 @@
margin-bottom: 0;
}
.markup ul ul > li::before,
.markup ol ul > li::before {
content: '◦';
.markup ul ul {
list-style-type: circle;
}
.markup ul ul ul > li::before {
content: '▪';
.markup ul ul ul {
list-style-type: square;
}
.markup ol ol {
counter-reset: nested-counter;
}
.markup ol ol > li {
counter-increment: nested-counter;
}
.markup ol ol > li::before {
content: counter(nested-counter, lower-alpha) '.';
list-style-type: lower-alpha;
}
.markup ol ol ol {
counter-reset: deep-counter;
}
.markup ol ol ol > li {
counter-increment: deep-counter;
}
.markup ol ol ol > li::before {
content: counter(deep-counter, lower-roman) '.';
list-style-type: lower-roman;
}
.markup code.inline {
@@ -243,6 +208,26 @@
box-sizing: border-box;
border: 1px solid var(--border-color);
padding: 0.75rem;
margin-bottom: 0.75rem;
}
.markup .codeContainer:last-child {
margin-bottom: 0;
}
.markup .codeContainer:has(+ h1),
.markup .codeContainer:has(+ h2),
.markup .codeContainer:has(+ h3),
.markup .codeContainer:has(+ h4),
.markup .codeContainer:has(+ h5),
.markup .codeContainer:has(+ h6),
.markup .codeContainer:has(+ .blockquoteContainer),
.markup .codeContainer:has(+ .alert),
.markup .codeContainer:has(+ .tableContainer),
.markup .codeContainer:has(+ .latexCodeBlock),
.markup .codeContainer:has(+ ul),
.markup .codeContainer:has(+ ol) {
margin-bottom: 0;
}
.markup pre {
@@ -493,8 +478,8 @@
}
.markup .mention {
border-radius: var(--radius-md);
padding: 0 0.25rem;
border-radius: var(--radius-sm);
padding: 0 0.2rem;
font-weight: 500;
unicode-bidi: plaintext;
color: var(--markup-mention-text);
@@ -504,7 +489,7 @@
background-color var(--transition-fast),
color var(--transition-fast),
border-color var(--transition-fast);
display: inline;
display: inline-flex;
align-items: center;
white-space: nowrap;
vertical-align: baseline;
@@ -512,9 +497,9 @@
}
.markup .mention svg {
width: 1em;
height: 1em;
margin-right: 0.1em;
width: 0.95em;
height: 0.95em;
margin-right: 0.08em;
margin-top: -0.1em;
flex-shrink: 0;
display: inline-block;
@@ -523,16 +508,27 @@
.markup .mention.interactive {
cursor: pointer;
display: inline;
display: inline-flex;
align-items: center;
}
.markup .mention.interactive:hover,
.markup .mention.interactive:focus-visible {
.markup .mention.interactive:hover {
background-color: var(--markup-interactive-hover-fill);
color: var(--markup-interactive-hover-text);
}
@supports (background-color: color-mix(in srgb, #000 50%, transparent)) {
.markup .mention {
background-color: color-mix(in srgb, var(--markup-mention-fill) 70%, transparent);
border-color: color-mix(in srgb, var(--markup-mention-border) 65%, transparent);
}
.markup .mention.interactive:hover {
background-color: color-mix(in srgb, var(--markup-interactive-hover-fill) 70%, transparent);
border-color: color-mix(in srgb, var(--markup-interactive-hover-fill) 60%, transparent);
}
}
.markup .timestamp {
background-color: var(--background-modifier-hover);
border-radius: 3px;
@@ -586,11 +582,6 @@
max-width: 100%;
}
.markup .spoiler:focus-visible {
outline: 2px solid var(--text-link);
outline-offset: 2px;
}
.markup .blockSpoiler {
padding: 0.5rem;
display: block;
@@ -787,7 +778,7 @@
background: transparent;
color: var(--text-code);
overflow-x: auto;
padding: 0;
padding: 0.25rem 0;
}
:global(.theme-light) .markup .hljs {
@@ -836,23 +827,19 @@
@media (max-width: 768px) {
.markup h1 {
font-size: 1.5rem;
font-size: 1.25rem;
}
.markup h2 {
font-size: 1.35rem;
font-size: 1.125rem;
}
.markup h3 {
font-size: 1.2rem;
font-size: 1.0625rem;
}
.markup h4 {
font-size: 1.05rem;
}
.markup pre {
padding: 0.25rem;
font-size: 1rem;
}
.markup .tableContainer {
@@ -869,6 +856,10 @@
.markup .alert {
padding: 0.375rem 0.5rem 0.375rem calc(0.5rem + 3px);
}
.markup .codeContainer {
max-width: 100%;
}
}
@media (max-width: 640px) {

View File

@@ -30,6 +30,6 @@
}
.channelIcon {
height: 1rem;
width: 1rem;
height: 0.9rem;
width: 0.9rem;
}

View File

@@ -23,7 +23,7 @@
--message-gutter: 16px;
--message-spacing-y: 0.125rem;
--message-line-height: 1.375rem;
--message-timestamp-color: var(--text-tertiary);
--message-timestamp-color: var(--text-primary-muted);
--message-timestamp-font-size: 0.75rem;
--message-timestamp-compact-font-size: 0.6875rem;
--message-timestamp-compact-height: 1.25rem;
@@ -78,48 +78,56 @@
--message-unknown-warning-color: #ff9933;
--message-transition-highlight: 200ms ease-in-out;
--message-avatar-align-offset: clamp(
0px,
calc((var(--message-line-height) * 2 - var(--message-avatar-size)) / 2),
0.5rem
);
}
.message {
text-align: left;
display: grid;
grid-template-columns: var(--chat-horizontal-padding, var(--message-gutter)) var(--message-avatar-size) var(
--message-gutter
) minmax(0, 1fr);
grid-template-rows: auto auto auto;
grid-template-areas:
'. . . reply'
'gutter-left avatar gutter-right content'
'. . . container';
padding-top: var(--message-spacing-y);
padding-bottom: var(--message-spacing-y);
padding-right: var(--chat-horizontal-padding, var(--message-gutter));
padding-left: 0;
position: relative;
user-select: text;
-webkit-user-select: text;
touch-action: pan-y;
word-break: break-word;
-webkit-tap-highlight-color: transparent;
margin-left: calc(-1 * var(--message-mobile-margin));
margin-right: calc(-1 * var(--message-mobile-margin));
display: grid;
grid-template-columns:
var(--chat-horizontal-padding, var(--message-gutter))
var(--message-avatar-size)
var(--message-gutter)
minmax(0, 1fr);
grid-template-rows: auto auto auto;
grid-template-areas:
'. . . reply'
'gutter-left avatar gutter-right content'
'. . . container';
padding-block: var(--message-spacing-y);
padding-inline-end: var(--chat-horizontal-padding, var(--message-gutter));
padding-inline-start: 0;
margin-inline: calc(-1 * var(--message-mobile-margin));
}
.messagePreviewSpacing {
margin-top: var(--message-group-spacing, 0);
}
.messagePreview {
--message-media-max-width: 100%;
}
@media (min-width: 768px) {
.message {
margin-left: calc(-1 * var(--chat-horizontal-padding, var(--message-gutter)));
margin-right: calc(-1 * var(--chat-horizontal-padding, var(--message-gutter)));
padding-right: calc(var(--chat-horizontal-padding, var(--message-gutter)) + var(--message-action-bar-offset));
margin-inline: calc(-1 * var(--chat-horizontal-padding, var(--message-gutter)));
padding-inline-end: calc(var(--chat-horizontal-padding, var(--message-gutter)) + var(--message-action-bar-offset));
}
.messagePreview {
margin-left: 0;
margin-right: 0;
padding-right: var(--chat-horizontal-padding, var(--message-gutter));
margin-inline: 0;
padding-inline-end: var(--chat-horizontal-padding, var(--message-gutter));
}
}
@@ -183,28 +191,32 @@
'. . . reply'
'gutter-left timestamp gutter-right content'
'. . . container';
grid-template-columns:
var(--chat-horizontal-padding, var(--message-gutter))
var(--message-avatar-size)
var(--message-gutter)
minmax(0, 1fr);
}
.messageCompact {
display: block;
position: relative;
user-select: text;
-webkit-user-select: text;
word-break: break-word;
text-align: left;
-webkit-tap-highlight-color: transparent;
padding-top: var(--message-spacing-y);
padding-bottom: var(--message-spacing-y);
padding-left: calc(var(--chat-horizontal-padding, var(--message-gutter)) + var(--message-compact-indent));
padding-right: var(--chat-horizontal-padding, var(--message-gutter));
display: block;
position: relative;
padding-block: var(--message-spacing-y);
padding-inline-start: calc(var(--chat-horizontal-padding, var(--message-gutter)) + var(--message-compact-indent));
padding-inline-end: var(--chat-horizontal-padding, var(--message-gutter));
text-indent: calc(-1 * var(--message-compact-indent));
margin-left: calc(-1 * var(--chat-horizontal-padding, var(--message-gutter)));
margin-right: calc(-1 * var(--chat-horizontal-padding, var(--message-gutter)));
margin-inline: calc(-1 * var(--chat-horizontal-padding, var(--message-gutter)));
}
@media (min-width: 768px) {
.messageCompact {
padding-right: calc(var(--chat-horizontal-padding, var(--message-gutter)) + var(--message-action-bar-offset));
padding-inline-end: calc(var(--chat-horizontal-padding, var(--message-gutter)) + var(--message-action-bar-offset));
}
}
@@ -229,9 +241,18 @@
opacity: var(--message-sending-link-opacity);
}
.messageFailed {
color: var(--status-danger);
}
.messageFailed,
.messageFailed * {
opacity: var(--message-failed-opacity);
opacity: 1;
}
.messageFailed .link,
.messageFailed a {
color: var(--status-danger) !important;
}
.mobileFailedIndicator {
@@ -255,9 +276,8 @@
content: '';
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
inset-block: 0;
inset-inline-start: 0;
width: var(--message-highlight-bar-width);
background-color: transparent;
pointer-events: none;
@@ -296,27 +316,45 @@
cursor: pointer;
position: relative;
z-index: 1;
margin-top: var(--message-highlight-bar-width);
align-self: start;
margin-block-start: calc(var(--message-spacing-y) + var(--message-avatar-align-offset));
transform: none;
inline-size: var(--message-avatar-size);
block-size: var(--message-avatar-size);
}
.messageAvatar:active {
transform: translateY(1px);
.messageNoText .messageAvatar,
.messageNoText.messageGrouped .messageAvatar {
margin-block-start: var(--message-spacing-y);
}
.messageContent {
grid-area: content;
min-width: 0;
overflow-wrap: break-word;
align-self: start;
display: flex;
flex-direction: column;
min-inline-size: 0;
}
.messageAuthorInfo {
margin-top: 0;
margin-bottom: 0;
margin: 0;
min-height: var(--message-line-height);
overflow: hidden;
white-space: break-spaces;
color: var(--text-chat-muted);
line-height: var(--message-line-height);
color: var(--text-chat-muted);
font-size: 1rem;
display: block;
min-inline-size: 0;
}
.messageAuthorRow {
display: flex;
align-items: baseline;
max-inline-size: 100%;
white-space: nowrap;
line-height: var(--message-line-height);
min-inline-size: 0;
}
.messageNoText {
@@ -334,26 +372,49 @@
}
.messageUsername {
display: inline;
display: inline-block;
position: relative;
cursor: pointer;
font-weight: 500;
color: var(--text-primary);
line-height: var(--message-line-height);
max-height: var(--message-line-height);
vertical-align: baseline;
min-inline-size: 0;
max-inline-size: min(32ch, 100%);
overflow: hidden;
vertical-align: bottom;
text-overflow: ellipsis;
white-space: nowrap;
}
.contextMenuUnderline {
text-decoration: underline;
}
.messageAuthorPart {
display: inline-flex;
align-items: center;
vertical-align: baseline;
line-height: var(--message-line-height);
min-inline-size: 0;
max-inline-size: 100%;
flex: 0 1 auto;
}
.messageAuthorPart > * {
vertical-align: baseline;
}
.messageTimeoutIndicator {
display: inline-flex;
align-items: center;
gap: 0.25rem;
margin-right: 0.35rem;
vertical-align: middle;
align-self: center;
color: var(--text-danger);
}
.messageTimeoutIndicator svg {
display: block;
}
@media (hover: hover) {
.messageUsername:hover {
text-decoration: underline;
@@ -362,7 +423,6 @@
.messageTimestamp,
.messageTimestampCompact {
display: inline-block;
cursor: default;
vertical-align: baseline;
font-weight: 400;
@@ -371,10 +431,47 @@
}
.messageTimestamp {
margin-left: 0;
display: inline;
font-size: var(--message-timestamp-font-size);
position: relative;
top: -0.05em;
line-height: var(--message-line-height);
opacity: 0.6;
margin-inline-start: 0.15rem;
white-space: nowrap;
}
.copyOnly {
display: inline-block;
width: 0;
height: 0;
overflow: visible;
opacity: 0;
pointer-events: none;
vertical-align: middle;
user-select: text;
-webkit-user-select: text;
white-space: pre;
}
.textSeparator {
display: inline;
vertical-align: baseline;
font-size: 0;
line-height: 0;
margin: 0 0.2rem;
padding: 0;
border: none;
}
.authorDashSeparator {
display: inline;
vertical-align: baseline;
color: transparent;
font-size: 0;
line-height: 0;
white-space: nowrap;
margin: 0 0.15rem;
padding: 0;
border: none;
}
.messageTimestampHover,
@@ -398,6 +495,7 @@
white-space: nowrap;
opacity: 0;
pointer-events: none;
transform: translateX(8px);
}
.message:hover .messageTimestampHover {
@@ -414,46 +512,46 @@
.messageAuthorInfoCompact {
position: relative;
display: inline-flex;
align-items: baseline;
display: inline;
min-height: var(--message-line-height);
overflow: hidden;
color: var(--text-chat-muted);
line-height: var(--message-line-height);
white-space: nowrap;
text-indent: 0;
vertical-align: baseline;
margin-right: var(--message-compact-username-gap);
margin: 0;
margin-inline-end: var(--message-compact-username-gap);
}
.messageTimestampCompact {
margin-right: var(--message-compact-gap);
margin-inline-end: var(--message-compact-gap);
width: var(--message-compact-timestamp-width);
height: var(--message-timestamp-compact-height);
font-size: var(--message-timestamp-compact-font-size);
text-align: right;
display: inline-block;
vertical-align: middle;
line-height: var(--message-line-height);
flex-shrink: 0;
}
.messageAvatarCompact {
margin-right: var(--message-compact-gap);
display: inline-flex;
align-self: center;
margin-inline-end: var(--message-compact-gap);
display: inline-block;
vertical-align: middle;
cursor: pointer;
flex-shrink: 0;
}
.messageAvatarCompact:active {
transform: translateY(1px);
}
.messageTimestampCompactHover {
margin-right: var(--message-compact-gap);
display: inline-block;
margin-inline-end: var(--message-compact-gap);
width: var(--message-compact-timestamp-width);
height: var(--message-timestamp-compact-height);
font-size: var(--message-timestamp-compact-font-size);
display: inline-block;
vertical-align: middle;
line-height: var(--message-line-height);
cursor: default;
vertical-align: baseline;
text-align: right;
flex-shrink: 0;
opacity: 0;
@@ -476,10 +574,11 @@
position: relative;
user-select: text;
-webkit-user-select: text;
overflow: visible;
overflow: hidden;
line-height: var(--message-line-height);
white-space: break-spaces;
word-break: break-word;
min-inline-size: 0;
}
.message .buttons,
@@ -530,8 +629,8 @@
.container {
grid-area: container;
display: grid;
height: fit-content;
display: grid;
grid-auto-flow: row;
row-gap: var(--message-container-gap);
grid-template-columns: repeat(auto-fill, minmax(100%, 1fr));
@@ -539,8 +638,7 @@
min-height: 0;
min-width: 0;
max-width: 100%;
padding-top: var(--message-container-padding-y);
padding-bottom: var(--message-container-padding-y);
padding-block: var(--message-container-padding-y);
position: relative;
}
@@ -554,7 +652,7 @@
}
.messageNoText .container {
padding-top: 0;
padding-block-start: 0;
display: flex;
flex-direction: column;
gap: var(--message-container-padding-y);
@@ -590,9 +688,9 @@
bottom: var(--spine-gap);
right: 100%;
left: calc(-1 * (0.5 * var(--avatar-size) + var(--gutter)));
margin-right: var(--reply-spacing);
margin-top: calc(-0.5 * var(--spine-width));
margin-left: calc(-0.5 * var(--spine-width));
margin-inline-end: var(--reply-spacing);
margin-block-start: calc(-0.5 * var(--spine-width));
margin-inline-start: calc(-0.5 * var(--spine-width));
border-color: var(--text-chat-muted);
border-width: var(--spine-width) 0 0 var(--spine-width);
border-style: solid;
@@ -601,8 +699,8 @@
.repliedMessageCompact {
text-indent: 0;
padding-left: 0;
margin-left: 0;
padding-inline-start: 0;
margin-inline-start: 0;
position: relative;
}
@@ -616,10 +714,10 @@
box-sizing: border-box;
top: 50%;
bottom: calc(-1 * (var(--reply-spacing) + var(--message-line-height) * 0.25));
left: -1.5rem;
inset-inline-start: -1.5rem;
right: calc(100% - var(--avatar-size) / 2 + var(--spine-gap) + var(--message-reply-spine-width));
margin-top: calc(-0.5 * var(--spine-width));
margin-left: calc(-0.5 * var(--spine-width));
margin-block-start: calc(-0.5 * var(--spine-width));
margin-inline-start: calc(-0.5 * var(--spine-width));
border-color: var(--text-chat-muted);
border-width: var(--spine-width) 0 0 var(--spine-width);
border-style: solid;
@@ -636,8 +734,7 @@
box-sizing: border-box;
line-height: 1.5;
min-height: 1.5rem;
padding-top: 0.125rem;
padding-bottom: 0.125rem;
padding-block: 0.125rem;
overflow-x: hidden;
overflow-y: visible;
}
@@ -653,17 +750,15 @@
}
.repliedAvatar {
margin-right: var(--message-container-gap);
margin-inline-end: var(--message-container-gap);
flex-shrink: 0;
cursor: pointer;
}
.repliedAvatar:active {
transform: translateY(1px);
user-select: none;
-webkit-user-select: none;
}
.repliedIconContainer {
margin-right: var(--message-container-gap);
margin-inline-end: var(--message-container-gap);
display: flex;
height: var(--message-icon-size-md);
width: var(--message-icon-size-md);
@@ -682,7 +777,7 @@
.repliedUsername {
position: relative;
margin-right: calc(var(--message-compact-username-gap) - 2px);
margin-inline-end: calc(var(--message-compact-username-gap) - 2px);
display: inline;
flex-shrink: 0;
cursor: pointer;
@@ -704,7 +799,7 @@
}
.repliedItalic {
padding-right: var(--message-reply-spine-width);
padding-inline-end: var(--message-reply-spine-width);
font-style: italic;
}
@@ -738,8 +833,6 @@
-webkit-user-select: none;
}
.repliedTextContent pre,
.repliedTextContent code,
.repliedTextContent h1,
.repliedTextContent h2,
.repliedTextContent h3,
@@ -765,20 +858,37 @@
overflow: visible !important;
}
.repliedTextContent pre,
.repliedTextContent code {
display: inline !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
background: none !important;
font-weight: inherit !important;
line-height: inherit !important;
white-space: nowrap !important;
overflow: visible !important;
}
.repliedTextContent pre::before,
.repliedTextContent pre::after {
content: none !important;
display: none !important;
}
.systemMessageFollowsSystem {
margin-block-start: calc(var(--message-group-spacing, 16px) / 4);
}
.systemMessageIconWrapper {
grid-area: avatar;
display: flex;
align-self: flex-start;
align-items: flex-start;
justify-content: center;
padding-top: 0.15em;
padding-left: max(
padding-block-start: 0.15em;
padding-inline-start: max(
0px,
calc(
(
@@ -791,10 +901,12 @@
2
)
);
user-select: none;
-webkit-user-select: none;
}
.systemMessageIconCompact {
margin-right: var(--message-container-gap);
margin-inline-end: var(--message-container-gap);
display: inline-flex;
align-items: center;
justify-content: center;
@@ -802,6 +914,8 @@
width: var(--system-message-icon-size);
flex-shrink: 0;
vertical-align: text-bottom;
user-select: none;
-webkit-user-select: none;
}
.systemMessageContent {
@@ -819,7 +933,10 @@
}
.systemMessageTimestamp {
margin-left: 0.25rem;
margin-inline-start: 0.25rem;
position: relative;
top: -2px;
color: var(--message-timestamp-color);
}
.systemMessageContentWrapper {
@@ -835,15 +952,15 @@
.systemMessageCompactContent {
--system-message-compact-indent: calc(var(--message-compact-indent) + var(--system-message-icon-size) + 0.5rem);
display: block;
padding-left: var(--system-message-compact-indent);
margin-left: calc(-1 * var(--message-compact-indent));
padding-inline-start: var(--system-message-compact-indent);
margin-inline-start: calc(-1 * var(--message-compact-indent));
text-indent: calc(-1 * var(--system-message-compact-indent));
color: var(--text-tertiary);
line-height: var(--message-line-height);
}
.systemMessageCompactContent .messageTimestampCompact {
margin-right: var(--message-compact-gap);
margin-inline-end: var(--message-compact-gap);
display: inline-block;
width: var(--message-compact-timestamp-width);
vertical-align: baseline;
@@ -851,7 +968,7 @@
}
.systemMessageContent .container {
margin-left: var(--message-compact-container-margin);
margin-inline-start: var(--message-compact-container-margin);
}
.systemMessageCompactContent .container {
@@ -902,33 +1019,25 @@
white-space: nowrap;
}
.authorContainer {
display: inline-flex;
align-items: center;
gap: 0.15rem;
margin-right: 0.4rem;
}
.messageAuthorInfoCompact .authorContainer {
margin-right: 0;
}
.messageAuthorInfoCompact .messageUsername {
margin-right: 0;
margin-inline-end: 0;
}
.userTagOffset {
position: relative;
margin-left: 0.25rem;
margin-inline-start: 0.35rem;
vertical-align: middle;
display: inline-flex;
}
.userTagCompact {
margin-right: var(--message-compact-gap);
margin-inline-end: var(--message-compact-gap);
flex-shrink: 0;
vertical-align: middle;
display: inline-flex;
}
.editedTimestamp {
margin-left: 1px;
margin-inline-start: 1px;
display: inline-block;
height: var(--message-timestamp-compact-height);
cursor: default;
@@ -979,7 +1088,7 @@
pointer-events: auto;
grid-column: 1 / -1;
justify-self: flex-start;
margin-left: 0;
margin-inline-start: 0;
transform: translateY(calc(50% + var(--typing-floating-offset, 0px)));
}
@@ -1000,11 +1109,11 @@
.typingAvatarContainer {
display: flex;
align-items: center;
margin-right: var(--message-typing-avatar-margin);
margin-inline-end: var(--message-typing-avatar-margin);
}
.typingText {
margin-left: var(--message-typing-avatar-margin);
margin-inline-start: var(--message-typing-avatar-margin);
min-width: 0;
flex: 0 1 auto;
overflow: hidden;
@@ -1015,6 +1124,7 @@
.compactContentWrapper {
line-height: var(--message-line-height);
overflow: hidden;
}
.compactInlineContent {
@@ -1027,24 +1137,22 @@
}
.compactInlineContent * {
/* messageCompact uses negative text-indent for the author line;
block containers inside the body must not inherit it */
text-indent: 0;
}
.compactInlineContent > div {
display: block;
margin-left: 0;
margin-inline-start: 0;
}
.compactInlineContent :global(ul),
.compactInlineContent :global(ol) {
margin-left: var(--message-compact-container-margin);
margin-inline-start: var(--message-compact-container-margin);
}
.compactInlineContent :global(li) > :global(ul),
.compactInlineContent :global(li) > :global(ol) {
margin-left: 0;
margin-inline-start: 0;
}
.compactInlineContent :global(h1),
@@ -1064,32 +1172,30 @@
:global([class*='alert']:not([class*='alertTitle']):not([class*='alertContent']):not([class*='alertIcon'])),
.compactInlineContent :global([class*='blockSpoilerWrapper']) {
display: block;
margin-left: var(--message-compact-container-margin);
margin-inline-start: var(--message-compact-container-margin);
text-indent: 0;
}
.compactInlineContent :global(small:not(.inlineFormat)) {
display: block;
margin-left: var(--message-compact-container-margin);
margin-inline-start: var(--message-compact-container-margin);
text-indent: 0;
}
.compactInlineContent :global([class*='blockquoteContainer']) {
margin-left: var(--message-compact-container-margin);
margin-inline-start: var(--message-compact-container-margin);
text-indent: 0;
gap: 0.25rem;
}
.compactInlineContent :global([class*='blockquoteDivider']) {
margin-right: 0.35rem;
margin-inline-end: 0.35rem;
}
.compactInlineContent
:global([class*='alert']:not([class*='alertTitle']):not([class*='alertContent']):not([class*='alertIcon'])) {
padding-left: 0.75rem;
padding-right: 0.75rem;
padding-top: 0.35rem;
padding-bottom: 0.35rem;
padding-inline: 0.75rem;
padding-block: 0.35rem;
}
.compactInlineContent :global(.blockquoteContent) {
@@ -1101,7 +1207,7 @@
}
.compactInlineContent :global(.blockquoteContent) :global(p) {
margin-left: 0;
margin-inline-start: 0;
}
.compactInlineContent
@@ -1128,26 +1234,30 @@
)
)
~ * {
margin-left: var(--message-compact-container-margin);
margin-inline-start: var(--message-compact-container-margin);
}
.messageCompact .container {
text-indent: 0;
margin-left: var(--message-compact-container-margin);
margin-inline-start: var(--message-compact-container-margin);
}
.messageCompact .compactContentWrapper:not(:has(.compactInlineContent)) + .container {
padding-top: 0;
padding-block-start: 0;
}
.messageCompact .systemMessageCompactContent .container {
margin-left: calc(var(--message-compact-container-margin) - var(--system-message-icon-size) - 0.5rem);
margin-inline-start: calc(var(--message-compact-container-margin) - var(--system-message-icon-size) - 0.5rem);
}
.contextMenuActive {
background-color: var(--background-modifier-hover) !important;
}
:global(html.reduced-motion) .contextMenuActive {
background-color: transparent !important;
}
.contextMenuActive .buttons {
opacity: 1 !important;
pointer-events: auto !important;
@@ -1164,6 +1274,10 @@
}
.contextMenuActive.messageMentioned {
background-color: var(--message-mention-bg-hover) !important;
}
:global(html.reduced-motion) .contextMenuActive.messageMentioned {
background-color: var(--message-mention-bg) !important;
}
@@ -1172,6 +1286,11 @@
background-color: var(--message-reply-bg) !important;
}
:global(html.reduced-motion) .contextMenuActive.messageReplying,
:global(html.reduced-motion) .contextMenuActive.messageHighlight {
background-color: var(--message-reply-bg) !important;
}
.keyboardFocused {
background-color: var(--background-modifier-hover);
}
@@ -1225,7 +1344,7 @@
display: flex;
align-items: center;
gap: var(--message-container-gap);
padding: var(--message-container-gap) 0;
padding-block: var(--message-container-gap);
color: var(--text-tertiary);
font-size: var(--message-timestamp-font-size);
}
@@ -1250,12 +1369,11 @@
}
.silentMessageIcon {
margin-left: 0.25rem;
margin-inline-start: 0.25rem;
display: inline-block;
vertical-align: middle;
color: var(--text-chat-muted);
height: 14px;
width: 14px;
position: relative;
top: -1px;
align-self: center;
}

View File

@@ -33,18 +33,9 @@ html,
line-height: 1.5;
-webkit-text-size-adjust: 100%;
tab-size: 4;
font-family: --theme(
--default-font-family,
ui-sans-serif,
system-ui,
sans-serif,
'Apple Color Emoji',
'Segoe UI Emoji',
'Segoe UI Symbol',
'Noto Color Emoji'
);
font-feature-settings: --theme(--default-font-feature-settings, normal);
font-variation-settings: --theme(--default-font-variation-settings, normal);
font-family: var(--font-sans);
font-feature-settings: normal;
font-variation-settings: normal;
-webkit-tap-highlight-color: transparent;
}
@@ -69,34 +60,13 @@ h6 {
font-weight: inherit;
}
a {
color: inherit;
-webkit-text-decoration: inherit;
text-decoration: inherit;
}
b,
strong {
font-weight: bolder;
}
code,
kbd,
samp,
pre {
font-family: --theme(
--default-mono-font-family,
ui-monospace,
SFMono-Regular,
Menlo,
Monaco,
Consolas,
'Liberation Mono',
'Courier New',
monospace
);
font-feature-settings: --theme(--default-mono-font-feature-settings, normal);
font-variation-settings: --theme(--default-mono-font-variation-settings, normal);
font-family: var(--font-mono);
font-feature-settings: normal;
font-variation-settings: normal;
font-size: 1em;
}
@@ -127,7 +97,7 @@ table {
}
:-moz-focusring {
outline: auto;
outline: none;
}
progress {
@@ -157,11 +127,15 @@ object {
}
img,
video {
video:not([data-embed-media]) {
max-width: 100%;
height: auto;
}
img {
-webkit-touch-callout: none;
}
button,
input,
select,