main
css 1,623 lines 31.5 KB
Raw
1 /* Add box-sizing globally for better cross-browser consistency */
2 *,
3 *::before,
4 *::after {
5 box-sizing: border-box;
6 }
7
8 :root {
9 /* Dark mode */
10 --color-background-dark: #131313;
11 --color-text-dark: #ffffff;
12 --color-text-muted-dark: #d4d4d4e4;
13 --color-primary-dark: #737a81;
14 --color-secondary-dark: #656565;
15 --color-accent-dark: #cf6679;
16 --color-message-bg-dark: #2d2d2d;
17 --color-highlight-dark: #2b5ab9;
18 --color-message-text-dark: #e0e0e0;
19 --color-panel-dark: #1a1a1a;
20 --color-border-dark: #444444a8;
21 --color-input-dark: #131313;
22 --color-input-focus-dark: #101010;
23 --color-chat-background-dark: #212121;
24 --color-error-text-dark:#e72323;
25 --color-warning-text-dark:#e79c23;
26 --color-table-row-dark: #272727;
27
28 /* Light mode */
29 --color-background-light: #fafafa;
30 --color-text-light: #333333;
31 --color-text-muted-light: #333333e4;
32 --color-primary-light: #384653;
33 --color-secondary-light: #e8eaf6;
34 --color-accent-light: #b00020;
35 --color-message-bg-light: #ffffff;
36 --color-highlight-light: #2563eb;
37 --color-message-text-light: #333333;
38 --color-panel-light: #f0f0f0;
39 --color-border-light: #bdbdbdcf;
40 --color-input-light: #e4e4e4;
41 --color-input-focus-light: #dadada;
42 --color-chat-background-light: #fafafa;
43 --color-error-text-light:#920000;
44 --color-warning-text-light:#936214;
45 --color-table-row-light: #edededf3;
46
47
48 /* Default to dark mode */
49 --color-background: var(--color-background-dark);
50 --color-text: var(--color-text-dark);
51 --color-text-muted: var(--color-text-muted-dark);
52 --color-primary: var(--color-primary-dark);
53 --color-secondary: var(--color-secondary-dark);
54 --color-accent: var(--color-accent-dark);
55 --color-message-bg: var(--color-message-bg-dark);
56 --color-highlight: var(--color-highlight-dark);
57 --color-message-text: var(--color-message-text-dark);
58 --color-panel: var(--color-panel-dark);
59 --color-border: var(--color-border-dark);
60 --color-input: var(--color-input-dark);
61 --color-input-focus: var(--color-input-focus-dark);
62 --color-background-hover: color-mix(in srgb, var(--color-border) 50%, transparent);
63 --color-chat-background: var(--color-chat-background-dark);
64 --color-error-text:var(--color-error-text-dark);
65 --color-warning-text:var(--color-warning-text-dark);
66 --color-table-row: var(--color-table-row-dark);
67
68 /* Spacing variables */
69 --spacing-xxs: 0.15rem;
70 --spacing-xs: 0.3125rem;
71 --spacing-sm: 0.625rem;
72 --spacing-md: 1.25rem;
73 --spacing-lg: 2rem;
74
75 /* Font sizes */
76 --font-size-xs: 0.7rem;
77 --font-size-small: 0.8rem;
78 --font-size-smaller: 0.9rem;
79 --font-size-normal: 1rem;
80 --font-size-large: 1.2rem;
81
82 /* Font families */
83 --font-family-main: "Rubik", Arial, Helvetica, sans-serif;
84 --font-family-code: "Roboto Mono", monospace;
85 --font-family-mono: var(--font-family-code);
86 --font-family-monospace: var(--font-family-code);
87 --font-mono: var(--font-family-code);
88
89 /* Other variables */
90 --border-radius: 1.125rem;
91 --border-radius-sm: 0.5rem;
92 --transition-speed: 0.3s;
93 --svg-filter: brightness(0) saturate(100%) var(--color-primary-filter);
94 --color-primary-filter: invert(73%) sepia(17%) saturate(360%)
95 hue-rotate(177deg) brightness(87%) contrast(85%);
96 }
97
98 /* Light mode class */
99 .light-mode {
100 --color-background: var(--color-background-light);
101 --color-text: var(--color-text-light);
102 --color-text-muted: var(--color-text-muted-light);
103 --color-primary: var(--color-primary-light);
104 --color-secondary: var(--color-secondary-light);
105 --color-accent: var(--color-accent-light);
106 --color-message-bg: var(--color-message-bg-light);
107 --color-message-text: var(--color-message-text-light);
108 --color-panel: var(--color-panel-light);
109 --color-border: var(--color-border-light);
110 --color-input: var(--color-input-light);
111 --color-input-focus: var(--color-input-focus-light);
112 --color-background-hover: color-mix(in srgb, var(--color-border) 50%, transparent);
113 --color-chat-background: var(--color-chat-background-light);
114 --color-error-text:var(--color-error-text-light);
115 --color-warning-text:var(--color-warning-text-light);
116 --color-table-row: var(--color-table-row-light);
117 }
118
119
120 html {
121 font-family: var(--font-family-main);
122 }
123
124 /* Reset and Base Styles */
125 body {
126 background-color: var(--color-background);
127 color: var(--color-text);
128 font-family: inherit;
129 width: 100%;
130 height: 100%;
131 min-width: 320px !important;
132 min-height: 370px !important;
133 margin: 0;
134 padding: 0;
135 overflow: hidden;
136 position: fixed;
137 -webkit-font-smoothing: antialiased; /* Improve font rendering */
138 -moz-osx-font-smoothing: grayscale; /* Improve font rendering */
139 }
140
141 body {
142 overscroll-behavior: none;
143 -webkit-overscroll-behavior: none;
144 overflow-x: hidden;
145 }
146
147 button,
148 input,
149 textarea,
150 select,
151 option,
152 optgroup {
153 font-family: var(--font-family-main);
154 }
155
156 ::file-selector-button {
157 font-family: var(--font-family-main);
158 }
159
160 x-extension:not(:empty) {
161 display: contents;
162 }
163
164 x-extension:empty {
165 display: none;
166 }
167
168 x-extension > x-component,
169 x-extension > x-component > div[x-data] {
170 display: contents;
171 }
172
173 p:last-child {
174 margin-bottom: 0;
175 }
176
177 body,
178 #chat-input,
179 .message,
180 .config-button,
181 .switch-label {
182 -webkit-transition: background-color 0.3s, color 0.3s, border-color 0.3s;
183 transition: background-color 0.3s, color 0.3s, border-color 0.3s;
184 color: var(--color-text) !important;
185 }
186
187 /* Bootstrap-like tooltips */
188 .tooltip {
189 position: absolute;
190 /* Above custom modals and toasts, below confirm dialogs. */
191 z-index: 9000;
192 display: block;
193 margin: 0;
194 font-family: var(--font-family-main);
195 font-style: normal;
196 font-weight: 400;
197 line-height: 1.2;
198 text-align: left;
199 text-decoration: none;
200 text-shadow: none;
201 text-transform: none;
202 letter-spacing: normal;
203 word-break: normal;
204 white-space: normal;
205 opacity: 0;
206 pointer-events: none;
207 transition: opacity 0.08s ease-in-out;
208 }
209
210 .tooltip.show {
211 opacity: 1;
212 }
213
214 .tooltip .tooltip-inner {
215 max-width: 240px;
216 padding: 0.35rem 0.6rem;
217 color: var(--color-text);
218 background-color: var(--color-secondary);
219 border-radius: 0.375rem;
220 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
221 font-size: 0.75rem;
222 }
223
224 .tooltip .tooltip-arrow {
225 position: absolute;
226 width: 0.8rem;
227 height: 0.4rem;
228 }
229
230 .tooltip .tooltip-arrow::before {
231 content: "";
232 position: absolute;
233 border-color: transparent;
234 border-style: solid;
235 }
236
237 .bs-tooltip-top .tooltip-arrow {
238 bottom: 0;
239 left: 50%;
240 transform: translateX(-50%);
241 }
242
243 .bs-tooltip-top .tooltip-arrow::before {
244 border-width: 0.4rem 0.4rem 0;
245 border-top-color: var(--color-secondary);
246 top: 0;
247 }
248
249 .bs-tooltip-bottom .tooltip-arrow {
250 top: 0;
251 left: 50%;
252 transform: translateX(-50%);
253 }
254
255 .bs-tooltip-bottom .tooltip-arrow::before {
256 border-width: 0 0.4rem 0.4rem;
257 border-bottom-color: var(--color-secondary);
258 top: 0;
259 }
260
261 .bs-tooltip-start .tooltip-arrow,
262 .bs-tooltip-left .tooltip-arrow {
263 right: 0;
264 top: 50%;
265 width: 0.4rem;
266 height: 0.8rem;
267 transform: translateY(-50%);
268 }
269
270 .bs-tooltip-start .tooltip-arrow::before,
271 .bs-tooltip-left .tooltip-arrow::before {
272 border-width: 0.4rem 0 0.4rem 0.4rem;
273 border-left-color: var(--color-secondary);
274 left: 0;
275 }
276
277 .bs-tooltip-end .tooltip-arrow,
278 .bs-tooltip-right .tooltip-arrow {
279 left: 0;
280 top: 50%;
281 width: 0.4rem;
282 height: 0.8rem;
283 transform: translateY(-50%);
284 }
285
286 .bs-tooltip-end .tooltip-arrow::before,
287 .bs-tooltip-right .tooltip-arrow::before {
288 border-width: 0.4rem 0.4rem 0.4rem 0;
289 border-right-color: var(--color-secondary);
290 right: 0;
291 }
292
293 img {
294 user-drag: none; /* Safari & old Chrome */
295 -webkit-user-drag: none;
296 user-select: none; /* Prevent selection for good measure */
297 -webkit-user-select: none;
298 -moz-user-select: none;
299 -ms-user-select: none;
300 pointer-events: auto; /* Allow clicks, just no drag */
301 }
302
303 /* Layout */
304 .container {
305 display: -webkit-flex;
306 display: flex;
307 height: 100%;
308 min-width: 0;
309 overflow: hidden;
310 }
311
312 .sidebar-slot {
313 flex: 0 0 250px;
314 min-width: 250px;
315 height: 100%;
316 }
317
318 .sidebar-slot:has(#left-panel) {
319 display: contents;
320 }
321
322 @media (max-width: 768px) {
323 .sidebar-slot {
324 flex-basis: 0;
325 min-width: 0;
326 }
327 }
328
329 .panel {
330 display: -webkit-flex;
331 display: flex;
332 height: 100%;
333 overflow: auto;
334 -webkit-scroll-behavior: smooth;
335 scroll-behavior: smooth;
336 }
337
338 /* Right Panel */
339 #right-panel {
340 display: -webkit-flex;
341 display: flex;
342 width: auto;
343 min-width: 0;
344 flex-direction: column;
345 flex: 1 1 0;
346 background-color: var(--color-background);
347 -webkit-transition: margin-left var(--transition-speed) ease-in-out,
348 background-color 0.2s ease-out;
349 transition: margin-left var(--transition-speed) ease-in-out,
350 background-color 0.2s ease-out;
351 }
352
353 #right-panel.chat-active {
354 background-color: var(--color-chat-background);
355 }
356
357 /* Chat area wrapper – contains chat-history + floating nav buttons */
358 #chat-area-wrapper {
359 position: relative;
360 display: flex;
361 flex-direction: column;
362 flex-grow: 1;
363 min-height: 0;
364 }
365
366 /* Chat Navigation Buttons – vertical, floating bottom-right of chat area */
367 #chat-nav-buttons {
368 position: absolute;
369 right: var(--spacing-md);
370 bottom: var(--spacing-md);
371 display: flex;
372 flex-direction: column;
373 align-items: center;
374 gap: 2px;
375 z-index: 100;
376 opacity: 0;
377 transition: opacity 0.2s ease;
378 pointer-events: none;
379 }
380 #chat-area-wrapper:hover #chat-nav-buttons,
381 #chat-nav-buttons:hover {
382 opacity: 0.85;
383 pointer-events: auto;
384 }
385 #chat-nav-buttons .btn-icon-action {
386 padding: var(--spacing-xs);
387 border: none !important;
388 border-radius: 50%;
389 background: var(--color-panel);
390 box-shadow: 0 1px 4px rgba(0,0,0,0.18);
391 }
392 @media (max-width: 768px) {
393 #chat-nav-buttons {
394 opacity: 0.85;
395 pointer-events: auto;
396 }
397 }
398
399 /* Scrollbar styles for right panel */
400 #right-panel.expanded {
401 margin-left: 0;
402 }
403 div#right-panel::-webkit-scrollbar {
404 width: 6px;
405 }
406 div#right-panel::-webkit-scrollbar-track {
407 background: transparent;
408 }
409 div#right-panel::-webkit-scrollbar-thumb {
410 background-color: rgba(155, 155, 155, 0.3);
411 border-radius: 6px;
412 }
413 div#right-panel::-webkit-scrollbar-thumb:hover {
414 background-color: rgba(155, 155, 155, 0.5);
415 }
416
417 #time-date-container {
418 z-index: 1000;
419 position: absolute;
420 top: 0;
421 right: var(--spacing-md);
422 display: flex;
423 align-items: center;
424 gap: var(--spacing-sm);
425 margin-top: var(--spacing-md);
426 }
427
428 #time-date {
429 color: var(--color-text);
430 text-align: right;
431 line-height: 1.2;
432 }
433
434 #user-date {
435 font-size: 0.7rem;
436 opacity: 0.5;
437 font-weight: 400;
438 display: block;
439 margin-top: 2px;
440 }
441
442 /* Typography */
443 /* h2,
444 h3 {
445 color: var(--color-primary);
446 } */
447
448 /* h2 {
449 margin-bottom: var(--spacing-sm);
450 margin-top: var(--spacing-lg);
451 }
452
453 h3 {
454 margin-bottom: var(--spacing-sm);
455 }
456
457 h4 {
458 margin: auto 0;
459 } */
460
461
462 /* Preview section with unified tile system */
463 .preview-section {
464 display: grid;
465 grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
466 gap: 12px;
467 margin-bottom: 10px;
468 padding: var(--spacing-sm);
469 transition: all 0.3s ease;
470 border-radius: 8px;
471 margin-bottom: var(--spacing-xs);
472 max-height: 10em;
473 overflow-y: auto;
474 }
475
476
477 .preview-item {
478 position: relative;
479 width: 120px;
480 height: 120px;
481 /* background-color: var(--color-background); */
482 border: 1px solid var(--color-border);
483 border-radius: var(--border-radius);
484 display: flex;
485 align-items: center;
486 justify-content: center;
487 overflow: hidden;
488 cursor: pointer;
489 transition: border-color 0.3s ease, box-shadow 0.3s ease,
490 filter 0.3s ease;
491 animation: fadeIn 0.3s ease;
492 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
493 }
494
495 .preview-item:hover {
496 border-color: var(--color-primary);
497 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
498 filter: brightness(1.02);
499 }
500
501 .preview-item.image-preview img {
502 width: 100%;
503 height: 100%;
504 object-fit: cover;
505 border-radius: 10px;
506 }
507
508 .preview-item.file-preview {
509 flex-direction: column;
510 padding: 12px;
511 text-align: center;
512 }
513
514 .preview-item.file-preview .file-icon {
515 width: 2.5rem;
516 height: 2.5rem;
517 margin-bottom: 0.1rem;
518 }
519
520 .preview-item.file-preview .file-info {
521 display: flex;
522 flex-direction: column;
523 gap: 4px;
524 align-items: center;
525 }
526
527 .preview-item.file-preview .filename {
528 font-size: 0.75rem;
529 color: var(--color-text);
530 word-break: break-word;
531 line-height: 1.2;
532 max-height: 2.4em;
533 overflow: hidden;
534 text-overflow: ellipsis;
535 display: -webkit-box;
536 -webkit-line-clamp: 2;
537 -webkit-box-orient: vertical;
538 }
539
540 .preview-item.file-preview .extension {
541 background: var(--color-primary);
542 color: var(--color-text);
543 padding: 2px 6px;
544 border-radius: 4px;
545 font-size: 0.7rem;
546 text-transform: uppercase;
547 white-space: nowrap;
548 }
549
550 .remove-attachment {
551 position: absolute;
552 top: 0.1em;
553 right: 0.1em;
554 background-color: var(--color-accent);
555 color: white;
556 border: none;
557 border-radius: 50%;
558 width: 2em;
559 height: 2em;
560 /* font-size: 1em; */
561 cursor: pointer;
562 display: flex;
563 align-items: center;
564 justify-content: center;
565 transition: background-color 0.2s ease, box-shadow 0.2s ease,
566 opacity 0.2s ease;
567 z-index: 2;
568 opacity: 0;
569 }
570
571 .device-pointer .preview-item:hover .remove-attachment,
572 .device-pointer .attachment-item:hover .remove-attachment {
573 opacity: 1;
574 }
575
576 .device-touch .remove-attachment {
577 opacity: 1 !important;
578 /* font-size: 1.5em; */
579 top: 0.5em;
580 right: 0.5em;
581 }
582
583 .remove-attachment:hover {
584 background-color: var(--color-accent-dark);
585 box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.18), 0 6px 14px rgba(0, 0, 0, 0.24);
586 }
587
588 .device-touch .remove-attachment:active {
589 box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12) !important;
590 }
591
592 .remove-attachment:active {
593 box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12) !important;
594 }
595
596 .image-error {
597 border: 1px solid var(--color-error);
598 padding: 10px;
599 color: var(--color-error);
600 border-radius: 4px;
601 font-size: 0.9em;
602 display: flex;
603 align-items: center;
604 gap: 8px;
605 }
606
607 .image-error::before {
608 content: "⚠️";
609 }
610
611 /* Config Section */
612 .config-section > h4 {
613 margin-top: 0;
614 }
615
616 .config-list {
617 list-style-type: none;
618 margin: 0;
619 padding: 0;
620 }
621
622 .config-list li {
623 align-items: center;
624 /* border-top: 1px solid var(--color-border); */
625 display: -webkit-flex;
626 display: flex;
627 justify-content: space-between;
628 padding: 0.28rem 0;
629 }
630
631 .config-list > *:first-child {
632 border-top: 0px;
633 }
634
635 /* Attachment icon */
636 .attachment-wrapper {
637 position: relative;
638 flex-shrink: 0;
639 }
640
641 .attachment-icon {
642 cursor: pointer;
643 color: var(--color-text);
644 opacity: 0.7;
645 transition: opacity 0.2s ease;
646 display: flex;
647 align-items: center;
648 }
649
650 .attachment-icon:hover {
651 opacity: 1;
652 }
653
654 .attachment-icon:active {
655 opacity: 0.5;
656 }
657
658 /* Message attachments with unified tile system */
659 .attachments-container {
660 margin-top: 0.75em;
661 display: flex;
662 flex-wrap: wrap;
663 gap: 8px;
664 justify-content: flex-end;
665 padding: var(--spacing-sm);
666 /* background-color: var(--color-input); */
667 border-radius: 8px;
668 overflow: visible;
669 }
670
671 .attachment-item {
672 position: relative;
673 width: 6rem;
674 height: 6rem;
675 /* background-color: var(--color-background); */
676 border: 1px solid var(--color-border);
677 display: flex;
678 align-items: center;
679 justify-content: center;
680 overflow: hidden;
681 cursor: pointer;
682 transition: border-color 0.3s ease, box-shadow 0.3s ease,
683 filter 0.3s ease;
684 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
685 border-radius: var(--border-radius);
686 }
687
688 .attachment-item:hover {
689 border-color: var(--color-primary);
690 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
691 filter: brightness(1.02);
692 }
693
694 .light-mode .attachment-item:hover {
695 border-color: var(--color-primary-light);
696 }
697
698 /* Image attachment styling */
699 .attachment-item.image-type {
700 padding: 0;
701 }
702
703 .attachment-item.image-type .attachment-preview {
704 width: 100%;
705 height: 100%;
706 object-fit: cover;
707 border-radius: var(--border-radius);
708 background: repeating-linear-gradient(45deg, var(--color-panel) 0 10px, var(--color-chat-background) 10px 20px);
709
710 }
711
712
713 /* File attachment styling */
714 .attachment-item.file-type {
715 flex-direction: column;
716 padding: 12px;
717 text-align: center;
718 }
719
720 .attachment-item.file-type .file-icon {
721 width: 50%;
722 height: 50%;
723 }
724
725 .attachment-item.file-type .file-title {
726 font-size: 0.75rem;
727 color: var(--color-text);
728 word-break: break-word;
729 line-height: 1.2;
730 max-height: 2.4em;
731 overflow: hidden;
732 text-overflow: ellipsis;
733 display: -webkit-box;
734 -webkit-line-clamp: 2;
735 -webkit-box-orient: vertical;
736 text-align: center;
737 margin-top: auto;
738 }
739
740 /* Chat-history attachments overrides (flat styling) */
741
742 #chat-history .attachments-container {
743 padding: 0 !important;
744 }
745
746 .attachment-info,
747 .file-info {
748 display: flex;
749 flex-direction: column;
750 gap: 4px;
751 align-items: center;
752 width: 100%;
753 }
754
755 .attachment-name,
756 .filename,
757 .file-name {
758 font-size: 0.75rem;
759 color: var(--color-text);
760 word-break: break-word;
761 line-height: 1.2;
762 max-height: 2.4em;
763 overflow: hidden;
764 text-overflow: ellipsis;
765 display: -webkit-box;
766 -webkit-line-clamp: 2;
767 -webkit-box-orient: vertical;
768 text-align: center;
769 }
770
771 .attachment-ext,
772 .extension,
773 .file-ext {
774 background: var(--color-primary);
775 color: var(--color-text);
776 padding: 2px 6px;
777 border-radius: 4px;
778 font-size: 0.7rem;
779 text-transform: uppercase;
780 white-space: nowrap;
781 }
782
783 /* Preview section styles */
784 .preview-section {
785 display: flex;
786 flex-wrap: wrap;
787 gap: 8px;
788 margin-bottom: 10px;
789 padding: var(--spacing-xs);
790 }
791
792 /* .preview-item {
793 position: relative;
794 background: var(--color-secondary);
795 border-radius: 8px;
796 padding: 8px;
797 max-width: 200px;
798 display: flex;
799 align-items: center;
800 gap: 8px;
801 transition: background-color 0.2s ease;
802 } */
803
804 /* .preview-item.image-preview img {
805 max-height: 100px;
806 object-fit: cover;
807 border-radius: 4px;
808 } */
809
810 .image-wrapper {
811 width: 100%;
812 height: 100%;
813 display: flex;
814 align-items: center;
815 justify-content: center;
816 overflow: hidden;
817 border-radius: 10px;
818 }
819
820 .file-preview {
821 display: flex;
822 flex-direction: column;
823 align-items: center;
824 gap: 8px;
825 width: 100%;
826 height: 100%;
827 padding: 12px;
828 text-align: center;
829 }
830
831 .extension {
832 background: var(--color-primary);
833 color: var(--color-text);
834 padding: 2px 6px;
835 border-radius: 4px;
836 font-size: 0.7rem;
837 text-transform: uppercase;
838 }
839
840 .remove-attachment:hover {
841 background-color: var(--color-accent);
842 box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.18), 0 6px 14px rgba(0, 0, 0, 0.24);
843 }
844
845 .remove-attachment:active {
846 box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
847 }
848
849 /* Error handling */
850 .image-error {
851 border: 1px solid var(--color-error);
852 padding: 10px;
853 color: var(--color-error);
854 border-radius: 4px;
855 font-size: 0.9em;
856 display: flex;
857 align-items: center;
858 gap: 8px;
859 }
860
861 .image-error::before {
862 content: "⚠️";
863 }
864
865 /* Image preview section */
866 .image-preview-section {
867 display: flex;
868 gap: var(--spacing-md);
869 padding: var(--spacing-sm) var(--spacing-sm) 0.37rem var(--spacing-sm);
870 overflow-x: auto;
871 background-color: var(--color-input);
872 border-radius: 8px;
873 margin-bottom: var(--spacing-xs);
874 -webkit-transition: all 0.3s ease;
875 transition: all 0.3s ease;
876 }
877
878 .preview-item {
879 position: relative;
880 flex-shrink: 0;
881 padding: 4px;
882 animation: fadeIn 0.3s ease;
883 min-width: min-content;
884 background-color: var(--color-background);
885 }
886
887 .image-preview img {
888 max-height: 100px;
889 object-fit: cover;
890 border-radius: 8px;
891 /* border: 1px solid var(--color-border-light); */
892 }
893
894 .file-preview {
895 display: flex;
896 align-items: center;
897 gap: 0.5em;
898 }
899
900 .extension {
901 background: var(--color-primary);
902 color: var(--color-text);
903 padding: 2px 6px;
904 border-radius: 4px;
905 font-size: 0.8em;
906 text-transform: uppercase;
907 }
908
909 .remove-image {
910 -webkit-transform: scale(1.1);
911 transform: scale(1.1);
912 }
913
914 /* Toggle Switch */
915 .switch {
916 display: inline-block;
917 height: 1.15rem;
918 position: relative;
919 width: 2.2rem;
920 }
921
922 .switch input {
923 float: right;
924 height: 0;
925 opacity: 0;
926 width: 0;
927 }
928
929 .slider {
930 background-color: #272727;
931 border: 1px solid #535353;
932 border-radius: 1.15rem;
933 bottom: 0;
934 cursor: pointer;
935 left: 0;
936 position: absolute;
937 right: 0;
938 top: 0;
939 -webkit-transition: 0.4s ease-in-out;
940 transition: 0.4s ease-in-out;
941 }
942
943 .slider:before {
944 background-color: #b6b6b6;
945 border-radius: 50%;
946 bottom: 0.134rem;
947 content: "";
948 height: 0.8rem;
949 left: 0.15rem;
950 position: absolute;
951 -webkit-transition: 0.4s ease-in-out;
952 transition: 0.4s ease-in-out;
953 width: 0.8rem;
954 }
955
956 input:checked + .slider {
957 background-color: #3a3a3a;
958 }
959
960 input:checked + .slider:before {
961 -webkit-transform: translateX(1rem);
962 transform: translateX(1rem);
963 }
964
965 .status-icon {
966 display: flex;
967 justify-content: center;
968 align-items: center;
969 }
970
971 .status-icon svg {
972 width: 18px;
973 height: 18px;
974 }
975
976 .connected-circle,
977 .disconnected-circle {
978 -webkit-transition: all 0.3s ease;
979 transition: all 0.3s ease;
980 }
981
982 .connected-circle {
983 animation: heartbeat 1.5s ease-in-out infinite;
984 transform-origin: center;
985 }
986
987 .connected {
988 color: #00c340;
989 }
990
991 .disconnected {
992 color: #e40138;
993 }
994
995 .heartbeat {
996 animation: heartbeat 1.5s ease-in-out infinite;
997 }
998
999 .font-bold {
1000 font-weight: bold;
1001 }
1002
1003
1004 /* Media Queries */
1005 @media (max-width: 640px) {
1006 /* Responsive tiles for mobile */
1007 .preview-section {
1008 grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
1009 gap: 8px;
1010 padding: var(--spacing-xs);
1011 }
1012
1013 .attachments-container {
1014 gap: 6px;
1015 padding: var(--spacing-xs);
1016 }
1017 /*
1018 .preview-item,
1019 .attachment-item {
1020 width: 90px;
1021 height: 90px;
1022 border-radius: 8px;
1023 }
1024
1025 .preview-item.file-preview,
1026 .attachment-item.file-type {
1027 padding: 8px;
1028 }
1029
1030 .preview-item.file-preview .file-icon,
1031 .attachment-item.file-type .file-icon {
1032 width: 32px;
1033 height: 32px;
1034 margin-bottom: 4px;
1035 } */
1036
1037 /* .preview-item.file-preview .filename,
1038 .attachment-item.file-type .file-title,
1039 .attachment-name,
1040 .filename {
1041 font-size: 0.65rem;
1042 -webkit-line-clamp: 1;
1043 } */
1044
1045 /* .preview-item.file-preview .extension,
1046 .attachment-item.file-type .file-extension,
1047 .attachment-item.image-type .image-badge,
1048 .attachment-ext,
1049 .extension {
1050 font-size: 0.6rem;
1051 padding: 1px 4px;
1052 } */
1053
1054 /* .remove-attachment,
1055 .remove-image {
1056 width: 20px;
1057 height: 20px;
1058 top: 2px;
1059 right: 2px;
1060 } */
1061
1062 /* .attachment-item.image-type .image-badge {
1063 bottom: 4px;
1064 font-size: 0.55rem;
1065 padding: 1px 6px;
1066 } */
1067 }
1068
1069 @media (max-width: 640px) {
1070 .sidebar-overlay {
1071 display: none;
1072 position: fixed;
1073 top: 0;
1074 left: 0;
1075 right: 0;
1076 bottom: 0;
1077 background-color: rgba(0, 0, 0, 0);
1078 opacity: 0;
1079 z-index: 1002;
1080 }
1081
1082 .sidebar-overlay.visible {
1083 display: block;
1084 }
1085 }
1086
1087
1088 @media (max-height: 600px) {
1089 /* consistent font sizing */
1090 html {
1091 -webkit-text-size-adjust: 100%;
1092 -moz-text-size-adjust: 100%;
1093 -ms-text-size-adjust: 100%;
1094 text-size-adjust: 100%;
1095 }
1096
1097 body {
1098 -webkit-font-smoothing: antialiased;
1099 -moz-osx-font-smoothing: grayscale;
1100 }
1101 }
1102
1103 @media screen and (orientation: landscape) {
1104 /* lock font size during rotation */
1105 html {
1106 -webkit-text-size-adjust: none;
1107 text-size-adjust: none;
1108 }
1109 }
1110
1111 /* Link styling */
1112 a {
1113 color: inherit;
1114 /* text-decoration: none; */
1115 }
1116
1117 a:visited {
1118 color: inherit;
1119 }
1120
1121 a:hover {
1122 color: inherit;
1123 }
1124
1125 a:active {
1126 color: inherit;
1127 }
1128
1129
1130 .light-mode .connected {
1131 color: #4caf50;
1132 }
1133
1134 .light-mode .disconnected {
1135 color: #f44336;
1136 }
1137
1138 .light-mode .slider {
1139 background-color: #f1f1f1;
1140 border: 1px solid #dddddd;
1141 }
1142
1143 .light-mode .slider:before {
1144 background-color: #838383;
1145 }
1146
1147 .light-mode input:checked + .slider {
1148 background-color: #e6e6e6;
1149 }
1150
1151 .light-mode .extension {
1152 background: var(--color-primary);
1153 color: var(--color-background);
1154 opacity: 0.7;
1155 }
1156
1157 .dragdrop-overlay {
1158 position: fixed;
1159 top: 0;
1160 left: 0;
1161 width: 100%;
1162 height: 100%;
1163 background: rgba(0, 0, 0, 0.85);
1164 z-index: 9999;
1165 display: flex;
1166 justify-content: center;
1167 align-items: center;
1168 flex-direction: column;
1169 gap: 1rem;
1170 }
1171
1172 .light-mode .dragdrop-overlay {
1173 background: rgba(255, 255, 255, 0.92);
1174 }
1175
1176 /* Alpine transition classes */
1177 .transition {
1178 transition-property: all;
1179 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1180 }
1181
1182 .duration-300 {
1183 transition-duration: 300ms;
1184 }
1185
1186 .opacity-0 {
1187 opacity: 0;
1188 }
1189
1190 .opacity-100 {
1191 opacity: 1;
1192 }
1193
1194 /* Rest of dragdrop styles remain the same */
1195 .dragdrop-icon {
1196 width: 128px;
1197 height: 128px;
1198 opacity: 0.85;
1199 filter: invert(1);
1200 }
1201
1202 .light-mode .dragdrop-icon {
1203 filter: none;
1204 }
1205
1206 .dragdrop-text {
1207 color: var(--color-text);
1208 font-size: 1.2rem;
1209 opacity: 0.85;
1210 text-align: center;
1211 max-width: 80%;
1212 line-height: 1.5;
1213 }
1214
1215 .dragdrop-subtext {
1216 color: var(--color-text);
1217 font-size: 0.9rem;
1218 opacity: 0.6;
1219 }
1220
1221 .path-link {
1222 margin-left: 0.1em;
1223 margin-right: 0.1em;
1224 }
1225
1226 /* Alpine cloak to prevent FOUC */
1227 [x-cloak] {
1228 display: none !important;
1229 }
1230
1231 /* Remove unnecessary specific media query that was causing issues */
1232 @media (max-width: 480px) {
1233 .text-button svg {
1234 width: 16px;
1235 height: 16px;
1236 }
1237 }
1238
1239 /* Settings Modal Styles */
1240 .settings-modal {
1241 position: fixed;
1242 top: 0;
1243 left: 0;
1244 right: 0;
1245 bottom: 0;
1246 z-index: 1000;
1247 background-color: rgba(0, 0, 0, 0.75);
1248 display: flex;
1249 justify-content: center;
1250 align-items: center;
1251 overflow: auto;
1252 padding: 24px;
1253 }
1254
1255 .settings-modal-close {
1256 position: absolute;
1257 top: 8px;
1258 right: 16px;
1259 border: none;
1260 background: transparent;
1261 font-size: 24px;
1262 cursor: pointer;
1263 color: var(--color-text-secondary);
1264 }
1265
1266 .settings-modal-title {
1267 margin-top: 0;
1268 margin-bottom: 24px;
1269 font-size: 0.95rem;
1270 text-align: center;
1271 border-bottom: 1px solid var(--color-border);
1272 padding-bottom: 12px;
1273 }
1274
1275 .settings-modal-content {
1276 background-color: var(--color-panel);
1277 color: var(--color-text);
1278 width: 100%;
1279 max-width: 800px;
1280 height: auto;
1281 max-height: 90vh;
1282 border-radius: 8px;
1283 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
1284 padding: 24px;
1285 position: relative;
1286 overflow: auto;
1287 }
1288
1289 /* Settings Sections */
1290 nav ul {
1291 display: grid;
1292 grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1293 gap: 1rem;
1294 padding: 0;
1295 margin: 0 0 1rem 0;
1296 list-style: none;
1297 }
1298
1299 /* Add specific styling for the nav element itself to ensure spacing */
1300 nav {
1301 margin-bottom: 1rem;
1302 }
1303
1304 nav ul li a {
1305 display: flex;
1306 flex-direction: column;
1307 align-items: center;
1308 padding: 1rem;
1309 border-radius: 0.5rem;
1310 background-color: var(--color-bg-secondary);
1311 text-decoration: none;
1312 color: var(--color-text);
1313 transition: background-color 0.2s ease;
1314 }
1315
1316 nav ul li a:hover {
1317 background-color: var(--color-bg-tertiary);
1318 }
1319
1320 nav ul li a img {
1321 width: 50px;
1322 height: 50px;
1323 margin-bottom: 0.5rem;
1324 filter: var(--svg-filter);
1325 }
1326
1327 .section {
1328 margin-bottom: 3rem;
1329 animation: fadeIn 0.3s ease;
1330 width: 100%;
1331 }
1332
1333 .section-title {
1334 margin-top: 0;
1335 margin-bottom: 0.5rem;
1336 font-size: 1.5rem;
1337 font-weight: 500;
1338 color: var(--color-primary);
1339 border-bottom: 1px solid var(--color-border);
1340 padding-bottom: 0.5rem;
1341 }
1342
1343 .section-description {
1344 margin-bottom: 1.5rem;
1345 color: var(--color-text-secondary);
1346 }
1347
1348 .icon {
1349 vertical-align: middle;
1350 }
1351
1352 /* Animations */
1353 @keyframes fadeIn {
1354 from {
1355 opacity: 0;
1356 transform: translateY(var(--spacing-sm));
1357 }
1358 to {
1359 opacity: 1;
1360 transform: translateY(0);
1361 }
1362 }
1363
1364 @-webkit-keyframes fadeIn {
1365 /* Safari and older Chrome */
1366 from {
1367 opacity: 0;
1368 -webkit-transform: translateY(var(--spacing-sm));
1369 transform: translateY(var(--spacing-sm));
1370 }
1371 to {
1372 opacity: 1;
1373 -webkit-transform: translateY(0);
1374 transform: translateY(0);
1375 }
1376 }
1377
1378 @keyframes heartbeat {
1379 0% {
1380 transform: scale(1);
1381 }
1382 14% {
1383 transform: scale(1.1);
1384 }
1385 28% {
1386 transform: scale(1);
1387 }
1388 42% {
1389 transform: scale(1.08);
1390 }
1391 70% {
1392 transform: scale(1);
1393 }
1394 100% {
1395 transform: scale(1);
1396 }
1397 }
1398
1399
1400 @keyframes spin {
1401 to {
1402 transform: rotate(360deg);
1403 }
1404 }
1405 .spin {
1406 animation: spin 1s linear infinite;
1407 }
1408
1409 /* Bootstrap Collapse */
1410 .collapse:not(.show) {
1411 display: none !important;
1412 }
1413 .collapsing {
1414 height: 0;
1415 overflow: hidden;
1416 transition: height .35s ease;
1417 }
1418
1419 /* Arrow rotation based on Bootstrap's .collapsed class */
1420 [data-bs-toggle="collapse"] .arrow-icon {
1421 transform: rotate(90deg);
1422 transition: transform .15s ease;
1423 }
1424 [data-bs-toggle="collapse"].collapsed .arrow-icon {
1425 transform: rotate(0deg);
1426 }
1427
1428 .project-color-ball {
1429 width: 0.6em;
1430 height: 0.6em;
1431 border-radius: 50%;
1432 display: inline-block;
1433 box-sizing: border-box;
1434 flex-shrink: 0;
1435 }
1436
1437 /* ========================================
1438 Global Dropdown Component Styles
1439 ======================================== */
1440
1441 /* Dropdown container - position relative for absolute menu */
1442 .dropdown {
1443 position: relative;
1444 display: inline-block;
1445 }
1446
1447 /* Dropdown trigger button */
1448 .dropdown-trigger {
1449 display: flex;
1450 align-items: center;
1451 justify-content: center;
1452 cursor: pointer;
1453 background: transparent;
1454 border: none;
1455 color: var(--color-text);
1456 padding: var(--spacing-xs);
1457 transition: all var(--transition-speed) ease;
1458 }
1459
1460 .dropdown-trigger:hover {
1461 opacity: 1;
1462 }
1463
1464 .dropdown-trigger:active {
1465 opacity: 0.5;
1466 }
1467
1468 /* Dropdown menu */
1469 .dropdown-menu {
1470 position: absolute;
1471 top: 100%;
1472 right: 0;
1473 min-width: 180px;
1474 max-height: 70vh;
1475 overflow-y: auto;
1476 background-color: var(--color-panel);
1477 border: 1px solid var(--color-border);
1478 border-radius: 0.5rem;
1479 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
1480 z-index: 1010;
1481 padding: var(--spacing-xs) 0;
1482 margin-top: var(--spacing-xs);
1483 }
1484
1485 .dropdown-menu.left {
1486 left: 0;
1487 right: auto;
1488 }
1489
1490 /* Dropdown menu items */
1491 .dropdown-item {
1492 display: flex;
1493 align-items: center;
1494 gap: var(--spacing-sm);
1495 width: 100%;
1496 padding: var(--spacing-sm) var(--spacing-md);
1497 background: transparent;
1498 border: none;
1499 color: var(--color-text);
1500 font-family: var(--font-family-main);
1501 font-size: var(--font-size-small);
1502 text-align: left;
1503 opacity: 0.8;
1504 cursor: pointer;
1505 transition: background-color 0.15s ease;
1506 white-space: nowrap;
1507 }
1508
1509 .dropdown-item:hover {
1510 background-color: var(--color-background-hover);
1511 opacity: 1;
1512 }
1513
1514 .dropdown-item:active {
1515 opacity: 0.7;
1516 }
1517
1518 .dropdown-item:disabled {
1519 opacity: 0.4;
1520 cursor: not-allowed;
1521 pointer-events: none;
1522 }
1523
1524 .dropdown-item svg {
1525 width: 18px;
1526 height: 18px;
1527 flex-shrink: 0;
1528 opacity: 0.8;
1529 }
1530
1531 .dropdown-item .material-symbols-outlined {
1532 font-size: 18px;
1533 flex-shrink: 0;
1534 opacity: 0.8;
1535 }
1536
1537 /* Dropdown separator */
1538 .dropdown-separator {
1539 height: 1px;
1540 background-color: var(--color-border);
1541 margin: var(--spacing-xs) 0;
1542 }
1543
1544 /* Dropdown header/label */
1545 .dropdown-header {
1546 padding: var(--spacing-xs) var(--spacing-md);
1547 font-size: 0.7rem;
1548 color: var(--color-primary);
1549 text-transform: uppercase;
1550 letter-spacing: 0.05em;
1551 opacity: 0.8;
1552 }
1553
1554 /* Light mode adjustments */
1555 .light-mode .dropdown-menu {
1556 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
1557 }
1558
1559 .light-mode .dropdown-item:hover { background-color: var(--color-background-hover); }
1560
1561 .display-none{
1562 display: none !important;
1563 }
1564
1565 .no-scrollbar {
1566 scrollbar-width: none; /* Firefox */
1567 -ms-overflow-style: none; /* IE/Edge */
1568 }
1569
1570 .no-scrollbar::-webkit-scrollbar {
1571 display: none; /* Chrome/Safari/Webkit */
1572 }
1573
1574 body * {
1575 scrollbar-width: thin;
1576 scrollbar-color: #555 transparent;
1577 }
1578
1579 body *::-webkit-scrollbar {
1580 width: 5px;
1581 }
1582
1583 body *::-webkit-scrollbar-track {
1584 box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3);
1585 border-radius: 3px;
1586 }
1587
1588 body *::-webkit-scrollbar-thumb {
1589 border-radius: 3px;
1590 box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3);
1591 background-color: #555;
1592 -webkit-transition: background-color var(--transition-speed) ease-in-out;
1593 transition: background-color var(--transition-speed) ease-in-out;
1594 }
1595
1596 body *::-webkit-scrollbar-thumb:hover {
1597 background-color: #666;
1598 }
1599
1600 body *::-webkit-scrollbar-thumb:active {
1601 background-color: #888;
1602 }
1603
1604 .light-mode * {
1605 scrollbar-color: #b7b7b7 transparent;
1606 }
1607
1608 .light-mode *::-webkit-scrollbar-track {
1609 box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.12);
1610 }
1611
1612 .light-mode *::-webkit-scrollbar-thumb {
1613 box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.12);
1614 background-color: #b7b7b7;
1615 }
1616
1617 .light-mode *::-webkit-scrollbar-thumb:hover {
1618 background-color: #9f9f9f;
1619 }
1620
1621 .light-mode *::-webkit-scrollbar-thumb:active {
1622 background-color: #8a8a8a;
1623 }