atproto blogging
1/* Markdown Editor Styling - using Rose Pine theme variables */
2
3.editor-page {
4 width: 100%;
5 height: 100%;
6 background: var(--color-base);
7 overflow: hidden;
8}
9
10.markdown-editor-container {
11 display: grid;
12 grid-template-columns: 1fr auto;
13 grid-template-rows: auto auto 1fr;
14 height: 100%;
15 max-width: calc(95ch + 100px);
16 margin: 0 auto;
17 padding: 0 20px;
18 font-family: var(--font-body);
19 background: var(--color-base);
20 color: var(--color-text);
21 gap: 0 8px;
22}
23
24/* Title bar */
25.editor-title-bar {
26 grid-column: 1;
27 padding: 16px 0 8px 0;
28}
29
30.editor-title-bar .title-input {
31 width: 100%;
32 padding: 8px 0;
33 border: none;
34 border-bottom: 2px solid var(--color-border);
35 background: transparent;
36 color: var(--color-text);
37 font-family: var(--font-heading);
38 font-size: 24px;
39 font-weight: 500;
40 outline: none;
41}
42
43.editor-title-bar .title-input:focus {
44 border-bottom-color: var(--color-primary);
45}
46
47.editor-title-bar .title-input::placeholder {
48 color: var(--color-muted);
49}
50
51/* Meta row - path, tags, and publish inline */
52.editor-meta-row {
53 grid-column: 1;
54 display: flex;
55 gap: 24px;
56 padding: 8px 0 16px 0;
57 align-items: flex-end;
58}
59
60.editor-meta-row label {
61 display: block;
62 font-size: 11px;
63 font-weight: 500;
64 color: var(--color-muted);
65 text-transform: uppercase;
66 letter-spacing: 0.05em;
67 margin-bottom: 4px;
68}
69
70.meta-path {
71 flex-shrink: 0;
72}
73
74.meta-path .path-input {
75 padding: 4px 8px;
76 border: 1px solid var(--color-border);
77 border-radius: 4px;
78 background: var(--color-surface);
79 color: var(--color-text);
80 font-family: var(--font-mono);
81 font-size: 13px;
82 min-width: 150px;
83}
84
85.meta-path .path-input:focus {
86 outline: none;
87 border-color: var(--color-primary);
88}
89
90.meta-tags {
91 flex: 1;
92}
93
94.tags-container {
95 display: flex;
96 flex-wrap: wrap;
97 gap: 6px;
98 align-items: center;
99}
100
101.tag-chip {
102 display: inline-flex;
103 align-items: center;
104 gap: 4px;
105 padding: 4px 8px;
106 background: var(--color-overlay);
107 border-radius: 12px;
108 font-size: 13px;
109 color: var(--color-text);
110}
111
112.tag-remove {
113 background: none;
114 border: none;
115 color: var(--color-muted);
116 cursor: pointer;
117 padding: 0 2px;
118 font-size: 14px;
119 line-height: 1;
120}
121
122.tag-remove:hover {
123 color: var(--color-love);
124}
125
126.tag-input {
127 padding: 4px 8px;
128 border: 1px dashed var(--color-border);
129 border-radius: 12px;
130 background: transparent;
131 color: var(--color-text);
132 font-family: var(--font-ui);
133 font-size: 13px;
134 min-width: 80px;
135}
136
137.tag-input:focus {
138 outline: none;
139 border-color: var(--color-primary);
140 border-style: solid;
141}
142
143/* Editor content wrapper */
144.editor-content-wrapper {
145 grid-column: 1;
146 display: flex;
147 flex-direction: column;
148 min-height: 0;
149 position: relative; /* For remote cursor overlay positioning */
150}
151
152.editor-content {
153 flex: 1;
154 padding: 20px;
155 overflow-y: auto;
156 outline: none;
157 min-height: 700px;
158 line-height: var(--spacing-line-height);
159 background: var(--color-base);
160 border: 1px solid var(--color-overlay);
161 color: var(--color-text);
162 /* break-spaces ensures trailing whitespace takes up space and allows cursor placement */
163 white-space-collapse: break-spaces;
164 /* Wrap long words/URLs only when they would overflow */
165 overflow-wrap: break-word;
166}
167
168.editor-content:focus {
169 border: 1px solid var(--color-border);
170}
171
172/* Override entry CSS margins - break-spaces already renders newlines visually */
173.editor-content p {
174 margin-bottom: 0 !important;
175}
176
177.editor-content h1,
178.editor-content h2,
179.editor-content h3,
180.editor-content h4,
181.editor-content h5,
182.editor-content h6 {
183 margin-top: 0 !important;
184 margin-bottom: 0 !important;
185}
186
187.editor-content pre {
188 margin-bottom: 0 !important;
189}
190
191.editor-content blockquote {
192 margin-top: 0 !important;
193 margin-bottom: 0 !important;
194}
195
196.editor-content ul,
197.editor-content ol {
198 margin-bottom: 0 !important;
199}
200
201.editor-toolbar {
202 grid-column: 2;
203 grid-row: 3;
204 display: flex;
205 flex-direction: column;
206 gap: 4px;
207 padding: 8px;
208 background: var(--color-base);
209 align-self: start;
210 min-width: 60px;
211}
212
213.toolbar-button {
214 padding: 8px 12px;
215 border: 1px solid var(--color-border);
216 background: var(--color-surface);
217 color: var(--color-text);
218 border-radius: 4px;
219 cursor: pointer;
220 font-weight: 600;
221 text-align: center;
222 transition: background 0.2s ease;
223}
224
225.toolbar-button:hover {
226 background: var(--color-overlay);
227}
228
229.toolbar-separator {
230 height: 1px;
231 background: var(--color-border);
232 margin: 4px 0;
233}
234
235.editor-debug {
236 padding: 8px;
237 padding-inline-end: 0;
238 background: var(--color-base);
239 font-family: var(--font-mono);
240 font-size: 12px;
241 width: 100%;
242 display: flex;
243 flex-direction: row;
244 justify-content: space-between;
245 color: var(--color-muted);
246}
247
248/* Markdown syntax characters - inline (**, *, ~~, `, etc) */
249.md-syntax-inline {
250 color: var(--color-muted);
251 opacity: 0.6;
252}
253
254/* Markdown syntax characters - block level (#, >, -, etc) */
255.md-syntax-block {
256 color: var(--color-muted);
257 opacity: 0.7;
258 font-weight: normal;
259}
260
261/* Hidden syntax spans - collapsed when cursor is not near */
262.md-syntax-inline.hidden,
263.md-syntax-block.hidden,
264.image-alt.hidden,
265.math-source.hidden {
266 display: none;
267}
268
269/* Math source is hidden by default, shown when syntax is visible */
270.math-source {
271 display: none;
272 color: var(--color-text);
273 font-family: var(--font-mono);
274 white-space: pre-wrap;
275 background: color-mix(in srgb, var(--color-primary) 10%, transparent);
276 padding: 0 2px;
277 border-radius: 2px;
278}
279
280/* When syntax is visible (cursor nearby), show source too */
281.math-source:not(.hidden) {
282 display: inline;
283}
284
285/* Rendered math is always visible */
286.math-rendered {
287 display: inline;
288}
289
290.math-display.math-rendered {
291 display: block;
292 text-align: center;
293 margin: 0.5rem 0;
294}
295
296/* Clickable math - click to edit */
297.math-clickable {
298 cursor: pointer;
299}
300
301/* Math error styling */
302.math-error {
303 border: 1px dashed var(--color-error, #eb6f92);
304 border-radius: 4px;
305 padding: 2px 6px;
306 background: color-mix(in srgb, var(--color-error, #eb6f92) 10%, transparent);
307}
308
309.math-error code {
310 font-family: var(--font-mono);
311 font-size: 0.9em;
312}
313
314/* Hide HTML list markers when markdown syntax is visible (not hidden) */
315/* This prevents double bullets/numbers when showing "- " or "1. " */
316li:has(.md-syntax-block:not(.hidden)) {
317 list-style-type: none;
318}
319
320/* Cursor positioning helper after <br> */
321.br-cursor {
322 display: inline-block;
323 font-size: 0;
324 width: 0;
325 height: 1em; /* force height so cursor is visible */
326 line-height: 1em;
327 vertical-align: baseline;
328}
329
330/* Editor page header with report button */
331.editor-header {
332 padding-inline-start: 6rem;
333 background: var(--color-base);
334}
335
336.editor-header h1 {
337 margin: 0;
338 color: var(--color-text);
339}
340
341/* Bug report button and dialog */
342.report-bug-button {
343 padding: 0.5rem 1rem;
344 background: var(--color-surface);
345 border: 1px solid var(--color-border);
346 border-radius: 4px;
347 color: var(--color-text);
348 cursor: pointer;
349 font-size: 0.9rem;
350 font-family: var(--font-ui);
351}
352
353.report-bug-button:hover {
354 background: var(--color-overlay);
355}
356
357.report-dialog-overlay {
358 position: fixed;
359 inset-inline: 0;
360 top: 0;
361 bottom: 0;
362 background: rgba(0, 0, 0, 0.6);
363 display: flex;
364 align-items: center;
365 justify-content: center;
366 z-index: 1000;
367}
368
369.report-dialog {
370 background: var(--color-surface);
371 border: 1px solid var(--color-border);
372 border-radius: 8px;
373 padding: 1.5rem;
374 max-width: 1000px;
375 width: 90%;
376 max-height: 80vh;
377 overflow-y: auto;
378 color: var(--color-text);
379}
380
381.report-dialog h2 {
382 margin: 0 0 1rem 0;
383 color: var(--color-emphasis);
384}
385
386.report-section {
387 margin-bottom: 1rem;
388}
389
390.report-section label {
391 display: block;
392 margin-bottom: 0.5rem;
393 font-weight: 500;
394 color: var(--color-text);
395}
396
397.report-section h4 {
398 margin: 0.5rem 0;
399 color: var(--color-subtle);
400}
401
402.report-section pre {
403 background: var(--color-base);
404 padding: 1rem;
405 border-radius: 4px;
406 overflow-x: auto;
407 font-size: 0.8rem;
408 font-family: var(--font-mono);
409 overflow-y: auto;
410 color: var(--color-text);
411}
412
413.report-comment {
414 width: 100%;
415 padding: 1rem;
416 border: 1px solid var(--color-border);
417 border-radius: 4px;
418 background: var(--color-base);
419 color: var(--color-text);
420 font-family: var(--font-ui);
421 resize: vertical;
422}
423
424.report-details {
425 margin: 1rem 0;
426}
427
428.report-details summary {
429 cursor: pointer;
430 color: var(--color-muted);
431}
432
433.report-actions {
434 display: flex;
435 gap: 1rem;
436 justify-content: flex-end;
437 margin-top: 1rem;
438}
439
440.report-cancel {
441 padding: 0.5rem 1rem;
442 background: transparent;
443 border: 1px solid var(--color-border);
444 border-radius: 4px;
445 color: var(--color-text);
446 cursor: pointer;
447 font-family: var(--font-ui);
448}
449
450.report-cancel:hover {
451 background: var(--color-overlay);
452}
453
454.report-submit {
455 padding: 0.5rem 1rem;
456 background: var(--color-primary);
457 border: none;
458 border-radius: 4px;
459 color: var(--color-base);
460 cursor: pointer;
461 font-weight: 500;
462 font-family: var(--font-ui);
463}
464
465.report-submit:hover {
466 opacity: 0.9;
467}
468
469/* Publish button and dialog - matches report dialog theming */
470/* Actions container for sync status + publish button */
471.meta-actions {
472 display: flex;
473 align-items: center;
474 gap: 12px;
475 margin-inline-start: auto;
476 flex-shrink: 0;
477}
478
479.publish-button {
480 padding: 0.5rem 1rem;
481 background: var(--color-primary);
482 border: none;
483 border-radius: 4px;
484 color: var(--color-base);
485 cursor: pointer;
486 font-weight: 500;
487 font-family: var(--font-ui);
488}
489
490.publish-button:hover:not(:disabled) {
491 opacity: 0.9;
492}
493
494.publish-button:disabled {
495 opacity: 0.5;
496 cursor: not-allowed;
497}
498
499.publish-dialog-overlay {
500 position: fixed;
501 inset-inline: 0;
502 top: 0;
503 bottom: 0;
504 background: rgba(0, 0, 0, 0.6);
505 display: flex;
506 align-items: center;
507 justify-content: center;
508 z-index: 1000;
509}
510
511.publish-dialog {
512 background: var(--color-surface);
513 border: 1px solid var(--color-border);
514 border-radius: 8px;
515 padding: 1.5rem;
516 max-width: 500px;
517 width: 90%;
518 color: var(--color-text);
519}
520
521.publish-dialog h2 {
522 margin: 0 0 1rem 0;
523 color: var(--color-emphasis);
524}
525
526.publish-field {
527 margin-bottom: 1rem;
528}
529
530.publish-field label {
531 display: block;
532 margin-bottom: 0.5rem;
533 font-size: 12px;
534 font-weight: 500;
535 color: var(--color-muted);
536 text-transform: uppercase;
537 letter-spacing: 0.05em;
538}
539
540.publish-input {
541 width: 100%;
542 padding: 8px 12px;
543 border: 1px solid var(--color-border);
544 border-radius: 4px;
545 background: var(--color-base);
546 color: var(--color-text);
547 font-family: var(--font-ui);
548 font-size: 14px;
549 box-sizing: border-box;
550}
551
552.publish-input:focus {
553 outline: none;
554 border-color: var(--color-primary);
555}
556
557.publish-preview {
558 background: var(--color-base);
559 padding: 1rem;
560 border-radius: 4px;
561 margin-bottom: 1rem;
562 font-size: 0.9rem;
563}
564
565.publish-preview p {
566 margin: 0.25rem 0;
567 color: var(--color-subtle);
568}
569
570.publish-error {
571 background: var(--color-love);
572 color: var(--color-base);
573 padding: 0.75rem;
574 border-radius: 4px;
575 margin-bottom: 1rem;
576 font-size: 0.9rem;
577}
578
579.publish-success {
580 text-align: center;
581 padding: 1rem 0;
582}
583
584.publish-success p {
585 color: var(--color-foam);
586 margin-bottom: 1rem;
587}
588
589.publish-success a {
590 color: var(--color-primary);
591 text-decoration: none;
592}
593
594.publish-success a:hover {
595 text-decoration: underline;
596}
597
598.publish-done {
599 margin-top: 1rem;
600 padding: 0.5rem 1.5rem;
601 background: var(--color-primary);
602 border: none;
603 border-radius: 4px;
604 color: var(--color-base);
605 cursor: pointer;
606 font-family: var(--font-ui);
607}
608
609.publish-actions {
610 display: flex;
611 gap: 1rem;
612 justify-content: flex-end;
613}
614
615.publish-cancel {
616 padding: 0.5rem 1rem;
617 background: transparent;
618 border: 1px solid var(--color-border);
619 border-radius: 4px;
620 color: var(--color-text);
621 cursor: pointer;
622 font-family: var(--font-ui);
623}
624
625.publish-cancel:hover:not(:disabled) {
626 background: var(--color-overlay);
627}
628
629.publish-cancel:disabled {
630 opacity: 0.5;
631 cursor: not-allowed;
632}
633
634.publish-submit {
635 padding: 0.5rem 1rem;
636 background: var(--color-primary);
637 border: none;
638 border-radius: 4px;
639 color: var(--color-base);
640 cursor: pointer;
641 font-weight: 500;
642 font-family: var(--font-ui);
643}
644
645.publish-submit:hover:not(:disabled) {
646 opacity: 0.9;
647}
648
649.publish-submit:disabled {
650 opacity: 0.5;
651 cursor: not-allowed;
652}
653
654/* Image upload dialog */
655.image-preview-container {
656 display: flex;
657 justify-content: center;
658 margin-bottom: 1rem;
659}
660
661.image-preview {
662 max-width: 100%;
663 max-height: 300px;
664 border-radius: 4px;
665 object-fit: contain;
666}
667
668.image-alt-input-container {
669 display: flex;
670 flex-direction: column;
671 gap: 0.5rem;
672}
673
674.image-alt-input-container label {
675 font-weight: 500;
676 color: var(--color-text);
677}
678
679.image-alt-input {
680 width: 100%;
681 padding: 0.75rem;
682 border: 1px solid var(--color-border);
683 border-radius: 4px;
684 background: var(--color-base);
685 color: var(--color-text);
686 font-family: var(--font-ui);
687 resize: vertical;
688}
689
690.image-alt-input::placeholder {
691 color: var(--color-muted);
692}
693
694.dialog-actions {
695 display: flex;
696 gap: 1rem;
697 justify-content: flex-end;
698 margin-top: 1rem;
699}
700
701/* Sync status indicator */
702.sync-status {
703 display: inline-flex;
704 align-items: center;
705 gap: 6px;
706 padding: 4px 10px;
707 border-radius: 12px;
708 font-size: 12px;
709 cursor: pointer;
710 transition:
711 background 0.2s ease,
712 opacity 0.2s ease;
713 user-select: none;
714}
715
716.sync-status:hover {
717 opacity: 0.8;
718}
719
720.sync-status .sync-icon {
721 font-size: 10px;
722 line-height: 1;
723}
724
725.sync-status .sync-label {
726 font-weight: 500;
727}
728
729/* Synced state - subtle success */
730.sync-status.synced {
731 background: color-mix(in srgb, var(--color-success) 15%, transparent);
732 color: var(--color-success);
733}
734
735/* Syncing state - in progress */
736.sync-status.syncing {
737 background: color-mix(in srgb, var(--color-warning) 15%, transparent);
738 color: var(--color-warning);
739 cursor: wait;
740}
741
742.sync-status.syncing .sync-icon {
743 animation: spin 1s linear infinite;
744}
745
746@keyframes spin {
747 from {
748 transform: rotate(0deg);
749 }
750 to {
751 transform: rotate(360deg);
752 }
753}
754
755/* Unsynced state - has pending changes */
756.sync-status.unsynced {
757 background: color-mix(in srgb, var(--color-warning) 20%, transparent);
758 color: var(--color-warning);
759}
760
761/* Remote changes available - collaborator updates */
762.sync-status.remote-changes {
763 background: color-mix(in srgb, var(--color-primary) 20%, transparent);
764 color: var(--color-primary);
765 animation: pulse-subtle 2s ease-in-out infinite;
766}
767
768.sync-status.remote-changes:hover {
769 animation: none;
770}
771
772/* Error state */
773.sync-status.error {
774 background: color-mix(in srgb, var(--color-error) 15%, transparent);
775 color: var(--color-error);
776}
777
778/* Disabled state */
779.sync-status.disabled {
780 background: var(--color-overlay);
781 color: var(--color-muted);
782 cursor: default;
783 opacity: 0.6;
784}
785
786.sync-status.disabled:hover {
787 opacity: 0.6;
788}
789
790@keyframes pulse-subtle {
791 0%,
792 100% {
793 opacity: 1;
794 }
795 50% {
796 opacity: 0.7;
797 }
798}
799
800/* ==========================================================================
801 COLLABORATORS
802 ========================================================================== */
803
804/* Inline avatars in meta row */
805.collaborator-avatars {
806 display: flex;
807 align-items: center;
808 cursor: pointer;
809 padding: 2px;
810}
811
812.collaborator-avatars:hover .collab-avatar {
813 border-color: var(--color-primary);
814}
815
816.collab-avatar {
817 width: 24px;
818 height: 24px;
819 background: var(--color-surface);
820 color: var(--color-muted);
821 display: flex;
822 border-radius: 4px;
823 align-items: center;
824 justify-content: center;
825 font-size: 11px;
826 font-weight: 500;
827 font-family: var(--font-mono);
828 text-transform: uppercase;
829 margin-inline-start: -6px;
830 position: relative;
831 overflow: hidden;
832}
833
834.collab-avatar-img {
835 width: 100%;
836 height: 100%;
837
838 object-fit: cover;
839}
840
841.collab-avatar:first-child {
842 margin-inline-start: 0;
843}
844
845.collab-avatar.collab-overflow {
846 background: var(--color-overlay);
847 color: var(--color-subtle);
848 font-size: 10px;
849}
850
851.collab-avatar.collab-add {
852 background: transparent;
853 border: 1px solid var(--color-border);
854 color: var(--color-muted);
855 font-size: 14px;
856}
857
858.collab-avatar.collab-add:hover {
859 border-color: var(--color-primary);
860 color: var(--color-primary);
861}
862
863/* Collaborators panel overlay */
864.collaborators-overlay {
865 position: fixed;
866 inset-inline: 0;
867 top: 0;
868 bottom: 0;
869 background: rgba(0, 0, 0, 0.4);
870 display: flex;
871 align-items: center;
872 justify-content: center;
873 z-index: 1000;
874}
875
876@media (prefers-color-scheme: dark) {
877 .collaborators-overlay {
878 background: rgba(0, 0, 0, 0.6);
879 }
880}
881
882.collaborators-modal {
883 background: var(--color-surface);
884 border: 1px solid var(--color-border);
885 padding: 0;
886 max-width: 400px;
887 width: 90%;
888 max-height: 80vh;
889 overflow-y: auto;
890 box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1);
891}
892
893@media (prefers-color-scheme: dark) {
894 .collaborators-modal {
895 box-shadow: none;
896 }
897}
898
899/* Collaborators panel content */
900.collaborators-panel {
901 padding: 1rem;
902}
903
904.collaborators-header {
905 display: flex;
906 justify-content: space-between;
907 align-items: center;
908 margin-bottom: 1rem;
909 padding-bottom: 0.75rem;
910 border-bottom: 1px solid var(--color-border);
911}
912
913.collaborators-header h4 {
914 margin: 0;
915 font-size: 14px;
916 font-weight: 600;
917 color: var(--color-text);
918}
919
920.collaborators-header-actions {
921 display: flex;
922 gap: 4px;
923}
924
925.collaborators-list {
926 display: flex;
927 flex-direction: column;
928 gap: 6px;
929 margin-bottom: 0.75rem;
930}
931
932.collaborator {
933 display: flex;
934 justify-content: space-between;
935 align-items: center;
936 padding: 8px 10px;
937 background: var(--color-overlay);
938 border: 1px solid transparent;
939}
940
941.collaborator.pending {
942 border-style: dashed;
943 border-color: var(--color-border);
944 background: transparent;
945}
946
947.collaborator-did {
948 font-family: var(--font-mono);
949 font-size: 12px;
950 color: var(--color-text);
951 overflow: hidden;
952 text-overflow: ellipsis;
953 white-space: nowrap;
954 max-width: 280px;
955}
956
957.collaborator-status {
958 font-size: 12px;
959 color: var(--color-muted);
960}
961
962.collaborator.accepted .collaborator-status {
963 color: var(--color-success);
964}
965
966.collaborators-summary {
967 font-size: 11px;
968 color: var(--color-muted);
969 text-align: right;
970}
971
972.collaborators-panel .empty-state {
973 color: var(--color-muted);
974 font-size: 13px;
975 text-align: center;
976 padding: 1.5rem 0;
977 margin: 0;
978}
979
980/* ==========================================================================
981 INVITE DIALOG
982 ========================================================================== */
983
984.invite-dialog-overlay {
985 position: fixed;
986 inset-inline: 0;
987 top: 0;
988 bottom: 0;
989 background: rgba(0, 0, 0, 0.4);
990 display: flex;
991 align-items: center;
992 justify-content: center;
993 z-index: 1001;
994}
995
996@media (prefers-color-scheme: dark) {
997 .invite-dialog-overlay {
998 background: rgba(0, 0, 0, 0.6);
999 }
1000}
1001
1002.invite-dialog {
1003 background: var(--color-surface);
1004 border: 1px solid var(--color-border);
1005 padding: 1.25rem;
1006 max-width: 420px;
1007 width: 90%;
1008 box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1);
1009}
1010
1011@media (prefers-color-scheme: dark) {
1012 .invite-dialog {
1013 box-shadow: none;
1014 }
1015}
1016
1017.invite-dialog h3 {
1018 margin: 0 0 1rem 0;
1019 font-size: 15px;
1020 font-weight: 600;
1021 color: var(--color-text);
1022}
1023
1024.invite-dialog .invite-resource-info {
1025 font-size: 12px;
1026 color: var(--color-muted);
1027 margin-bottom: 1rem;
1028 padding: 8px 10px;
1029 background: var(--color-overlay);
1030 border: 1px solid var(--color-border);
1031}
1032
1033.invite-field {
1034 margin-bottom: 1rem;
1035}
1036
1037.invite-field label {
1038 display: block;
1039 font-size: 11px;
1040 font-weight: 500;
1041 color: var(--color-muted);
1042 text-transform: uppercase;
1043 letter-spacing: 0.05em;
1044 margin-bottom: 6px;
1045}
1046
1047.invite-field input,
1048.invite-field textarea {
1049 width: 100%;
1050 padding: 8px 10px;
1051 border: 1px solid var(--color-border);
1052 background: var(--color-base);
1053 color: var(--color-text);
1054 font-family: var(--font-ui);
1055 font-size: 13px;
1056 box-sizing: border-box;
1057}
1058
1059.invite-field input:focus,
1060.invite-field textarea:focus {
1061 outline: none;
1062 border-color: var(--color-primary);
1063}
1064
1065.invite-field textarea {
1066 min-height: 60px;
1067 resize: vertical;
1068}
1069
1070.invite-error {
1071 background: color-mix(in srgb, var(--color-error) 10%, var(--color-surface));
1072 border: 1px solid var(--color-error);
1073 color: var(--color-error);
1074 padding: 8px 10px;
1075 margin-bottom: 1rem;
1076 font-size: 13px;
1077}
1078
1079.invite-actions {
1080 display: flex;
1081 gap: 8px;
1082 justify-content: flex-end;
1083 margin-top: 1rem;
1084 padding-top: 1rem;
1085 border-top: 1px solid var(--color-border);
1086}
1087
1088/* ==========================================================================
1089 INVITES LIST
1090 ========================================================================== */
1091
1092.invites-list {
1093 display: flex;
1094 flex-direction: column;
1095 gap: 1.5rem;
1096}
1097
1098.invites-section h3 {
1099 font-size: 13px;
1100 font-weight: 600;
1101 color: var(--color-muted);
1102 text-transform: uppercase;
1103 letter-spacing: 0.05em;
1104 margin: 0 0 0.75rem 0;
1105 padding-bottom: 0.5rem;
1106 border-bottom: 1px solid var(--color-border);
1107}
1108
1109.invites-section .empty-state {
1110 color: var(--color-muted);
1111 font-size: 13px;
1112 padding: 1rem 0;
1113 margin: 0;
1114}
1115
1116.invite-card {
1117 padding: 12px;
1118 background: var(--color-surface);
1119 border: 1px solid var(--color-border);
1120 margin-bottom: 8px;
1121}
1122
1123.invite-card:last-child {
1124 margin-bottom: 0;
1125}
1126
1127.invite-info {
1128 display: flex;
1129 flex-direction: column;
1130 gap: 4px;
1131 margin-bottom: 8px;
1132}
1133
1134.invite-from,
1135.invite-to {
1136 font-size: 13px;
1137 color: var(--color-text);
1138}
1139
1140.invite-resource {
1141 font-size: 11px;
1142 font-family: var(--font-mono);
1143 color: var(--color-muted);
1144 overflow: hidden;
1145 text-overflow: ellipsis;
1146 white-space: nowrap;
1147}
1148
1149.invite-message {
1150 font-size: 13px;
1151 color: var(--color-subtle);
1152 margin: 6px 0 0 0;
1153 padding: 8px;
1154 background: var(--color-overlay);
1155 border-inline-start: 2px solid var(--color-border);
1156}
1157
1158.invite-actions,
1159.invite-status {
1160 display: flex;
1161 align-items: center;
1162 gap: 8px;
1163}
1164
1165.invite-status .status-badge {
1166 font-size: 11px;
1167 font-weight: 500;
1168 text-transform: uppercase;
1169 letter-spacing: 0.03em;
1170 padding: 3px 8px;
1171}
1172
1173.status-badge.pending {
1174 background: color-mix(in srgb, var(--color-warning) 15%, transparent);
1175 color: var(--color-warning);
1176 border: 1px solid var(--color-warning);
1177}
1178
1179.status-badge.accepted {
1180 background: color-mix(in srgb, var(--color-success) 15%, transparent);
1181 color: var(--color-success);
1182 border: 1px solid var(--color-success);
1183}
1184
1185.invite-card .error-message {
1186 background: color-mix(in srgb, var(--color-error) 10%, var(--color-surface));
1187 border: 1px solid var(--color-error);
1188 color: var(--color-error);
1189 padding: 6px 8px;
1190 margin-bottom: 8px;
1191 font-size: 12px;
1192}
1193
1194.invite-status.accepted {
1195 color: var(--color-success);
1196 font-size: 12px;
1197 font-weight: 500;
1198}
1199
1200/* ==========================================================================
1201 Remote Collaborator Cursors
1202 ========================================================================== */
1203
1204.remote-cursors-overlay {
1205 position: absolute;
1206 inset-inline: 0;
1207 top: 0;
1208 bottom: 0;
1209 pointer-events: none;
1210 z-index: 10;
1211}
1212
1213.remote-cursor {
1214 position: absolute;
1215 pointer-events: none;
1216}
1217
1218.remote-selection {
1219 position: absolute;
1220 pointer-events: none;
1221 border-radius: 2px;
1222}
1223
1224.remote-cursor-caret {
1225 width: 2px;
1226 height: var(--cursor-height, 18px);
1227 background: var(--cursor-color, #4ecdc4);
1228 border-radius: 1px;
1229 animation: cursor-blink 1.2s ease-in-out infinite;
1230}
1231
1232.remote-cursor-label {
1233 position: absolute;
1234 top: -18px;
1235 left: 0;
1236 padding: 2px 6px;
1237 background: var(--cursor-color, #4ecdc4);
1238 color: #fff;
1239 font-size: 10px;
1240 font-weight: 500;
1241 line-height: 1.2;
1242 border-radius: 3px 3px 3px 0;
1243 white-space: nowrap;
1244 opacity: 0.9;
1245 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
1246}
1247
1248@keyframes cursor-blink {
1249 0%,
1250 100% {
1251 opacity: 1;
1252 }
1253 50% {
1254 opacity: 0.5;
1255 }
1256}
1257
1258/* ==========================================================================
1259 Footnotes (Editor Mode) - styled but visible, no reordering
1260 ========================================================================== */
1261
1262/* Inline footnote reference [^name] */
1263.footnote-ref {
1264 font-family: var(--font-mono);
1265 font-size: 0.9rem;
1266 color: var(--color-subtle);
1267 background: color-mix(in srgb, var(--color-surface) 10%, transparent);
1268 padding: 0 2px;
1269}
1270
1271/* Footnote definition wrapper - stays in place, no reordering */
1272.footnote-def-editor {
1273 margin-bottom: 1rem;
1274 margin-top: -1rem;
1275 margin-inline-start: 2rem;
1276 padding: 0 0.5rem;
1277 border-inline-start: 2px solid var(--color-border);
1278}
1279
1280/* The [^name]: prefix in definitions */
1281.footnote-def-syntax {
1282 font-family: var(--font-mono);
1283 font-size: 0.9rem;
1284 color: var(--color-subtle);
1285}
1286
1287/* Inner paragraphs in footnote defs */
1288.footnote-def-editor p {
1289 margin: 0;
1290 display: inline;
1291}