Share receiver for URLs - save, tag and route elsewhere!
at main 14 kB view raw
1@font-face { 2 font-family: "ServerMono"; 3 src: url("/fonts/ServerMono-Regular.woff2") format("woff2"); 4 font-weight: normal; 5 font-style: normal; 6} 7 8@font-face { 9 font-family: "ServerMono"; 10 src: url("/fonts/ServerMono-Regular-Italic.woff2") format("woff2"); 11 font-weight: normal; 12 font-style: italic; 13} 14 15:root { 16 color-scheme: light dark; 17 font-family: "ServerMono", monospace; 18 font-size: 16px; 19 line-height: 1.5; 20 font-weight: 400; 21 color: #0f0f0f; 22 background-color: #f6f6f6; 23 -webkit-font-smoothing: antialiased; 24 -moz-osx-font-smoothing: grayscale; 25} 26 27* { 28 box-sizing: border-box; 29 margin: 0; 30 padding: 0; 31} 32 33html, body { 34 overflow: hidden; 35 height: 100%; 36} 37 38#root { 39 height: 100%; 40 overflow: hidden; 41} 42 43.app { 44 height: 100%; 45 display: flex; 46 flex-direction: column; 47 overflow: hidden; 48} 49 50/* Main content area - scrollable */ 51main.saved-view { 52 flex: 1; 53 overflow-y: auto; 54 -webkit-overflow-scrolling: touch; 55} 56 57header { 58 background: #ffffff; 59 padding: 0.75rem 1rem; 60 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 61 position: sticky; 62 top: 0; 63 z-index: 100; 64 flex-shrink: 0; 65} 66 67header h1 { 68 font-size: 1.1rem; 69 margin: 0; 70 color: #333; 71 display: flex; 72 align-items: center; 73 gap: 0.5rem; 74} 75 76header h1 .url-count { 77 font-weight: 400; 78 opacity: 0.6; 79} 80 81nav { 82 display: flex; 83 gap: 0.5rem; 84} 85 86nav button { 87 flex: 1; 88 padding: 0.5rem 1rem; 89 background: transparent; 90 border: 1px solid #ddd; 91 border-radius: 6px; 92 cursor: pointer; 93 font-weight: 500; 94 transition: all 0.2s; 95} 96 97nav button.active { 98 background: #007aff; 99 color: white; 100 border-color: #007aff; 101} 102 103main { 104 flex: 1; 105 padding: 1rem; 106 max-width: 600px; 107 width: 100%; 108 margin: 0 auto; 109} 110 111.url-input { 112 margin-bottom: 1.5rem; 113} 114 115.url-input label { 116 display: block; 117 margin-bottom: 0.5rem; 118 font-weight: 500; 119 color: #333; 120} 121 122.url-input input { 123 width: 100%; 124 padding: 0.75rem; 125 border: 1px solid #ddd; 126 border-radius: 8px; 127 font-size: 1rem; 128} 129 130.tags-section h2 { 131 font-size: 1.25rem; 132 margin-bottom: 1rem; 133 color: #333; 134} 135 136.tag-list { 137 display: flex; 138 flex-wrap: wrap; 139 gap: 0.5rem; 140 margin-bottom: 1rem; 141} 142 143.tag { 144 padding: 0.5rem 1rem; 145 background: #fff; 146 border: 2px solid #e0e0e0; 147 border-radius: 20px; 148 cursor: pointer; 149 transition: all 0.2s; 150 display: flex; 151 flex-direction: column; 152 align-items: center; 153 gap: 0.25rem; 154} 155 156.tag:hover { 157 border-color: #007aff; 158} 159 160.tag.selected { 161 background: #007aff; 162 color: white; 163 border-color: #007aff; 164} 165 166.tag-stats { 167 font-size: 0.75rem; 168 opacity: 0.7; 169} 170 171.tag.selected .tag-stats { 172 opacity: 0.9; 173} 174 175.new-tag { 176 display: flex; 177 gap: 0.5rem; 178 margin-bottom: 1.5rem; 179} 180 181.new-tag input { 182 flex: 1; 183 padding: 0.75rem; 184 border: 1px solid #ddd; 185 border-radius: 8px; 186 font-size: 1rem; 187} 188 189.new-tag button { 190 padding: 0.75rem 1.5rem; 191 background: #34c759; 192 color: white; 193 border: none; 194 border-radius: 8px; 195 font-weight: 500; 196 cursor: pointer; 197} 198 199.selected-tags { 200 margin-bottom: 1.5rem; 201} 202 203.selected-tags h3 { 204 font-size: 1rem; 205 margin-bottom: 0.5rem; 206 color: #666; 207} 208 209.selected-tag-list { 210 display: flex; 211 flex-wrap: wrap; 212 gap: 0.5rem; 213 min-height: 2rem; 214} 215 216.selected-tag { 217 display: inline-flex; 218 align-items: center; 219 gap: 0.5rem; 220 padding: 0.5rem 0.75rem; 221 background: #007aff; 222 color: white; 223 border-radius: 16px; 224 font-size: 0.9rem; 225} 226 227.selected-tag button { 228 background: none; 229 border: none; 230 color: white; 231 font-size: 1.25rem; 232 cursor: pointer; 233 padding: 0; 234 width: 20px; 235 height: 20px; 236 display: flex; 237 align-items: center; 238 justify-content: center; 239} 240 241.save-button { 242 width: 100%; 243 padding: 1rem; 244 background: #007aff; 245 color: white; 246 border: none; 247 border-radius: 12px; 248 font-size: 1.1rem; 249 font-weight: 600; 250 cursor: pointer; 251 margin-bottom: 1rem; 252} 253 254.save-button:active { 255 background: #0051d5; 256} 257 258.message { 259 padding: 1rem; 260 background: #34c759; 261 color: white; 262 border-radius: 8px; 263 text-align: center; 264} 265 266.saved-view h2 { 267 font-size: 1.25rem; 268 margin-bottom: 1rem; 269 color: #333; 270} 271 272.saved-urls-list { 273 display: flex; 274 flex-direction: column; 275 gap: 1rem; 276 width: 100%; 277} 278 279.saved-url-item { 280 padding: 1rem; 281 background: white; 282 border-radius: 12px; 283 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 284 width: 100%; 285 box-sizing: border-box; 286 overflow: hidden; 287} 288 289.saved-url-item a { 290 color: #007aff; 291 text-decoration: none; 292 font-weight: 500; 293 word-break: break-all; 294} 295 296.saved-url-tags { 297 display: flex; 298 flex-wrap: wrap; 299 gap: 0.5rem; 300 margin-top: 0.75rem; 301} 302 303.saved-url-tag { 304 padding: 0.25rem 0.75rem; 305 background: #e0e0e0; 306 border-radius: 12px; 307 font-size: 0.85rem; 308 color: #333; 309} 310 311.saved-url-date { 312 margin-top: 0.5rem; 313 font-size: 0.85rem; 314 color: #999; 315} 316 317/* URL row with edit button */ 318.url-row { 319 display: flex; 320 justify-content: space-between; 321 align-items: flex-start; 322 gap: 0.5rem; 323 width: 100%; 324 overflow: hidden; 325} 326 327.url-row a { 328 flex: 1; 329 min-width: 0; 330 overflow: hidden; 331 text-overflow: ellipsis; 332} 333 334.edit-btn { 335 padding: 0.25rem 0.75rem; 336 background: #e0e0e0; 337 border: none; 338 border-radius: 6px; 339 font-size: 0.85rem; 340 color: #333; 341 cursor: pointer; 342 flex-shrink: 0; 343} 344 345/* Editing mode */ 346.saved-url-item.editing { 347 border: 2px solid #007aff; 348 overflow: hidden; 349 max-width: 100%; 350 box-sizing: border-box; 351} 352 353.edit-url-display { 354 color: #007aff; 355 font-weight: 500; 356 font-size: 1rem; 357 line-height: 1.4; 358 word-break: break-word; 359 overflow-wrap: break-word; 360 margin-bottom: 1rem; 361 padding-bottom: 0.75rem; 362} 363 364.edit-url-input { 365 width: 100%; 366 padding: 0.75rem; 367 border: 1px solid #ddd; 368 border-radius: 8px; 369 font-size: 1rem; 370 color: #007aff; 371 box-sizing: border-box; 372 border-bottom: 1px solid #e0e0e0; 373} 374 375.edit-section { 376 margin-bottom: 0.75rem; 377} 378 379.editing-tags { 380 display: flex; 381 flex-wrap: wrap; 382 gap: 0.5rem; 383 min-height: 2rem; 384} 385 386.editing-tag { 387 display: inline-flex; 388 align-items: center; 389 gap: 0.25rem; 390 padding: 0.35rem 0.5rem 0.35rem 0.75rem; 391 background: #007aff; 392 color: white; 393 border-radius: 16px; 394 font-size: 0.85rem; 395} 396 397.editing-tag button { 398 background: none; 399 border: none; 400 color: white; 401 font-size: 1.1rem; 402 cursor: pointer; 403 padding: 0; 404 width: 18px; 405 height: 18px; 406 display: flex; 407 align-items: center; 408 justify-content: center; 409 opacity: 0.8; 410} 411 412.editing-tag button:hover { 413 opacity: 1; 414} 415 416.no-tags { 417 color: #999; 418 font-style: italic; 419 font-size: 0.85rem; 420} 421 422.new-tag-input { 423 display: flex; 424 gap: 0.5rem; 425 max-width: 100%; 426} 427 428.new-tag-input input { 429 flex: 1; 430 min-width: 0; 431 padding: 0.5rem 0.75rem; 432 border: 1px solid #ddd; 433 border-radius: 8px; 434 font-size: 16px; /* Prevents iOS auto-zoom on focus */ 435} 436 437.new-tag-input button { 438 padding: 0.5rem 1rem; 439 background: #34c759; 440 color: white; 441 border: none; 442 border-radius: 8px; 443 font-weight: 500; 444 cursor: pointer; 445} 446 447.new-tag-input button:disabled { 448 background: #ccc; 449 cursor: not-allowed; 450} 451 452.all-tags-list { 453 display: flex; 454 flex-wrap: wrap; 455 gap: 0.5rem; 456} 457 458.tag-chip { 459 padding: 0.35rem 0.75rem; 460 background: #e0e0e0; 461 border: 2px solid transparent; 462 border-radius: 16px; 463 font-size: 0.85rem; 464 color: #333; 465 cursor: pointer; 466 transition: all 0.15s; 467} 468 469.tag-chip:hover { 470 border-color: #007aff; 471} 472 473.tag-chip.selected { 474 background: #007aff; 475 color: white; 476} 477 478.edit-buttons { 479 display: flex; 480 gap: 0.75rem; 481 margin-top: 1rem; 482 padding-top: 0.75rem; 483 border-top: 1px solid #e0e0e0; 484} 485 486.edit-buttons button { 487 flex: 1; 488 padding: 0.75rem; 489 border: none; 490 border-radius: 8px; 491 font-size: 1rem; 492 font-weight: 600; 493 cursor: pointer; 494} 495 496.delete-btn { 497 background: #ff3b30; 498 color: white; 499} 500 501.cancel-btn { 502 background: #e0e0e0; 503 color: #333; 504} 505 506.save-btn { 507 background: #007aff; 508 color: white; 509} 510 511body.dark { 512 color: #f6f6f6; 513 background-color: #1c1c1e; 514} 515 516body.dark header { 517 background: #2c2c2e; 518} 519 520body.dark header h1 { 521 color: #f6f6f6; 522} 523 524body.dark header h1 .url-count { 525 opacity: 0.5; 526} 527 528body.dark nav button { 529 color: #f6f6f6; 530 border-color: #444; 531} 532 533body.dark nav button.active { 534 background: #0a84ff; 535 border-color: #0a84ff; 536} 537 538body.dark .url-input label, 539body.dark .tags-section h2, 540body.dark .saved-view h2 { 541 color: #f6f6f6; 542} 543 544body.dark .url-input input, 545body.dark .new-tag input { 546 background: #2c2c2e; 547 border-color: #444; 548 color: #f6f6f6; 549} 550 551body.dark .tag { 552 background: #2c2c2e; 553 border-color: #444; 554 color: #f6f6f6; 555} 556 557body.dark .tag:hover { 558 border-color: #0a84ff; 559} 560 561body.dark .tag.selected { 562 background: #0a84ff; 563 border-color: #0a84ff; 564} 565 566body.dark .selected-tag { 567 background: #0a84ff; 568} 569 570body.dark .save-button { 571 background: #0a84ff; 572} 573 574body.dark .save-button:active { 575 background: #0066cc; 576} 577 578body.dark .saved-url-item { 579 background: #2c2c2e; 580} 581 582body.dark .saved-url-tag { 583 background: #3a3a3c; 584 color: #f6f6f6; 585} 586 587body.dark .edit-btn { 588 background: #3a3a3c; 589 color: #f6f6f6; 590} 591 592body.dark .saved-url-item.editing { 593 border-color: #0a84ff; 594} 595 596body.dark .edit-url-display { 597 color: #0a84ff; 598 border-bottom-color: #444; 599} 600 601body.dark .edit-url-input { 602 background: #1c1c1e; 603 border-color: #444; 604 color: #0a84ff; 605} 606 607body.dark .editing-tag { 608 background: #0a84ff; 609} 610 611body.dark .new-tag-input input { 612 background: #2c2c2e; 613 border-color: #444; 614 color: #f6f6f6; 615} 616 617body.dark .new-tag-input button { 618 background: #30d158; 619} 620 621body.dark .new-tag-input button:disabled { 622 background: #555; 623} 624 625body.dark .tag-chip { 626 background: #3a3a3c; 627 color: #f6f6f6; 628} 629 630body.dark .tag-chip:hover { 631 border-color: #0a84ff; 632} 633 634body.dark .tag-chip.selected { 635 background: #0a84ff; 636} 637 638body.dark .edit-buttons { 639 border-top-color: #444; 640} 641 642body.dark .delete-btn { 643 background: #ff453a; 644} 645 646body.dark .cancel-btn { 647 background: #3a3a3c; 648 color: #f6f6f6; 649} 650 651body.dark .save-btn { 652 background: #0a84ff; 653} 654 655body.dark .no-tags { 656 color: #666; 657} 658 659/* Header layout with buttons */ 660header { 661 display: flex; 662 align-items: center; 663 justify-content: space-between; 664} 665 666.header-btn { 667 background: transparent; 668 border: none; 669 padding: 0.5rem; 670 cursor: pointer; 671 display: flex; 672 align-items: center; 673 justify-content: center; 674 color: #007aff; 675 font-size: 1rem; 676} 677 678.header-spacer { 679 width: 44px; 680} 681 682.settings-btn svg { 683 color: #666; 684} 685 686body.dark .settings-btn svg { 687 color: #999; 688} 689 690body.dark .header-btn { 691 color: #0a84ff; 692} 693 694/* Settings view */ 695.settings-view { 696 padding: 1rem; 697 max-width: 600px; 698 width: 100%; 699 margin: 0 auto; 700} 701 702.settings-section { 703 background: white; 704 border-radius: 12px; 705 padding: 1.25rem; 706 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 707} 708 709.settings-section h2 { 710 font-size: 1.1rem; 711 margin: 0 0 0.5rem 0; 712 color: #333; 713} 714 715.settings-description { 716 font-size: 0.9rem; 717 color: #666; 718 margin: 0 0 1rem 0; 719 line-height: 1.4; 720} 721 722.webhook-input { 723 display: flex; 724 gap: 0.5rem; 725 margin-bottom: 1rem; 726} 727 728.webhook-input input { 729 flex: 1; 730 padding: 0.75rem; 731 border: 1px solid #ddd; 732 border-radius: 8px; 733 font-size: 16px; 734} 735 736.api-key-field { 737 position: relative; 738} 739 740.api-key-field input { 741 padding-right: 3rem; 742} 743 744.toggle-visibility-btn { 745 position: absolute; 746 right: 0.75rem; 747 top: 50%; 748 transform: translateY(-50%); 749 background: none; 750 border: none; 751 padding: 0.25rem; 752 cursor: pointer; 753 color: #666; 754 display: flex; 755 align-items: center; 756 justify-content: center; 757} 758 759.toggle-visibility-btn:hover { 760 color: #333; 761} 762 763body.dark .toggle-visibility-btn { 764 color: #999; 765} 766 767body.dark .toggle-visibility-btn:hover { 768 color: #ccc; 769} 770 771.save-webhook-btn { 772 padding: 0.75rem 1rem; 773 background: #007aff; 774 color: white; 775 border: none; 776 border-radius: 8px; 777 font-weight: 500; 778 cursor: pointer; 779} 780 781.save-webhook-btn:disabled { 782 background: #ccc; 783 cursor: not-allowed; 784} 785 786.save-settings-btn { 787 width: 100%; 788 padding: 1rem; 789 margin-top: 1rem; 790 background: #007aff; 791 color: white; 792 border: none; 793 border-radius: 12px; 794 font-weight: 600; 795 font-size: 1rem; 796 cursor: pointer; 797} 798 799.save-settings-btn:disabled { 800 background: #ccc; 801 cursor: not-allowed; 802} 803 804.last-sync-info { 805 margin: 1rem 0; 806 font-size: 0.85rem; 807 color: #666; 808 text-align: center; 809} 810 811.sync-btn { 812 width: 100%; 813 padding: 1rem; 814 margin-top: 1rem; 815 background: #34c759; 816 color: white; 817 border: none; 818 border-radius: 12px; 819 font-size: 1rem; 820 font-weight: 600; 821 cursor: pointer; 822} 823 824.sync-btn:disabled { 825 background: #ccc; 826 cursor: not-allowed; 827} 828 829.sync-message { 830 margin-top: 1rem; 831 padding: 0.75rem; 832 border-radius: 8px; 833 text-align: center; 834 font-size: 0.9rem; 835} 836 837.sync-message.success { 838 background: #d4edda; 839 color: #155724; 840} 841 842.sync-message.error { 843 background: #f8d7da; 844 color: #721c24; 845} 846 847/* Dark mode for settings */ 848body.dark .settings-section { 849 background: #2c2c2e; 850} 851 852body.dark .settings-section h2 { 853 color: #f6f6f6; 854} 855 856body.dark .settings-description { 857 color: #999; 858} 859 860body.dark .webhook-input input { 861 background: #1c1c1e; 862 border-color: #444; 863 color: #f6f6f6; 864} 865 866body.dark .save-webhook-btn { 867 background: #0a84ff; 868} 869 870body.dark .save-webhook-btn:disabled { 871 background: #555; 872} 873 874body.dark .save-settings-btn { 875 background: #0a84ff; 876} 877 878body.dark .save-settings-btn:disabled { 879 background: #555; 880} 881 882body.dark .sync-btn { 883 background: #30d158; 884} 885 886body.dark .sync-btn:disabled { 887 background: #555; 888} 889 890body.dark .last-sync-info { 891 color: #999; 892} 893 894body.dark .sync-message.success { 895 background: #1e3a29; 896 color: #30d158; 897} 898 899body.dark .sync-message.error { 900 background: #3a1e1e; 901 color: #ff6b6b; 902}