at main 1291 lines 26 kB view raw
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}