diff --git a/src/assets/styles/DiscordLogs.css b/src/assets/styles/DiscordLogs.css
new file mode 100644
index 0000000..6b6d753
--- /dev/null
+++ b/src/assets/styles/DiscordLogs.css
@@ -0,0 +1,2068 @@
+/* Discord Logs Archive Styles */
+
+.discord-logs-container {
+ width: 100%;
+ max-width: 100%;
+}
+
+/* Main layout: sidebar + content side by side */
+.discord-main-layout {
+ display: flex;
+ gap: 1.5rem;
+ min-height: 500px;
+}
+
+/* Content area (messages) */
+.discord-content-area {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+/* Server/Channel Header */
+.discord-header {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 1rem 1.25rem;
+ background: linear-gradient(135deg, rgba(88, 101, 242, 0.12) 0%, rgba(88, 101, 242, 0.04) 100%);
+ border-radius: 12px;
+ margin-bottom: 1.5rem;
+ border: 1px solid rgba(88, 101, 242, 0.2);
+}
+
+[data-theme="dark"] .discord-header {
+ background: linear-gradient(135deg, rgba(88, 101, 242, 0.15) 0%, rgba(88, 101, 242, 0.05) 100%);
+ border-color: rgba(88, 101, 242, 0.25);
+}
+
+.discord-server-icon {
+ width: 48px;
+ height: 48px;
+ border-radius: 16px;
+ object-fit: cover;
+ flex-shrink: 0;
+}
+
+.discord-header-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.discord-server-name {
+ font-size: 1.125rem;
+ font-weight: 600;
+ color: #1a1a1a;
+ margin: 0;
+ line-height: 1.3;
+}
+
+[data-theme="dark"] .discord-server-name {
+ color: #fff;
+}
+
+.discord-channel-name {
+ display: flex;
+ align-items: center;
+ gap: 0.35rem;
+ font-size: 0.9rem;
+ color: #5c5f66;
+ margin-top: 0.15rem;
+ flex: 1;
+ min-width: 0;
+}
+
+[data-theme="dark"] .discord-channel-name {
+ color: #b5bac1;
+}
+
+.discord-channel-name svg {
+ width: 18px;
+ height: 18px;
+ opacity: 0.7;
+ flex-shrink: 0;
+}
+
+.discord-topic-divider {
+ margin: 0 0.5rem;
+ color: #80848e;
+ opacity: 0.5;
+}
+
+.discord-channel-topic {
+ font-size: 0.8rem;
+ color: #80848e;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ flex: 1;
+ min-width: 0;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.discord-channel-topic:hover {
+ color: #5c5e66;
+}
+
+.discord-channel-topic.expanded {
+ white-space: normal;
+ overflow: visible;
+ text-overflow: unset;
+ line-height: 1.4;
+}
+
+[data-theme="dark"] .discord-channel-topic {
+ color: #949ba4;
+}
+
+[data-theme="dark"] .discord-channel-topic:hover {
+ color: #b5bac1;
+}
+
+.discord-message-count {
+ font-size: 0.75rem;
+ color: #80848e;
+ background: rgba(0, 0, 0, 0.06);
+ padding: 0.25rem 0.6rem;
+ border-radius: 999px;
+ white-space: nowrap;
+ flex-shrink: 0;
+}
+
+[data-theme="dark"] .discord-message-count {
+ background: rgba(255, 255, 255, 0.08);
+ color: #949ba4;
+}
+
+/* Channel Selector */
+.discord-channel-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.discord-channel-btn {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ padding: 0.5rem 0.85rem;
+ background: rgba(0, 0, 0, 0.04);
+ border: 1px solid rgba(0, 0, 0, 0.08);
+ border-radius: 8px;
+ font-size: 0.875rem;
+ color: #4f545c;
+ cursor: pointer;
+ transition: all 0.15s ease;
+}
+
+[data-theme="dark"] .discord-channel-btn {
+ background: rgba(255, 255, 255, 0.04);
+ border-color: rgba(255, 255, 255, 0.08);
+ color: #b5bac1;
+}
+
+.discord-channel-btn:hover {
+ background: rgba(88, 101, 242, 0.1);
+ border-color: rgba(88, 101, 242, 0.3);
+ color: #5865f2;
+}
+
+.discord-channel-btn.active {
+ background: rgba(88, 101, 242, 0.15);
+ border-color: rgba(88, 101, 242, 0.4);
+ color: #5865f2;
+}
+
+[data-theme="dark"] .discord-channel-btn:hover,
+[data-theme="dark"] .discord-channel-btn.active {
+ background: rgba(88, 101, 242, 0.2);
+ border-color: rgba(88, 101, 242, 0.4);
+ color: #8b9dff;
+}
+
+.discord-channel-btn svg {
+ width: 16px;
+ height: 16px;
+ opacity: 0.7;
+ flex-shrink: 0;
+}
+
+.discord-channel-btn span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* Messages Container */
+.discord-messages {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ flex: 1;
+ overflow-y: auto;
+ overscroll-behavior: contain;
+ max-height: calc(100vh - 300px);
+ min-height: 400px;
+}
+
+/* Message Group (same author within time window) */
+.discord-message-group {
+ padding: 0.5rem 0;
+}
+
+.discord-message-group:hover {
+ background: rgba(0, 0, 0, 0.02);
+}
+
+[data-theme="dark"] .discord-message-group:hover {
+ background: rgba(255, 255, 255, 0.02);
+}
+
+/* Single Message */
+.discord-message {
+ display: flex;
+ gap: 1rem;
+ padding: 0.125rem 0.5rem;
+ position: relative;
+ transition: background-color 0.3s ease;
+}
+
+/* Message highlight for deep-linking */
+.discord-message-highlight {
+ background-color: rgba(88, 101, 242, 0.25) !important;
+ box-shadow:
+ inset 4px 0 0 0 #5865f2,
+ 0 0 20px rgba(88, 101, 242, 0.3);
+ animation: message-highlight-pulse 0.5s ease-in-out 3, message-highlight-fade 3s ease-out 1.5s forwards;
+ border-radius: 4px;
+ position: relative;
+}
+
+@keyframes message-highlight-pulse {
+ 0%, 100% {
+ background-color: rgba(88, 101, 242, 0.25);
+ box-shadow:
+ inset 4px 0 0 0 #5865f2,
+ 0 0 20px rgba(88, 101, 242, 0.3);
+ }
+ 50% {
+ background-color: rgba(88, 101, 242, 0.4);
+ box-shadow:
+ inset 4px 0 0 0 #5865f2,
+ 0 0 30px rgba(88, 101, 242, 0.5);
+ }
+}
+
+@keyframes message-highlight-fade {
+ 0% {
+ background-color: rgba(88, 101, 242, 0.25);
+ box-shadow:
+ inset 4px 0 0 0 #5865f2,
+ 0 0 20px rgba(88, 101, 242, 0.3);
+ }
+ 100% {
+ background-color: transparent;
+ box-shadow:
+ inset 4px 0 0 0 transparent,
+ 0 0 0 transparent;
+ }
+}
+
+[data-theme="dark"] .discord-message-highlight {
+ background-color: rgba(88, 101, 242, 0.3) !important;
+ box-shadow:
+ inset 4px 0 0 0 #5865f2,
+ 0 0 25px rgba(88, 101, 242, 0.4);
+ animation: message-highlight-pulse-dark 0.5s ease-in-out 3, message-highlight-fade-dark 3s ease-out 1.5s forwards;
+}
+
+@keyframes message-highlight-pulse-dark {
+ 0%, 100% {
+ background-color: rgba(88, 101, 242, 0.3);
+ box-shadow:
+ inset 4px 0 0 0 #5865f2,
+ 0 0 25px rgba(88, 101, 242, 0.4);
+ }
+ 50% {
+ background-color: rgba(88, 101, 242, 0.5);
+ box-shadow:
+ inset 4px 0 0 0 #7289da,
+ 0 0 40px rgba(88, 101, 242, 0.6);
+ }
+}
+
+@keyframes message-highlight-fade-dark {
+ 0% {
+ background-color: rgba(88, 101, 242, 0.3);
+ box-shadow:
+ inset 4px 0 0 0 #5865f2,
+ 0 0 25px rgba(88, 101, 242, 0.4);
+ }
+ 100% {
+ background-color: transparent;
+ box-shadow:
+ inset 4px 0 0 0 transparent,
+ 0 0 0 transparent;
+ }
+}
+
+.discord-message.first-in-group {
+ padding-top: 0.5rem;
+ margin-top: 1rem;
+}
+
+.discord-message.first-in-group::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background: rgba(0, 0, 0, 0.06);
+}
+
+[data-theme="dark"] .discord-message.first-in-group::before {
+ background: rgba(255, 255, 255, 0.06);
+}
+
+.discord-message:first-child.first-in-group {
+ margin-top: 0;
+}
+
+.discord-message:first-child.first-in-group::before {
+ display: none;
+}
+
+/* Avatar */
+.discord-avatar-wrapper {
+ width: 40px;
+ flex-shrink: 0;
+ padding-top: 2px;
+}
+
+.discord-avatar {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ object-fit: cover;
+}
+
+.discord-avatar-placeholder {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #5865f2 0%, #7289da 100%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ font-weight: 600;
+ font-size: 1rem;
+}
+
+/* Timestamp placeholder for continuation messages */
+.discord-timestamp-gutter {
+ width: 40px;
+ flex-shrink: 0;
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding-top: 2px;
+}
+
+.discord-hover-timestamp {
+ font-size: 0.65rem;
+ color: #80848e;
+ opacity: 0;
+ transition: opacity 0.1s ease;
+}
+
+.discord-message:hover .discord-hover-timestamp {
+ opacity: 1;
+}
+
+/* Message Content */
+.discord-message-content {
+ flex: 1;
+ min-width: 0;
+}
+
+.discord-message-header {
+ display: flex;
+ align-items: baseline;
+ gap: 0.5rem;
+ margin-bottom: 0.15rem;
+}
+
+.discord-username {
+ font-weight: 600;
+ font-size: 0.9375rem;
+ color: #1a1a1a;
+ cursor: pointer;
+}
+
+.discord-username:hover {
+ text-decoration: underline;
+}
+
+[data-theme="dark"] .discord-username {
+ color: #f2f3f5;
+}
+
+/* Role colors */
+.discord-username.role-admin { color: #e74c3c; }
+.discord-username.role-mod { color: #3498db; }
+.discord-username.role-vip { color: #9b59b6; }
+.discord-username.role-member { color: #2ecc71; }
+
+[data-theme="dark"] .discord-username.role-admin { color: #ff6b6b; }
+[data-theme="dark"] .discord-username.role-mod { color: #5dade2; }
+[data-theme="dark"] .discord-username.role-vip { color: #bb8fce; }
+[data-theme="dark"] .discord-username.role-member { color: #58d68d; }
+
+.discord-bot-tag {
+ font-size: 0.625rem;
+ font-weight: 600;
+ background: #5865f2;
+ color: #fff;
+ padding: 0.1rem 0.3rem;
+ border-radius: 3px;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+}
+
+.discord-server-tag {
+ font-size: 0.625rem;
+ font-weight: 600;
+ background: #3ba55c;
+ color: #fff;
+ padding: 0.1rem 0.3rem;
+ border-radius: 3px;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+}
+
+[data-theme="dark"] .discord-server-tag {
+ background: #2d7d46;
+}
+
+.discord-archive-tag {
+ font-size: 0.625rem;
+ font-weight: 600;
+ background: #9b59b6;
+ color: #fff;
+ padding: 0.1rem 0.3rem;
+ border-radius: 3px;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+ cursor: help;
+}
+
+[data-theme="dark"] .discord-archive-tag {
+ background: #8e44ad;
+}
+
+.discord-timestamp {
+ font-size: 0.75rem;
+ color: #80848e;
+}
+
+[data-theme="dark"] .discord-timestamp {
+ color: #949ba4;
+}
+
+.discord-text {
+ font-size: 0.9375rem;
+ line-height: 1.375;
+ color: #2e3338;
+ word-wrap: break-word;
+}
+
+[data-theme="dark"] .discord-text {
+ color: #dcddde;
+}
+
+/* Inline formatting */
+.discord-text code {
+ background: rgba(0, 0, 0, 0.06);
+ padding: 0.1rem 0.35rem;
+ border-radius: 4px;
+ font-family: var(--font-mono);
+ font-size: 0.85em;
+}
+
+[data-theme="dark"] .discord-text code {
+ background: rgba(255, 255, 255, 0.08);
+}
+
+.discord-text a {
+ color: #00aff4;
+ text-decoration: none;
+}
+
+.discord-text a:hover {
+ text-decoration: underline;
+}
+
+/* Mentions */
+.discord-mention {
+ background: rgba(88, 101, 242, 0.15);
+ color: #5865f2;
+ padding: 0 0.2rem;
+ border-radius: 3px;
+ font-weight: 500;
+ cursor: pointer;
+ text-decoration: none;
+}
+
+.discord-mention:hover {
+ background: rgba(88, 101, 242, 0.25);
+}
+
+[data-theme="dark"] .discord-mention {
+ background: rgba(88, 101, 242, 0.3);
+ color: #c9cdfb;
+}
+
+/* Clickable channel links */
+.discord-channel-link {
+ cursor: pointer;
+ text-decoration: none;
+}
+
+.discord-channel-link:hover {
+ text-decoration: underline;
+}
+
+/* Headings (# ## ### in Discord) */
+.discord-heading {
+ display: block;
+ font-weight: 700;
+ margin-top: 0.5rem;
+ margin-bottom: 0.25rem;
+ line-height: 1.3;
+}
+
+.discord-heading-1 {
+ font-size: 1.5rem;
+}
+
+.discord-heading-2 {
+ font-size: 1.25rem;
+}
+
+.discord-heading-3 {
+ font-size: 1.1rem;
+}
+
+/* Subtext / Small text (-# in Discord) */
+.discord-subtext {
+ display: block;
+ font-size: 0.75rem;
+ color: #72767d;
+ margin-top: 0.25rem;
+ line-height: 1.4;
+}
+
+[data-theme="dark"] .discord-subtext {
+ color: #a3a6aa;
+}
+
+/* List items */
+.discord-list-item {
+ display: block;
+ padding-left: 1rem;
+ line-height: 1.5;
+}
+
+/* Timestamps */
+.discord-timestamp {
+ background: rgba(88, 101, 242, 0.1);
+ padding: 0.1rem 0.3rem;
+ border-radius: 3px;
+ font-size: 0.875em;
+ cursor: default;
+}
+
+[data-theme="dark"] .discord-timestamp {
+ background: rgba(88, 101, 242, 0.15);
+}
+
+/* Slash commands */
+.discord-slash-command {
+ background: rgba(88, 101, 242, 0.15);
+ color: #5865f2;
+ padding: 0.1rem 0.4rem;
+ border-radius: 3px;
+ font-weight: 500;
+}
+
+/* @everyone and @here */
+.discord-mention-everyone {
+ background: rgba(250, 168, 26, 0.15);
+ color: #faa81a;
+}
+
+[data-theme="dark"] .discord-mention-everyone {
+ background: rgba(250, 168, 26, 0.2);
+}
+
+/* Emoji */
+.discord-emoji {
+ width: 1.375em;
+ height: 1.375em;
+ vertical-align: -0.3em;
+ object-fit: contain;
+}
+
+.discord-emoji.large {
+ width: 3rem;
+ height: 3rem;
+}
+
+/* Stickers */
+.discord-stickers {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-top: 0.5rem;
+}
+
+.discord-sticker {
+ display: inline-block;
+}
+
+.discord-sticker-image {
+ width: 160px;
+ height: 160px;
+ object-fit: contain;
+ border-radius: 4px;
+}
+
+.discord-sticker-lottie {
+ width: 160px;
+ height: 160px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(88, 101, 242, 0.1);
+ border-radius: 8px;
+ font-size: 0.875rem;
+ color: var(--text-muted, #72767d);
+}
+
+[data-theme="dark"] .discord-sticker-lottie {
+ background: rgba(88, 101, 242, 0.15);
+ color: #b9bbbe;
+}
+
+/* Attachments */
+.discord-attachments {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-top: 0.5rem;
+}
+
+.discord-attachment-image-wrapper {
+ max-width: 400px;
+}
+
+.discord-attachment-image {
+ max-width: 400px;
+ max-height: 300px;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: opacity 0.15s ease;
+ display: block;
+}
+
+.discord-attachment-image:hover {
+ opacity: 0.9;
+}
+
+/* Video attachments */
+.discord-attachment-video-wrapper {
+ max-width: 500px;
+}
+
+.discord-attachment-video {
+ max-width: 100%;
+ max-height: 350px;
+ border-radius: 8px;
+ background: #000;
+}
+
+/* Audio attachments */
+.discord-attachment-audio-wrapper {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ max-width: 400px;
+}
+
+.discord-attachment-audio {
+ width: 100%;
+ height: 32px;
+ border-radius: 4px;
+}
+
+.discord-attachment-file {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ background: rgba(0, 0, 0, 0.04);
+ border: 1px solid rgba(0, 0, 0, 0.08);
+ border-radius: 8px;
+ padding: 0.75rem 1rem;
+ max-width: 400px;
+}
+
+[data-theme="dark"] .discord-attachment-file {
+ background: rgba(255, 255, 255, 0.04);
+ border-color: rgba(255, 255, 255, 0.08);
+}
+
+.discord-attachment-icon {
+ width: 36px;
+ height: 36px;
+ color: #5865f2;
+ flex-shrink: 0;
+}
+
+.discord-attachment-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.discord-attachment-name {
+ font-size: 0.875rem;
+ color: #00aff4;
+ text-decoration: none;
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.discord-attachment-name:hover {
+ text-decoration: underline;
+}
+
+.discord-attachment-size {
+ font-size: 0.75rem;
+ color: #80848e;
+ margin-top: 0.1rem;
+}
+
+/* Embeds */
+.discord-embed {
+ border-left: 4px solid #5865f2;
+ background: rgba(0, 0, 0, 0.03);
+ border-radius: 4px;
+ padding: 0.75rem 1rem;
+ margin-top: 0.5rem;
+ max-width: 500px;
+}
+
+[data-theme="dark"] .discord-embed {
+ background: rgba(0, 0, 0, 0.2);
+}
+
+.discord-embed-author {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-bottom: 0.5rem;
+}
+
+.discord-embed-author-icon {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+}
+
+.discord-embed-author-name {
+ font-size: 0.875rem;
+ font-weight: 600;
+ color: #2e3338;
+}
+
+[data-theme="dark"] .discord-embed-author-name {
+ color: #dcddde;
+}
+
+.discord-embed-title {
+ font-size: 1rem;
+ font-weight: 600;
+ color: #2e3338;
+ margin-bottom: 0.5rem;
+}
+
+[data-theme="dark"] .discord-embed-title {
+ color: #f2f3f5;
+}
+
+/* Only style as link when it's an actual anchor */
+a.discord-embed-title {
+ color: #00aff4;
+ text-decoration: none;
+}
+
+a.discord-embed-title:hover {
+ text-decoration: underline;
+}
+
+.discord-embed-description {
+ font-size: 0.875rem;
+ color: #4f545c;
+ line-height: 1.4;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+[data-theme="dark"] .discord-embed-description {
+ color: #b5bac1;
+}
+
+/* Embed fields */
+.discord-embed-fields {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 0.5rem;
+ margin-top: 0.5rem;
+}
+
+.discord-embed-field {
+ grid-column: span 3;
+}
+
+.discord-embed-field.inline {
+ grid-column: span 1;
+}
+
+.discord-embed-field-name {
+ font-size: 0.875rem;
+ font-weight: 600;
+ color: #2e3338;
+ margin-bottom: 0.125rem;
+}
+
+[data-theme="dark"] .discord-embed-field-name {
+ color: #f2f3f5;
+}
+
+.discord-embed-field-value {
+ font-size: 0.875rem;
+ color: #4f545c;
+ line-height: 1.4;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+[data-theme="dark"] .discord-embed-field-value {
+ color: #b5bac1;
+}
+
+.discord-embed-footer-separator {
+ color: #80848e;
+}
+
+/* Embed content wrapper for thumbnail layout */
+.discord-embed-content-wrapper {
+ display: flex;
+ gap: 1rem;
+}
+
+.discord-embed-content {
+ flex: 1;
+ min-width: 0;
+}
+
+.discord-embed-thumbnail {
+ flex-shrink: 0;
+ width: 80px;
+ height: 80px;
+ border-radius: 4px;
+ object-fit: cover;
+}
+
+.discord-embed-image {
+ margin-top: 0.75rem;
+ max-width: 100%;
+ max-height: 300px;
+ border-radius: 4px;
+ object-fit: contain;
+}
+
+.discord-embed-footer {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin-top: 0.5rem;
+ font-size: 0.75rem;
+ color: #80848e;
+}
+
+.discord-embed-footer-icon {
+ width: 20px;
+ height: 20px;
+ border-radius: 50%;
+}
+
+/* Embed provider (site name) */
+.discord-embed-provider {
+ font-size: 0.75rem;
+ font-weight: 500;
+ color: #80848e;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+ margin-bottom: 0.25rem;
+}
+
+[data-theme="dark"] .discord-embed-provider {
+ color: #949ba4;
+}
+
+/* Loading state for embeds */
+.discord-embed-loading {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 60px;
+ background: rgba(0, 0, 0, 0.02);
+}
+
+[data-theme="dark"] .discord-embed-loading {
+ background: rgba(255, 255, 255, 0.02);
+}
+
+/* Video embeds */
+.discord-embed-video {
+ max-width: 520px;
+}
+
+.discord-embed-video-container {
+ margin-top: 0.75rem;
+ position: relative;
+ width: 100%;
+ padding-bottom: 56.25%; /* 16:9 aspect ratio */
+ border-radius: 4px;
+ overflow: hidden;
+ background: #000;
+}
+
+.discord-embed-iframe {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: none;
+}
+
+.discord-embed-video-player {
+ max-width: 100%;
+ max-height: 350px;
+ border-radius: 4px;
+ background: #000;
+}
+
+/* Reactions */
+.discord-reactions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.25rem;
+ margin-top: 0.35rem;
+}
+
+.discord-reaction {
+ display: flex;
+ align-items: center;
+ gap: 0.35rem;
+ background: rgba(0, 0, 0, 0.04);
+ border: 1px solid transparent;
+ border-radius: 8px;
+ padding: 0.2rem 0.5rem;
+ font-size: 0.8rem;
+ color: #4f545c;
+ cursor: pointer;
+ transition: all 0.1s ease;
+}
+
+[data-theme="dark"] .discord-reaction {
+ background: rgba(255, 255, 255, 0.06);
+ color: #b5bac1;
+}
+
+.discord-reaction:hover {
+ border-color: rgba(88, 101, 242, 0.4);
+ background: rgba(88, 101, 242, 0.1);
+}
+
+.discord-reaction.reacted {
+ border-color: rgba(88, 101, 242, 0.5);
+ background: rgba(88, 101, 242, 0.15);
+ color: #5865f2;
+}
+
+.discord-reaction-emoji {
+ width: 1rem;
+ height: 1rem;
+}
+
+/* Reply thread line */
+.discord-reply-context {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.25rem 0 0.25rem 3.5rem;
+ font-size: 0.8125rem;
+ color: #80848e;
+ position: relative;
+ margin-left: 0.5rem;
+}
+
+.discord-reply-context::before {
+ content: '';
+ width: 33px;
+ height: 13px;
+ border-left: 2px solid #4f545c;
+ border-top: 2px solid #4f545c;
+ border-radius: 8px 0 0 0;
+ position: absolute;
+ left: 20px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+[data-theme="dark"] .discord-reply-context::before {
+ border-color: #5c5f66;
+}
+
+.discord-reply-avatar {
+ width: 16px;
+ height: 16px;
+ border-radius: 50%;
+}
+
+.discord-reply-username {
+ font-weight: 600;
+ color: #5c5f66;
+ cursor: pointer;
+}
+
+.discord-reply-username:hover {
+ color: #2e3338;
+}
+
+[data-theme="dark"] .discord-reply-username {
+ color: #b5bac1;
+}
+
+[data-theme="dark"] .discord-reply-username:hover {
+ color: #fff;
+}
+
+.discord-reply-content {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ flex: 1;
+}
+
+/* Search/Filter */
+.discord-search-bar {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 1rem;
+ position: relative;
+}
+
+.discord-search-input {
+ flex: 1;
+ background: rgba(0, 0, 0, 0.04);
+ border: 1px solid rgba(0, 0, 0, 0.08);
+ border-radius: 8px;
+ padding: 0.65rem 1rem;
+ font-size: 0.9rem;
+ color: #2e3338;
+ transition: all 0.15s ease;
+}
+
+[data-theme="dark"] .discord-search-input {
+ background: rgba(255, 255, 255, 0.06);
+ border-color: rgba(255, 255, 255, 0.08);
+ color: #dcddde;
+}
+
+.discord-search-input:focus {
+ outline: none;
+ border-color: rgba(88, 101, 242, 0.5);
+ background: rgba(88, 101, 242, 0.05);
+}
+
+.discord-search-input::placeholder {
+ color: #80848e;
+}
+
+.discord-search-loading {
+ position: absolute;
+ right: 0.75rem;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+/* Search info banner */
+.discord-search-info {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0.5rem 0.75rem;
+ background: rgba(88, 101, 242, 0.1);
+ border-radius: 6px;
+ margin-bottom: 1rem;
+ font-size: 0.85rem;
+ color: #5865f2;
+}
+
+[data-theme="dark"] .discord-search-info {
+ background: rgba(88, 101, 242, 0.15);
+}
+
+.discord-search-clear {
+ background: none;
+ border: none;
+ color: #5865f2;
+ cursor: pointer;
+ font-size: 0.85rem;
+ padding: 0.25rem 0.5rem;
+ border-radius: 4px;
+ transition: background 0.15s ease;
+}
+
+.discord-search-clear:hover {
+ background: rgba(88, 101, 242, 0.15);
+}
+
+/* Date divider */
+.discord-date-divider {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ margin: 1.5rem 0 1rem;
+}
+
+.discord-date-divider::before,
+.discord-date-divider::after {
+ content: '';
+ flex: 1;
+ height: 1px;
+ background: rgba(0, 0, 0, 0.08);
+}
+
+[data-theme="dark"] .discord-date-divider::before,
+[data-theme="dark"] .discord-date-divider::after {
+ background: rgba(255, 255, 255, 0.08);
+}
+
+.discord-date-divider span {
+ font-size: 0.75rem;
+ font-weight: 600;
+ color: #80848e;
+ text-transform: uppercase;
+ letter-spacing: 0.03em;
+}
+
+/* Loading state */
+.discord-loading {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 3rem;
+ gap: 1rem;
+}
+
+.discord-loading-text {
+ font-size: 0.9rem;
+ color: #80848e;
+}
+
+/* Empty state */
+.discord-empty {
+ text-align: center;
+ padding: 3rem;
+ color: #80848e;
+}
+
+.discord-empty svg {
+ width: 64px;
+ height: 64px;
+ margin-bottom: 1rem;
+ opacity: 0.5;
+}
+
+.discord-empty-title {
+ font-size: 1.125rem;
+ font-weight: 600;
+ color: #4f545c;
+ margin-bottom: 0.5rem;
+}
+
+[data-theme="dark"] .discord-empty-title {
+ color: #b5bac1;
+}
+
+.discord-empty-description {
+ font-size: 0.875rem;
+}
+
+/* Pagination / Load more */
+.discord-load-more {
+ display: flex;
+ justify-content: center;
+ padding: 1.5rem;
+}
+
+.discord-loading-more {
+ display: flex;
+ justify-content: center;
+ padding: 0.75rem;
+}
+
+.discord-load-more-btn {
+ background: rgba(88, 101, 242, 0.1);
+ border: 1px solid rgba(88, 101, 242, 0.3);
+ color: #5865f2;
+ padding: 0.6rem 1.5rem;
+ border-radius: 8px;
+ font-size: 0.875rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.15s ease;
+}
+
+.discord-load-more-btn:hover {
+ background: rgba(88, 101, 242, 0.2);
+ border-color: rgba(88, 101, 242, 0.5);
+}
+
+[data-theme="dark"] .discord-load-more-btn {
+ background: rgba(88, 101, 242, 0.15);
+ color: #8b9dff;
+}
+
+[data-theme="dark"] .discord-load-more-btn:hover {
+ background: rgba(88, 101, 242, 0.25);
+}
+
+/* Code blocks */
+.discord-code-block {
+ background: #2b2d31;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-radius: 4px;
+ padding: 0.5rem;
+ margin: 0.25rem 0;
+ overflow: auto;
+ max-height: 400px;
+ overscroll-behavior: contain;
+ font-family: var(--font-mono);
+ font-size: 0.875rem;
+ line-height: 1.4;
+}
+
+.discord-code-block code {
+ background: none;
+ padding: 0;
+ color: #b5bac1;
+ white-space: pre;
+}
+
+[data-theme="light"] .discord-code-block {
+ background: #f2f3f5;
+}
+
+[data-theme="light"] .discord-code-block code {
+ color: #2e3338;
+}
+
+/* Blockquotes */
+.discord-blockquote {
+ border-left: 4px solid #4e5058;
+ padding-left: 0.75rem;
+ margin: 0.25rem 0;
+ max-height: 300px;
+ overflow-y: auto;
+ overscroll-behavior: contain;
+ color: #b5bac1;
+}
+
+[data-theme="light"] .discord-blockquote {
+ border-left-color: #c4c9ce;
+ color: #4e5058;
+}
+
+/* Spoilers */
+.discord-spoiler {
+ background: #1e1f22;
+ color: transparent;
+ border-radius: 3px;
+ padding: 0 0.2rem;
+ cursor: pointer;
+ transition: all 0.1s ease;
+}
+
+.discord-spoiler:hover,
+.discord-spoiler.revealed {
+ background: rgba(255, 255, 255, 0.1);
+ color: inherit;
+}
+
+[data-theme="light"] .discord-spoiler {
+ background: #b9bbbe;
+}
+
+[data-theme="light"] .discord-spoiler:hover,
+[data-theme="light"] .discord-spoiler.revealed {
+ background: rgba(0, 0, 0, 0.1);
+}
+
+/* Links in text */
+.discord-link {
+ color: #00aff4;
+ text-decoration: none;
+}
+
+.discord-link:hover {
+ text-decoration: underline;
+}
+
+/* System messages (join, boost, etc.) */
+.discord-system-message {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.5rem;
+ color: #80848e;
+ font-size: 0.9rem;
+}
+
+.discord-system-icon {
+ width: 20px;
+ height: 20px;
+ opacity: 0.7;
+}
+
+.discord-system-icon svg {
+ width: 100%;
+ height: 100%;
+}
+
+.discord-system-content {
+ flex: 1;
+}
+
+.discord-system-content .discord-username {
+ color: #00aff4;
+ font-weight: 600;
+}
+
+[data-theme="dark"] .discord-system-message {
+ color: #949ba4;
+}
+
+/* Responsive */
+@media (max-width: 640px) {
+ .discord-header {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.75rem;
+ }
+
+ .discord-message {
+ gap: 0.75rem;
+ }
+
+ .discord-avatar-wrapper,
+ .discord-timestamp-gutter {
+ width: 32px;
+ }
+
+ .discord-avatar,
+ .discord-avatar-placeholder {
+ width: 32px;
+ height: 32px;
+ }
+
+ .discord-attachment-image,
+ .discord-attachment-image-wrapper {
+ max-width: 100%;
+ }
+
+ .discord-attachment-video-wrapper {
+ max-width: 100%;
+ }
+
+ .discord-embed {
+ max-width: 100%;
+ }
+
+ .discord-embed-video-container {
+ padding-bottom: 56.25%;
+ }
+}
+
+/* ============================================================================
+ Sidebar with Guild and Channel Selection
+ ============================================================================ */
+
+.discord-sidebar {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ width: 220px;
+ flex-shrink: 0;
+ background: rgba(0, 0, 0, 0.02);
+ border-radius: 8px;
+ padding: 0.75rem;
+ max-height: 600px;
+ overflow-y: auto;
+ overscroll-behavior: contain;
+}
+
+[data-theme="dark"] .discord-sidebar {
+ background: rgba(255, 255, 255, 0.02);
+}
+
+/* Guild List (server icons) */
+.discord-guild-list {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ padding-bottom: 0.75rem;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+}
+
+[data-theme="dark"] .discord-guild-list {
+ border-right-color: rgba(255, 255, 255, 0.08);
+}
+
+.discord-guild-btn {
+ width: 48px;
+ height: 48px;
+ border-radius: 24px;
+ background: rgba(0, 0, 0, 0.06);
+ border: none;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.2s ease;
+ overflow: hidden;
+}
+
+[data-theme="dark"] .discord-guild-btn {
+ background: rgba(255, 255, 255, 0.06);
+}
+
+.discord-guild-btn:hover {
+ border-radius: 16px;
+ background: rgba(88, 101, 242, 0.2);
+}
+
+.discord-guild-btn.active {
+ border-radius: 16px;
+ background: #5865f2;
+}
+
+.discord-guild-icon {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.discord-guild-initial {
+ font-size: 1.25rem;
+ font-weight: 600;
+ color: #4f545c;
+}
+
+[data-theme="dark"] .discord-guild-initial {
+ color: #b5bac1;
+}
+
+.discord-guild-btn.active .discord-guild-initial {
+ color: #fff;
+}
+
+/* Channel List Header */
+.discord-channel-list-header {
+ font-size: 0.75rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+ color: #5c5f66;
+ padding: 0.5rem 0.5rem 0.75rem;
+}
+
+[data-theme="dark"] .discord-channel-list-header {
+ color: #949ba4;
+}
+
+/* Channel list in sidebar mode */
+.discord-sidebar .discord-channel-list {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: nowrap;
+ gap: 0.25rem;
+ margin-bottom: 0;
+ flex: 1;
+ overflow-y: auto;
+ overscroll-behavior: contain;
+}
+
+/* Category headers in sidebar */
+.discord-category-header {
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+ padding: 0.5rem 0.4rem 0.25rem;
+ margin-top: 0.5rem;
+ font-size: 0.7rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+ color: #6d6f78;
+}
+
+[data-theme="dark"] .discord-category-header {
+ color: #8e9297;
+}
+
+.discord-category-header svg {
+ opacity: 0.7;
+}
+
+.discord-sidebar .discord-channel-btn {
+ width: 100%;
+ justify-content: flex-start;
+ padding: 0.4rem 0.6rem;
+ border-radius: 4px;
+ border: none;
+ background: transparent;
+ overflow: hidden;
+ white-space: nowrap;
+ min-width: 0;
+}
+
+.discord-sidebar .discord-channel-btn svg {
+ flex-shrink: 0;
+}
+
+.discord-sidebar .discord-channel-btn span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.discord-sidebar .discord-channel-btn.has-category {
+ padding-left: 1rem;
+}
+
+.discord-sidebar .discord-channel-btn:hover {
+ background: rgba(0, 0, 0, 0.04);
+}
+
+[data-theme="dark"] .discord-sidebar .discord-channel-btn:hover {
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.discord-sidebar .discord-channel-btn.active {
+ background: rgba(88, 101, 242, 0.15);
+ color: #5865f2;
+}
+
+[data-theme="dark"] .discord-sidebar .discord-channel-btn.active {
+ background: rgba(88, 101, 242, 0.2);
+ color: #8b9dff;
+}
+
+/* ============================================================================
+ Load More Button
+ ============================================================================ */
+
+.discord-load-more {
+ display: flex;
+ justify-content: center;
+ padding: 1.5rem 0;
+ margin-top: 1rem;
+}
+
+.discord-load-more-btn {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1.5rem;
+ background: rgba(88, 101, 242, 0.1);
+ border: 1px solid rgba(88, 101, 242, 0.3);
+ border-radius: 8px;
+ color: #5865f2;
+ font-size: 0.875rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.15s ease;
+}
+
+.discord-load-more-btn:hover:not(:disabled) {
+ background: rgba(88, 101, 242, 0.2);
+ border-color: rgba(88, 101, 242, 0.5);
+}
+
+.discord-load-more-btn:disabled {
+ opacity: 0.7;
+ cursor: not-allowed;
+}
+
+[data-theme="dark"] .discord-load-more-btn {
+ background: rgba(88, 101, 242, 0.15);
+ border-color: rgba(88, 101, 242, 0.4);
+ color: #8b9dff;
+}
+
+[data-theme="dark"] .discord-load-more-btn:hover:not(:disabled) {
+ background: rgba(88, 101, 242, 0.25);
+ border-color: rgba(88, 101, 242, 0.6);
+}
+
+/* Mobile responsive */
+@media (max-width: 768px) {
+ .discord-main-layout {
+ flex-direction: column;
+ }
+
+ .discord-sidebar {
+ width: 100%;
+ max-height: 250px;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: flex-start;
+ }
+
+ .discord-guild-list {
+ flex-direction: row;
+ flex-wrap: wrap;
+ border-bottom: none;
+ border-right: 1px solid rgba(0, 0, 0, 0.08);
+ padding-bottom: 0;
+ padding-right: 0.75rem;
+ }
+
+ [data-theme="dark"] .discord-guild-list {
+ border-right-color: rgba(255, 255, 255, 0.08);
+ }
+
+ .discord-sidebar .discord-channel-list {
+ flex: 1;
+ flex-direction: row;
+ flex-wrap: wrap;
+ max-height: none;
+ }
+
+ .discord-sidebar .discord-channel-btn {
+ width: auto;
+ }
+
+ .discord-messages {
+ max-height: calc(100vh - 400px);
+ }
+}
+
+/* Image Modal */
+.discord-image-modal-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.85);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 10000;
+ padding: 2rem;
+ cursor: pointer;
+}
+
+.discord-image-modal {
+ position: relative;
+ max-width: 90vw;
+ max-height: 90vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1rem;
+ cursor: default;
+}
+
+.discord-image-modal-img {
+ max-width: 100%;
+ max-height: calc(90vh - 4rem);
+ object-fit: contain;
+ border-radius: 8px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
+}
+
+.discord-image-modal-close {
+ position: absolute;
+ top: -2.5rem;
+ right: -0.5rem;
+ background: rgba(255, 255, 255, 0.1);
+ border: none;
+ border-radius: 50%;
+ width: 36px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ color: #fff;
+ transition: background 0.2s;
+}
+
+.discord-image-modal-close:hover {
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.discord-image-modal-link {
+ color: #00aff4;
+ font-size: 0.875rem;
+ text-decoration: none;
+ padding: 0.5rem 1rem;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 4px;
+ transition: background 0.2s;
+}
+
+.discord-image-modal-link:hover {
+ background: rgba(255, 255, 255, 0.2);
+ text-decoration: none;
+}
+
+/* ============================================
+ Reaction Users Popup
+ ============================================ */
+
+.discord-reaction-popup {
+ background: #fff;
+ border-radius: 8px;
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
+ z-index: 1001;
+ min-width: 200px;
+ max-width: 280px;
+ max-height: 300px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+}
+
+[data-theme="dark"] .discord-reaction-popup {
+ background: #2f3136;
+}
+
+.discord-reaction-popup-header {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1rem;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+ font-weight: 600;
+}
+
+[data-theme="dark"] .discord-reaction-popup-header {
+ border-bottom-color: rgba(255, 255, 255, 0.1);
+}
+
+.discord-reaction-popup-emoji {
+ width: 24px;
+ height: 24px;
+ font-size: 1.25rem;
+}
+
+.discord-reaction-popup-count {
+ color: #80848e;
+ font-size: 0.875rem;
+ font-weight: 400;
+}
+
+.discord-reaction-popup-users {
+ padding: 0.5rem;
+ overflow-y: auto;
+ max-height: 220px;
+}
+
+.discord-reaction-popup-loading {
+ display: flex;
+ justify-content: center;
+ padding: 1rem;
+}
+
+.discord-reaction-popup-empty {
+ text-align: center;
+ padding: 1rem;
+ color: #80848e;
+ font-size: 0.875rem;
+}
+
+.discord-reaction-popup-user {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.375rem 0.5rem;
+ border-radius: 4px;
+}
+
+.discord-reaction-popup-user:hover {
+ background: rgba(0, 0, 0, 0.04);
+}
+
+[data-theme="dark"] .discord-reaction-popup-user:hover {
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.discord-reaction-popup-avatar {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+}
+
+.discord-reaction-popup-name {
+ font-size: 0.875rem;
+ color: #2e3338;
+}
+
+[data-theme="dark"] .discord-reaction-popup-name {
+ color: #dcddde;
+}
+
+/* ============================================
+ Header Actions (copy link, member toggle)
+ ============================================ */
+
+.discord-header-actions {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ flex-shrink: 0;
+}
+
+.discord-copy-link-btn,
+.discord-member-toggle-btn {
+ display: flex;
+ align-items: center;
+ gap: 0.35rem;
+ padding: 0.4rem 0.6rem;
+ background: rgba(0, 0, 0, 0.06);
+ border: none;
+ border-radius: 6px;
+ cursor: pointer;
+ color: #5c5f66;
+ transition: all 0.15s ease;
+}
+
+[data-theme="dark"] .discord-copy-link-btn,
+[data-theme="dark"] .discord-member-toggle-btn {
+ background: rgba(255, 255, 255, 0.08);
+ color: #b5bac1;
+}
+
+.discord-copy-link-btn:hover,
+.discord-member-toggle-btn:hover {
+ background: rgba(88, 101, 242, 0.15);
+ color: #5865f2;
+}
+
+.discord-copy-link-btn.copied {
+ background: rgba(35, 165, 90, 0.2);
+ color: #23a55a;
+}
+
+.discord-member-toggle-btn.active {
+ background: rgba(88, 101, 242, 0.2);
+ color: #5865f2;
+}
+
+.discord-member-count {
+ font-size: 0.7rem;
+ font-weight: 500;
+}
+
+/* ============================================
+ Member List Panel
+ ============================================ */
+
+.discord-member-list {
+ width: 220px;
+ flex-shrink: 0;
+ background: rgba(0, 0, 0, 0.02);
+ border-radius: 12px;
+ padding: 0.75rem;
+ max-height: calc(100vh - 200px);
+ overflow-y: auto;
+ border: 1px solid rgba(0, 0, 0, 0.08);
+}
+
+[data-theme="dark"] .discord-member-list {
+ background: rgba(255, 255, 255, 0.02);
+ border-color: rgba(255, 255, 255, 0.06);
+}
+
+.discord-member-list-loading {
+ display: flex;
+ justify-content: center;
+ padding: 2rem;
+}
+
+.discord-member-list-empty {
+ text-align: center;
+ padding: 2rem 1rem;
+ color: #80848e;
+ font-size: 0.85rem;
+}
+
+.discord-member-group {
+ margin-bottom: 1rem;
+}
+
+.discord-member-group:last-child {
+ margin-bottom: 0;
+}
+
+.discord-member-group-header {
+ font-size: 0.7rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+ padding: 0.5rem 0.5rem 0.25rem;
+ color: #80848e;
+}
+
+.discord-member-item {
+ display: flex;
+ align-items: center;
+ gap: 0.6rem;
+ padding: 0.4rem 0.5rem;
+ border-radius: 6px;
+ cursor: default;
+ transition: background 0.15s ease;
+}
+
+.discord-member-item:hover {
+ background: rgba(0, 0, 0, 0.04);
+}
+
+[data-theme="dark"] .discord-member-item:hover {
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.discord-member-avatar {
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ object-fit: cover;
+ flex-shrink: 0;
+}
+
+.discord-member-avatar-placeholder {
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ background: #5865f2;
+ color: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.75rem;
+ font-weight: 600;
+ flex-shrink: 0;
+}
+
+.discord-member-name {
+ font-size: 0.85rem;
+ font-weight: 500;
+ color: #2e3338;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+[data-theme="dark"] .discord-member-name {
+ color: #dbdee1;
+}
+
+.discord-member-item .discord-bot-tag {
+ font-size: 0.6rem;
+ padding: 0.1rem 0.25rem;
+ flex-shrink: 0;
+}
+
+/* ============================================
+ Context Menu (right-click on messages)
+ ============================================ */
+
+.discord-context-menu {
+ position: fixed;
+ background: #fff;
+ border-radius: 8px;
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
+ z-index: 1002;
+ min-width: 180px;
+ padding: 0.375rem;
+ overflow: hidden;
+}
+
+[data-theme="dark"] .discord-context-menu {
+ background: #111214;
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
+}
+
+.discord-context-menu-item {
+ display: flex;
+ align-items: center;
+ gap: 0.6rem;
+ width: 100%;
+ padding: 0.5rem 0.625rem;
+ background: none;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ color: #2e3338;
+ font-size: 0.875rem;
+ text-align: left;
+ transition: background 0.1s ease;
+}
+
+[data-theme="dark"] .discord-context-menu-item {
+ color: #dbdee1;
+}
+
+.discord-context-menu-item:hover {
+ background: #5865f2;
+ color: #fff;
+}
+
+.discord-context-menu-item svg {
+ width: 18px;
+ height: 18px;
+ opacity: 0.7;
+}
+
+.discord-context-menu-item:hover svg {
+ opacity: 1;
+}
+
diff --git a/src/assets/styles/global.css b/src/assets/styles/global.css
index fd3f500..0ae17a4 100644
--- a/src/assets/styles/global.css
+++ b/src/assets/styles/global.css
@@ -367,6 +367,10 @@ Custom
background-color: oklch(from rgba(255, 255, 255, 2.0) calc(l - 0.02) c h);
}
+.discord-logs-container {
+ padding-bottom: 25px;
+}
+
.random-msg {
padding-top: 10px;
max-width: 100%;
diff --git a/src/components/AppLayout.jsx b/src/components/AppLayout.jsx
index 8ae881b..e1362ca 100644
--- a/src/components/AppLayout.jsx
+++ b/src/components/AppLayout.jsx
@@ -14,6 +14,7 @@ const LoginPage = lazy(() => import('./Login.jsx'));
const LyricSearch = lazy(() => import('./LyricSearch'));
const MediaRequestForm = lazy(() => import('./TRip/MediaRequestForm.jsx'));
const RequestManagement = lazy(() => import('./TRip/RequestManagement.jsx'));
+const DiscordLogs = lazy(() => import('./DiscordLogs.jsx'));
// NOTE: Player is intentionally NOT imported at module initialization.
// We create the lazy import inside the component at render-time only when
// we are on the main site and the Player island should be rendered. This
@@ -98,6 +99,11 @@ export default function Root({ child, user = undefined, ...props }) {
)}
{child == "Memes" &&
${code.trim()}`;
+ });
+
+ // Inline code (`) - must be early to prevent formatting inside code
+ parsed = parsed.replace(/`([^`]+)`/g, '$1');
+
+ // Blockquotes (> at start of line) - process before newline conversion
+ // Group consecutive > lines into a single blockquote
+ parsed = parsed.replace(/(^|\n)((?:> .+(?:\n|$))+)/gm, (_, before, block) => {
+ const content = block
+ .split('\n')
+ .map(line => line.replace(/^> /, ''))
+ .join('\n');
+ return `${before}${content}`; + }); + + // Headings (# ## ###) - must be at start of line + // Process before other inline formatting + parsed = parsed.replace(/(^|\n)### (.+?)(?=\n|$)/gm, (_, before, content) => { + return `${before}${content}`; + }); + parsed = parsed.replace(/(^|\n)## (.+?)(?=\n|$)/gm, (_, before, content) => { + return `${before}${content}`; + }); + parsed = parsed.replace(/(^|\n)# (.+?)(?=\n|$)/gm, (_, before, content) => { + return `${before}${content}`; + }); + + // Subtext/small text (-# at start of line) - process before newline conversion + parsed = parsed.replace(/(^|\n)-# (.+?)(?=\n|$)/gm, (_, before, content) => { + return `${before}${content}`; + }); + + // Unordered lists (- or * at start of line, but not ---) + parsed = parsed.replace(/(^|\n)[-*] (.+?)(?=\n|$)/gm, (_, before, content) => { + return `${before}• ${content}`; + }); + + // Ordered lists (1. 2. etc at start of line) + parsed = parsed.replace(/(^|\n)(\d+)\. (.+?)(?=\n|$)/gm, (_, before, num, content) => { + return `${before}${num}. ${content}`; + }); + + // Bold + Italic + Underline combinations (most specific first) + // ___***text***___ or ***___text___*** + parsed = parsed.replace(/(\*\*\*|___)(\*\*\*|___)([^*_]+)\2\1/g, '$3'); + + // Bold + Italic (***text***) + parsed = parsed.replace(/\*\*\*([^*]+)\*\*\*/g, '$1'); + + // Bold + Underline (__**text**__ or **__text__**) + parsed = parsed.replace(/__\*\*([^*_]+)\*\*__/g, '$1'); + parsed = parsed.replace(/\*\*__([^*_]+)__\*\*/g, '$1'); + + // Italic + Underline (__*text*__ or *__text__* or ___text___) + parsed = parsed.replace(/__\*([^*_]+)\*__/g, '$1'); + parsed = parsed.replace(/\*__([^*_]+)__\*/g, '$1'); + parsed = parsed.replace(/___([^_]+)___/g, '$1'); + + // Bold (**) + parsed = parsed.replace(/\*\*([^*]+)\*\*/g, '$1'); + + // Underline (__) - must come before italic _ handling + parsed = parsed.replace(/__([^_]+)__/g, '$1'); + + // Italic (* or _) + parsed = parsed.replace(/\*([^*]+)\*/g, '$1'); + parsed = parsed.replace(/\b_([^_]+)_\b/g, '$1'); + + // Strikethrough (~~) + parsed = parsed.replace(/~~([^~]+)~~/g, '
{error}
++ {searchQuery ? 'No messages match your search. Try different keywords.' : 'This channel has no archived messages'} +
+