forked from pdsls.dev/pdsls
atproto explorer

tailwind v4 switch (#45)

* tw4 switch

* active selector

authored by juli.ee and committed by GitHub ef1cbcb9 c2370bd3

+4 -5
index.html
··· 15 15 <link rel="preconnect" href="https://fonts.bunny.net" /> 16 16 <link href="https://fonts.bunny.net/css?family=roboto-mono:400" rel="stylesheet" /> 17 17 <script> 18 - if ( 18 + document.documentElement.classList.toggle( 19 + "dark", 19 20 localStorage.theme === "dark" || 20 - (!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches) 21 - ) 22 - document.documentElement.classList.add("dark"); 23 - else document.documentElement.classList.remove("dark"); 21 + (!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches), 22 + ); 24 23 </script> 25 24 <script src="/src/index.tsx" type="module"></script> 26 25 </head>
+3 -1
package.json
··· 9 9 "serve": "vite preview" 10 10 }, 11 11 "devDependencies": { 12 + "@iconify/tailwind4": "^1.0.6", 12 13 "@iconify-json/lucide": "^1.2.65", 14 + "@tailwindcss/vite": "^4.1.12", 13 15 "prettier": "^3.6.2", 14 16 "prettier-plugin-tailwindcss": "^0.6.14", 17 + "tailwindcss": "^4.1.12", 15 18 "typescript": "^5.9.2", 16 - "unocss": "66.4.2", 17 19 "vite": "^7.1.3", 18 20 "vite-plugin-solid": "^2.11.8" 19 21 },
+389 -523
pnpm-lock.yaml
··· 81 81 '@iconify-json/lucide': 82 82 specifier: ^1.2.65 83 83 version: 1.2.65 84 + '@iconify/tailwind4': 85 + specifier: ^1.0.6 86 + version: 1.0.6(tailwindcss@4.1.12) 87 + '@tailwindcss/vite': 88 + specifier: ^4.1.12 89 + version: 4.1.12(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2)) 84 90 prettier: 85 91 specifier: ^3.6.2 86 92 version: 3.6.2 87 93 prettier-plugin-tailwindcss: 88 94 specifier: ^0.6.14 89 95 version: 0.6.14(prettier@3.6.2) 96 + tailwindcss: 97 + specifier: ^4.1.12 98 + version: 4.1.12 90 99 typescript: 91 100 specifier: ^5.9.2 92 101 version: 5.9.2 93 - unocss: 94 - specifier: 66.4.2 95 - version: 66.4.2(postcss@8.5.6)(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)) 96 102 vite: 97 103 specifier: ^7.1.3 98 - version: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2) 104 + version: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2) 99 105 vite-plugin-solid: 100 106 specifier: ^2.11.8 101 - version: 2.11.8(solid-js@1.9.9)(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)) 107 + version: 2.11.8(solid-js@1.9.9)(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2)) 102 108 103 109 packages: 104 110 ··· 109 115 '@antfu/install-pkg@1.1.0': 110 116 resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} 111 117 112 - '@antfu/utils@9.2.0': 113 - resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} 118 + '@antfu/utils@8.1.1': 119 + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} 114 120 115 121 '@atcute/atproto@3.1.2': 116 122 resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==} ··· 559 565 '@iconify-json/lucide@1.2.65': 560 566 resolution: {integrity: sha512-Ur5I3dZyLW8bZLTEtsMKQ9lkl8u5HIiwO79pYxlvAzKQ0Mc4milB+G04CxnFqlB15x/lRq2rTPSi7ep1utDXrg==} 561 567 568 + '@iconify/tailwind4@1.0.6': 569 + resolution: {integrity: sha512-43ZXe+bC7CuE2LCgROdqbQeFYJi/J7L/k1UpSy8KDQlWVsWxPzLSWbWhlJx4uRYLOh1NRyw02YlDOgzBOFNd+A==} 570 + peerDependencies: 571 + tailwindcss: '>= 4' 572 + 562 573 '@iconify/types@2.0.0': 563 574 resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 564 575 565 - '@iconify/utils@3.0.1': 566 - resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==} 576 + '@iconify/utils@2.3.0': 577 + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} 578 + 579 + '@isaacs/fs-minipass@4.0.1': 580 + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 581 + engines: {node: '>=18.0.0'} 567 582 568 583 '@jridgewell/gen-mapping@0.3.13': 569 584 resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 585 + 586 + '@jridgewell/remapping@2.3.5': 587 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 570 588 571 589 '@jridgewell/resolve-uri@3.1.2': 572 590 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} ··· 583 601 584 602 '@noble/secp256k1@2.3.0': 585 603 resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==} 586 - 587 - '@polka/url@1.0.0-next.29': 588 - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 589 - 590 - '@quansync/fs@0.1.5': 591 - resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} 592 604 593 605 '@rollup/rollup-android-arm-eabi@4.49.0': 594 606 resolution: {integrity: sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==} ··· 703 715 peerDependencies: 704 716 solid-js: ^1.8.6 705 717 706 - '@types/babel__core@7.20.5': 707 - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 718 + '@tailwindcss/node@4.1.12': 719 + resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} 708 720 709 - '@types/babel__generator@7.27.0': 710 - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 711 - 712 - '@types/babel__template@7.4.4': 713 - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 714 - 715 - '@types/babel__traverse@7.28.0': 716 - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 717 - 718 - '@types/estree@1.0.8': 719 - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 720 - 721 - '@types/node@22.13.1': 722 - resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} 723 - 724 - '@unocss/astro@66.4.2': 725 - resolution: {integrity: sha512-En3AKHwkiPxtZT95vkVrNiRYrB+DFVCikew6/dMMCWDWVKK0+5tEVUTzR1ak3+YnzAXl0NpWj8D4zHb0PxOs/A==} 726 - peerDependencies: 727 - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 728 - peerDependenciesMeta: 729 - vite: 730 - optional: true 731 - 732 - '@unocss/cli@66.4.2': 733 - resolution: {integrity: sha512-WsXzrB0SHbSt2nOHtD5QM91VN8j38+wObqyGcoIhtBSugqzsc+t7AdPkxV/ZaYgtPAz87bR0WFEVKcbiBRnmJw==} 734 - engines: {node: '>=14'} 735 - hasBin: true 736 - 737 - '@unocss/config@66.4.2': 738 - resolution: {integrity: sha512-plji1gNGSzlWjuV2Uh0q6Dt5ZlNkOKCHpgxekW9J458WghGAMBeXgB9uNpWg6flilqP1g0GJQv+XvJcSkYRGpQ==} 739 - engines: {node: '>=14'} 740 - 741 - '@unocss/core@66.4.2': 742 - resolution: {integrity: sha512-cYgMQrLhB9nRekv5c+yPDDa+5dzlMkA2UMQRil0s5D9Lb5n7NsCMcr6+nfxkcSYVLy92SbwDV45c6T7vIxFTOA==} 743 - 744 - '@unocss/extractor-arbitrary-variants@66.4.2': 745 - resolution: {integrity: sha512-T/eSeodfAp7HaWnQGqVLOsW4PbKUAvuybNRyvFWThMneM2qo+dOo3kFnA5my9ULAmRSFsAlyB1DnupD3qv5Klg==} 721 + '@tailwindcss/oxide-android-arm64@4.1.12': 722 + resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} 723 + engines: {node: '>= 10'} 724 + cpu: [arm64] 725 + os: [android] 746 726 747 - '@unocss/inspector@66.4.2': 748 - resolution: {integrity: sha512-ugcJK8r2ypM4eIdgetVn8RhfKrbA3AF3OQ/RohK5PPk2UPDAScqabzYpfdNW4eYQsBOZOgoiqWtnfc8weqo8LQ==} 727 + '@tailwindcss/oxide-darwin-arm64@4.1.12': 728 + resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} 729 + engines: {node: '>= 10'} 730 + cpu: [arm64] 731 + os: [darwin] 749 732 750 - '@unocss/postcss@66.4.2': 751 - resolution: {integrity: sha512-tu4lnh6K27pIAuaQHlFlhXin8korwC0r1kQl00YMmF3THiX7orXkTP6xWGcQwnkbx4uQz1dw+tBimYxeaAMrhA==} 752 - engines: {node: '>=14'} 753 - peerDependencies: 754 - postcss: ^8.4.21 733 + '@tailwindcss/oxide-darwin-x64@4.1.12': 734 + resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} 735 + engines: {node: '>= 10'} 736 + cpu: [x64] 737 + os: [darwin] 755 738 756 - '@unocss/preset-attributify@66.4.2': 757 - resolution: {integrity: sha512-DwFJJkkawmHpjo3pGQE8FyoPsvhbxh+QMvvaAdYpo+iZ5HRkeDml9SOj7u6SGTcmbNyI+QR61s0KM8fxx6HcVQ==} 739 + '@tailwindcss/oxide-freebsd-x64@4.1.12': 740 + resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} 741 + engines: {node: '>= 10'} 742 + cpu: [x64] 743 + os: [freebsd] 758 744 759 - '@unocss/preset-icons@66.4.2': 760 - resolution: {integrity: sha512-qJx9gmesrvrmoTe9Mqoidihad8hm2MSD4QAezhfDSAyllioJOgyT0Bev/IEWAbehe9jtqYIh8v1oCerBPbGn6Q==} 745 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': 746 + resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} 747 + engines: {node: '>= 10'} 748 + cpu: [arm] 749 + os: [linux] 761 750 762 - '@unocss/preset-mini@66.4.2': 763 - resolution: {integrity: sha512-Ry+5hM+XLmT8HrEb182mUfcZuyrZ8xR+TBe72DBcliJ1DhOV3K67TCxwQucfb0zHbGV71HNWdPmHsLKxPDgweQ==} 751 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': 752 + resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} 753 + engines: {node: '>= 10'} 754 + cpu: [arm64] 755 + os: [linux] 764 756 765 - '@unocss/preset-tagify@66.4.2': 766 - resolution: {integrity: sha512-dECS09LqWJY4sYpgPUH2OAUftWU/tiZPR2XDRoTngeGU37GxSN+1sWtSmB7vwDm3C7opsdVUN20he8F1LUNubw==} 757 + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': 758 + resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} 759 + engines: {node: '>= 10'} 760 + cpu: [arm64] 761 + os: [linux] 767 762 768 - '@unocss/preset-typography@66.4.2': 769 - resolution: {integrity: sha512-ZOKRuR5+V0r30QTVq04/6ZoIw75me3V25v2dU2YWJXIzwpMKmQ9TUN/M1yeiEUFfXjOaruWX6Ad6CvAw2MlCew==} 763 + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': 764 + resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} 765 + engines: {node: '>= 10'} 766 + cpu: [x64] 767 + os: [linux] 770 768 771 - '@unocss/preset-uno@66.4.2': 772 - resolution: {integrity: sha512-1MFtPivGcpqRQFWdjtP40Enop1y3XDb3tlZXoMQUX0IGLG8HJOT+lfQx/Xl9t73ShJ8aAJ/l6qTxC43ZGNACzA==} 769 + '@tailwindcss/oxide-linux-x64-musl@4.1.12': 770 + resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} 771 + engines: {node: '>= 10'} 772 + cpu: [x64] 773 + os: [linux] 773 774 774 - '@unocss/preset-web-fonts@66.4.2': 775 - resolution: {integrity: sha512-4FYmleeRoM8r2DqGl6dfIjnX57tepcfZCvVfeCqYnk7475Yddmv1OYkoMjkWMnkK9MzdSxsFwHMU6CIUTmFTzQ==} 775 + '@tailwindcss/oxide-wasm32-wasi@4.1.12': 776 + resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} 777 + engines: {node: '>=14.0.0'} 778 + cpu: [wasm32] 779 + bundledDependencies: 780 + - '@napi-rs/wasm-runtime' 781 + - '@emnapi/core' 782 + - '@emnapi/runtime' 783 + - '@tybys/wasm-util' 784 + - '@emnapi/wasi-threads' 785 + - tslib 776 786 777 - '@unocss/preset-wind3@66.4.2': 778 - resolution: {integrity: sha512-0Aye/PaT08M/cQhPnGKn93iEVoRJbym0/1eomMvXoL+8oc7DVry35ws06r5CLu5h1sXI6UmS6sejoePFlSkLJQ==} 787 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': 788 + resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} 789 + engines: {node: '>= 10'} 790 + cpu: [arm64] 791 + os: [win32] 779 792 780 - '@unocss/preset-wind4@66.4.2': 781 - resolution: {integrity: sha512-F4RZsDqIpnSevD9hY353+Tw5gxpJuHA5HwdKjLnC/TnT9VKKVmV7qUEZ6M0jEuAk1kz2x3/ngnQ9Ftw+C2L84A==} 793 + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': 794 + resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} 795 + engines: {node: '>= 10'} 796 + cpu: [x64] 797 + os: [win32] 782 798 783 - '@unocss/preset-wind@66.4.2': 784 - resolution: {integrity: sha512-z/rFYFINNqmBtl3Dh+7UCKpPnPkxM7IIUGszMnvdntky9uhLauJ11dt/Puir73sM2cAfywfgvnHyZ00m0pg7rA==} 799 + '@tailwindcss/oxide@4.1.12': 800 + resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} 801 + engines: {node: '>= 10'} 785 802 786 - '@unocss/reset@66.4.2': 787 - resolution: {integrity: sha512-s3Kq4Q6a/d3/jYe6HTCfXUx7zYAYufetId5n66DZHzQxpeu6CoBS83+b37STTKsw27SOgV28cPJlJtZ6/D6Bhw==} 803 + '@tailwindcss/vite@4.1.12': 804 + resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} 805 + peerDependencies: 806 + vite: ^5.2.0 || ^6 || ^7 788 807 789 - '@unocss/rule-utils@66.4.2': 790 - resolution: {integrity: sha512-7z3IuajwXhy2cx3E0IGOFXIiuKC79/jzm4Tt56TC68nXLh/etlH0fKhxVwkZ/HbcQRpVwWyDRNcbh29pmA3DwQ==} 791 - engines: {node: '>=14'} 808 + '@types/babel__core@7.20.5': 809 + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 792 810 793 - '@unocss/transformer-attributify-jsx@66.4.2': 794 - resolution: {integrity: sha512-de6LzoyW1tkdOftlCrj6z8wEb4j6l1sqmOU1nYKkYHw7luLFGxRUELC7iujlI9KmylbM02bcKfLETAfJy/je2w==} 811 + '@types/babel__generator@7.27.0': 812 + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 795 813 796 - '@unocss/transformer-compile-class@66.4.2': 797 - resolution: {integrity: sha512-+oiIrV8c3T7qiJdICr6YsEWik5sjbWirXF0mlpcBvZu2HyV559hvHjzuWKr/fl7xYYZKDL9FvddbqWo3DOXh3Q==} 814 + '@types/babel__template@7.4.4': 815 + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 798 816 799 - '@unocss/transformer-directives@66.4.2': 800 - resolution: {integrity: sha512-7m/dTrCUkBkZeSRKPxPEo65Rav239orQSLq6sztwZhoA4x/6H8r58xCkAK0qC9VEalyerpCpyarU3sKN4+ehNg==} 817 + '@types/babel__traverse@7.28.0': 818 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 801 819 802 - '@unocss/transformer-variant-group@66.4.2': 803 - resolution: {integrity: sha512-SbPDbZUrhQyL4CpvnpvUfrr1DFq8AKf8ofPGbMJDm5S2TInQ34vFaIrhNroGR0szntMZRH5Zlkq6LtVUKDRs5g==} 820 + '@types/estree@1.0.8': 821 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 804 822 805 - '@unocss/vite@66.4.2': 806 - resolution: {integrity: sha512-7eON9iPF3qWzuI+M6u0kq7K3y9nEbimZlLj01nGoqrgSGxEsyJpP01QQQsmT7FPRiZzRMJv7BiKMEyDQSuRRCA==} 807 - peerDependencies: 808 - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 823 + '@types/node@22.13.1': 824 + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} 809 825 810 826 acorn@8.15.0: 811 827 resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 812 828 engines: {node: '>=0.4.0'} 813 829 hasBin: true 814 830 815 - anymatch@3.1.3: 816 - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 817 - engines: {node: '>= 8'} 818 - 819 831 babel-plugin-jsx-dom-expressions@0.40.1: 820 832 resolution: {integrity: sha512-b4iHuirqK7RgaMzB2Lsl7MqrlDgQtVRSSazyrmx7wB3T759ggGjod5Rkok5MfHjQXhR7tRPmdwoeGPqBnW2KfA==} 821 833 peerDependencies: ··· 830 842 solid-js: 831 843 optional: true 832 844 833 - binary-extensions@2.3.0: 834 - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 835 - engines: {node: '>=8'} 836 - 837 - braces@3.0.3: 838 - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 839 - engines: {node: '>=8'} 840 - 841 845 browserslist@4.25.3: 842 846 resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} 843 847 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 844 848 hasBin: true 845 - 846 - cac@6.7.14: 847 - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 848 - engines: {node: '>=8'} 849 849 850 850 caniuse-lite@1.0.30001737: 851 851 resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} 852 852 853 - chokidar@3.6.0: 854 - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 855 - engines: {node: '>= 8.10.0'} 856 - 857 - colorette@2.0.20: 858 - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 853 + chownr@3.0.0: 854 + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} 855 + engines: {node: '>=18'} 859 856 860 857 confbox@0.1.8: 861 858 resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} ··· 863 860 confbox@0.2.2: 864 861 resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} 865 862 866 - consola@3.4.2: 867 - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 868 - engines: {node: ^14.18.0 || >=16.10.0} 869 - 870 863 convert-source-map@2.0.0: 871 864 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 872 865 873 - css-tree@3.1.0: 874 - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} 875 - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 876 - 877 866 csstype@3.1.3: 878 867 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 879 868 ··· 886 875 supports-color: 887 876 optional: true 888 877 889 - defu@6.1.4: 890 - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 891 - 892 - destr@2.0.5: 893 - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} 894 - 895 - duplexer@0.1.2: 896 - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} 878 + detect-libc@2.0.4: 879 + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 880 + engines: {node: '>=8'} 897 881 898 882 electron-to-chromium@1.5.211: 899 883 resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==} 900 884 885 + enhanced-resolve@5.18.3: 886 + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} 887 + engines: {node: '>=10.13.0'} 888 + 901 889 entities@6.0.1: 902 890 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 903 891 engines: {node: '>=0.12'} ··· 931 919 picomatch: 932 920 optional: true 933 921 934 - fill-range@7.1.1: 935 - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 936 - engines: {node: '>=8'} 937 - 938 922 fsevents@2.3.3: 939 923 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 940 924 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} ··· 947 931 get-tsconfig@4.10.1: 948 932 resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} 949 933 950 - glob-parent@5.1.2: 951 - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 952 - engines: {node: '>= 6'} 953 - 954 934 globals@15.15.0: 955 935 resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 956 936 engines: {node: '>=18'} 957 937 958 - gzip-size@6.0.0: 959 - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} 960 - engines: {node: '>=10'} 938 + graceful-fs@4.2.11: 939 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 961 940 962 941 hls.js@1.6.11: 963 942 resolution: {integrity: sha512-tdDwOAgPGXohSiNE4oxGr3CI9Hx9lsGLFe6TULUvRk2TfHS+w1tSAJntrvxsHaxvjtr6BXsDZM7NOqJFhU4mmg==} ··· 965 944 html-entities@2.3.3: 966 945 resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} 967 946 968 - is-binary-path@2.1.0: 969 - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 970 - engines: {node: '>=8'} 971 - 972 - is-extglob@2.1.1: 973 - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 974 - engines: {node: '>=0.10.0'} 975 - 976 - is-glob@4.0.3: 977 - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 978 - engines: {node: '>=0.10.0'} 979 - 980 - is-number@7.0.0: 981 - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 982 - engines: {node: '>=0.12.0'} 983 - 984 947 is-what@4.1.16: 985 948 resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 986 949 engines: {node: '>=12.13'} ··· 1005 968 kolorist@1.8.0: 1006 969 resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1007 970 971 + lightningcss-darwin-arm64@1.30.1: 972 + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} 973 + engines: {node: '>= 12.0.0'} 974 + cpu: [arm64] 975 + os: [darwin] 976 + 977 + lightningcss-darwin-x64@1.30.1: 978 + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} 979 + engines: {node: '>= 12.0.0'} 980 + cpu: [x64] 981 + os: [darwin] 982 + 983 + lightningcss-freebsd-x64@1.30.1: 984 + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} 985 + engines: {node: '>= 12.0.0'} 986 + cpu: [x64] 987 + os: [freebsd] 988 + 989 + lightningcss-linux-arm-gnueabihf@1.30.1: 990 + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} 991 + engines: {node: '>= 12.0.0'} 992 + cpu: [arm] 993 + os: [linux] 994 + 995 + lightningcss-linux-arm64-gnu@1.30.1: 996 + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} 997 + engines: {node: '>= 12.0.0'} 998 + cpu: [arm64] 999 + os: [linux] 1000 + 1001 + lightningcss-linux-arm64-musl@1.30.1: 1002 + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} 1003 + engines: {node: '>= 12.0.0'} 1004 + cpu: [arm64] 1005 + os: [linux] 1006 + 1007 + lightningcss-linux-x64-gnu@1.30.1: 1008 + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} 1009 + engines: {node: '>= 12.0.0'} 1010 + cpu: [x64] 1011 + os: [linux] 1012 + 1013 + lightningcss-linux-x64-musl@1.30.1: 1014 + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} 1015 + engines: {node: '>= 12.0.0'} 1016 + cpu: [x64] 1017 + os: [linux] 1018 + 1019 + lightningcss-win32-arm64-msvc@1.30.1: 1020 + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} 1021 + engines: {node: '>= 12.0.0'} 1022 + cpu: [arm64] 1023 + os: [win32] 1024 + 1025 + lightningcss-win32-x64-msvc@1.30.1: 1026 + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} 1027 + engines: {node: '>= 12.0.0'} 1028 + cpu: [x64] 1029 + os: [win32] 1030 + 1031 + lightningcss@1.30.1: 1032 + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} 1033 + engines: {node: '>= 12.0.0'} 1034 + 1008 1035 local-pkg@1.1.2: 1009 1036 resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} 1010 1037 engines: {node: '>=14'} ··· 1015 1042 magic-string@0.30.18: 1016 1043 resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} 1017 1044 1018 - mdn-data@2.12.2: 1019 - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} 1020 - 1021 1045 merge-anything@5.1.7: 1022 1046 resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} 1023 1047 engines: {node: '>=12.13'} 1024 1048 1049 + minipass@7.1.2: 1050 + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1051 + engines: {node: '>=16 || 14 >=14.17'} 1052 + 1053 + minizlib@3.0.2: 1054 + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} 1055 + engines: {node: '>= 18'} 1056 + 1057 + mkdirp@3.0.1: 1058 + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} 1059 + engines: {node: '>=10'} 1060 + hasBin: true 1061 + 1025 1062 mlly@1.8.0: 1026 1063 resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 1027 1064 1028 1065 monaco-editor@0.52.2: 1029 1066 resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} 1030 - 1031 - mrmime@2.0.1: 1032 - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1033 - engines: {node: '>=10'} 1034 1067 1035 1068 ms@2.1.3: 1036 1069 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} ··· 1049 1082 engines: {node: ^18 || >=20} 1050 1083 hasBin: true 1051 1084 1052 - node-fetch-native@1.6.7: 1053 - resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} 1054 - 1055 1085 node-releases@2.0.19: 1056 1086 resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1057 1087 1058 - normalize-path@3.0.0: 1059 - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1060 - engines: {node: '>=0.10.0'} 1061 - 1062 - ofetch@1.4.1: 1063 - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} 1064 - 1065 1088 package-manager-detector@1.3.0: 1066 1089 resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} 1067 1090 ··· 1071 1094 pathe@2.0.3: 1072 1095 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1073 1096 1074 - perfect-debounce@1.0.0: 1075 - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 1076 - 1077 1097 picocolors@1.1.1: 1078 1098 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1079 - 1080 - picomatch@2.3.1: 1081 - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1082 - engines: {node: '>=8.6'} 1083 1099 1084 1100 picomatch@4.0.3: 1085 1101 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} ··· 1163 1179 1164 1180 quansync@0.2.11: 1165 1181 resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} 1166 - 1167 - readdirp@3.6.0: 1168 - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1169 - engines: {node: '>=8.10.0'} 1170 1182 1171 1183 resolve-pkg-maps@1.0.0: 1172 1184 resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} ··· 1190 1202 resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 1191 1203 engines: {node: '>=10'} 1192 1204 1193 - sirv@3.0.1: 1194 - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} 1195 - engines: {node: '>=18'} 1196 - 1197 1205 solid-js@1.9.9: 1198 1206 resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} 1199 1207 ··· 1206 1214 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1207 1215 engines: {node: '>=0.10.0'} 1208 1216 1217 + tailwindcss@4.1.12: 1218 + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} 1219 + 1220 + tapable@2.2.3: 1221 + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} 1222 + engines: {node: '>=6'} 1223 + 1224 + tar@7.4.3: 1225 + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} 1226 + engines: {node: '>=18'} 1227 + 1209 1228 tinyexec@1.0.1: 1210 1229 resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} 1211 1230 ··· 1213 1232 resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1214 1233 engines: {node: '>=12.0.0'} 1215 1234 1216 - to-regex-range@5.0.1: 1217 - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1218 - engines: {node: '>=8.0'} 1219 - 1220 - totalist@3.0.1: 1221 - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1222 - engines: {node: '>=6'} 1223 - 1224 1235 tsx@4.19.2: 1225 1236 resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} 1226 1237 engines: {node: '>=18.0.0'} ··· 1233 1244 1234 1245 ufo@1.6.1: 1235 1246 resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1236 - 1237 - unconfig@7.3.3: 1238 - resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} 1239 1247 1240 1248 undici-types@6.20.0: 1241 1249 resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1242 1250 1243 - unocss@66.4.2: 1244 - resolution: {integrity: sha512-PsZ+4XF/ekiParR7PZEM7AchvHJ78EIfOXlqTPflTOXCYgZ77kG9NaIaIf4lHRevY+rRTyrHrjxdg1Ern2j8qw==} 1245 - engines: {node: '>=14'} 1246 - peerDependencies: 1247 - '@unocss/webpack': 66.4.2 1248 - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 1249 - peerDependenciesMeta: 1250 - '@unocss/webpack': 1251 - optional: true 1252 - vite: 1253 - optional: true 1254 - 1255 - unplugin-utils@0.2.5: 1256 - resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==} 1257 - engines: {node: '>=18.12.0'} 1258 - 1259 1251 update-browserslist-db@1.1.3: 1260 1252 resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1261 1253 hasBin: true ··· 1323 1315 vite: 1324 1316 optional: true 1325 1317 1326 - vue-flow-layout@0.2.0: 1327 - resolution: {integrity: sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==} 1328 - 1329 1318 yallist@3.1.1: 1330 1319 resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1320 + 1321 + yallist@5.0.0: 1322 + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} 1323 + engines: {node: '>=18'} 1331 1324 1332 1325 yocto-queue@1.2.1: 1333 1326 resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} ··· 1345 1338 package-manager-detector: 1.3.0 1346 1339 tinyexec: 1.0.1 1347 1340 1348 - '@antfu/utils@9.2.0': {} 1341 + '@antfu/utils@8.1.1': {} 1349 1342 1350 1343 '@atcute/atproto@3.1.2': 1351 1344 dependencies: ··· 1712 1705 dependencies: 1713 1706 '@iconify/types': 2.0.0 1714 1707 1708 + '@iconify/tailwind4@1.0.6(tailwindcss@4.1.12)': 1709 + dependencies: 1710 + '@iconify/types': 2.0.0 1711 + '@iconify/utils': 2.3.0 1712 + tailwindcss: 4.1.12 1713 + transitivePeerDependencies: 1714 + - supports-color 1715 + 1715 1716 '@iconify/types@2.0.0': {} 1716 1717 1717 - '@iconify/utils@3.0.1': 1718 + '@iconify/utils@2.3.0': 1718 1719 dependencies: 1719 1720 '@antfu/install-pkg': 1.1.0 1720 - '@antfu/utils': 9.2.0 1721 + '@antfu/utils': 8.1.1 1721 1722 '@iconify/types': 2.0.0 1722 1723 debug: 4.4.1 1723 1724 globals: 15.15.0 ··· 1727 1728 transitivePeerDependencies: 1728 1729 - supports-color 1729 1730 1731 + '@isaacs/fs-minipass@4.0.1': 1732 + dependencies: 1733 + minipass: 7.1.2 1734 + 1730 1735 '@jridgewell/gen-mapping@0.3.13': 1731 1736 dependencies: 1732 1737 '@jridgewell/sourcemap-codec': 1.5.5 1733 1738 '@jridgewell/trace-mapping': 0.3.30 1734 1739 1740 + '@jridgewell/remapping@2.3.5': 1741 + dependencies: 1742 + '@jridgewell/gen-mapping': 0.3.13 1743 + '@jridgewell/trace-mapping': 0.3.30 1744 + 1735 1745 '@jridgewell/resolve-uri@3.1.2': {} 1736 1746 1737 1747 '@jridgewell/sourcemap-codec@1.5.5': {} ··· 1744 1754 '@jsr/mary__exif-rm@0.2.2': {} 1745 1755 1746 1756 '@noble/secp256k1@2.3.0': {} 1747 - 1748 - '@polka/url@1.0.0-next.29': {} 1749 - 1750 - '@quansync/fs@0.1.5': 1751 - dependencies: 1752 - quansync: 0.2.11 1753 1757 1754 1758 '@rollup/rollup-android-arm-eabi@4.49.0': 1755 1759 optional: true ··· 1825 1829 dependencies: 1826 1830 solid-js: 1.9.9 1827 1831 1828 - '@types/babel__core@7.20.5': 1832 + '@tailwindcss/node@4.1.12': 1829 1833 dependencies: 1830 - '@babel/parser': 7.28.3 1831 - '@babel/types': 7.28.2 1832 - '@types/babel__generator': 7.27.0 1833 - '@types/babel__template': 7.4.4 1834 - '@types/babel__traverse': 7.28.0 1835 - 1836 - '@types/babel__generator@7.27.0': 1837 - dependencies: 1838 - '@babel/types': 7.28.2 1839 - 1840 - '@types/babel__template@7.4.4': 1841 - dependencies: 1842 - '@babel/parser': 7.28.3 1843 - '@babel/types': 7.28.2 1844 - 1845 - '@types/babel__traverse@7.28.0': 1846 - dependencies: 1847 - '@babel/types': 7.28.2 1848 - 1849 - '@types/estree@1.0.8': {} 1850 - 1851 - '@types/node@22.13.1': 1852 - dependencies: 1853 - undici-types: 6.20.0 1854 - optional: true 1855 - 1856 - '@unocss/astro@66.4.2(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2))': 1857 - dependencies: 1858 - '@unocss/core': 66.4.2 1859 - '@unocss/reset': 66.4.2 1860 - '@unocss/vite': 66.4.2(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)) 1861 - optionalDependencies: 1862 - vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2) 1863 - 1864 - '@unocss/cli@66.4.2': 1865 - dependencies: 1866 - '@ampproject/remapping': 2.3.0 1867 - '@unocss/config': 66.4.2 1868 - '@unocss/core': 66.4.2 1869 - '@unocss/preset-uno': 66.4.2 1870 - cac: 6.7.14 1871 - chokidar: 3.6.0 1872 - colorette: 2.0.20 1873 - consola: 3.4.2 1834 + '@jridgewell/remapping': 2.3.5 1835 + enhanced-resolve: 5.18.3 1836 + jiti: 2.5.1 1837 + lightningcss: 1.30.1 1874 1838 magic-string: 0.30.18 1875 - pathe: 2.0.3 1876 - perfect-debounce: 1.0.0 1877 - tinyglobby: 0.2.14 1878 - unplugin-utils: 0.2.5 1839 + source-map-js: 1.2.1 1840 + tailwindcss: 4.1.12 1879 1841 1880 - '@unocss/config@66.4.2': 1881 - dependencies: 1882 - '@unocss/core': 66.4.2 1883 - unconfig: 7.3.3 1842 + '@tailwindcss/oxide-android-arm64@4.1.12': 1843 + optional: true 1884 1844 1885 - '@unocss/core@66.4.2': {} 1845 + '@tailwindcss/oxide-darwin-arm64@4.1.12': 1846 + optional: true 1886 1847 1887 - '@unocss/extractor-arbitrary-variants@66.4.2': 1888 - dependencies: 1889 - '@unocss/core': 66.4.2 1848 + '@tailwindcss/oxide-darwin-x64@4.1.12': 1849 + optional: true 1890 1850 1891 - '@unocss/inspector@66.4.2': 1892 - dependencies: 1893 - '@unocss/core': 66.4.2 1894 - '@unocss/rule-utils': 66.4.2 1895 - colorette: 2.0.20 1896 - gzip-size: 6.0.0 1897 - sirv: 3.0.1 1898 - vue-flow-layout: 0.2.0 1851 + '@tailwindcss/oxide-freebsd-x64@4.1.12': 1852 + optional: true 1899 1853 1900 - '@unocss/postcss@66.4.2(postcss@8.5.6)': 1901 - dependencies: 1902 - '@unocss/config': 66.4.2 1903 - '@unocss/core': 66.4.2 1904 - '@unocss/rule-utils': 66.4.2 1905 - css-tree: 3.1.0 1906 - postcss: 8.5.6 1907 - tinyglobby: 0.2.14 1854 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': 1855 + optional: true 1908 1856 1909 - '@unocss/preset-attributify@66.4.2': 1910 - dependencies: 1911 - '@unocss/core': 66.4.2 1857 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': 1858 + optional: true 1912 1859 1913 - '@unocss/preset-icons@66.4.2': 1914 - dependencies: 1915 - '@iconify/utils': 3.0.1 1916 - '@unocss/core': 66.4.2 1917 - ofetch: 1.4.1 1918 - transitivePeerDependencies: 1919 - - supports-color 1860 + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': 1861 + optional: true 1920 1862 1921 - '@unocss/preset-mini@66.4.2': 1922 - dependencies: 1923 - '@unocss/core': 66.4.2 1924 - '@unocss/extractor-arbitrary-variants': 66.4.2 1925 - '@unocss/rule-utils': 66.4.2 1863 + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': 1864 + optional: true 1926 1865 1927 - '@unocss/preset-tagify@66.4.2': 1928 - dependencies: 1929 - '@unocss/core': 66.4.2 1866 + '@tailwindcss/oxide-linux-x64-musl@4.1.12': 1867 + optional: true 1930 1868 1931 - '@unocss/preset-typography@66.4.2': 1932 - dependencies: 1933 - '@unocss/core': 66.4.2 1934 - '@unocss/preset-mini': 66.4.2 1935 - '@unocss/rule-utils': 66.4.2 1869 + '@tailwindcss/oxide-wasm32-wasi@4.1.12': 1870 + optional: true 1936 1871 1937 - '@unocss/preset-uno@66.4.2': 1938 - dependencies: 1939 - '@unocss/core': 66.4.2 1940 - '@unocss/preset-wind3': 66.4.2 1872 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': 1873 + optional: true 1941 1874 1942 - '@unocss/preset-web-fonts@66.4.2': 1943 - dependencies: 1944 - '@unocss/core': 66.4.2 1945 - ofetch: 1.4.1 1875 + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': 1876 + optional: true 1946 1877 1947 - '@unocss/preset-wind3@66.4.2': 1878 + '@tailwindcss/oxide@4.1.12': 1948 1879 dependencies: 1949 - '@unocss/core': 66.4.2 1950 - '@unocss/preset-mini': 66.4.2 1951 - '@unocss/rule-utils': 66.4.2 1880 + detect-libc: 2.0.4 1881 + tar: 7.4.3 1882 + optionalDependencies: 1883 + '@tailwindcss/oxide-android-arm64': 4.1.12 1884 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 1885 + '@tailwindcss/oxide-darwin-x64': 4.1.12 1886 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 1887 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 1888 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 1889 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 1890 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 1891 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 1892 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 1893 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 1894 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 1952 1895 1953 - '@unocss/preset-wind4@66.4.2': 1896 + '@tailwindcss/vite@4.1.12(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2))': 1954 1897 dependencies: 1955 - '@unocss/core': 66.4.2 1956 - '@unocss/extractor-arbitrary-variants': 66.4.2 1957 - '@unocss/rule-utils': 66.4.2 1898 + '@tailwindcss/node': 4.1.12 1899 + '@tailwindcss/oxide': 4.1.12 1900 + tailwindcss: 4.1.12 1901 + vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2) 1958 1902 1959 - '@unocss/preset-wind@66.4.2': 1903 + '@types/babel__core@7.20.5': 1960 1904 dependencies: 1961 - '@unocss/core': 66.4.2 1962 - '@unocss/preset-wind3': 66.4.2 1905 + '@babel/parser': 7.28.3 1906 + '@babel/types': 7.28.2 1907 + '@types/babel__generator': 7.27.0 1908 + '@types/babel__template': 7.4.4 1909 + '@types/babel__traverse': 7.28.0 1963 1910 1964 - '@unocss/reset@66.4.2': {} 1965 - 1966 - '@unocss/rule-utils@66.4.2': 1911 + '@types/babel__generator@7.27.0': 1967 1912 dependencies: 1968 - '@unocss/core': 66.4.2 1969 - magic-string: 0.30.18 1913 + '@babel/types': 7.28.2 1970 1914 1971 - '@unocss/transformer-attributify-jsx@66.4.2': 1915 + '@types/babel__template@7.4.4': 1972 1916 dependencies: 1973 1917 '@babel/parser': 7.28.3 1974 - '@babel/traverse': 7.28.3 1975 - '@unocss/core': 66.4.2 1976 - transitivePeerDependencies: 1977 - - supports-color 1978 - 1979 - '@unocss/transformer-compile-class@66.4.2': 1980 - dependencies: 1981 - '@unocss/core': 66.4.2 1918 + '@babel/types': 7.28.2 1982 1919 1983 - '@unocss/transformer-directives@66.4.2': 1920 + '@types/babel__traverse@7.28.0': 1984 1921 dependencies: 1985 - '@unocss/core': 66.4.2 1986 - '@unocss/rule-utils': 66.4.2 1987 - css-tree: 3.1.0 1922 + '@babel/types': 7.28.2 1988 1923 1989 - '@unocss/transformer-variant-group@66.4.2': 1990 - dependencies: 1991 - '@unocss/core': 66.4.2 1924 + '@types/estree@1.0.8': {} 1992 1925 1993 - '@unocss/vite@66.4.2(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2))': 1926 + '@types/node@22.13.1': 1994 1927 dependencies: 1995 - '@ampproject/remapping': 2.3.0 1996 - '@unocss/config': 66.4.2 1997 - '@unocss/core': 66.4.2 1998 - '@unocss/inspector': 66.4.2 1999 - chokidar: 3.6.0 2000 - magic-string: 0.30.18 2001 - pathe: 2.0.3 2002 - tinyglobby: 0.2.14 2003 - unplugin-utils: 0.2.5 2004 - vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2) 1928 + undici-types: 6.20.0 1929 + optional: true 2005 1930 2006 1931 acorn@8.15.0: {} 2007 - 2008 - anymatch@3.1.3: 2009 - dependencies: 2010 - normalize-path: 3.0.0 2011 - picomatch: 2.3.1 2012 1932 2013 1933 babel-plugin-jsx-dom-expressions@0.40.1(@babel/core@7.28.3): 2014 1934 dependencies: ··· 2027 1947 optionalDependencies: 2028 1948 solid-js: 1.9.9 2029 1949 2030 - binary-extensions@2.3.0: {} 2031 - 2032 - braces@3.0.3: 2033 - dependencies: 2034 - fill-range: 7.1.1 2035 - 2036 1950 browserslist@4.25.3: 2037 1951 dependencies: 2038 1952 caniuse-lite: 1.0.30001737 ··· 2040 1954 node-releases: 2.0.19 2041 1955 update-browserslist-db: 1.1.3(browserslist@4.25.3) 2042 1956 2043 - cac@6.7.14: {} 2044 - 2045 1957 caniuse-lite@1.0.30001737: {} 2046 1958 2047 - chokidar@3.6.0: 2048 - dependencies: 2049 - anymatch: 3.1.3 2050 - braces: 3.0.3 2051 - glob-parent: 5.1.2 2052 - is-binary-path: 2.1.0 2053 - is-glob: 4.0.3 2054 - normalize-path: 3.0.0 2055 - readdirp: 3.6.0 2056 - optionalDependencies: 2057 - fsevents: 2.3.3 2058 - 2059 - colorette@2.0.20: {} 1959 + chownr@3.0.0: {} 2060 1960 2061 1961 confbox@0.1.8: {} 2062 1962 2063 1963 confbox@0.2.2: {} 2064 - 2065 - consola@3.4.2: {} 2066 1964 2067 1965 convert-source-map@2.0.0: {} 2068 1966 2069 - css-tree@3.1.0: 2070 - dependencies: 2071 - mdn-data: 2.12.2 2072 - source-map-js: 1.2.1 2073 - 2074 1967 csstype@3.1.3: {} 2075 1968 2076 1969 debug@4.4.1: 2077 1970 dependencies: 2078 1971 ms: 2.1.3 2079 1972 2080 - defu@6.1.4: {} 1973 + detect-libc@2.0.4: {} 2081 1974 2082 - destr@2.0.5: {} 1975 + electron-to-chromium@1.5.211: {} 2083 1976 2084 - duplexer@0.1.2: {} 2085 - 2086 - electron-to-chromium@1.5.211: {} 1977 + enhanced-resolve@5.18.3: 1978 + dependencies: 1979 + graceful-fs: 4.2.11 1980 + tapable: 2.2.3 2087 1981 2088 1982 entities@6.0.1: {} 2089 1983 ··· 2154 2048 optionalDependencies: 2155 2049 picomatch: 4.0.3 2156 2050 2157 - fill-range@7.1.1: 2158 - dependencies: 2159 - to-regex-range: 5.0.1 2160 - 2161 2051 fsevents@2.3.3: 2162 2052 optional: true 2163 2053 ··· 2168 2058 resolve-pkg-maps: 1.0.0 2169 2059 optional: true 2170 2060 2171 - glob-parent@5.1.2: 2172 - dependencies: 2173 - is-glob: 4.0.3 2174 - 2175 2061 globals@15.15.0: {} 2176 2062 2177 - gzip-size@6.0.0: 2178 - dependencies: 2179 - duplexer: 0.1.2 2063 + graceful-fs@4.2.11: {} 2180 2064 2181 2065 hls.js@1.6.11: {} 2182 2066 2183 2067 html-entities@2.3.3: {} 2184 - 2185 - is-binary-path@2.1.0: 2186 - dependencies: 2187 - binary-extensions: 2.3.0 2188 - 2189 - is-extglob@2.1.1: {} 2190 - 2191 - is-glob@4.0.3: 2192 - dependencies: 2193 - is-extglob: 2.1.1 2194 - 2195 - is-number@7.0.0: {} 2196 2068 2197 2069 is-what@4.1.16: {} 2198 2070 ··· 2206 2078 2207 2079 kolorist@1.8.0: {} 2208 2080 2081 + lightningcss-darwin-arm64@1.30.1: 2082 + optional: true 2083 + 2084 + lightningcss-darwin-x64@1.30.1: 2085 + optional: true 2086 + 2087 + lightningcss-freebsd-x64@1.30.1: 2088 + optional: true 2089 + 2090 + lightningcss-linux-arm-gnueabihf@1.30.1: 2091 + optional: true 2092 + 2093 + lightningcss-linux-arm64-gnu@1.30.1: 2094 + optional: true 2095 + 2096 + lightningcss-linux-arm64-musl@1.30.1: 2097 + optional: true 2098 + 2099 + lightningcss-linux-x64-gnu@1.30.1: 2100 + optional: true 2101 + 2102 + lightningcss-linux-x64-musl@1.30.1: 2103 + optional: true 2104 + 2105 + lightningcss-win32-arm64-msvc@1.30.1: 2106 + optional: true 2107 + 2108 + lightningcss-win32-x64-msvc@1.30.1: 2109 + optional: true 2110 + 2111 + lightningcss@1.30.1: 2112 + dependencies: 2113 + detect-libc: 2.0.4 2114 + optionalDependencies: 2115 + lightningcss-darwin-arm64: 1.30.1 2116 + lightningcss-darwin-x64: 1.30.1 2117 + lightningcss-freebsd-x64: 1.30.1 2118 + lightningcss-linux-arm-gnueabihf: 1.30.1 2119 + lightningcss-linux-arm64-gnu: 1.30.1 2120 + lightningcss-linux-arm64-musl: 1.30.1 2121 + lightningcss-linux-x64-gnu: 1.30.1 2122 + lightningcss-linux-x64-musl: 1.30.1 2123 + lightningcss-win32-arm64-msvc: 1.30.1 2124 + lightningcss-win32-x64-msvc: 1.30.1 2125 + 2209 2126 local-pkg@1.1.2: 2210 2127 dependencies: 2211 2128 mlly: 1.8.0 ··· 2220 2137 dependencies: 2221 2138 '@jridgewell/sourcemap-codec': 1.5.5 2222 2139 2223 - mdn-data@2.12.2: {} 2224 - 2225 2140 merge-anything@5.1.7: 2226 2141 dependencies: 2227 2142 is-what: 4.1.16 2228 2143 2144 + minipass@7.1.2: {} 2145 + 2146 + minizlib@3.0.2: 2147 + dependencies: 2148 + minipass: 7.1.2 2149 + 2150 + mkdirp@3.0.1: {} 2151 + 2229 2152 mlly@1.8.0: 2230 2153 dependencies: 2231 2154 acorn: 8.15.0 ··· 2234 2157 ufo: 1.6.1 2235 2158 2236 2159 monaco-editor@0.52.2: {} 2237 - 2238 - mrmime@2.0.1: {} 2239 2160 2240 2161 ms@2.1.3: {} 2241 2162 ··· 2245 2166 2246 2167 nanoid@5.1.5: {} 2247 2168 2248 - node-fetch-native@1.6.7: {} 2249 - 2250 2169 node-releases@2.0.19: {} 2251 2170 2252 - normalize-path@3.0.0: {} 2253 - 2254 - ofetch@1.4.1: 2255 - dependencies: 2256 - destr: 2.0.5 2257 - node-fetch-native: 1.6.7 2258 - ufo: 1.6.1 2259 - 2260 2171 package-manager-detector@1.3.0: {} 2261 2172 2262 2173 parse5@7.3.0: ··· 2265 2176 2266 2177 pathe@2.0.3: {} 2267 2178 2268 - perfect-debounce@1.0.0: {} 2269 - 2270 2179 picocolors@1.1.1: {} 2271 - 2272 - picomatch@2.3.1: {} 2273 2180 2274 2181 picomatch@4.0.3: {} 2275 2182 ··· 2299 2206 2300 2207 quansync@0.2.11: {} 2301 2208 2302 - readdirp@3.6.0: 2303 - dependencies: 2304 - picomatch: 2.3.1 2305 - 2306 2209 resolve-pkg-maps@1.0.0: 2307 2210 optional: true 2308 2211 ··· 2340 2243 2341 2244 seroval@1.3.2: {} 2342 2245 2343 - sirv@3.0.1: 2344 - dependencies: 2345 - '@polka/url': 1.0.0-next.29 2346 - mrmime: 2.0.1 2347 - totalist: 3.0.1 2348 - 2349 2246 solid-js@1.9.9: 2350 2247 dependencies: 2351 2248 csstype: 3.1.3 ··· 2363 2260 2364 2261 source-map-js@1.2.1: {} 2365 2262 2263 + tailwindcss@4.1.12: {} 2264 + 2265 + tapable@2.2.3: {} 2266 + 2267 + tar@7.4.3: 2268 + dependencies: 2269 + '@isaacs/fs-minipass': 4.0.1 2270 + chownr: 3.0.0 2271 + minipass: 7.1.2 2272 + minizlib: 3.0.2 2273 + mkdirp: 3.0.1 2274 + yallist: 5.0.0 2275 + 2366 2276 tinyexec@1.0.1: {} 2367 2277 2368 2278 tinyglobby@0.2.14: ··· 2370 2280 fdir: 6.5.0(picomatch@4.0.3) 2371 2281 picomatch: 4.0.3 2372 2282 2373 - to-regex-range@5.0.1: 2374 - dependencies: 2375 - is-number: 7.0.0 2376 - 2377 - totalist@3.0.1: {} 2378 - 2379 2283 tsx@4.19.2: 2380 2284 dependencies: 2381 2285 esbuild: 0.23.1 ··· 2387 2291 typescript@5.9.2: {} 2388 2292 2389 2293 ufo@1.6.1: {} 2390 - 2391 - unconfig@7.3.3: 2392 - dependencies: 2393 - '@quansync/fs': 0.1.5 2394 - defu: 6.1.4 2395 - jiti: 2.5.1 2396 - quansync: 0.2.11 2397 2294 2398 2295 undici-types@6.20.0: 2399 2296 optional: true 2400 2297 2401 - unocss@66.4.2(postcss@8.5.6)(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)): 2402 - dependencies: 2403 - '@unocss/astro': 66.4.2(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)) 2404 - '@unocss/cli': 66.4.2 2405 - '@unocss/core': 66.4.2 2406 - '@unocss/postcss': 66.4.2(postcss@8.5.6) 2407 - '@unocss/preset-attributify': 66.4.2 2408 - '@unocss/preset-icons': 66.4.2 2409 - '@unocss/preset-mini': 66.4.2 2410 - '@unocss/preset-tagify': 66.4.2 2411 - '@unocss/preset-typography': 66.4.2 2412 - '@unocss/preset-uno': 66.4.2 2413 - '@unocss/preset-web-fonts': 66.4.2 2414 - '@unocss/preset-wind': 66.4.2 2415 - '@unocss/preset-wind3': 66.4.2 2416 - '@unocss/preset-wind4': 66.4.2 2417 - '@unocss/transformer-attributify-jsx': 66.4.2 2418 - '@unocss/transformer-compile-class': 66.4.2 2419 - '@unocss/transformer-directives': 66.4.2 2420 - '@unocss/transformer-variant-group': 66.4.2 2421 - '@unocss/vite': 66.4.2(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)) 2422 - optionalDependencies: 2423 - vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2) 2424 - transitivePeerDependencies: 2425 - - postcss 2426 - - supports-color 2427 - 2428 - unplugin-utils@0.2.5: 2429 - dependencies: 2430 - pathe: 2.0.3 2431 - picomatch: 4.0.3 2432 - 2433 2298 update-browserslist-db@1.1.3(browserslist@4.25.3): 2434 2299 dependencies: 2435 2300 browserslist: 4.25.3 ··· 2438 2303 2439 2304 validate-html-nesting@1.2.3: {} 2440 2305 2441 - vite-plugin-solid@2.11.8(solid-js@1.9.9)(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)): 2306 + vite-plugin-solid@2.11.8(solid-js@1.9.9)(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2)): 2442 2307 dependencies: 2443 2308 '@babel/core': 7.28.3 2444 2309 '@types/babel__core': 7.20.5 ··· 2446 2311 merge-anything: 5.1.7 2447 2312 solid-js: 1.9.9 2448 2313 solid-refresh: 0.6.3(solid-js@1.9.9) 2449 - vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2) 2450 - vitefu: 1.1.1(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)) 2314 + vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2) 2315 + vitefu: 1.1.1(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2)) 2451 2316 transitivePeerDependencies: 2452 2317 - supports-color 2453 2318 2454 - vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2): 2319 + vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2): 2455 2320 dependencies: 2456 2321 esbuild: 0.25.9 2457 2322 fdir: 6.5.0(picomatch@4.0.3) ··· 2463 2328 '@types/node': 22.13.1 2464 2329 fsevents: 2.3.3 2465 2330 jiti: 2.5.1 2331 + lightningcss: 1.30.1 2466 2332 tsx: 4.19.2 2467 2333 2468 - vitefu@1.1.1(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2)): 2334 + vitefu@1.1.1(vite@7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2)): 2469 2335 optionalDependencies: 2470 - vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(tsx@4.19.2) 2336 + vite: 7.1.3(@types/node@22.13.1)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2) 2471 2337 2472 - vue-flow-layout@0.2.0: {} 2338 + yallist@3.1.1: {} 2473 2339 2474 - yallist@3.1.1: {} 2340 + yallist@5.0.0: {} 2475 2341 2476 2342 yocto-queue@1.2.1: {}
+7 -7
src/components/account.tsx
··· 68 68 return ( 69 69 <> 70 70 <Modal open={openManager()} onClose={() => setOpenManager(false)}> 71 - <div class="starting:opacity-0 dark:bg-dark-800/70 border-0.5 w-22rem dark:shadow-dark-900/80 backdrop-blur-xs left-50% absolute top-12 -translate-x-1/2 rounded-lg border-neutral-300 bg-neutral-200/70 p-4 text-neutral-900 shadow-md transition-opacity duration-300 dark:border-neutral-700 dark:text-neutral-200"> 71 + <div class="dark:bg-dark-800/70 dark:shadow-dark-900/80 absolute top-12 left-[50%] w-[22rem] -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-200/70 p-4 text-neutral-900 shadow-md backdrop-blur-xs transition-opacity duration-300 dark:border-neutral-700 dark:text-neutral-200 starting:opacity-0"> 72 72 <div class="mb-2 flex items-center gap-1 font-bold"> 73 - <div class="i-lucide-user-round" /> 73 + <span class="iconify lucide--user-round"></span> 74 74 <span>Manage accounts</span> 75 75 </div> 76 76 <div class="mb-3 max-h-[20rem] overflow-y-auto md:max-h-[25rem]"> 77 77 <For each={Object.keys(sessions)}> 78 78 {(did) => ( 79 - <div class="flex w-full items-center justify-between gap-x-2 rounded-lg hover:bg-neutral-100 dark:hover:bg-neutral-600"> 79 + <div class="flex w-full items-center justify-between gap-x-2 rounded-lg hover:bg-neutral-100 active:bg-neutral-100 dark:hover:bg-neutral-600 dark:active:bg-neutral-600"> 80 80 <button 81 81 class="flex basis-full items-center justify-between gap-1 truncate p-1" 82 82 onclick={() => resumeSession(did as Did)} 83 83 > 84 84 <span class="truncate">{sessions[did]?.length ? sessions[did] : did}</span> 85 85 <Show when={did === agent()?.sub}> 86 - <div class="i-lucide-check shrink-0" /> 86 + <span class="iconify lucide--check shrink-0"></span> 87 87 </Show> 88 88 </button> 89 89 <button 90 90 onclick={() => removeSession(did as Did)} 91 - class="p-1.5 hover:text-red-500 hover:dark:text-red-400" 91 + class="flex items-center p-1.5 hover:text-red-500 hover:dark:text-red-400" 92 92 > 93 - <div class="i-lucide-user-round-x text-lg" /> 93 + <span class="iconify lucide--user-round-x text-lg"></span> 94 94 </button> 95 95 </div> 96 96 )} ··· 103 103 <Tooltip text="Accounts"> 104 104 {agent() && avatar() ? 105 105 <img src={avatar()} class="dark:shadow-dark-900/80 size-5 rounded-full shadow-sm" /> 106 - : <div class="i-lucide-circle-user-round text-xl" />} 106 + : <span class="iconify lucide--circle-user-round text-xl"></span>} 107 107 </Tooltip> 108 108 </button> 109 109 </>
+7 -7
src/components/backlinks.tsx
··· 39 39 40 40 return ( 41 41 <Show when={response()}> 42 - <div class="break-anywhere flex w-full flex-col gap-1 text-sm"> 42 + <div class="flex w-full flex-col gap-1 text-sm wrap-anywhere"> 43 43 <For each={backlinks()}> 44 44 {({ collection, path, counts }) => ( 45 45 <div> 46 46 <div> 47 47 <div title="Collection containing linking records" class="flex items-center gap-1"> 48 - <div class="i-lucide-book-text shrink-0" /> 48 + <span class="iconify lucide--book-text shrink-0"></span> 49 49 {collection} 50 50 </div> 51 51 <div title="Record path where the link is found" class="flex items-center gap-1"> 52 - <div class="i-lucide-route shrink-0" /> 52 + <span class="iconify lucide--route shrink-0"></span> 53 53 {path.slice(1)} 54 54 </div> 55 55 </div> 56 56 <div class="ml-4.5"> 57 57 <p> 58 58 <a 59 - class="text-blue-400 hover:underline" 59 + class="text-blue-400 hover:underline active:underline" 60 60 href="#" 61 61 title="Show linking records" 62 62 onclick={() => ··· 73 73 </a> 74 74 {" from "} 75 75 <a 76 - class="text-blue-400 hover:underline" 76 + class="text-blue-400 hover:underline active:underline" 77 77 href="#" 78 78 title="Show linking DIDs" 79 79 onclick={() => ··· 158 158 {(did) => ( 159 159 <a 160 160 href={`/at://${did}`} 161 - class="relative flex w-full font-mono text-blue-400 hover:underline" 161 + class="relative flex w-full font-mono text-blue-400 hover:underline active:underline" 162 162 > 163 163 {did} 164 164 </a> ··· 169 169 <For each={links().linking_records}> 170 170 {({ did, collection, rkey }) => ( 171 171 <p class="relative flex w-full items-center gap-1 font-mono"> 172 - <a href={`/at://${did}/${collection}/${rkey}`} class="text-blue-400 hover:underline"> 172 + <a href={`/at://${did}/${collection}/${rkey}`} class="text-blue-400 hover:underline active:underline"> 173 173 {rkey} 174 174 </a> 175 175 <span class="text-xs text-neutral-500 dark:text-neutral-400">
+1 -1
src/components/button.tsx
··· 12 12 type="button" 13 13 class={ 14 14 props.class ?? 15 - "dark:hover:bg-dark-100 dark:bg-dark-300 dark:shadow-dark-900/80 flex items-center gap-1 rounded-lg bg-white px-2 py-1.5 text-xs font-semibold shadow-sm hover:bg-neutral-50" 15 + "dark:hover:bg-dark-100 dark:bg-dark-300 dark:shadow-dark-900/80 dark:active:bg-dark-100 flex items-center gap-1 rounded-lg bg-white px-2 py-1.5 text-xs font-semibold shadow-sm hover:bg-neutral-50 active:bg-neutral-50" 16 16 } 17 17 onClick={props.onClick} 18 18 >
+15 -15
src/components/create.tsx
··· 173 173 return ( 174 174 <> 175 175 <Modal open={openDialog()} onClose={() => setOpenDialog(false)}> 176 - <div class="w-22rem sm:w-xl lg:w-48rem starting:opacity-0 dark:bg-dark-800/70 left-50% backdrop-blur-xs border-0.5 dark:shadow-dark-900/80 absolute top-12 -translate-x-1/2 rounded-lg border-neutral-300 bg-neutral-200/70 p-2 text-neutral-900 shadow-md transition-opacity duration-300 sm:p-4 dark:border-neutral-700 dark:text-neutral-200"> 176 + <div class="dark:bg-dark-800/70 dark:shadow-dark-900/80 absolute top-12 left-[50%] w-[22rem] -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-200/70 p-2 text-neutral-900 shadow-md backdrop-blur-xs transition-opacity duration-300 sm:w-xl sm:p-4 lg:w-[48rem] dark:border-neutral-700 dark:text-neutral-200 starting:opacity-0"> 177 177 <div class="mb-2 flex w-full justify-between"> 178 178 <div class="flex items-center gap-1 font-bold"> 179 - <div class="i-lucide-square-pen" /> 179 + <span class="iconify lucide--square-pen"></span> 180 180 <span>{props.create ? "Creating" : "Editing"} record</span> 181 181 </div> 182 - <button onclick={() => setOpenDialog(false)}> 183 - <div class="i-lucide-x text-lg hover:text-neutral-500 dark:hover:text-neutral-400" /> 182 + <button onclick={() => setOpenDialog(false)} class="flex items-center"> 183 + <span class="iconify lucide--x text-lg hover:text-neutral-500 dark:hover:text-neutral-400"></span> 184 184 </button> 185 185 </div> 186 186 <form ref={formRef} class="flex flex-col gap-y-2"> ··· 194 194 id="collection" 195 195 name="collection" 196 196 placeholder="Optional (default: record type)" 197 - class="w-14rem" 197 + class="w-[14rem]" 198 198 /> 199 199 </div> 200 200 <div class="flex items-center gap-x-2"> 201 201 <label for="rkey" class="min-w-20 select-none"> 202 202 Record key 203 203 </label> 204 - <TextInput id="rkey" name="rkey" placeholder="Optional" class="w-14rem" /> 204 + <TextInput id="rkey" name="rkey" placeholder="Optional" class="w-[14rem]" /> 205 205 </div> 206 206 </Show> 207 207 <div class="flex items-center gap-x-2"> ··· 220 220 </div> 221 221 <div class="flex items-center gap-2"> 222 222 <Show when={!uploading()}> 223 - <div class="dark:hover:bg-dark-100 dark:bg-dark-300 dark:shadow-dark-900/80 flex rounded-lg bg-white text-xs font-semibold shadow-sm hover:bg-neutral-50"> 223 + <div class="dark:hover:bg-dark-100 dark:bg-dark-300 dark:shadow-dark-900/80 dark:active:bg-dark-100 flex rounded-lg bg-white text-xs font-semibold shadow-sm hover:bg-neutral-50 active:bg-neutral-50"> 224 224 <input type="file" id="blob" hidden onChange={() => uploadBlob()} /> 225 225 <label class="flex items-center gap-1 px-2 py-1.5" for="blob"> 226 - <div class="i-lucide-upload text-sm" /> 226 + <span class="iconify lucide--upload text-sm"></span> 227 227 Upload 228 228 </label> 229 229 </div> 230 230 <p class="text-xs">Metadata will be pasted after the cursor</p> 231 231 </Show> 232 232 <Show when={uploading()}> 233 - <div class="i-lucide-loader-circle animate-spin text-xl" /> 233 + <span class="iconify lucide--loader-circle animate-spin text-xl"></span> 234 234 <p>Uploading...</p> 235 235 </Show> 236 236 </div> ··· 239 239 <label for="mimetype" class="min-w-20 select-none"> 240 240 MIME type 241 241 </label> 242 - <TextInput id="mimetype" placeholder="Optional" class="w-14rem" /> 242 + <TextInput id="mimetype" placeholder="Optional" class="w-[14rem]" /> 243 243 </div> 244 244 <div class="flex items-center gap-1"> 245 245 <input id="exif-rm" class="size-4" type="checkbox" checked /> ··· 258 258 <Show when={!props.create}> 259 259 <div class="flex items-center gap-1"> 260 260 <input id="recreate" class="size-4" name="recreate" type="checkbox" /> 261 - <label for="recreate" class="select-none text-sm"> 261 + <label for="recreate" class="text-sm select-none"> 262 262 Recreate record 263 263 </label> 264 264 </div> ··· 279 279 </Modal> 280 280 <Tooltip text={`${props.create ? "Create" : "Edit"} record`}> 281 281 <button 282 - class={ 283 - props.create ? "" : "rounded-sm p-1 hover:bg-neutral-100 dark:hover:bg-neutral-600" 284 - } 282 + class={`flex items-center ${props.create ? "" : "rounded-sm p-1 hover:bg-neutral-100 active:bg-neutral-100 dark:hover:bg-neutral-600 dark:active:bg-neutral-600"}`} 285 283 onclick={() => { 286 284 createModel(); 287 285 setOpenDialog(true); 288 286 }} 289 287 > 290 - <div class={props.create ? "i-lucide-square-pen text-xl" : "i-lucide-pencil"} /> 288 + <div 289 + class={props.create ? "iconify lucide--square-pen text-xl" : "iconify lucide--pencil"} 290 + /> 291 291 </button> 292 292 </Tooltip> 293 293 </>
+3 -1
src/components/editor.tsx
··· 30 30 }); 31 31 }); 32 32 33 - return <div ref={editorDiv} class="h-20rem sm:h-24rem dark:shadow-dark-900/80 shadow-sm"></div>; 33 + return ( 34 + <div ref={editorDiv} class="dark:shadow-dark-900/80 h-[20rem] shadow-sm sm:h-[24rem]"></div> 35 + ); 34 36 }; 35 37 36 38 export { Editor, editor };
+14 -12
src/components/json.tsx
··· 35 35 {(part) => ( 36 36 <> 37 37 {ATURI_RE.test(part) ? 38 - <A class="text-blue-400 hover:underline" href={`/${part}`}> 38 + <A class="text-blue-400 hover:underline active:underline" href={`/${part}`}> 39 39 {part} 40 40 </A> 41 41 : DID_RE.test(part) ? 42 - <A class="text-blue-400 hover:underline" href={`/at://${part}`}> 42 + <A class="text-blue-400 hover:underline active:underline" href={`/at://${part}`}> 43 43 {part} 44 44 </A> 45 45 : ( ··· 48 48 part.split("\n").length === 1 49 49 ) ? 50 50 <a 51 - class="text-blue-400 hover:underline" 51 + class="text-blue-400 hover:underline active:underline" 52 52 href={part} 53 53 target="_blank" 54 54 rel="noopener noreferrer" ··· 92 92 }} 93 93 > 94 94 <button 95 - class="max-w-40% sm:max-w-50% break-anywhere group/clip relative flex size-fit shrink-0 items-center text-neutral-500 hover:text-neutral-700 dark:text-neutral-400 dark:hover:text-neutral-300" 95 + class="max-w-40% sm:max-w-50% group/clip relative flex size-fit shrink-0 items-center wrap-anywhere text-neutral-500 hover:text-neutral-700 active:text-neutral-700 dark:text-neutral-400 dark:hover:text-neutral-300 dark:active:text-neutral-300" 96 96 onclick={() => setShow(!show())} 97 97 > 98 98 <span 99 99 classList={{ 100 - "dark:bg-dark-500 absolute w-5 -left-5 bg-neutral-100 text-sm": true, 101 - "hidden group-hover/clip:block": show(), 100 + "dark:bg-dark-500 absolute w-5 flex items-center -left-5 bg-neutral-100 text-sm": true, 101 + "hidden group-hover/clip:flex": show(), 102 102 }} 103 103 > 104 104 {show() ? 105 - <div class="i-lucide-chevron-down" /> 106 - : <div class="i-lucide-chevron-right" />} 105 + <span class="iconify lucide--chevron-down"></span> 106 + : <span class="iconify lucide--chevron-right"></span>} 107 107 </span> 108 108 {key}: 109 109 </button> 110 110 <span 111 111 classList={{ 112 112 "self-center": value !== Object(value), 113 - "pl-[calc(2ch-1px)] border-l-0.5 border-neutral-500/50 dark:border-neutral-400/50 has-hover:group-hover/indent:border-neutral-700 dark:has-hover:group-hover/indent:border-neutral-300": 113 + "pl-[calc(2ch-1px)] border-l-[0.5px] border-neutral-500/50 dark:border-neutral-400/50 has-hover:group-hover/indent:border-neutral-700 dark:has-hover:group-hover/indent:border-neutral-300": 114 114 value === Object(value), 115 115 "invisible h-0": !show(), 116 116 }} ··· 150 150 > 151 151 <Show when={blob.mimeType.startsWith("image/") || blob.mimeType === "video/mp4"}> 152 152 <Tooltip text={hide() ? "Show" : "Hide"}> 153 - <button onclick={() => setHide(!hide())}> 154 - <div class={`text-base ${hide() ? "i-lucide-eye-off" : "i-lucide-eye"}`} /> 153 + <button onclick={() => setHide(!hide())} class="flex items-center"> 154 + <span 155 + class={`iconify text-base ${hide() ? "lucide--eye-off" : "lucide--eye"}`} 156 + ></span> 155 157 </button> 156 158 </Tooltip> 157 159 </Show> ··· 162 164 class="size-fit" 163 165 > 164 166 <Tooltip text="Blob link"> 165 - <div class="i-lucide-external-link text-base" /> 167 + <span class="iconify lucide--external-link text-base"></span> 166 168 </Tooltip> 167 169 </a> 168 170 </Show>
+3 -5
src/components/login.tsx
··· 58 58 return ( 59 59 <form class="flex flex-col gap-y-2" onsubmit={(e) => e.preventDefault()}> 60 60 <div class="flex items-center gap-2"> 61 - <label for="handle"> 62 - <div class="i-lucide-user-round-plus text-lg" /> 61 + <label for="handle" class="flex items-center"> 62 + <span class="iconify lucide--user-round-plus text-lg"></span> 63 63 </label> 64 64 <TextInput 65 65 id="handle" ··· 67 67 onInput={(e) => setLoginInput(e.currentTarget.value)} 68 68 class="grow" 69 69 /> 70 - <button onclick={() => login(loginInput())}> 71 - <div class="i-lucide-log-in text-lg" /> 72 - </button> 70 + <button onclick={() => login(loginInput())} class="iconify lucide--log-in text-lg"></button> 73 71 </div> 74 72 <div>{notice()}</div> 75 73 </form>
+58 -56
src/components/navbar.tsx
··· 12 12 export const [validSchema, setValidSchema] = createSignal<boolean | undefined>(undefined); 13 13 14 14 const swapIcons: Record<string, string> = { 15 - "did:plc:vwzwgnygau7ed7b7wt5ux7y2": "i-lucide-microchip", 16 - "did:plc:oisofpd7lj26yvgiivf3lxsi": "i-lucide-bone", 17 - "did:plc:uu5axsmbm2or2dngy4gwchec": "i-lucide-train-track", 18 - "did:plc:7x6rtuenkuvxq3zsvffp2ide": "i-lucide-rabbit", 19 - "did:plc:ia76kvnndjutgedggx2ibrem": "i-lucide-rabbit", 20 - "did:plc:hvakvedv6byxhufjl23mfmsd": "i-lucide-rat", 21 - "did:plc:ezhjhbzqt32bqprrn6qjlkri": "i-lucide-film", 22 - "did:plc:6v6jqsy7swpzuu53rmzaybjy": "i-lucide-fish", 23 - "did:plc:hx53snho72xoj7zqt5uice4u": "i-lucide-rose", 24 - "did:plc:wzsilnxf24ehtmmc3gssy5bu": "i-lucide-music-2", 25 - "did:plc:bnqkww7bjxaacajzvu5gswdf": "i-lucide-gem", 26 - "did:plc:hdhoaan3xa3jiuq4fg4mefid": "i-lucide-sparkles", 15 + "did:plc:vwzwgnygau7ed7b7wt5ux7y2": "iconify lucide--microchip", 16 + "did:plc:oisofpd7lj26yvgiivf3lxsi": "iconify lucide--bone", 17 + "did:plc:uu5axsmbm2or2dngy4gwchec": "iconify lucide--train-track", 18 + "did:plc:7x6rtuenkuvxq3zsvffp2ide": "iconify lucide--rabbit", 19 + "did:plc:ia76kvnndjutgedggx2ibrem": "iconify lucide--rabbit", 20 + "did:plc:hvakvedv6byxhufjl23mfmsd": "iconify lucide--rat", 21 + "did:plc:ezhjhbzqt32bqprrn6qjlkri": "iconify lucide--film", 22 + "did:plc:6v6jqsy7swpzuu53rmzaybjy": "iconify lucide--fish", 23 + "did:plc:hx53snho72xoj7zqt5uice4u": "iconify lucide--rose", 24 + "did:plc:wzsilnxf24ehtmmc3gssy5bu": "iconify lucide--music-2", 25 + "did:plc:bnqkww7bjxaacajzvu5gswdf": "iconify lucide--gem", 26 + "did:plc:hdhoaan3xa3jiuq4fg4mefid": "iconify lucide--sparkles", 27 27 }; 28 28 29 29 const NavBar = (props: { params: Params }) => { ··· 52 52 }); 53 53 54 54 return ( 55 - <div class="break-anywhere mt-4 flex w-[22rem] flex-col text-sm sm:w-[24rem]"> 55 + <nav class="mt-4 flex w-[22rem] flex-col text-sm wrap-anywhere sm:w-[24rem]"> 56 56 <div class="relative flex items-center justify-between gap-1"> 57 - <div class="min-h-1.25rem flex basis-full items-center gap-2"> 57 + <div class="flex min-h-[1.25rem] basis-full items-center gap-2"> 58 58 <Tooltip text="PDS"> 59 - <button onclick={() => addToClipboard(pds()!)}> 60 - <div class="i-lucide-server shrink-0 text-lg" /> 61 - </button> 59 + <button 60 + class="iconify lucide--server shrink-0 text-lg" 61 + onclick={() => addToClipboard(pds()!)} 62 + ></button> 62 63 </Tooltip> 63 64 <Show when={pds()}> 64 65 <Show when={props.params.repo}> 65 - <A end href={pds()!} inactiveClass="text-blue-400 w-full hover:underline"> 66 + <A end href={pds()!} inactiveClass="text-blue-400 w-full hover:underline active:underline"> 66 67 {pds()} 67 68 </A> 68 69 </Show> ··· 79 80 }`} 80 81 > 81 82 <button 83 + class="iconify lucide--copy shrink-0 text-lg" 82 84 onclick={() => 83 85 addToClipboard( 84 86 props.params.collection ? ··· 87 89 : pds()!, 88 90 ) 89 91 } 90 - > 91 - <div class="i-lucide-copy shrink-0 text-lg" /> 92 - </button> 92 + ></button> 93 93 </Tooltip> 94 94 </div> 95 95 <div class="flex flex-col flex-wrap"> ··· 97 97 <div class="relative mt-1 flex items-center justify-between gap-1"> 98 98 <div class="flex basis-full items-center gap-2"> 99 99 <Tooltip text="Repository"> 100 - <button onclick={() => addToClipboard(props.params.repo)}> 101 - <div class="i-lucide-at-sign text-lg" /> 102 - </button> 100 + <button 101 + class="iconify lucide--at-sign text-lg" 102 + onclick={() => addToClipboard(props.params.repo)} 103 + ></button> 103 104 </Tooltip> 104 105 <div class="flex w-full gap-1"> 105 106 {props.params.collection || location.pathname.includes("/labels") ? 106 107 <A 107 108 end 108 109 href={`/at://${props.params.repo}`} 109 - inactiveClass={`text-blue-400 hover:underline ${!showHandle() ? "w-full" : ""}`} 110 + inactiveClass={`text-blue-400 hover:underline active:underline ${!showHandle() ? "w-full" : ""}`} 110 111 > 111 112 {showHandle() ? handle() : props.params.repo} 112 113 </A> ··· 120 121 : "Invalid handle" 121 122 } 122 123 > 123 - <div 124 + <span 124 125 classList={{ 125 - "i-lucide-circle-check": validHandle() === true, 126 - "i-lucide-circle-x text-red-500 dark:text-red-400": validHandle() === false, 127 - "i-lucide-loader-circle animate-spin": validHandle() === undefined, 126 + "iconify lucide--circle-check": validHandle() === true, 127 + "iconify lucide--circle-x text-red-500 dark:text-red-400": 128 + validHandle() === false, 129 + "iconify lucide--loader-circle animate-spin": validHandle() === undefined, 128 130 }} 129 - /> 131 + ></span> 130 132 </Tooltip> 131 133 </Show> 132 134 </div> ··· 137 139 localStorage.showHandle = !showHandle(); 138 140 setShowHandle(!showHandle()); 139 141 }} 140 - > 141 - <div 142 - class={ 143 - `duration-400 shrink-0 text-lg transition-transform ${showHandle() ? "rotate-y-180" : ""} ` + 144 - (swapIcons[props.params.repo] ?? "i-lucide-arrow-left-right") 145 - } 146 - /> 147 - </button> 142 + class={ 143 + `shrink-0 text-lg transition-transform duration-400 ${showHandle() ? "rotate-y-180" : ""} ` + 144 + (swapIcons[props.params.repo] ?? "iconify lucide--arrow-left-right") 145 + } 146 + ></button> 148 147 </Tooltip> 149 148 </div> 150 149 </Show> 151 150 <Show when={props.params.repo in labelerCache && !props.params.collection}> 152 151 <div class="mt-1 flex items-center gap-2"> 153 - <div class="i-lucide-tag text-lg" /> 152 + <span class="iconify lucide--tag text-lg"></span> 154 153 <A 155 154 end 156 155 href={`/at://${props.params.repo}/labels`} 157 - inactiveClass="text-blue-400 grow hover:underline" 156 + inactiveClass="text-blue-400 grow hover:underline active:underline" 158 157 > 159 158 labels 160 159 </A> ··· 163 162 <Show when={props.params.collection}> 164 163 <div class="mt-1 flex items-center gap-2"> 165 164 <Tooltip text="Collection"> 166 - <button onclick={() => addToClipboard(props.params.collection)}> 167 - <div class="i-lucide-folder-open text-lg" /> 168 - </button> 165 + <button 166 + onclick={() => addToClipboard(props.params.collection)} 167 + class="iconify lucide--folder-open text-lg" 168 + ></button> 169 169 </Tooltip> 170 170 <Show when={props.params.rkey}> 171 171 <A 172 172 end 173 173 href={`/at://${props.params.repo}/${props.params.collection}`} 174 - inactiveClass="text-blue-400 w-full hover:underline" 174 + inactiveClass="text-blue-400 w-full hover:underline active:underline" 175 175 > 176 176 {props.params.collection} 177 177 </A> ··· 184 184 <Show when={props.params.rkey}> 185 185 <div class="mt-1 flex items-center gap-2"> 186 186 <Tooltip text="Record"> 187 - <button onclick={() => addToClipboard(props.params.rkey)}> 188 - <div class="i-lucide-file-json text-lg" /> 189 - </button> 187 + <button 188 + onclick={() => addToClipboard(props.params.rkey)} 189 + class="iconify lucide--file-json text-lg" 190 + ></button> 190 191 </Tooltip> 191 192 <div class="flex gap-1"> 192 193 <span>{props.params.rkey}</span> 193 194 <Show when={validRecord()}> 194 195 <Tooltip text="Valid record"> 195 - <div class="i-lucide-lock-keyhole" /> 196 + <span class="iconify lucide--lock-keyhole"></span> 196 197 </Tooltip> 197 198 </Show> 198 199 <Show when={validRecord() === false}> 199 200 <Tooltip text="Invalid record"> 200 - <div class="i-lucide-lock-keyhole-open text-red-500 dark:text-red-400" /> 201 + <span class="iconify lucide--lock-keyhole-open text-red-500 dark:text-red-400"></span> 201 202 </Tooltip> 202 203 </Show> 203 204 <Show when={validRecord() === undefined}> 204 205 <Tooltip text="Validating"> 205 - <div class="i-lucide-loader-circle animate-spin" /> 206 + <span class="iconify lucide--loader-circle animate-spin"></span> 206 207 </Tooltip> 207 208 </Show> 208 209 <Show when={validSchema()}> 209 210 <Tooltip text="Valid schema"> 210 - <div class="i-lucide-file-check" /> 211 + <span class="iconify lucide--file-check"></span> 211 212 </Tooltip> 212 213 </Show> 213 214 <Show when={validSchema() === false}> 214 215 <Tooltip text="Invalid schema"> 215 - <div class="i-lucide-file-x text-red-500 dark:text-red-400" /> 216 + <span class="iconify lucide--file-x text-red-500 dark:text-red-400"></span> 216 217 </Tooltip> 217 218 </Show> 218 219 </div> ··· 223 224 {(cid) => ( 224 225 <div class="mt-1 flex gap-2"> 225 226 <Tooltip text="CID"> 226 - <button onclick={() => addToClipboard(cid())}> 227 - <div class="i-lucide-box text-lg" /> 228 - </button> 227 + <button 228 + onclick={() => addToClipboard(cid())} 229 + class="iconify lucide--box text-lg" 230 + ></button> 229 231 </Tooltip> 230 232 <button 231 233 dir="rtl" ··· 237 239 </div> 238 240 )} 239 241 </Show> 240 - </div> 242 + </nav> 241 243 ); 242 244 }; 243 245
+8 -8
src/components/search.tsx
··· 59 59 </label> 60 60 </div> 61 61 <div class="flex w-full items-center gap-2"> 62 - <div class="dark:bg-dark-100 focus-within:outline-1.5 dark:shadow-dark-900/80 flex grow items-center gap-2 rounded-lg bg-white px-2 py-1 shadow-sm focus-within:outline-neutral-900 dark:focus-within:outline-neutral-200"> 62 + <div class="dark:bg-dark-100 dark:shadow-dark-900/80 flex grow items-center gap-2 rounded-lg bg-white px-2 py-1 shadow-sm focus-within:outline-[1.5px] focus-within:outline-neutral-900 dark:focus-within:outline-neutral-200"> 63 63 <input 64 64 type="text" 65 65 spellcheck={false} ··· 68 68 class="grow focus:outline-none" 69 69 /> 70 70 <Show when={loading()}> 71 - <div class="i-lucide-loader-circle animate-spin text-lg" /> 71 + <span class="iconify lucide--loader-circle animate-spin text-lg"></span> 72 72 </Show> 73 73 <Show when={!loading()}> 74 - <button type="submit" onclick={() => processInput(searchInput.value)}> 75 - <div class="i-lucide-arrow-right text-lg text-neutral-500 dark:text-neutral-400" /> 76 - </button> 74 + <button 75 + type="submit" 76 + class="iconify lucide--arrow-right text-lg text-neutral-500 dark:text-neutral-400" 77 + onclick={() => processInput(searchInput.value)} 78 + ></button> 77 79 </Show> 78 80 </div> 79 81 <Show when={agent()}> 80 82 <Tooltip 81 83 text="Repository" 82 84 children={ 83 - <A href={`/at://${agent()?.sub}`}> 84 - <div class="i-lucide-book-user text-lg" /> 85 - </A> 85 + <A href={`/at://${agent()?.sub}`} class="iconify lucide--book-user text-lg"></A> 86 86 } 87 87 /> 88 88 </Show>
+45 -45
src/components/settings.tsx
··· 51 51 return ( 52 52 <> 53 53 <Modal open={openSettings()} onClose={() => setOpenSettings(false)}> 54 - <div class="starting:opacity-0 w-22rem dark:bg-dark-800/70 border-0.5 dark:shadow-dark-900/80 backdrop-blur-xs left-50% absolute top-12 -translate-x-1/2 rounded-lg border-neutral-300 bg-neutral-200/70 p-4 text-neutral-900 shadow-md transition-opacity duration-300 dark:border-neutral-700 dark:text-neutral-200"> 54 + <div class="dark:bg-dark-800/70 dark:shadow-dark-900/80 absolute top-12 left-[50%] w-[22rem] -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-200/70 p-4 text-neutral-900 shadow-md backdrop-blur-xs transition-opacity duration-300 dark:border-neutral-700 dark:text-neutral-200 starting:opacity-0"> 55 55 <div class="mb-2 flex items-center gap-1 font-bold"> 56 - <div class="i-lucide-settings" /> 56 + <span class="iconify lucide--settings"></span> 57 57 <span>Settings</span> 58 58 </div> 59 59 <div class="flex flex-col gap-2"> ··· 87 87 Hide media embeds 88 88 </label> 89 89 </div> 90 - <div class="dark:shadow-dark-900/80 dark:bg-dark-100 flex w-fit items-center gap-1 rounded-full bg-white p-0.5 text-lg shadow-sm"> 91 - <Tooltip text="System Theme"> 92 - <button 93 - classList={{ 94 - "p-1.5 rounded-full": true, 95 - "bg-neutral-200 dark:bg-dark-400": theme().system, 96 - }} 97 - onclick={() => 98 - updateTheme({ 99 - color: 100 - window.matchMedia("(prefers-color-scheme: dark)").matches ? 101 - "dark" 102 - : "light", 103 - system: true, 104 - }) 105 - } 106 - > 107 - <div class="i-lucide-monitor" /> 108 - </button> 109 - </Tooltip> 110 - <Tooltip text="Light Theme"> 111 - <button 112 - classList={{ 113 - "p-1.5 rounded-full": true, 114 - "bg-neutral-200": theme().color === "light" && !theme().system, 115 - }} 116 - onclick={() => updateTheme({ color: "light", system: false })} 117 - > 118 - <div class="i-lucide-sun" /> 119 - </button> 120 - </Tooltip> 121 - <Tooltip text="Dark Theme"> 122 - <button 123 - classList={{ 124 - "p-1.5 rounded-full": true, 125 - "bg-dark-400": theme().color === "dark" && !theme().system, 126 - }} 127 - onclick={() => updateTheme({ color: "dark", system: false })} 128 - > 129 - <div class="i-lucide-moon" /> 130 - </button> 131 - </Tooltip> 90 + <div class="dark:shadow-dark-900/80 dark:bg-dark-100 flex items-center gap-1 rounded-full bg-white p-0.5 text-lg shadow-sm"> 91 + <button 92 + name="System Theme" 93 + classList={{ 94 + "p-1.5 flex items-center rounded-full": true, 95 + "bg-neutral-200 dark:bg-dark-400": theme().system, 96 + }} 97 + onclick={() => 98 + updateTheme({ 99 + color: 100 + window.matchMedia("(prefers-color-scheme: dark)").matches ? 101 + "dark" 102 + : "light", 103 + system: true, 104 + }) 105 + } 106 + > 107 + <span class="iconify lucide--monitor"></span> 108 + </button> 109 + <button 110 + name="Light Theme" 111 + classList={{ 112 + "p-1.5 flex items-center rounded-full": true, 113 + "bg-neutral-200": theme().color === "light" && !theme().system, 114 + }} 115 + onclick={() => updateTheme({ color: "light", system: false })} 116 + > 117 + <span class="iconify lucide--sun"></span> 118 + </button> 119 + <button 120 + name="Dark Theme" 121 + classList={{ 122 + "p-1.5 flex items-center rounded-full": true, 123 + "bg-dark-400": theme().color === "dark" && !theme().system, 124 + }} 125 + onclick={() => updateTheme({ color: "dark", system: false })} 126 + > 127 + <span class="iconify lucide--moon"></span> 128 + </button> 132 129 </div> 133 130 </div> 134 131 </div> 135 132 </div> 136 133 </Modal> 137 134 <button onclick={() => setOpenSettings(true)}> 138 - <Tooltip text="Settings" children={<div class="i-lucide-settings text-xl" />} /> 135 + <Tooltip 136 + text="Settings" 137 + children={<span class="iconify lucide--settings text-xl"></span>} 138 + /> 139 139 </button> 140 140 </> 141 141 );
+1 -1
src/components/text-input.tsx
··· 25 25 disabled={props.disabled} 26 26 required={props.required} 27 27 class={ 28 - "dark:bg-dark-100 focus:outline-1.5 dark:shadow-dark-900/80 rounded-lg bg-white px-2 py-1 shadow-sm focus:outline-neutral-900 dark:focus:outline-neutral-200 " + 28 + "dark:bg-dark-100 dark:shadow-dark-900/80 rounded-lg bg-white px-2 py-1 shadow-sm focus:outline-[1.5px] focus:outline-neutral-900 dark:focus:outline-neutral-200 " + 29 29 props.class 30 30 } 31 31 onInput={props.onInput}
+1 -1
src/components/tooltip.tsx
··· 8 8 <Show when={!isTouchDevice}> 9 9 <span 10 10 style={`transform: translate(-50%, 28px)`} 11 - class={`left-50% border-0.5 dark:shadow-dark-900/80 pointer-events-none absolute z-10 hidden min-w-fit select-none whitespace-nowrap rounded border-neutral-300 bg-white p-1 text-center font-sans text-xs text-neutral-900 shadow-md group-hover/tooltip:inline dark:border-neutral-600 dark:bg-neutral-800 dark:text-neutral-200`} 11 + class={`dark:shadow-dark-900/80 pointer-events-none absolute left-[50%] z-10 hidden min-w-fit rounded border-[0.5px] border-neutral-300 bg-white p-1 text-center font-sans text-xs whitespace-nowrap text-neutral-900 shadow-md select-none group-hover/tooltip:inline dark:border-neutral-600 dark:bg-neutral-800 dark:text-neutral-200`} 12 12 > 13 13 {props.text} 14 14 </span>
-1
src/index.tsx
··· 1 1 /* @refresh reload */ 2 2 import { render } from "solid-js/web"; 3 - import "virtual:uno.css"; 4 3 import "./styles/index.css"; 5 4 import { Route, Router } from "@solidjs/router"; 6 5 import { Layout } from "./layout.tsx";
+13 -11
src/layout.tsx
··· 33 33 </MetaProvider> 34 34 <div class="mb-2 flex w-[22rem] items-center sm:w-[24rem]"> 35 35 <div class="flex basis-1/3 gap-x-2"> 36 - <A href="/jetstream"> 37 - <Tooltip text="Relay"> 38 - <div class="i-lucide-radio-tower text-xl" /> 39 - </Tooltip> 40 - </A> 36 + <Tooltip text="Relay"> 37 + <A href="/jetstream" class="iconify lucide--radio-tower text-xl"></A> 38 + </Tooltip> 41 39 <AccountManager /> 42 40 </div> 43 41 <div class="flex basis-1/3 items-center justify-center text-center"> 44 - <A href="/" style='font-feature-settings: "cv05"' class="font-bold hover:underline"> 42 + <A href="/" style='font-feature-settings: "cv05"' class="font-bold hover:underline active:underline"> 45 43 PDSls 46 44 </A> 47 45 </div> 48 - <div class="justify-right flex basis-1/3 items-center gap-x-2"> 46 + <div class="flex basis-1/3 items-center justify-end gap-x-2"> 49 47 <Show when={agent()}> 50 48 <RecordEditor create={true} /> 51 49 </Show> 52 50 <Settings /> 53 51 </div> 54 52 </div> 55 - <div class="min-w-22rem sm:min-w-24rem z-1 dark:bg-dark-500 mb-4 flex max-w-full flex-col items-center text-pretty bg-neutral-100 md:max-w-screen-md"> 53 + <div class="dark:bg-dark-500 z-1 mb-4 flex max-w-full min-w-[22rem] flex-col items-center bg-neutral-100 text-pretty sm:min-w-[24rem] md:max-w-[48rem]"> 56 54 <Show when={location.pathname !== "/jetstream" && location.pathname !== "/firehose"}> 57 55 <Search /> 58 56 </Show> ··· 63 61 <ErrorBoundary 64 62 fallback={(err) => <div class="mt-3 break-words">Error: {err.message}</div>} 65 63 > 66 - <Suspense fallback={<div class="i-lucide-loader-circle mt-3 animate-spin text-xl" />}> 64 + <Suspense 65 + fallback={ 66 + <span class="iconify lucide--loader-circle mt-3 animate-spin text-xl"></span> 67 + } 68 + > 67 69 {props.children} 68 70 </Suspense> 69 71 </ErrorBoundary> 70 72 </Show> 71 73 </div> 72 74 <Show when={copyNotice()}> 73 - <div class="backdrop-blur-xs border-0.5 dark:shadow-dark-900/80 dark:bg-dark-100/70 fixed bottom-10 z-50 flex items-center rounded-lg border-neutral-300 bg-neutral-100/70 p-2 shadow-md dark:border-neutral-700"> 74 - <div class="i-lucide-clipboard-check mr-1" /> 75 + <div class="dark:shadow-dark-900/80 dark:bg-dark-100/70 fixed bottom-10 z-50 flex items-center rounded-lg border-[0.5px] border-neutral-300 bg-neutral-100/70 p-2 shadow-md backdrop-blur-xs dark:border-neutral-700"> 76 + <span class="iconify lucide--clipboard-check mr-1"></span> 75 77 Copied to clipboard 76 78 </div> 77 79 </Show>
+25
src/styles/index.css
··· 1 + @import "tailwindcss"; 2 + 3 + @plugin "@iconify/tailwind4" { 4 + prefixes: lucide; 5 + } 6 + 7 + @custom-variant dark (&:where(.dark, .dark *)); 8 + 9 + @theme { 10 + --font-sans: "Inter", sans-serif; 11 + --font-mono: "Roboto Mono", monospace; 12 + 13 + --color-dark-50: oklch(40.91% 0 0); 14 + --color-dark-100: oklch(35.62% 0 0); 15 + --color-dark-200: oklch(31.71% 0 0); 16 + --color-dark-300: oklch(29.72% 0 0); 17 + --color-dark-400: oklch(25.2% 0 0); 18 + --color-dark-500: oklch(23.93% 0 0); 19 + --color-dark-600: oklch(22.73% 0.0038 286.09); 20 + --color-dark-700: oklch(22.21% 0 0); 21 + --color-dark-800: oklch(20.9% 0 0); 22 + --color-dark-900: oklch(16.84% 0 0); 23 + --color-dark-950: oklch(13.44% 0 0); 24 + } 25 + 1 26 html { 2 27 scrollbar-gutter: stable both-edges; 3 28 }
+3 -3
src/views/blob.tsx
··· 36 36 <p> 37 37 {blobs()?.length} blob{(blobs()?.length ?? 0 > 1) ? "s" : ""} 38 38 </p> 39 - <div class="break-anywhere flex flex-col gap-0.5 font-mono text-sm lg:break-normal"> 39 + <div class="flex flex-col gap-0.5 font-mono text-sm wrap-anywhere lg:break-normal"> 40 40 <For each={blobs()}> 41 41 {(cid) => ( 42 42 <a 43 43 href={`${props.pds}/xrpc/com.atproto.sync.getBlob?did=${props.repo}&cid=${cid}`} 44 44 target="_blank" 45 - class="rounded px-0.5 hover:bg-neutral-200 dark:hover:bg-neutral-700" 45 + class="rounded px-0.5 hover:bg-neutral-200 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-700" 46 46 > 47 47 <span class="text-blue-400">{cid}</span> 48 48 </a> ··· 54 54 <Button onClick={() => refetch()}>Load More</Button> 55 55 </Show> 56 56 <Show when={response.loading}> 57 - <div class="i-lucide-loader-circle mt-2 animate-spin text-xl" /> 57 + <span class="iconify lucide--loader-circle mt-2 animate-spin text-xl"></span> 58 58 </Show> 59 59 </div> 60 60 );
+19 -16
src/views/collection.tsx
··· 37 37 38 38 return ( 39 39 <span 40 - class="relative flex items-baseline rounded px-0.5 hover:bg-neutral-200 dark:hover:bg-neutral-700" 40 + class="relative flex items-baseline rounded px-0.5 hover:bg-neutral-200 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-700" 41 41 ref={rkeyRef} 42 42 onmouseover={() => setHover(true)} 43 43 onmouseleave={() => setHover(false)} ··· 51 51 <Show when={hover()}> 52 52 <span 53 53 ref={previewRef} 54 - class={`dark:bg-dark-500/70 left-50% max-h-xs sm:max-h-md z-25 backdrop-blur-xs border-0.5 dark:shadow-dark-900/80 pointer-events-none absolute block w-max max-w-sm -translate-x-1/2 overflow-hidden whitespace-pre-wrap rounded-lg border-neutral-300 bg-neutral-100/70 p-2 text-xs shadow-md lg:max-w-lg dark:border-neutral-700 ${isOverflowing(previewHeight()) ? "bottom-7" : "top-7"}`} 54 + class={`dark:bg-dark-500/70 max-h-xs sm:max-h-md dark:shadow-dark-900/80 pointer-events-none absolute left-[50%] z-25 block w-max max-w-sm -translate-x-1/2 overflow-hidden rounded-lg border-[0.5px] border-neutral-300 bg-neutral-100/70 p-2 text-xs whitespace-pre-wrap shadow-md backdrop-blur-xs lg:max-w-lg dark:border-neutral-700 ${isOverflowing(previewHeight()) ? "bottom-7" : "top-7"}`} 55 55 > 56 56 <JSONValue 57 57 data={props.record.record.value as JSONType} ··· 161 161 162 162 return ( 163 163 <Show when={records.length || response()}> 164 - <div class="z-5 dark:bg-dark-500/70 backdrop-blur-xs sticky top-0 flex w-screen flex-col items-center justify-center gap-2 bg-neutral-100/70 py-3"> 165 - <div class="w-22rem sm:w-24rem flex items-center gap-2"> 164 + <div class="dark:bg-dark-500/70 sticky top-0 z-5 flex w-screen flex-col items-center justify-center gap-2 bg-neutral-100/70 py-3 backdrop-blur-xs"> 165 + <div class="flex w-[22rem] items-center gap-2 sm:w-[24rem]"> 166 166 <Show when={agent() && agent()?.sub === did}> 167 167 <div class="flex items-center gap-x-2"> 168 168 <Tooltip ··· 178 178 setLastSelected(undefined); 179 179 setBatchDelete(!batchDelete()); 180 180 }} 181 + class="flex items-center" 181 182 > 182 - <div 183 - class={`text-lg ${batchDelete() ? "i-lucide-circle-x" : "i-lucide-trash-2"} `} 184 - /> 183 + <span 184 + class={`iconify text-lg ${batchDelete() ? "lucide--circle-x" : "lucide--trash-2"} `} 185 + ></span> 185 186 </button> 186 187 } 187 188 /> ··· 189 190 <Tooltip 190 191 text="Select All" 191 192 children={ 192 - <button onclick={() => selectAll()}> 193 - <div class="i-lucide-copy-check text-lg" /> 193 + <button onclick={() => selectAll()} class="flex items-center"> 194 + <span class="iconify lucide--copy-check text-lg"></span> 194 195 </button> 195 196 } 196 197 /> 197 198 <Tooltip 198 199 text="Confirm" 199 200 children={ 200 - <button onclick={() => deleteRecords()}> 201 - <div class="i-lucide-trash-2 text-lg text-red-500 dark:text-red-400" /> 201 + <button onclick={() => deleteRecords()} class="flex items-center"> 202 + <span class="iconify lucide--trash-2 text-lg text-red-500 dark:text-red-400"></span> 202 203 </button> 203 204 } 204 205 /> ··· 212 213 /> 213 214 </div> 214 215 <Show when={records.length > 1}> 215 - <div class="w-22rem sm:w-24rem flex items-center justify-between gap-x-2"> 216 + <div class="flex w-[22rem] items-center justify-between gap-x-2 sm:w-[24rem]"> 216 217 <Button 217 218 onClick={() => { 218 219 setReverse(!reverse()); ··· 221 222 refetch(); 222 223 }} 223 224 > 224 - <div class={`${reverse() ? "i-lucide-rotate-ccw" : "i-lucide-rotate-cw"} text-sm`} /> 225 + <span 226 + class={`iconify ${reverse() ? "lucide--rotate-ccw" : "lucide--rotate-cw"} text-sm`} 227 + ></span> 225 228 Reverse 226 229 </Button> 227 230 <div> ··· 231 234 </Show> 232 235 <span>{records.length} records</span> 233 236 </div> 234 - <div class="w-5rem flex items-center justify-end"> 237 + <div class="flex w-[5rem] items-center justify-end"> 235 238 <Show when={cursor()}> 236 239 <Show when={!response.loading}> 237 240 <Button onClick={() => refetch()}>Load More</Button> 238 241 </Show> 239 242 <Show when={response.loading}> 240 - <div class="i-lucide-loader-circle w-5rem animate-spin text-xl" /> 243 + <div class="iconify lucide--loader-circle w-[5rem] animate-spin text-xl" /> 241 244 </Show> 242 245 </Show> 243 246 </div> ··· 254 257 <> 255 258 <Show when={batchDelete()}> 256 259 <label 257 - class="flex select-none items-center gap-1" 260 + class="flex items-center gap-1 select-none" 258 261 onclick={(e) => handleSelectionClick(e, index())} 259 262 > 260 263 <input
+17 -17
src/views/home.tsx
··· 3 3 4 4 const Home = () => { 5 5 return ( 6 - <div class="w-22rem sm:w-24rem mt-4 flex flex-col gap-2 break-words"> 6 + <div class="mt-4 flex w-[22rem] flex-col gap-2 break-words sm:w-[24rem]"> 7 7 <div> 8 8 <div> 9 9 <span class="font-semibold">AT Protocol Explorer</span> 10 10 </div> 11 11 <div class="flex items-center gap-1"> 12 - <div class="i-lucide-search" /> 12 + <div class="iconify lucide--search" /> 13 13 <span> 14 14 Browse the public data on{" "} 15 - <a class="text-blue-400 hover:underline" href="https://atproto.com" target="_blank"> 15 + <a class="text-blue-400 hover:underline active:underline" href="https://atproto.com" target="_blank"> 16 16 atproto 17 17 </a> 18 18 . 19 19 </span> 20 20 </div> 21 21 <div class="flex items-center gap-1"> 22 - <div class="i-lucide-user-round" /> 22 + <div class="iconify lucide--user-round" /> 23 23 <span>Login to manage records in your repo.</span> 24 24 </div> 25 25 <div class="flex items-center gap-1"> 26 - <div class="i-lucide-radio-tower" /> 26 + <div class="iconify lucide--radio-tower" /> 27 27 <div> 28 - <A href="/jetstream" class="text-blue-400 hover:underline"> 28 + <A href="/jetstream" class="text-blue-400 hover:underline active:underline"> 29 29 Jetstream 30 30 </A>{" "} 31 31 and{" "} 32 - <A href="/firehose" class="text-blue-400 hover:underline"> 32 + <A href="/firehose" class="text-blue-400 hover:underline active:underline"> 33 33 firehose 34 34 </A>{" "} 35 35 streaming. 36 36 </div> 37 37 </div> 38 38 <div class="flex items-center gap-1"> 39 - <div class="i-lucide-send-to-back" /> 39 + <div class="iconify lucide--send-to-back" /> 40 40 <span> 41 41 Backlinks support with{" "} 42 42 <A 43 43 href="https://constellation.microcosm.blue" 44 - class="text-blue-400 hover:underline" 44 + class="text-blue-400 hover:underline active:underline" 45 45 target="_blank" 46 46 > 47 47 constellation ··· 53 53 <div> 54 54 <span class="font-semibold">Examples</span> 55 55 <div class="flex items-center gap-1"> 56 - <div class="i-lucide-server" /> 57 - <A href="/pds.kelinci.net" class="text-blue-400 hover:underline"> 56 + <div class="iconify lucide--server" /> 57 + <A href="/pds.kelinci.net" class="text-blue-400 hover:underline active:underline"> 58 58 https://pds.kelinci.net 59 59 </A> 60 60 </div> 61 61 <div class="flex items-center gap-1"> 62 - <div class="i-lucide-at-sign" /> 63 - <A href="/at://did:plc:vwzwgnygau7ed7b7wt5ux7y2" class="text-blue-400 hover:underline"> 62 + <div class="iconify lucide--at-sign" /> 63 + <A href="/at://did:plc:vwzwgnygau7ed7b7wt5ux7y2" class="text-blue-400 hover:underline active:underline"> 64 64 at://did:plc:vwzwgnygau7ed7b7wt5ux7y2 65 65 </A> 66 66 </div> 67 67 <div class="flex items-center gap-1"> 68 - <div class="i-lucide-file-json shrink-0" /> 68 + <div class="iconify lucide--file-json shrink-0" /> 69 69 <A 70 70 href="/at://did:plc:oisofpd7lj26yvgiivf3lxsi/app.bsky.actor.profile/self" 71 - class="text-blue-400 hover:underline" 71 + class="text-blue-400 hover:underline active:underline" 72 72 > 73 73 at://hailey.at/app.bsky.actor.profile/self 74 74 </A> 75 75 </div> 76 76 <div class="flex items-center gap-1"> 77 - <div class="i-lucide-tag" /> 77 + <div class="iconify lucide--tag" /> 78 78 <A 79 79 href="/at://did:plc:wkoofae5uytcm7bjncmev6n6/labels" 80 - class="text-blue-400 hover:underline" 80 + class="text-blue-400 hover:underline active:underline" 81 81 > 82 82 at://pronouns.diy/labels 83 83 </A>
+13 -11
src/views/labels.tsx
··· 66 66 URI Patterns (comma-separated) 67 67 </label> 68 68 </div> 69 - <div class="w-22rem sm:w-24rem flex items-center gap-x-2"> 69 + <div class="flex w-[22rem] items-center gap-x-2 sm:w-[24rem]"> 70 70 <textarea 71 71 id="patterns" 72 72 name="patterns" ··· 77 77 /> 78 78 <div class="flex justify-center"> 79 79 <Show when={!response.loading}> 80 - <button onclick={() => initQuery()} type="submit"> 81 - <div class="i-lucide-search text-xl" /> 82 - </button> 80 + <button 81 + onclick={() => initQuery()} 82 + type="submit" 83 + class="iconify lucide--search text-xl" 84 + ></button> 83 85 </Show> 84 86 <Show when={response.loading}> 85 - <div class="i-lucide-loader-circle animate-spin text-xl" /> 87 + <div class="iconify lucide--loader-circle animate-spin text-xl" /> 86 88 </Show> 87 89 </div> 88 90 </div> 89 91 </form> 90 - <div class="z-5 dark:bg-dark-500/70 backdrop-blur-xs sticky top-0 flex w-screen flex-col items-center justify-center gap-3 bg-neutral-100/70 py-3"> 92 + <div class="dark:bg-dark-500/70 sticky top-0 z-5 flex w-screen flex-col items-center justify-center gap-3 bg-neutral-100/70 py-3 backdrop-blur-xs"> 91 93 <TextInput 92 94 placeholder="Filter by label" 93 95 onInput={(e) => setFilter(e.currentTarget.value)} 94 - class="w-22rem sm:w-24rem" 96 + class="w-[22rem] sm:w-[24rem]" 95 97 /> 96 98 <div class="flex items-center gap-x-2"> 97 99 <Show when={labelCount() && labels().length}> ··· 107 109 <Button onClick={() => refetch()}>Load More</Button> 108 110 </Show> 109 111 <Show when={response.loading}> 110 - <div class="i-lucide-loader-circle animate-spin text-xl" /> 112 + <div class="iconify lucide--loader-circle animate-spin text-xl" /> 111 113 </Show> 112 114 </div> 113 115 </Show> 114 116 </div> 115 117 </div> 116 118 <Show when={labels().length}> 117 - <div class="break-anywhere min-w-22rem sm:min-w-24rem divide-y-0.5 flex flex-col gap-2 divide-neutral-400 whitespace-pre-wrap text-sm dark:divide-neutral-600"> 119 + <div class="flex min-w-[22rem] flex-col gap-2 divide-y-[0.5px] divide-neutral-400 text-sm wrap-anywhere whitespace-pre-wrap sm:min-w-[24rem] dark:divide-neutral-600"> 118 120 <For each={filterLabels()}> 119 121 {(label) => ( 120 122 <div class="flex items-center justify-between gap-2 pb-2"> ··· 124 126 <A 125 127 href={`/at://${label.uri.replace("at://", "")}`} 126 128 target="_blank" 127 - class="text-blue-400 hover:underline" 129 + class="text-blue-400 hover:underline active:underline" 128 130 > 129 131 {label.uri} 130 132 </A> ··· 153 155 </Show> 154 156 </div> 155 157 <Show when={label.neg}> 156 - <div class="i-lucide-minus shrink-0 text-lg text-red-500 dark:text-red-400" /> 158 + <div class="iconify lucide--minus shrink-0 text-lg text-red-500 dark:text-red-400" /> 157 159 </Show> 158 160 </div> 159 161 )}
+4 -4
src/views/pds.tsx
··· 78 78 <div class="flex flex-col"> 79 79 <span class="font-semibold">Available User Domains</span> 80 80 <For each={server().availableUserDomains}> 81 - {(domain) => <span class="break-anywhere text-sm">{domain}</span>} 81 + {(domain) => <span class="text-sm wrap-anywhere">{domain}</span>} 82 82 </For> 83 83 </div> 84 84 </Show> ··· 91 91 <A 92 92 href={`/at://${repo.did}`} 93 93 classList={{ 94 - "rounded items-center text-sm gap-1 flex justify-between font-mono relative hover:bg-neutral-200 dark:hover:bg-neutral-700": true, 94 + "rounded items-center text-sm gap-1 flex justify-between font-mono relative hover:bg-neutral-200 dark:hover:bg-neutral-700 active:bg-neutral-200 dark:active:bg-neutral-700": true, 95 95 "text-blue-400": repo.active, 96 96 "text-neutral-400 dark:text-neutral-500": !repo.active, 97 97 }} ··· 99 99 <Show when={!repo.active}> 100 100 <div class="absolute -left-4"> 101 101 <Tooltip text={repo.status ?? "???"}> 102 - <div class="i-lucide-skull" /> 102 + <span class="iconify lucide--skull"></span> 103 103 </Tooltip> 104 104 </div> 105 105 </Show> ··· 117 117 <Button onClick={() => refetch()}>Load More</Button> 118 118 </Show> 119 119 <Show when={response.loading}> 120 - <div class="i-lucide-loader-circle animate-spin text-xl" /> 120 + <span class="iconify lucide--loader-circle animate-spin text-xl"></span> 121 121 </Show> 122 122 </div> 123 123 </div>
+18 -16
src/views/record.tsx
··· 114 114 return ( 115 115 <div class="flex w-full flex-col items-center"> 116 116 <Show when={record() === undefined && validRecord() !== false}> 117 - <div class="i-lucide-loader-circle mt-3 animate-spin text-xl" /> 117 + <div class="iconify lucide--loader-circle mt-3 animate-spin text-xl" /> 118 118 </Show> 119 119 <Show when={validRecord() === false}> 120 120 <div class="mt-3 break-words text-red-500 dark:text-red-400">{notice()}</div> 121 121 </Show> 122 122 <Show when={record()}> 123 - <div class="w-22rem sm:w-24rem dark:shadow-dark-900/80 dark:bg-dark-300 my-3 flex justify-between rounded-lg bg-white px-2 py-1.5 shadow-sm"> 123 + <div class="dark:shadow-dark-900/80 dark:bg-dark-300 my-3 flex w-[22rem] justify-between rounded-lg bg-white px-2 py-1.5 shadow-sm sm:w-[24rem]"> 124 124 <div class="flex gap-3 text-sm"> 125 125 <button 126 126 classList={{ ··· 130 130 }} 131 131 onclick={() => setShowBacklinks(!showBacklinks())} 132 132 > 133 - <div class="i-lucide-file-json" /> 133 + <div class="iconify lucide--file-json" /> 134 134 Record 135 135 </button> 136 136 <button ··· 141 141 }} 142 142 onclick={() => setShowBacklinks(!showBacklinks())} 143 143 > 144 - <div class="i-lucide-send-to-back" /> 144 + <div class="iconify lucide--send-to-back" /> 145 145 Backlinks 146 146 </button> 147 147 </div> ··· 150 150 <RecordEditor create={false} record={record()?.value} /> 151 151 <Tooltip text="Delete"> 152 152 <button 153 - class="rounded-sm p-1 hover:bg-neutral-100 dark:hover:bg-neutral-600" 153 + class="flex items-center rounded-sm p-1 hover:bg-neutral-100 active:bg-neutral-100 dark:hover:bg-neutral-600 dark:active:bg-neutral-600" 154 154 onclick={() => setOpenDelete(true)} 155 155 > 156 - <div class="i-lucide-trash-2" /> 156 + <span class="iconify lucide--trash-2"></span> 157 157 </button> 158 158 </Tooltip> 159 159 <Modal open={openDelete()} onClose={() => setOpenDelete(false)}> 160 - <div class="starting:opacity-0 dark:bg-dark-800/70 border-0.5 dark:shadow-dark-900/80 backdrop-blur-xs left-50% top-70 absolute -translate-x-1/2 rounded-lg border-neutral-300 bg-neutral-200/70 p-4 text-neutral-900 shadow-md transition-opacity duration-300 dark:border-neutral-700 dark:text-neutral-200"> 160 + <div class="dark:bg-dark-800/70 border-0.5 dark:shadow-dark-900/80 left-50% absolute top-70 -translate-x-1/2 rounded-lg border-neutral-300 bg-neutral-200/70 p-4 text-neutral-900 shadow-md backdrop-blur-xs transition-opacity duration-300 dark:border-neutral-700 dark:text-neutral-200 starting:opacity-0"> 161 161 <h2 class="mb-2 font-bold">Delete this record?</h2> 162 162 <div class="flex justify-end gap-2"> 163 163 <Button onClick={() => setOpenDelete(false)}>Cancel</Button> 164 164 <Button 165 165 onClick={deleteRecord} 166 - class="dark:shadow-dark-900/80 rounded-lg bg-red-500 px-2 py-1.5 text-xs font-semibold text-neutral-200 shadow-sm hover:bg-red-400" 166 + class="dark:shadow-dark-900/80 rounded-lg bg-red-500 px-2 py-1.5 text-xs font-semibold text-neutral-200 shadow-sm hover:bg-red-400 active:bg-red-400" 167 167 > 168 168 Delete 169 169 </Button> ··· 173 173 </Show> 174 174 <Tooltip text="Copy record"> 175 175 <button 176 - class="rounded-sm p-1 hover:bg-neutral-100 dark:hover:bg-neutral-600" 176 + class="flex items-center rounded-sm p-1 hover:bg-neutral-100 active:bg-neutral-100 dark:hover:bg-neutral-600 dark:active:bg-neutral-600" 177 177 onclick={() => addToClipboard(JSON.stringify(record()?.value, null, 2))} 178 178 > 179 - <div class="i-lucide-copy" /> 179 + <span class="iconify lucide--copy"></span> 180 180 </button> 181 181 </Tooltip> 182 182 <Show when={externalLink()}> 183 183 {(externalLink) => ( 184 184 <Tooltip text={`Open on ${externalLink().label}`}> 185 185 <a 186 - class="rounded-sm p-1 hover:bg-neutral-100 dark:hover:bg-neutral-600" 186 + class="flex items-center rounded-sm p-1 hover:bg-neutral-100 active:bg-neutral-100 dark:hover:bg-neutral-600 dark:active:bg-neutral-600" 187 187 target="_blank" 188 188 href={externalLink()?.link} 189 189 > 190 - <div class={`${externalLink().icon ?? "i-lucide-app-window"}`} /> 190 + <span class={`iconify ${externalLink().icon ?? "lucide--app-window"}`}></span> 191 191 </a> 192 192 </Tooltip> 193 193 )} 194 194 </Show> 195 195 <Tooltip text="Record on PDS"> 196 196 <a 197 - class="rounded-sm p-1 hover:bg-neutral-100 dark:hover:bg-neutral-600" 197 + class="flex items-center rounded-sm p-1 hover:bg-neutral-100 active:bg-neutral-100 dark:hover:bg-neutral-600 dark:active:bg-neutral-600" 198 198 href={`https://${pds()}/xrpc/com.atproto.repo.getRecord?repo=${params.repo}&collection=${params.collection}&rkey=${params.rkey}`} 199 199 target="_blank" 200 200 > 201 - <div class="i-lucide-external-link" /> 201 + <span class="iconify lucide--external-link"></span> 202 202 </a> 203 203 </Tooltip> 204 204 </div> 205 205 </div> 206 206 <Show when={!showBacklinks()}> 207 - <div class="break-anywhere w-full whitespace-pre-wrap font-mono text-xs sm:text-sm"> 207 + <div class="w-full font-mono text-xs wrap-anywhere whitespace-pre-wrap sm:text-sm"> 208 208 <JSONValue data={record()?.value as any} repo={record()!.uri.split("/")[2]} /> 209 209 </div> 210 210 </Show> 211 211 <Show when={showBacklinks()}> 212 212 <ErrorBoundary fallback={(err) => <div class="break-words">Error: {err.message}</div>}> 213 213 <Suspense 214 - fallback={<div class="i-lucide-loader-circle animate-spin self-center text-xl" />} 214 + fallback={ 215 + <div class="iconify lucide--loader-circle animate-spin self-center text-xl" /> 216 + } 215 217 > 216 218 <Backlinks target={`at://${did}/${params.collection}/${params.rkey}`} /> 217 219 </Suspense>
+51 -45
src/views/repo.tsx
··· 31 31 const FilterButton = (props: { icon: string; event: PlcEvent }) => ( 32 32 <button 33 33 classList={{ 34 - "rounded-full p-1.5": true, 34 + "flex items-center rounded-full p-1.5": true, 35 35 "bg-neutral-700 dark:bg-neutral-200": activePlcEvent() === props.event, 36 36 }} 37 37 onclick={() => setActivePlcEvent(activePlcEvent() === props.event ? undefined : props.event)} 38 38 > 39 - <div 39 + <span 40 40 class={`${props.icon} ${activePlcEvent() === props.event ? "text-neutral-200 dark:text-neutral-900" : ""}`} 41 - /> 41 + ></span> 42 42 </button> 43 43 ); 44 44 45 45 const DiffItem = (props: { diff: DiffEntry }) => { 46 46 const diff = props.diff; 47 47 let title = "Unknown log entry"; 48 - let icon = "i-lucide-circle-help"; 48 + let icon = "lucide--circle-help"; 49 49 let value = ""; 50 50 51 51 if (diff.type === "identity_created") { 52 - icon = "i-lucide-bell"; 52 + icon = "lucide--bell"; 53 53 title = `Identity created`; 54 54 } else if (diff.type === "identity_tombstoned") { 55 - icon = "i-lucide-skull"; 55 + icon = "lucide--skull"; 56 56 title = `Identity tombstoned`; 57 57 } else if (diff.type === "handle_added" || diff.type === "handle_removed") { 58 - icon = "i-lucide-at-sign"; 58 + icon = "lucide--at-sign"; 59 59 title = diff.type === "handle_added" ? "Alias added" : "Alias removed"; 60 60 value = diff.handle; 61 61 } else if (diff.type === "handle_changed") { 62 - icon = "i-lucide-at-sign"; 62 + icon = "lucide--at-sign"; 63 63 title = "Alias updated"; 64 64 value = `${diff.prev_handle} → ${diff.next_handle}`; 65 65 } else if (diff.type === "rotation_key_added" || diff.type === "rotation_key_removed") { 66 - icon = "i-lucide-key-round"; 66 + icon = "lucide--key-round"; 67 67 title = diff.type === "rotation_key_added" ? "Rotation key added" : "Rotation key removed"; 68 68 value = diff.rotation_key; 69 69 } else if (diff.type === "service_added" || diff.type === "service_removed") { 70 - icon = "i-lucide-server"; 70 + icon = "lucide--server"; 71 71 title = `Service ${diff.service_id} ${diff.type === "service_added" ? "added" : "removed"}`; 72 72 value = `${diff.service_endpoint}`; 73 73 } else if (diff.type === "service_changed") { 74 - icon = "i-lucide-server"; 74 + icon = "lucide--server"; 75 75 title = `Service ${diff.service_id} updated`; 76 76 value = `${diff.prev_service_endpoint} → ${diff.next_service_endpoint}`; 77 77 } else if ( 78 78 diff.type === "verification_method_added" || 79 79 diff.type === "verification_method_removed" 80 80 ) { 81 - icon = "i-lucide-shield-check"; 81 + icon = "lucide--shield-check"; 82 82 title = `Verification method ${diff.method_id} ${diff.type === "verification_method_added" ? "added" : "removed"}`; 83 83 value = `${diff.method_key}`; 84 84 } else if (diff.type === "verification_method_changed") { 85 - icon = "i-lucide-shield-check"; 85 + icon = "lucide--shield-check"; 86 86 title = `Verification method ${diff.method_id} updated`; 87 87 value = `${diff.prev_method_key} → ${diff.next_method_key}`; 88 88 } 89 89 90 90 return ( 91 91 <div class="grid grid-cols-[min-content_1fr] items-center gap-x-1"> 92 - <div class={icon + ` shrink-0`} /> 92 + <div class={icon + ` iconify shrink-0`} /> 93 93 <p 94 94 classList={{ 95 95 "font-semibold": true, ··· 109 109 <div class="flex items-center justify-between"> 110 110 <div class="flex items-center gap-1"> 111 111 <Tooltip text="Filter operations"> 112 - <div class="i-lucide-filter" /> 112 + <div class="iconify lucide--filter" /> 113 113 </Tooltip> 114 114 <div class="dark:shadow-dark-900/80 dark:bg-dark-300 flex w-fit items-center rounded-full bg-white shadow-sm"> 115 - <FilterButton icon="i-lucide-at-sign" event="handle" /> 116 - <FilterButton icon="i-lucide-key-round" event="rotation_key" /> 117 - <FilterButton icon="i-lucide-server" event="service" /> 118 - <FilterButton icon="i-lucide-shield-check" event="verification_method" /> 115 + <FilterButton icon="iconify lucide--at-sign" event="handle" /> 116 + <FilterButton icon="iconify lucide--key-round" event="rotation_key" /> 117 + <FilterButton icon="iconify lucide--server" event="service" /> 118 + <FilterButton icon="iconify lucide--shield-check" event="verification_method" /> 119 119 </div> 120 120 </div> 121 121 <Tooltip text="Audit log"> 122 122 <a 123 123 href={`${localStorage.plcDirectory ?? "https://plc.directory"}/${props.did}/log/audit`} 124 124 target="_blank" 125 + class="flex items-center" 125 126 > 126 - <div class="i-lucide-external-link" /> 127 + <span class="iconify lucide--external-link"></span> 127 128 </a> 128 129 </Tooltip> 129 130 </div> ··· 177 178 }} 178 179 onclick={() => setTab(props.tab)} 179 180 > 180 - <div class={props.icon} /> 181 + <div class={"iconify " + props.icon} /> 181 182 {props.label} 182 183 </button> 183 184 ); ··· 264 265 </Show> 265 266 <div class="flex justify-between text-sm"> 266 267 <Show when={!error()}> 267 - <RepoTab tab="collections" label="Collections" icon="i-lucide-folder-open" /> 268 + <RepoTab tab="collections" label="Collections" icon="lucide--folder-open" /> 268 269 </Show> 269 - <RepoTab tab="doc" label="Identity" icon="i-lucide-id-card" /> 270 + <RepoTab tab="doc" label="Identity" icon="lucide--id-card" /> 270 271 <Show when={!error()}> 271 - <RepoTab tab="blobs" label="Blobs" icon="i-lucide-file-digit" /> 272 + <RepoTab tab="blobs" label="Blobs" icon="lucide--file-digit" /> 272 273 </Show> 273 - <RepoTab tab="backlinks" label="Backlinks" icon="i-lucide-send-to-back" /> 274 + <RepoTab tab="backlinks" label="Backlinks" icon="lucide--send-to-back" /> 274 275 </div> 275 276 <Show when={tab() === "backlinks"}> 276 277 <ErrorBoundary fallback={(err) => <div class="break-words">Error: {err.message}</div>}> 277 278 <Suspense 278 - fallback={<div class="i-lucide-loader-circle animate-spin self-center text-xl" />} 279 + fallback={ 280 + <div class="iconify lucide--loader-circle animate-spin self-center text-xl" /> 281 + } 279 282 > 280 283 <Backlinks target={did} /> 281 284 </Suspense> ··· 284 287 <Show when={tab() === "blobs"}> 285 288 <ErrorBoundary fallback={(err) => <div class="break-words">Error: {err.message}</div>}> 286 289 <Suspense 287 - fallback={<div class="i-lucide-loader-circle animate-spin self-center text-xl" />} 290 + fallback={ 291 + <div class="iconify lucide--loader-circle animate-spin self-center text-xl" /> 292 + } 288 293 > 289 294 <BlobView pds={pds!} repo={did} /> 290 295 </Suspense> ··· 306 311 > 307 312 {(authority) => ( 308 313 <> 309 - <button onclick={() => toggleCollection(authority)}> 310 - <div 314 + <button onclick={() => toggleCollection(authority)} class="flex items-center"> 315 + <span 311 316 classList={{ 312 - "i-lucide-chevron-down text-lg transition-transform": true, 317 + "iconify lucide--chevron-down text-lg transition-transform": true, 313 318 "-rotate-90": nsids()?.[authority].hidden, 314 319 }} 315 - /> 320 + ></span> 316 321 </button> 317 322 <button 318 - class="break-anywhere bg-transparent text-left" 323 + class="bg-transparent text-left wrap-anywhere" 319 324 onclick={() => toggleCollection(authority)} 320 325 > 321 326 {authority} ··· 333 338 {(nsid) => ( 334 339 <A 335 340 href={`/at://${did}/${authority}.${nsid}`} 336 - class="text-blue-400 hover:underline" 341 + class="text-blue-400 hover:underline active:underline" 337 342 > 338 343 {authority}.{nsid} 339 344 </A> ··· 350 355 <Show when={tab() === "doc"}> 351 356 <Show when={didDoc()}> 352 357 {(didDocument) => ( 353 - <div class="break-anywhere flex flex-col gap-y-2"> 358 + <div class="flex flex-col gap-y-2 wrap-anywhere"> 354 359 <div class="flex flex-col gap-y-1"> 355 360 <div class="flex items-baseline justify-between gap-2"> 356 361 <div> 357 362 <div class="flex items-center gap-1"> 358 - <div class="i-lucide-id-card" /> 363 + <div class="iconify lucide--id-card" /> 359 364 <p class="font-semibold">ID</p> 360 365 </div> 361 366 <div class="text-sm">{didDocument().id}</div> ··· 368 373 : `https://${did.split("did:web:")[1]}/.well-known/did.json` 369 374 } 370 375 target="_blank" 376 + class="flex items-center" 371 377 > 372 - <div class="i-lucide-external-link" /> 378 + <span class="iconify lucide--external-link"></span> 373 379 </a> 374 380 </Tooltip> 375 381 </div> 376 382 <div> 377 383 <div class="flex items-center gap-1"> 378 - <div class="i-lucide-at-sign" /> 384 + <div class="iconify lucide--at-sign" /> 379 385 <p class="font-semibold">Aliases</p> 380 386 </div> 381 387 <ul> ··· 386 392 </div> 387 393 <div> 388 394 <div class="flex items-center gap-1"> 389 - <div class="i-lucide-server" /> 395 + <div class="iconify lucide--server" /> 390 396 <p class="font-semibold">Services</p> 391 397 </div> 392 398 <ul> ··· 395 401 <li class="flex flex-col text-sm"> 396 402 <span>#{service.id.split("#")[1]}</span> 397 403 <a 398 - class="w-fit text-blue-400 hover:underline" 404 + class="w-fit text-blue-400 hover:underline active:underline" 399 405 href={service.serviceEndpoint.toString()} 400 406 target="_blank" 401 407 > ··· 408 414 </div> 409 415 <div> 410 416 <div class="flex items-center gap-1"> 411 - <div class="i-lucide-shield-check" /> 417 + <div class="iconify lucide--shield-check" /> 412 418 <p class="font-semibold">Verification methods</p> 413 419 </div> 414 420 <ul> ··· 420 426 <span class="flex justify-between gap-1"> 421 427 <span>#{verif.id.split("#")[1]}</span> 422 428 <span class="flex items-center gap-0.5"> 423 - <div class="i-lucide-key-round" /> 429 + <div class="iconify lucide--key-round" /> 424 430 <ErrorBoundary fallback={<>unknown</>}> 425 431 {parsePublicMultikey(key()).type} 426 432 </ErrorBoundary> ··· 462 468 setShowPlcLogs(!showPlcLogs()); 463 469 }} 464 470 > 465 - <div class="i-lucide-logs text-sm" /> 471 + <span class="iconify lucide--logs text-sm"></span> 466 472 {showPlcLogs() ? "Hide" : "Show"} PLC Logs 467 473 </Button> 468 474 <Show when={loading()}> 469 - <div class="i-lucide-loader-circle animate-spin text-xl" /> 475 + <div class="iconify lucide--loader-circle animate-spin text-xl" /> 470 476 </Show> 471 477 </div> 472 478 </Show> ··· 478 484 }} 479 485 > 480 486 <Show when={downloading()}> 481 - <div class="i-lucide-loader-circle animate-spin text-xl" /> 487 + <div class="iconify lucide--loader-circle animate-spin text-xl" /> 482 488 </Show> 483 489 <Button onClick={() => downloadRepo()}> 484 - <div class="i-lucide-download text-sm" /> 490 + <span class="iconify lucide--download text-sm"></span> 485 491 Export Repo 486 492 </Button> 487 493 </div>
+10 -10
src/views/stream.tsx
··· 155 155 inactiveClass="border-transparent hover:border-neutral-400 dark:hover:border-neutral-600" 156 156 href="/jetstream" 157 157 > 158 - <div class="i-lucide-wind" /> 158 + <span class="iconify lucide--wind"></span> 159 159 Jetstream 160 160 </A> 161 161 <A ··· 163 163 inactiveClass="border-transparent hover:border-neutral-400 dark:hover:border-neutral-600" 164 164 href="/firehose" 165 165 > 166 - <div class="i-lucide-fire-extinguisher" /> 166 + <span class="iconify lucide--fire-extinguisher"></span> 167 167 Firehose 168 168 </A> 169 169 </div> 170 170 <form 171 171 ref={formRef} 172 - class="z-5 dark:bg-dark-500/70 backdrop-blur-xs sticky top-0 flex w-screen flex-col items-center bg-neutral-100/70 px-4 text-sm" 172 + class="dark:bg-dark-500/70 sticky top-0 z-5 flex w-screen flex-col items-center bg-neutral-100/70 px-4 text-sm backdrop-blur-xs" 173 173 > 174 174 <div class="flex flex-col gap-2 py-3"> 175 175 <Show when={!connected()}> ··· 183 183 "wss://jetstream1.us-east.bsky.network/subscribe" 184 184 : "wss://bsky.network") 185 185 } 186 - class="w-16rem" 186 + class="w-[16rem]" 187 187 /> 188 188 </label> 189 189 <Show when={streamType === StreamType.JETSTREAM}> ··· 194 194 spellcheck={false} 195 195 placeholder="Comma-separated list of collections" 196 196 value={searchParams.collections ?? ""} 197 - class="w-16rem dark:bg-dark-100 focus:outline-1.5 dark:shadow-dark-900/80 rounded-lg bg-white px-2 py-1 shadow-sm focus:outline-neutral-900 dark:focus:outline-neutral-200" 197 + class="dark:bg-dark-100 focus:outline-1.5 dark:shadow-dark-900/80 w-[16rem] rounded-lg bg-white px-2 py-1 shadow-sm focus:outline-neutral-900 dark:focus:outline-neutral-200" 198 198 /> 199 199 </label> 200 200 </Show> ··· 206 206 spellcheck={false} 207 207 placeholder="Comma-separated list of DIDs" 208 208 value={searchParams.dids ?? ""} 209 - class="w-16rem dark:bg-dark-100 focus:outline-1.5 dark:shadow-dark-900/80 rounded-lg bg-white px-2 py-1 shadow-sm focus:outline-neutral-900 dark:focus:outline-neutral-200" 209 + class="dark:bg-dark-100 focus:outline-1.5 dark:shadow-dark-900/80 w-[16rem] rounded-lg bg-white px-2 py-1 shadow-sm focus:outline-neutral-900 dark:focus:outline-neutral-200" 210 210 /> 211 211 </label> 212 212 </Show> ··· 216 216 name="cursor" 217 217 placeholder="Leave empty for live-tail" 218 218 value={searchParams.cursor ?? ""} 219 - class="w-16rem" 219 + class="w-[16rem]" 220 220 /> 221 221 </label> 222 222 <Show when={streamType === StreamType.JETSTREAM}> ··· 235 235 </Show> 236 236 </Show> 237 237 <Show when={connected()}> 238 - <div class="break-anywhere flex flex-col gap-1"> 238 + <div class="flex flex-col gap-1 wrap-anywhere"> 239 239 <For each={parameters()}> 240 240 {(param) => ( 241 241 <Show when={param.param}> 242 242 <div class="flex"> 243 - <div class="min-w-6rem font-semibold">{param.name}</div> 243 + <div class="min-w-[6rem] font-semibold">{param.name}</div> 244 244 {param.param} 245 245 </div> 246 246 </Show> ··· 258 258 <Show when={notice().length}> 259 259 <div class="text-red-500 dark:text-red-400">{notice()}</div> 260 260 </Show> 261 - <div class="break-anywhere md:w-screen-md divide-y-0.5 flex w-full flex-col gap-2 divide-neutral-500 whitespace-pre-wrap px-4 font-mono text-sm"> 261 + <div class="flex w-full flex-col gap-2 divide-y-[0.5px] divide-neutral-500 px-4 font-mono text-sm wrap-anywhere whitespace-pre-wrap md:w-[48rem]"> 262 262 <For each={records().toReversed()}> 263 263 {(rec) => ( 264 264 <div class="pb-2">
-15
uno.config.ts
··· 1 - import { defineConfig, presetIcons, presetWebFonts, presetWind4 } from "unocss"; 2 - 3 - export default defineConfig({ 4 - presets: [ 5 - presetIcons(), 6 - presetWind4(), 7 - presetWebFonts({ 8 - provider: "none", 9 - fonts: { 10 - sans: "Inter:400,600,700", 11 - mono: "Roboto Mono:400", 12 - }, 13 - }), 14 - ], 15 - });
+2 -2
vite.config.ts
··· 1 1 import { defineConfig } from "vite"; 2 2 import solidPlugin from "vite-plugin-solid"; 3 - import UnoCSS from "unocss/vite"; 4 3 import metadata from "./public/oauth-client-metadata.json"; 4 + import tailwindcss from "@tailwindcss/vite"; 5 5 6 6 const SERVER_HOST = "127.0.0.1"; 7 7 const SERVER_PORT = 13213; 8 8 9 9 export default defineConfig({ 10 10 plugins: [ 11 - UnoCSS(), 11 + tailwindcss(), 12 12 solidPlugin(), 13 13 // Injects OAuth-related variables 14 14 {