this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial commit

Lim Chee Aun 2b9390a0

+9135
+2
.env
··· 1 + VITE_CLIENT_NAME=Phanpy 2 + VITE_WEBSITE=https://phanpy.social
+27
.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + dist 12 + dist-ssr 13 + *.local 14 + 15 + # Editor directories and files 16 + .vscode/* 17 + !.vscode/extensions.json 18 + .idea 19 + .DS_Store 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw? 25 + 26 + # Custom 27 + .env.dev
+11
.prettierrc
··· 1 + { 2 + "tabWidth": 2, 3 + "useTabs": false, 4 + "singleQuote": true, 5 + "trailingComma": "all", 6 + "importOrder": [".css$", "<THIRD_PARTY_MODULES>", "^../", "^[./]"], 7 + "importOrderSeparation": true, 8 + "importOrderSortSpecifiers": true, 9 + "importOrderGroupNamespaceSpecifiers": true, 10 + "importOrderCaseInsensitive": true 11 + }
+85
README.md
··· 1 + <div align="center"> 2 + <img src="design/logo-2.svg" width="128" height="128" alt=""> 3 + 4 + Phanpy 5 + === 6 + 7 + **Minimalistic opinionated Mastodon web client.** 8 + </div> 9 + 10 + <br> 11 + 12 + This is an alternative web client for [Mastodon](https://joinmastodon.org/). 13 + 14 + Everything is designed and engineered for my own use case, following my taste and vision. This is a personal side project for me to learn about Mastodon and experiment with new UI/UX ideas. 15 + 16 + 🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧 17 + 18 + **🐘 This is an early ALPHA project. Many features are missing, many bugs are present. Please report issues as detailed as possible. Thanks 🙏** 19 + 20 + 🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧 21 + 22 + ## Features 23 + 24 + - Minimalistic UI 25 + - Accounts switching 26 + - Theme switching (light, dark, auto) 27 + 28 + ## Design decisions 29 + 30 + - **Status actions (reply, boost, favourite, bookmark, etc) are hidden by default**.<br>They only appear in individual status page. This is to reduce clutter and distraction. It may result in lower engagement, but we're not chasing numbers here. 31 + - **Boost is represented with the rocket icon**.<br>The green double arrow icon (retweet for Twitter) doesn't look right for the term "boost". Green rocket looks weird, so I use purple. 32 + - **Short usernames (`@username`) are displayed in timelines, instead of the full account username (`@username@instance`)**.<br>Despite the [guideline](https://docs.joinmastodon.org/api/guidelines/#username) mentioned that "Decentralization must be transparent to the user", I don't think we should shove it to the face every single time. There are also some [screen-reader-related accessibility concerns](https://twitter.com/lifeofablindgrl/status/1595864647554502656) with the full username, though this web app is unfortunately not accessible yet. 33 + - **Hash-based URLs**.<br>This web app is not meant to be a full-fledged replacement to Mastodon's existing front-end. There's no SEO, database, serverless or any long-running servers. I could be wrong one day. 34 + 35 + ## Development 36 + 37 + Prerequisites: Node.js 18+ 38 + 39 + - `npm install` - Install dependencies 40 + - `npm run dev` - Start development server 41 + - `npm run build` - Build for production 42 + - `npm run preview` - Preview the production build 43 + - `npm run fetch-instances` - Fetch instances list from [instances.social](https://instances.social/), save it to `src/data/instances.json` 44 + - requires `.env.dev` file with `INSTANCES_SOCIAL_SECRET_TOKEN` variable set 45 + 46 + ## Tech stack 47 + 48 + - [Vite](https://vitejs.dev/) - Build tool 49 + - [Preact](https://preactjs.com/) - UI library 50 + - [Valtio](https://valtio.pmnd.rs/) - State management 51 + - [masto.js](https://github.com/neet/masto.js/) - Mastodon API client 52 + - [Iconify](https://iconify.design/) - Icon library 53 + - Vanilla CSS - *Yes, I'm old school.* 54 + 55 + Some of these may change in the future. The front-end world is ever-changing. 56 + 57 + ## Mascot 58 + 59 + [Phanpy](https://bulbapedia.bulbagarden.net/wiki/Phanpy_(Pok%C3%A9mon)) is a Ground-type Pokémon. 60 + 61 + ## Maintainers 62 + 63 + - [Chee Aun](https://github.com/cheeaun) ([Mastodon](https://mastodon.social/@cheeaun)) ([Twitter](https://twitter.com/cheeaun)) 64 + 65 + ## Backstory 66 + 67 + I am one of the earliest users of Twitter. Twitter was launched on [15 July 2006](https://en.wikipedia.org/wiki/Twitter). I joined on December 2006 and my [first tweet](https://twitter.com/cheeaun/status/1298723) was posted on 18 December 2006. 68 + 69 + I know how early Twitter looks like. It was fun. 70 + 71 + Back then, I [made a Twitter clone](https://twitter.com/cheeaun/status/789031599) called "Twig" written in Python and Google App Engine. I almost made my own [Twitter desktop client](https://github.com/cheeaun/chidori) written in Appcelerator Titanium. I [gave one of my best talks about the Twitter client](https://www.slideshare.net/cheeaun/story-of-a-thousand-birds) in a mini-conference. I built this thing called "Twitter [Columns](https://twitter.com/columns)", a web app that shows your list of followings, your followings' followings, your followers, your followers' followers and so on. In 2009, I wrote a blog post titled ["How I got started with Twitter"](https://cheeaun.com/blog/2009/04/how-i-got-started-with-twitter/). I created [two](https://twitter.com/cheeaun/status/1273422454) [themes](https://twitter.com/cheeaun/status/1487781343) for DestroyTwitter (a desktop client made with Adobe Air by Jonnie Hallman) and one of them is called ["Vimeo"](https://dribbble.com/shots/31624). In 2013, I wrote [my own tweets backup site](https://github.com/cheeaun/tweets) with a front-end to view my tweets and a [CouchDB backend](https://github.com/cheeaun/tweet-couch) to store them. 72 + 73 + It's been **more than 15 years**. 74 + 75 + And here I am. Building a Mastodon web client. 76 + 77 + ## Alternative clients 78 + 79 + - [Pinafore](https://pinafore.social/) 80 + - [Elk](https://m.webtoo.ls/@elk) 81 + - [More...](https://github.com/tleb/awesome-mastodon#clients) 82 + 83 + ## License 84 + 85 + [MIT]([LICENSE](https://cheeaun.mit-license.org/)).
design/logo-2-avatar.png

This is a binary file and will not be displayed.

design/logo-2.png

This is a binary file and will not be displayed.

+1
design/logo-2.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 381 368" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><g><path d="M78.909,82.334c-10.437,-1.485 -55.82,-9.301 -58.49,-33.215c-3.02,-27.033 43.822,-41.472 77.54,-40.305c20.178,0.699 44.134,6.33 55.868,9.399c1.051,-0.537 2.12,-1.055 3.207,-1.551c13.167,-6.013 26.448,-9.536 46.022,-9.449c19.575,0.087 54.35,11.469 77.976,36.429c5.179,5.472 10.635,14.496 16.094,25.631c10.186,6.727 21.646,15.511 31.49,26.077c24.701,26.51 53.147,83.42 36.878,109.351c-5.311,8.466 -11.17,15.825 -17.311,21.775c2.157,10.584 3.185,15.865 3.193,20.799c0.01,6.594 -9.864,41.299 -15.883,56.275c-6.019,14.977 -14.581,35.699 -19.38,39.821c-4.8,4.121 -33.763,3.565 -39.62,-2.192c-5.857,-5.757 -7.848,-31.288 -7.848,-31.288l-2.218,-2.699c-4.173,1.049 -7.9,1.79 -10.766,2.067c-1.895,0.184 -14.517,46.662 -19.293,50.624c-4.777,3.962 -43.958,4.79 -49.391,-0.227c-2.385,-2.202 -3.254,-10.436 -3.601,-19.528c-2.133,-0.3 -5.527,-0.954 -6.789,-2.179c-1.611,-1.563 -4.432,-25.157 -5.251,-32.285c-7.074,-2.799 -14.925,-6.876 -17.749,-8.835c-4.234,-2.937 -21.867,-14.152 -28.341,-14.068c-9.109,0.119 -43.336,11.043 -55.177,11.687c-6.373,0.347 -11.406,-1.29 -16.768,-5.245c-10.426,-7.69 -15.718,-32.353 -12.303,-43.413c2.678,-8.672 48.013,-28.011 52.067,-39.248c3.109,-8.619 2.356,-21.517 1.836,-27.059c-2.383,0.056 -4.676,0.076 -6.78,0.056c-11.902,-0.109 -36.118,3.983 -58.926,-9.726c-22.808,-13.709 -22.404,-28.875 -21.805,-42.895c0.591,-13.856 16.405,-26.461 22.89,-28.506c4.811,-1.516 18.614,-2.025 30.464,-7.473c7.302,-3.356 13.206,-6.11 18.165,-8.605Zm24.761,-17.381l-16.844,13.144c6.85,-3.959 11.708,-7.762 16.844,-13.144Z" style="fill:#d8e7fe;"/><path d="M122.224,177.371c0,0 6.01,10.278 7.912,16.062c1.925,5.851 9.701,28.137 20.95,27.791c11.249,-0.345 15.076,-9.81 16.054,-12.279c1.813,-4.578 2.912,-15.762 1.768,-21.437c-10.324,-0.558 -19.981,-3.275 -27.55,-12.746l-19.134,2.609Z" style="fill:#edcafe;stroke:#a4bff7;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/><path d="M268.645,309.891c-0,-0 1.991,25.531 7.848,31.288c5.857,5.757 34.82,6.313 39.62,2.192c4.799,-4.122 13.361,-24.844 19.38,-39.821c6.019,-14.976 15.893,-49.681 15.883,-56.275c-0.011,-6.593 -1.842,-13.805 -5.756,-33.464c-3.913,-19.659 -37.923,-141.998 -64.588,-170.169c-23.626,-24.96 -58.401,-36.342 -77.976,-36.429c-19.574,-0.087 -32.855,3.436 -46.022,9.449c-21.714,9.915 -36.237,28.389 -48.534,42.891c-12.32,14.528 -19.805,18.537 -47.756,31.386c-11.85,5.448 -25.653,5.957 -30.464,7.473c-6.485,2.045 -22.299,14.65 -22.89,28.506c-0.599,14.02 -1.003,29.186 21.805,42.895c22.808,13.709 47.024,9.617 58.926,9.726c10.916,0.101 26.932,-0.848 34.082,-2.506c4.057,-0.94 10.073,-2.518 14.604,-2.115c2.691,0.239 3.968,-0.417 4.994,0.613c1.521,1.527 5.4,6.453 11.421,8.91c6.021,2.456 10.405,3.784 15.215,3.473c4.811,-0.312 9.994,-2.603 13.647,-5.341" style="fill:none;stroke:#a4bff7;stroke-width:8px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:1.5;"/><path d="M269.651,53.813c-0,0 34.482,15.258 58.965,41.537c24.701,26.51 53.147,83.42 36.878,109.351c-16.269,25.932 -37.67,41.483 -56.611,37.92c-18.941,-3.562 -53.399,-48.206 -62.042,-69.994c-7.465,-18.818 -15.173,-56.883 -5.891,-105.257c3.855,-20.091 28.701,-13.557 28.701,-13.557" style="fill:#d8e7fe;"/><path d="M269.651,53.813c-0,0 34.482,15.258 58.965,41.537c24.701,26.51 53.147,83.42 36.878,109.351c-16.269,25.932 -37.67,41.483 -56.611,37.92c-18.941,-3.562 -53.399,-48.206 -62.042,-69.994c-7.465,-18.818 -15.173,-56.883 -5.891,-105.257" style="fill:none;stroke:#a4bff7;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/><path d="M151.965,17.634c-8.411,-2.277 -31.67,-8.046 -54.006,-8.82c-33.718,-1.167 -80.56,13.272 -77.54,40.305c3.019,27.034 60.619,33.495 60.619,33.495" style="fill:none;stroke:#a4bff7;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/><path d="M94.965,181.731c-0,-0 2.154,13.573 -1.9,24.811c-4.054,11.237 -49.389,30.576 -52.067,39.248c-3.415,11.06 1.877,35.723 12.303,43.413c5.362,3.955 10.395,5.592 16.768,5.245c11.841,-0.644 46.068,-11.568 55.177,-11.687c6.474,-0.084 24.107,11.131 28.341,14.068c4.235,2.938 19.778,10.642 27.05,11.649" style="fill:none;stroke:#a4bff7;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/><path d="M174.379,299.457c-0,-0 6.686,5.949 8.143,12.418c1.458,6.469 -0.977,42.765 4.455,47.781c5.433,5.017 44.614,4.189 49.391,0.227c4.776,-3.962 17.398,-50.44 19.293,-50.624c14.54,-1.407 51.225,-14.729 55.955,-19.902" style="fill:none;stroke:#a4bff7;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/><path d="M171.408,308.187c-0,0 3.28,27.919 5.179,29.762c1.898,1.842 4.433,1.949 4.433,1.949" style="fill:none;stroke:#a4bff7;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/><path d="M202.987,97.482c1.704,0.322 5.208,12.163 1.848,25.168c-4.052,15.688 -10.468,19.748 -12.407,19.589c-5.808,-0.475 3.352,-46.121 10.559,-44.757Z" style="fill:#6892e2;"/><path d="M48.539,94.633c-0,0 16.969,-28.042 44.651,-25.875c25.779,2.019 43.679,25.111 45.247,28.565c2.951,6.505 4.004,19.287 2.418,23.059c-2.14,5.085 -30.761,11.951 -37.266,9.971c-6.504,-1.98 -21.061,-38.517 -33.269,-39.164c-12.734,-0.675 -21.781,3.444 -21.781,3.444Z" style="fill:#4c73b3;"/><path d="M66.881,7.211c0,0 -42.38,16.855 -41.616,35.744c0.625,15.444 42.812,20.199 44.053,24.44c1.116,3.811 -15.724,8.248 -25.083,8.251c-9.389,0.002 -28.763,-5.29 -29.587,-22.339c-1.315,-27.182 31.366,-45.395 52.233,-46.096Z" style="fill:#4c73b3;"/><path d="M295.003,164.325c3.382,-0.76 42.45,26.887 40.395,57.444c-1.607,23.892 -18.447,28.651 -24.719,28.677c-17.984,0.076 -30.158,-24.251 -30.158,-24.251c-0,-0 4.377,4.308 7.189,4.402c2.812,0.095 0.715,-45.332 1.885,-52.053c0.976,-5.607 1.117,-13.255 5.408,-14.219Z" style="fill:#4c73b3;"/><path d="M341.526,153.507c4.109,-3.618 36.948,18.72 38.447,46.443c1.389,25.701 -26.93,30.269 -30.668,29.639c-1.874,-0.315 3.888,-5.399 5.839,-11.563c1.952,-6.164 -12.61,-51.907 -13.657,-56.321c-0.623,-2.629 -1.107,-7.189 0.039,-8.198Z" style="fill:#4c73b3;"/><path d="M354.492,237.192c-0,-0 11.457,8.309 11.208,11.614c-0.356,4.731 -12.794,7.835 -12.794,7.835l-2.934,0.203l1.404,-21.693l3.116,2.041Z" style="fill:#a4bff7;"/><path d="M40.286,124.149c2.189,7.405 4.138,18.161 4.358,28.378" style="fill:none;stroke:#6892e2;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/><path d="M24.788,120.054c-5.343,6.127 -5.084,18.196 -4.013,25.681" style="fill:none;stroke:#6892e2;stroke-width:8px;stroke-linecap:round;stroke-miterlimit:1.5;"/></g></svg>
design/logo.afdesign

This is a binary file and will not be displayed.

design/logo.png

This is a binary file and will not be displayed.

+39
design/logo.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 782 766"> 2 + <path fill="#fff" d="M170 177c-20-3-111-18-117-66-6-54 88-83 156-81 40 2 88 13 111 19l7-3c26-12 53-19 92-19s108 23 156 73c10 11 21 29 32 51 20 14 43 31 63 52 49 53 106 167 74 219-11 17-23 32-35 44 4 21 6 31 6 41a638 638 0 0 1-70 192c-10 9-68 7-79-4-12-12-16-63-16-63l-5-5c-8 2-15 4-21 4-4 1-29 93-39 101-9 8-88 10-98 0-5-4-7-21-8-39-4-1-11-2-13-4-3-4-9-51-11-65-14-6-30-14-35-18-9-6-44-28-57-28-18 0-87 22-110 24-13 0-23-3-34-11-21-15-31-65-24-87 5-17 96-56 104-78 6-18 4-43 3-54h-13c-24-1-72 8-118-20-46-27-45-58-44-86 2-27 33-52 46-57 10-3 37-4 61-15l36-17Zm50-34-34 26c14-8 24-16 34-26Z"/> 3 + <path fill="#b4aaff" d="M257 367s12 21 16 32c4 12 19 57 42 56 22-1 30-20 32-24 4-10 6-32 3-43-20-1-40-7-55-26l-38 5Z"/> 4 + <use xlink:href="#a" width="709" height="698" x="17" y="16"/> 5 + <path fill="#fff" d="M552 120s69 31 118 83c49 53 106 167 74 219-33 52-76 83-114 76-37-7-106-97-124-140-15-38-30-114-11-211 7-40 57-27 57-27Z"/> 6 + <use xlink:href="#b" width="286" height="396" x="477" y="113"/> 7 + <use xlink:href="#c" width="294" height="163" x="42" y="19"/> 8 + <use xlink:href="#d" width="308" height="270" x="82" y="363"/> 9 + <use xlink:href="#e" width="302" height="172" x="344" y="578"/> 10 + <path fill="#342cc6" d="M419 208c3 0 10 24 3 50-8 31-21 39-25 39-11-1 7-92 22-89Z"/> 11 + <use xlink:href="#f" width="38" height="95" x="390" y="206"/> 12 + <path fill="#342cc6" d="M110 202s34-56 89-52c52 4 87 50 90 57 6 13 9 39 5 46-4 11-61 24-74 20s-42-77-67-78-43 7-43 7Z"/> 13 + <use xlink:href="#g" width="191" height="131" x="109" y="147"/> 14 + <path fill="#342cc6" d="M142 38S62 72 63 99c2 30 86 40 88 48s-31 17-50 17-57-11-59-45c-3-54 85-80 100-81Z"/> 15 + <use xlink:href="#h" width="117" height="131" x="38" y="36"/> 16 + <path fill="#342cc6" d="M603 341c6-1 85 54 80 115-3 48-36 57-49 58-36 0-60-49-60-49s8 9 14 9 1-91 4-104c2-12 2-27 11-29Z"/> 17 + <use xlink:href="#i" width="116" height="178" x="571" y="339"/> 18 + <path fill="#342cc6" d="M696 320c8-8 74 37 77 93 2 51-54 60-62 59-4-1 8-11 12-23 4-13-25-104-27-113-2-5-3-14 0-16Z"/> 19 + <use xlink:href="#j" width="84" height="159" x="692" y="317"/> 20 + <path fill="#6364ff" d="M722 487s23 17 22 23c-1 10-26 16-26 16l4-39Z"/> 21 + <use xlink:href="#k" width="33" height="44" x="714" y="485"/> 22 + <use xlink:href="#l" width="30" height="87" x="82" y="246"/> 23 + <use xlink:href="#m" width="33" height="80" x="42" y="239"/> 24 + <defs> 25 + <image xlink:href="data:image/png;base64,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" id="a" width="709" height="698"/> 26 + <image xlink:href="data:image/png;base64,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" id="b" width="286" height="396"/> 27 + <image xlink:href="data:image/png;base64,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" id="c" width="294" height="163"/> 28 + <image xlink:href="data:image/png;base64,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" id="d" width="308" height="270"/> 29 + <image xlink:href="data:image/png;base64,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" id="e" width="302" height="172"/> 30 + <image xlink:href="data:image/png;base64,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" id="f" width="38" height="95"/> 31 + <image xlink:href="data:image/png;base64,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" id="g" width="191" height="131"/> 32 + <image xlink:href="data:image/png;base64,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" id="h" width="117" height="131"/> 33 + <image xlink:href="data:image/png;base64,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" id="i" width="116" height="178"/> 34 + <image xlink:href="data:image/png;base64,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" id="j" width="84" height="159"/> 35 + <image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAsCAYAAADretGxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGklEQVRYhbWYXYhVVRSAvz1n5k7jzJiVY5rOOKNCfxRGBdEP9RRBfxYFFUIxe9NDFPQDvVTWQ0ESRCam1DkJ0Y+9GCT0oKFRki+RmEE9WFKpMWXqZOo0M/fuHtba3H3P3Nvce5xZcDh39tlnrW+vtfba6ww0EOt8v3X+kkbPZ1JMA4D5wCrgHOAbYH+WmlOzBdHeYHwA6AMO6e9u6/xBYGQ2YNoajF8BDAH9QAIsAB4AXrLOXz7rENb5EnAlMKgg+4HFwGXALcAu6/yjswoBzAdWAkuBFUBJx/v17z5gvXX+E+t8/2xBLAEWqbElSN7sBMrAPJ1TAu4EvrDOr7bOd840xBCyK9qBTqAX2As8j4QmSAIsAzYCm6zzi2YSYoVCdCAr7s5S47PUfA08BxzJze8BHgG+ss5fP1MQFyMeCBBzwoMsNduANcC/dd5bDnxunR8+KwjdGcvVeKIwXbl33gWeBkbr6OsC3rbOP1EYAll1jwIAVMgVtCw1HtgEPAaM19GZAG9Y558tCtGLhCGMewWpkSw1lSw1HwLXAGPRozC3DXjVOv9iEYjzkVDE4/XiH2D2I+E7o0MGmIwW8IJ1fm2rEAsQT8QH2z//pyBLzRGkwp7U99oU3Ov1lHX+rVYgLspBVKaDUJADwM3AcdWZIN4JIMPW+S3NQgxQTUSPuHaMJiRLzV7gduCY6igpSEUXdZd1fod1fkpZqOeJhKonyohnmpIsNXuAuxWkhBS9cb3ageuAz6zzSfxeHqJPAQzVneGbhVCQ3cA9wIkIpAKc1r+vBWpO4TzEvNxYmfq1YDqQLxGPnIxAQMLbDayxzvc1gujVseCNsIKWRUHuQHKqQ68zeu8G9lnnz6sH0cVUT/xdBCICcUhIu5Bj4C+kMidIt1Y1aJ1fiLgu7A6D7PfjRSFUtgBbVV9JYUJYhq3zHfGqlypAnLnjSFwLS5aaMvAyEtoEWfhpJE8WARfGEIM6KYao5P4uCrIP2EE139B7AqyIIYaYWrLbaPBtUkB+zelFIRbmPZEvTCVmQKzzlwL3IYken8xjwA/tOskgJTtA+Oje6NukWYBlwHvI9p9UnSW9jwFHg4F6EOUcUBGAAeAD5BNiAvHAOLJDRoFtWWoOx7FJqO2iKsj2nCgIcCvwPnC1Gg4AcxGPnAA2Exlt09+x6yvA0Sw1k7Qg1vkO4DVgGClOE4g3J5DW0QN/Auuy1HwfQwRPxNunopNbAbgfeBy4CgltAAjFyQAjwDpgfXgv74lweqIQx5o0vhp4EOk5e1TPRHSfq1NHgDeB17VhroEI+RAggifqtfWx8YeBh5DE640WEJI6Qc6JcV3QBgUox3oCxAURBFT38pTDyzp/I7Lnb0A+A7up7cjD7zmq7xRwGHgG2F4vxwLEYAQRGpmKKsA6PwTcC9yGuLxTVxk3PcGD4dkEcmJ+BGzIUnMwbzwPMUC1RAeACnDGOr9Zjc/V+T43J5wBQV8ZCeMh4MksNTsbGW8EEVYUDGyk2hVVqMY6GA7eaKOaQ78Ba4FdWWp+nw4ghliSg0iAc6ntMw3VWlKOxgzyWfAT8AqwO0tNS1u7Xc+Nxao8H190PKw0XKGsjyL/QEmB77LUFGqA2vVaTG2hCvlRVqOT0bNR4EfgHWBPlpqfixjOQ4RYhoQDyew4/qeAo2p4O3AgS03Db9RWxQBY529CesGe6NlJpE5sBT4GfslSU7jpnRZCQVYiBQXgU+Bb4I8sNWfVYzYj/wGHg5TPRrLoUAAAAABJRU5ErkJggg==" id="k" width="33" height="44"/> 36 + <image xlink:href="data:image/png;base64,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" id="l" width="30" height="87"/> 37 + <image xlink:href="data:image/png;base64,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" id="m" width="33" height="80"/> 38 + </defs> 39 + </svg>
+15
index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>Phanpy</title> 8 + <meta name="color-scheme" content="dark light" /> 9 + </head> 10 + <body> 11 + <div id="app"></div> 12 + <div id="modal-container"></div> 13 + <script type="module" src="/src/main.jsx"></script> 14 + </body> 15 + </html>
+3785
package-lock.json
··· 1 + { 2 + "name": "phanpy", 3 + "version": "0.1.0", 4 + "lockfileVersion": 2, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "phanpy", 9 + "version": "0.1.0", 10 + "dependencies": { 11 + "@github/text-expander-element": "~2.3.0", 12 + "@github/time-elements": "~4.0.0", 13 + "autoprefixer": "~10.4.13", 14 + "fast-blurhash": "~1.1.2", 15 + "history": "~5.3.0", 16 + "iconify-icon": "~1.0.2", 17 + "masto": "~4.9.1", 18 + "mem": "~9.0.2", 19 + "preact": "~10.11.3", 20 + "preact-router": "~4.1.0", 21 + "react-intersection-observer": "~9.4.1", 22 + "valtio": "~1.7.6" 23 + }, 24 + "devDependencies": { 25 + "@preact/preset-vite": "~2.4.0", 26 + "@trivago/prettier-plugin-sort-imports": "~4.0.0", 27 + "postcss": "~8.4.19", 28 + "postcss-dark-theme-class": "~0.7.3", 29 + "vite": "3.2.5" 30 + } 31 + }, 32 + "node_modules/@ampproject/remapping": { 33 + "version": "2.2.0", 34 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 35 + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 36 + "dev": true, 37 + "dependencies": { 38 + "@jridgewell/gen-mapping": "^0.1.0", 39 + "@jridgewell/trace-mapping": "^0.3.9" 40 + }, 41 + "engines": { 42 + "node": ">=6.0.0" 43 + } 44 + }, 45 + "node_modules/@babel/code-frame": { 46 + "version": "7.18.6", 47 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 48 + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 49 + "dev": true, 50 + "dependencies": { 51 + "@babel/highlight": "^7.18.6" 52 + }, 53 + "engines": { 54 + "node": ">=6.9.0" 55 + } 56 + }, 57 + "node_modules/@babel/compat-data": { 58 + "version": "7.20.1", 59 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", 60 + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", 61 + "dev": true, 62 + "engines": { 63 + "node": ">=6.9.0" 64 + } 65 + }, 66 + "node_modules/@babel/core": { 67 + "version": "7.20.2", 68 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", 69 + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", 70 + "dev": true, 71 + "dependencies": { 72 + "@ampproject/remapping": "^2.1.0", 73 + "@babel/code-frame": "^7.18.6", 74 + "@babel/generator": "^7.20.2", 75 + "@babel/helper-compilation-targets": "^7.20.0", 76 + "@babel/helper-module-transforms": "^7.20.2", 77 + "@babel/helpers": "^7.20.1", 78 + "@babel/parser": "^7.20.2", 79 + "@babel/template": "^7.18.10", 80 + "@babel/traverse": "^7.20.1", 81 + "@babel/types": "^7.20.2", 82 + "convert-source-map": "^1.7.0", 83 + "debug": "^4.1.0", 84 + "gensync": "^1.0.0-beta.2", 85 + "json5": "^2.2.1", 86 + "semver": "^6.3.0" 87 + }, 88 + "engines": { 89 + "node": ">=6.9.0" 90 + }, 91 + "funding": { 92 + "type": "opencollective", 93 + "url": "https://opencollective.com/babel" 94 + } 95 + }, 96 + "node_modules/@babel/generator": { 97 + "version": "7.20.4", 98 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", 99 + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", 100 + "dev": true, 101 + "dependencies": { 102 + "@babel/types": "^7.20.2", 103 + "@jridgewell/gen-mapping": "^0.3.2", 104 + "jsesc": "^2.5.1" 105 + }, 106 + "engines": { 107 + "node": ">=6.9.0" 108 + } 109 + }, 110 + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { 111 + "version": "0.3.2", 112 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 113 + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 114 + "dev": true, 115 + "dependencies": { 116 + "@jridgewell/set-array": "^1.0.1", 117 + "@jridgewell/sourcemap-codec": "^1.4.10", 118 + "@jridgewell/trace-mapping": "^0.3.9" 119 + }, 120 + "engines": { 121 + "node": ">=6.0.0" 122 + } 123 + }, 124 + "node_modules/@babel/helper-annotate-as-pure": { 125 + "version": "7.18.6", 126 + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", 127 + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", 128 + "dev": true, 129 + "dependencies": { 130 + "@babel/types": "^7.18.6" 131 + }, 132 + "engines": { 133 + "node": ">=6.9.0" 134 + } 135 + }, 136 + "node_modules/@babel/helper-compilation-targets": { 137 + "version": "7.20.0", 138 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", 139 + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", 140 + "dev": true, 141 + "dependencies": { 142 + "@babel/compat-data": "^7.20.0", 143 + "@babel/helper-validator-option": "^7.18.6", 144 + "browserslist": "^4.21.3", 145 + "semver": "^6.3.0" 146 + }, 147 + "engines": { 148 + "node": ">=6.9.0" 149 + }, 150 + "peerDependencies": { 151 + "@babel/core": "^7.0.0" 152 + } 153 + }, 154 + "node_modules/@babel/helper-environment-visitor": { 155 + "version": "7.18.9", 156 + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 157 + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 158 + "dev": true, 159 + "engines": { 160 + "node": ">=6.9.0" 161 + } 162 + }, 163 + "node_modules/@babel/helper-function-name": { 164 + "version": "7.19.0", 165 + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", 166 + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", 167 + "dev": true, 168 + "dependencies": { 169 + "@babel/template": "^7.18.10", 170 + "@babel/types": "^7.19.0" 171 + }, 172 + "engines": { 173 + "node": ">=6.9.0" 174 + } 175 + }, 176 + "node_modules/@babel/helper-hoist-variables": { 177 + "version": "7.18.6", 178 + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 179 + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 180 + "dev": true, 181 + "dependencies": { 182 + "@babel/types": "^7.18.6" 183 + }, 184 + "engines": { 185 + "node": ">=6.9.0" 186 + } 187 + }, 188 + "node_modules/@babel/helper-module-imports": { 189 + "version": "7.18.6", 190 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 191 + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 192 + "devOptional": true, 193 + "dependencies": { 194 + "@babel/types": "^7.18.6" 195 + }, 196 + "engines": { 197 + "node": ">=6.9.0" 198 + } 199 + }, 200 + "node_modules/@babel/helper-module-transforms": { 201 + "version": "7.20.2", 202 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", 203 + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", 204 + "dev": true, 205 + "dependencies": { 206 + "@babel/helper-environment-visitor": "^7.18.9", 207 + "@babel/helper-module-imports": "^7.18.6", 208 + "@babel/helper-simple-access": "^7.20.2", 209 + "@babel/helper-split-export-declaration": "^7.18.6", 210 + "@babel/helper-validator-identifier": "^7.19.1", 211 + "@babel/template": "^7.18.10", 212 + "@babel/traverse": "^7.20.1", 213 + "@babel/types": "^7.20.2" 214 + }, 215 + "engines": { 216 + "node": ">=6.9.0" 217 + } 218 + }, 219 + "node_modules/@babel/helper-plugin-utils": { 220 + "version": "7.20.2", 221 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", 222 + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", 223 + "dev": true, 224 + "engines": { 225 + "node": ">=6.9.0" 226 + } 227 + }, 228 + "node_modules/@babel/helper-simple-access": { 229 + "version": "7.20.2", 230 + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", 231 + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", 232 + "dev": true, 233 + "dependencies": { 234 + "@babel/types": "^7.20.2" 235 + }, 236 + "engines": { 237 + "node": ">=6.9.0" 238 + } 239 + }, 240 + "node_modules/@babel/helper-split-export-declaration": { 241 + "version": "7.18.6", 242 + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 243 + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 244 + "dev": true, 245 + "dependencies": { 246 + "@babel/types": "^7.18.6" 247 + }, 248 + "engines": { 249 + "node": ">=6.9.0" 250 + } 251 + }, 252 + "node_modules/@babel/helper-string-parser": { 253 + "version": "7.19.4", 254 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", 255 + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", 256 + "devOptional": true, 257 + "engines": { 258 + "node": ">=6.9.0" 259 + } 260 + }, 261 + "node_modules/@babel/helper-validator-identifier": { 262 + "version": "7.19.1", 263 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 264 + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 265 + "devOptional": true, 266 + "engines": { 267 + "node": ">=6.9.0" 268 + } 269 + }, 270 + "node_modules/@babel/helper-validator-option": { 271 + "version": "7.18.6", 272 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", 273 + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", 274 + "dev": true, 275 + "engines": { 276 + "node": ">=6.9.0" 277 + } 278 + }, 279 + "node_modules/@babel/helpers": { 280 + "version": "7.20.1", 281 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", 282 + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", 283 + "dev": true, 284 + "dependencies": { 285 + "@babel/template": "^7.18.10", 286 + "@babel/traverse": "^7.20.1", 287 + "@babel/types": "^7.20.0" 288 + }, 289 + "engines": { 290 + "node": ">=6.9.0" 291 + } 292 + }, 293 + "node_modules/@babel/highlight": { 294 + "version": "7.18.6", 295 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 296 + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 297 + "dev": true, 298 + "dependencies": { 299 + "@babel/helper-validator-identifier": "^7.18.6", 300 + "chalk": "^2.0.0", 301 + "js-tokens": "^4.0.0" 302 + }, 303 + "engines": { 304 + "node": ">=6.9.0" 305 + } 306 + }, 307 + "node_modules/@babel/parser": { 308 + "version": "7.20.3", 309 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", 310 + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", 311 + "dev": true, 312 + "bin": { 313 + "parser": "bin/babel-parser.js" 314 + }, 315 + "engines": { 316 + "node": ">=6.0.0" 317 + } 318 + }, 319 + "node_modules/@babel/plugin-syntax-jsx": { 320 + "version": "7.18.6", 321 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", 322 + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", 323 + "dev": true, 324 + "dependencies": { 325 + "@babel/helper-plugin-utils": "^7.18.6" 326 + }, 327 + "engines": { 328 + "node": ">=6.9.0" 329 + }, 330 + "peerDependencies": { 331 + "@babel/core": "^7.0.0-0" 332 + } 333 + }, 334 + "node_modules/@babel/plugin-transform-react-jsx": { 335 + "version": "7.19.0", 336 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", 337 + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", 338 + "dev": true, 339 + "dependencies": { 340 + "@babel/helper-annotate-as-pure": "^7.18.6", 341 + "@babel/helper-module-imports": "^7.18.6", 342 + "@babel/helper-plugin-utils": "^7.19.0", 343 + "@babel/plugin-syntax-jsx": "^7.18.6", 344 + "@babel/types": "^7.19.0" 345 + }, 346 + "engines": { 347 + "node": ">=6.9.0" 348 + }, 349 + "peerDependencies": { 350 + "@babel/core": "^7.0.0-0" 351 + } 352 + }, 353 + "node_modules/@babel/plugin-transform-react-jsx-development": { 354 + "version": "7.18.6", 355 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", 356 + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", 357 + "dev": true, 358 + "dependencies": { 359 + "@babel/plugin-transform-react-jsx": "^7.18.6" 360 + }, 361 + "engines": { 362 + "node": ">=6.9.0" 363 + }, 364 + "peerDependencies": { 365 + "@babel/core": "^7.0.0-0" 366 + } 367 + }, 368 + "node_modules/@babel/runtime": { 369 + "version": "7.20.6", 370 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", 371 + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", 372 + "dependencies": { 373 + "regenerator-runtime": "^0.13.11" 374 + }, 375 + "engines": { 376 + "node": ">=6.9.0" 377 + } 378 + }, 379 + "node_modules/@babel/template": { 380 + "version": "7.18.10", 381 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", 382 + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", 383 + "dev": true, 384 + "dependencies": { 385 + "@babel/code-frame": "^7.18.6", 386 + "@babel/parser": "^7.18.10", 387 + "@babel/types": "^7.18.10" 388 + }, 389 + "engines": { 390 + "node": ">=6.9.0" 391 + } 392 + }, 393 + "node_modules/@babel/traverse": { 394 + "version": "7.20.1", 395 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", 396 + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", 397 + "dev": true, 398 + "dependencies": { 399 + "@babel/code-frame": "^7.18.6", 400 + "@babel/generator": "^7.20.1", 401 + "@babel/helper-environment-visitor": "^7.18.9", 402 + "@babel/helper-function-name": "^7.19.0", 403 + "@babel/helper-hoist-variables": "^7.18.6", 404 + "@babel/helper-split-export-declaration": "^7.18.6", 405 + "@babel/parser": "^7.20.1", 406 + "@babel/types": "^7.20.0", 407 + "debug": "^4.1.0", 408 + "globals": "^11.1.0" 409 + }, 410 + "engines": { 411 + "node": ">=6.9.0" 412 + } 413 + }, 414 + "node_modules/@babel/types": { 415 + "version": "7.20.2", 416 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", 417 + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", 418 + "devOptional": true, 419 + "dependencies": { 420 + "@babel/helper-string-parser": "^7.19.4", 421 + "@babel/helper-validator-identifier": "^7.19.1", 422 + "to-fast-properties": "^2.0.0" 423 + }, 424 + "engines": { 425 + "node": ">=6.9.0" 426 + } 427 + }, 428 + "node_modules/@esbuild/android-arm": { 429 + "version": "0.15.18", 430 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", 431 + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", 432 + "cpu": [ 433 + "arm" 434 + ], 435 + "dev": true, 436 + "optional": true, 437 + "os": [ 438 + "android" 439 + ], 440 + "engines": { 441 + "node": ">=12" 442 + } 443 + }, 444 + "node_modules/@esbuild/linux-loong64": { 445 + "version": "0.15.18", 446 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", 447 + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", 448 + "cpu": [ 449 + "loong64" 450 + ], 451 + "dev": true, 452 + "optional": true, 453 + "os": [ 454 + "linux" 455 + ], 456 + "engines": { 457 + "node": ">=12" 458 + } 459 + }, 460 + "node_modules/@github/combobox-nav": { 461 + "version": "2.1.5", 462 + "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.1.5.tgz", 463 + "integrity": "sha512-dmG1PuppNKHnBBEcfylWDwj9SSxd/E/qd8mC1G/klQC3s7ps5q6JZ034mwkkG0LKfI+Y+UgEua/ROD776N400w==" 464 + }, 465 + "node_modules/@github/text-expander-element": { 466 + "version": "2.3.0", 467 + "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.3.0.tgz", 468 + "integrity": "sha512-E1KCxTOA/7Y4dP5g7vXbfRDFU6/SjU0TuJxx6JMwvxzI/NlBrXyXsx/fjFskD2T/un6i6CNKnXu1ZwExDLjcqw==", 469 + "dependencies": { 470 + "@github/combobox-nav": "^2.0.2" 471 + } 472 + }, 473 + "node_modules/@github/time-elements": { 474 + "version": "4.0.0", 475 + "resolved": "https://registry.npmjs.org/@github/time-elements/-/time-elements-4.0.0.tgz", 476 + "integrity": "sha512-oTPpERR/FylYCyUdVjufmF5MmlrIZ7gYzN59xe5mF3aQA+zn5IWiNj+5/D/6NgQWFNXoRB84DILnP/YlkETKhg==" 477 + }, 478 + "node_modules/@iconify/types": { 479 + "version": "2.0.0", 480 + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", 481 + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" 482 + }, 483 + "node_modules/@jridgewell/gen-mapping": { 484 + "version": "0.1.1", 485 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 486 + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 487 + "dev": true, 488 + "dependencies": { 489 + "@jridgewell/set-array": "^1.0.0", 490 + "@jridgewell/sourcemap-codec": "^1.4.10" 491 + }, 492 + "engines": { 493 + "node": ">=6.0.0" 494 + } 495 + }, 496 + "node_modules/@jridgewell/resolve-uri": { 497 + "version": "3.1.0", 498 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 499 + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 500 + "dev": true, 501 + "engines": { 502 + "node": ">=6.0.0" 503 + } 504 + }, 505 + "node_modules/@jridgewell/set-array": { 506 + "version": "1.1.2", 507 + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 508 + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 509 + "dev": true, 510 + "engines": { 511 + "node": ">=6.0.0" 512 + } 513 + }, 514 + "node_modules/@jridgewell/sourcemap-codec": { 515 + "version": "1.4.14", 516 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 517 + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 518 + "dev": true 519 + }, 520 + "node_modules/@jridgewell/trace-mapping": { 521 + "version": "0.3.17", 522 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 523 + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 524 + "dev": true, 525 + "dependencies": { 526 + "@jridgewell/resolve-uri": "3.1.0", 527 + "@jridgewell/sourcemap-codec": "1.4.14" 528 + } 529 + }, 530 + "node_modules/@preact/preset-vite": { 531 + "version": "2.4.0", 532 + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.4.0.tgz", 533 + "integrity": "sha512-EiUMHuiCThuTuK+eH2r5uDg+CJbbt4aWJGePuszrHuXUpRv6WAeO4S+/DTJsEHtPtGmPRR3cLQ68N5097eOSRA==", 534 + "dev": true, 535 + "dependencies": { 536 + "@babel/plugin-transform-react-jsx": "^7.14.9", 537 + "@babel/plugin-transform-react-jsx-development": "^7.16.7", 538 + "@prefresh/vite": "^2.2.8", 539 + "@rollup/pluginutils": "^4.1.1", 540 + "babel-plugin-transform-hook-names": "^1.0.2", 541 + "debug": "^4.3.1", 542 + "kolorist": "^1.2.10", 543 + "resolve": "^1.20.0" 544 + }, 545 + "peerDependencies": { 546 + "@babel/core": "7.x", 547 + "vite": "2.x || 3.x" 548 + } 549 + }, 550 + "node_modules/@prefresh/babel-plugin": { 551 + "version": "0.4.4", 552 + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.4.4.tgz", 553 + "integrity": "sha512-/EvgIFMDL+nd20WNvMO0JQnzIl1EJPgmSaSYrZUww7A+aSdKsi37aL07TljrZR1cBMuzFxcr4xvqsUQLFJEukw==", 554 + "dev": true 555 + }, 556 + "node_modules/@prefresh/core": { 557 + "version": "1.4.1", 558 + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.4.1.tgz", 559 + "integrity": "sha512-og1vaBj3LMJagVncNrDb37Gqc0cWaUcDbpVt5hZtsN4i2Iwzd/5hyTsDHvlMirhSym3wL9ihU0Xa2VhSaOue7g==", 560 + "dev": true, 561 + "peerDependencies": { 562 + "preact": "^10.0.0" 563 + } 564 + }, 565 + "node_modules/@prefresh/utils": { 566 + "version": "1.1.3", 567 + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.1.3.tgz", 568 + "integrity": "sha512-Mb9abhJTOV4yCfkXrMrcgFiFT7MfNOw8sDa+XyZBdq/Ai2p4Zyxqsb3EgHLOEdHpMj6J9aiZ54W8H6FTam1u+A==", 569 + "dev": true 570 + }, 571 + "node_modules/@prefresh/vite": { 572 + "version": "2.2.9", 573 + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.2.9.tgz", 574 + "integrity": "sha512-1ERBF85Ja9/lkrfaltmo4Gca7R2ClQPSHHDDysFgfvPzHmLUeyB0x9WHwhwov/AA1DnyPhsfYT54z3yQd8XrgA==", 575 + "dev": true, 576 + "dependencies": { 577 + "@babel/core": "^7.9.6", 578 + "@prefresh/babel-plugin": "0.4.4", 579 + "@prefresh/core": "^1.3.3", 580 + "@prefresh/utils": "^1.1.2", 581 + "@rollup/pluginutils": "^4.1.0" 582 + }, 583 + "peerDependencies": { 584 + "preact": "^10.4.0", 585 + "vite": ">=2.0.0-beta.3" 586 + } 587 + }, 588 + "node_modules/@rollup/pluginutils": { 589 + "version": "4.2.1", 590 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 591 + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 592 + "dev": true, 593 + "dependencies": { 594 + "estree-walker": "^2.0.1", 595 + "picomatch": "^2.2.2" 596 + }, 597 + "engines": { 598 + "node": ">= 8.0.0" 599 + } 600 + }, 601 + "node_modules/@trivago/prettier-plugin-sort-imports": { 602 + "version": "4.0.0", 603 + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.0.0.tgz", 604 + "integrity": "sha512-Tyuk5ZY4a0e2MNFLdluQO9F6d1awFQYXVVujEPFfvKPPXz8DADNHzz73NMhwCSXGSuGGZcA/rKOyZBrxVNMxaA==", 605 + "dev": true, 606 + "dependencies": { 607 + "@babel/core": "7.17.8", 608 + "@babel/generator": "7.17.7", 609 + "@babel/parser": "7.18.9", 610 + "@babel/traverse": "7.17.3", 611 + "@babel/types": "7.17.0", 612 + "javascript-natural-sort": "0.7.1", 613 + "lodash": "4.17.21" 614 + }, 615 + "peerDependencies": { 616 + "@vue/compiler-sfc": "3.x", 617 + "prettier": "2.x" 618 + } 619 + }, 620 + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/core": { 621 + "version": "7.17.8", 622 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", 623 + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", 624 + "dev": true, 625 + "dependencies": { 626 + "@ampproject/remapping": "^2.1.0", 627 + "@babel/code-frame": "^7.16.7", 628 + "@babel/generator": "^7.17.7", 629 + "@babel/helper-compilation-targets": "^7.17.7", 630 + "@babel/helper-module-transforms": "^7.17.7", 631 + "@babel/helpers": "^7.17.8", 632 + "@babel/parser": "^7.17.8", 633 + "@babel/template": "^7.16.7", 634 + "@babel/traverse": "^7.17.3", 635 + "@babel/types": "^7.17.0", 636 + "convert-source-map": "^1.7.0", 637 + "debug": "^4.1.0", 638 + "gensync": "^1.0.0-beta.2", 639 + "json5": "^2.1.2", 640 + "semver": "^6.3.0" 641 + }, 642 + "engines": { 643 + "node": ">=6.9.0" 644 + }, 645 + "funding": { 646 + "type": "opencollective", 647 + "url": "https://opencollective.com/babel" 648 + } 649 + }, 650 + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/generator": { 651 + "version": "7.17.7", 652 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", 653 + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", 654 + "dev": true, 655 + "dependencies": { 656 + "@babel/types": "^7.17.0", 657 + "jsesc": "^2.5.1", 658 + "source-map": "^0.5.0" 659 + }, 660 + "engines": { 661 + "node": ">=6.9.0" 662 + } 663 + }, 664 + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/parser": { 665 + "version": "7.18.9", 666 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", 667 + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", 668 + "dev": true, 669 + "bin": { 670 + "parser": "bin/babel-parser.js" 671 + }, 672 + "engines": { 673 + "node": ">=6.0.0" 674 + } 675 + }, 676 + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse": { 677 + "version": "7.17.3", 678 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", 679 + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", 680 + "dev": true, 681 + "dependencies": { 682 + "@babel/code-frame": "^7.16.7", 683 + "@babel/generator": "^7.17.3", 684 + "@babel/helper-environment-visitor": "^7.16.7", 685 + "@babel/helper-function-name": "^7.16.7", 686 + "@babel/helper-hoist-variables": "^7.16.7", 687 + "@babel/helper-split-export-declaration": "^7.16.7", 688 + "@babel/parser": "^7.17.3", 689 + "@babel/types": "^7.17.0", 690 + "debug": "^4.1.0", 691 + "globals": "^11.1.0" 692 + }, 693 + "engines": { 694 + "node": ">=6.9.0" 695 + } 696 + }, 697 + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/types": { 698 + "version": "7.17.0", 699 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", 700 + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", 701 + "dev": true, 702 + "dependencies": { 703 + "@babel/helper-validator-identifier": "^7.16.7", 704 + "to-fast-properties": "^2.0.0" 705 + }, 706 + "engines": { 707 + "node": ">=6.9.0" 708 + } 709 + }, 710 + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/source-map": { 711 + "version": "0.5.7", 712 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 713 + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 714 + "dev": true, 715 + "engines": { 716 + "node": ">=0.10.0" 717 + } 718 + }, 719 + "node_modules/@vue/compiler-core": { 720 + "version": "3.2.45", 721 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", 722 + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", 723 + "dev": true, 724 + "peer": true, 725 + "dependencies": { 726 + "@babel/parser": "^7.16.4", 727 + "@vue/shared": "3.2.45", 728 + "estree-walker": "^2.0.2", 729 + "source-map": "^0.6.1" 730 + } 731 + }, 732 + "node_modules/@vue/compiler-dom": { 733 + "version": "3.2.45", 734 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", 735 + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", 736 + "dev": true, 737 + "peer": true, 738 + "dependencies": { 739 + "@vue/compiler-core": "3.2.45", 740 + "@vue/shared": "3.2.45" 741 + } 742 + }, 743 + "node_modules/@vue/compiler-sfc": { 744 + "version": "3.2.45", 745 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", 746 + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", 747 + "dev": true, 748 + "peer": true, 749 + "dependencies": { 750 + "@babel/parser": "^7.16.4", 751 + "@vue/compiler-core": "3.2.45", 752 + "@vue/compiler-dom": "3.2.45", 753 + "@vue/compiler-ssr": "3.2.45", 754 + "@vue/reactivity-transform": "3.2.45", 755 + "@vue/shared": "3.2.45", 756 + "estree-walker": "^2.0.2", 757 + "magic-string": "^0.25.7", 758 + "postcss": "^8.1.10", 759 + "source-map": "^0.6.1" 760 + } 761 + }, 762 + "node_modules/@vue/compiler-ssr": { 763 + "version": "3.2.45", 764 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", 765 + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", 766 + "dev": true, 767 + "peer": true, 768 + "dependencies": { 769 + "@vue/compiler-dom": "3.2.45", 770 + "@vue/shared": "3.2.45" 771 + } 772 + }, 773 + "node_modules/@vue/reactivity-transform": { 774 + "version": "3.2.45", 775 + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", 776 + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", 777 + "dev": true, 778 + "peer": true, 779 + "dependencies": { 780 + "@babel/parser": "^7.16.4", 781 + "@vue/compiler-core": "3.2.45", 782 + "@vue/shared": "3.2.45", 783 + "estree-walker": "^2.0.2", 784 + "magic-string": "^0.25.7" 785 + } 786 + }, 787 + "node_modules/@vue/shared": { 788 + "version": "3.2.45", 789 + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", 790 + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==", 791 + "dev": true, 792 + "peer": true 793 + }, 794 + "node_modules/ansi-styles": { 795 + "version": "3.2.1", 796 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 797 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 798 + "dev": true, 799 + "dependencies": { 800 + "color-convert": "^1.9.0" 801 + }, 802 + "engines": { 803 + "node": ">=4" 804 + } 805 + }, 806 + "node_modules/asynckit": { 807 + "version": "0.4.0", 808 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 809 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 810 + }, 811 + "node_modules/autoprefixer": { 812 + "version": "10.4.13", 813 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", 814 + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", 815 + "funding": [ 816 + { 817 + "type": "opencollective", 818 + "url": "https://opencollective.com/postcss/" 819 + }, 820 + { 821 + "type": "tidelift", 822 + "url": "https://tidelift.com/funding/github/npm/autoprefixer" 823 + } 824 + ], 825 + "dependencies": { 826 + "browserslist": "^4.21.4", 827 + "caniuse-lite": "^1.0.30001426", 828 + "fraction.js": "^4.2.0", 829 + "normalize-range": "^0.1.2", 830 + "picocolors": "^1.0.0", 831 + "postcss-value-parser": "^4.2.0" 832 + }, 833 + "bin": { 834 + "autoprefixer": "bin/autoprefixer" 835 + }, 836 + "engines": { 837 + "node": "^10 || ^12 || >=14" 838 + }, 839 + "peerDependencies": { 840 + "postcss": "^8.1.0" 841 + } 842 + }, 843 + "node_modules/axios": { 844 + "version": "1.1.3", 845 + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", 846 + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", 847 + "dependencies": { 848 + "follow-redirects": "^1.15.0", 849 + "form-data": "^4.0.0", 850 + "proxy-from-env": "^1.1.0" 851 + } 852 + }, 853 + "node_modules/babel-plugin-transform-hook-names": { 854 + "version": "1.0.2", 855 + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", 856 + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", 857 + "dev": true, 858 + "peerDependencies": { 859 + "@babel/core": "^7.12.10" 860 + } 861 + }, 862 + "node_modules/browserslist": { 863 + "version": "4.21.4", 864 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 865 + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 866 + "funding": [ 867 + { 868 + "type": "opencollective", 869 + "url": "https://opencollective.com/browserslist" 870 + }, 871 + { 872 + "type": "tidelift", 873 + "url": "https://tidelift.com/funding/github/npm/browserslist" 874 + } 875 + ], 876 + "dependencies": { 877 + "caniuse-lite": "^1.0.30001400", 878 + "electron-to-chromium": "^1.4.251", 879 + "node-releases": "^2.0.6", 880 + "update-browserslist-db": "^1.0.9" 881 + }, 882 + "bin": { 883 + "browserslist": "cli.js" 884 + }, 885 + "engines": { 886 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 887 + } 888 + }, 889 + "node_modules/camel-case": { 890 + "version": "4.1.2", 891 + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", 892 + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", 893 + "dependencies": { 894 + "pascal-case": "^3.1.2", 895 + "tslib": "^2.0.3" 896 + } 897 + }, 898 + "node_modules/caniuse-lite": { 899 + "version": "1.0.30001431", 900 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", 901 + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", 902 + "funding": [ 903 + { 904 + "type": "opencollective", 905 + "url": "https://opencollective.com/browserslist" 906 + }, 907 + { 908 + "type": "tidelift", 909 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 910 + } 911 + ] 912 + }, 913 + "node_modules/capital-case": { 914 + "version": "1.0.4", 915 + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", 916 + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", 917 + "dependencies": { 918 + "no-case": "^3.0.4", 919 + "tslib": "^2.0.3", 920 + "upper-case-first": "^2.0.2" 921 + } 922 + }, 923 + "node_modules/chalk": { 924 + "version": "2.4.2", 925 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 926 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 927 + "dev": true, 928 + "dependencies": { 929 + "ansi-styles": "^3.2.1", 930 + "escape-string-regexp": "^1.0.5", 931 + "supports-color": "^5.3.0" 932 + }, 933 + "engines": { 934 + "node": ">=4" 935 + } 936 + }, 937 + "node_modules/change-case": { 938 + "version": "4.1.2", 939 + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", 940 + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", 941 + "dependencies": { 942 + "camel-case": "^4.1.2", 943 + "capital-case": "^1.0.4", 944 + "constant-case": "^3.0.4", 945 + "dot-case": "^3.0.4", 946 + "header-case": "^2.0.4", 947 + "no-case": "^3.0.4", 948 + "param-case": "^3.0.4", 949 + "pascal-case": "^3.1.2", 950 + "path-case": "^3.0.4", 951 + "sentence-case": "^3.0.4", 952 + "snake-case": "^3.0.4", 953 + "tslib": "^2.0.3" 954 + } 955 + }, 956 + "node_modules/color-convert": { 957 + "version": "1.9.3", 958 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 959 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 960 + "dev": true, 961 + "dependencies": { 962 + "color-name": "1.1.3" 963 + } 964 + }, 965 + "node_modules/color-name": { 966 + "version": "1.1.3", 967 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 968 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 969 + "dev": true 970 + }, 971 + "node_modules/combined-stream": { 972 + "version": "1.0.8", 973 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 974 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 975 + "dependencies": { 976 + "delayed-stream": "~1.0.0" 977 + }, 978 + "engines": { 979 + "node": ">= 0.8" 980 + } 981 + }, 982 + "node_modules/constant-case": { 983 + "version": "3.0.4", 984 + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", 985 + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", 986 + "dependencies": { 987 + "no-case": "^3.0.4", 988 + "tslib": "^2.0.3", 989 + "upper-case": "^2.0.2" 990 + } 991 + }, 992 + "node_modules/convert-source-map": { 993 + "version": "1.9.0", 994 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 995 + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 996 + "dev": true 997 + }, 998 + "node_modules/debug": { 999 + "version": "4.3.4", 1000 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1001 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1002 + "dev": true, 1003 + "dependencies": { 1004 + "ms": "2.1.2" 1005 + }, 1006 + "engines": { 1007 + "node": ">=6.0" 1008 + }, 1009 + "peerDependenciesMeta": { 1010 + "supports-color": { 1011 + "optional": true 1012 + } 1013 + } 1014 + }, 1015 + "node_modules/delayed-stream": { 1016 + "version": "1.0.0", 1017 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1018 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1019 + "engines": { 1020 + "node": ">=0.4.0" 1021 + } 1022 + }, 1023 + "node_modules/dot-case": { 1024 + "version": "3.0.4", 1025 + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 1026 + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 1027 + "dependencies": { 1028 + "no-case": "^3.0.4", 1029 + "tslib": "^2.0.3" 1030 + } 1031 + }, 1032 + "node_modules/electron-to-chromium": { 1033 + "version": "1.4.284", 1034 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 1035 + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" 1036 + }, 1037 + "node_modules/esbuild": { 1038 + "version": "0.15.18", 1039 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", 1040 + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", 1041 + "devOptional": true, 1042 + "hasInstallScript": true, 1043 + "bin": { 1044 + "esbuild": "bin/esbuild" 1045 + }, 1046 + "engines": { 1047 + "node": ">=12" 1048 + }, 1049 + "optionalDependencies": { 1050 + "@esbuild/android-arm": "0.15.18", 1051 + "@esbuild/linux-loong64": "0.15.18", 1052 + "esbuild-android-64": "0.15.18", 1053 + "esbuild-android-arm64": "0.15.18", 1054 + "esbuild-darwin-64": "0.15.18", 1055 + "esbuild-darwin-arm64": "0.15.18", 1056 + "esbuild-freebsd-64": "0.15.18", 1057 + "esbuild-freebsd-arm64": "0.15.18", 1058 + "esbuild-linux-32": "0.15.18", 1059 + "esbuild-linux-64": "0.15.18", 1060 + "esbuild-linux-arm": "0.15.18", 1061 + "esbuild-linux-arm64": "0.15.18", 1062 + "esbuild-linux-mips64le": "0.15.18", 1063 + "esbuild-linux-ppc64le": "0.15.18", 1064 + "esbuild-linux-riscv64": "0.15.18", 1065 + "esbuild-linux-s390x": "0.15.18", 1066 + "esbuild-netbsd-64": "0.15.18", 1067 + "esbuild-openbsd-64": "0.15.18", 1068 + "esbuild-sunos-64": "0.15.18", 1069 + "esbuild-windows-32": "0.15.18", 1070 + "esbuild-windows-64": "0.15.18", 1071 + "esbuild-windows-arm64": "0.15.18" 1072 + } 1073 + }, 1074 + "node_modules/esbuild-android-64": { 1075 + "version": "0.15.18", 1076 + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", 1077 + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", 1078 + "cpu": [ 1079 + "x64" 1080 + ], 1081 + "dev": true, 1082 + "optional": true, 1083 + "os": [ 1084 + "android" 1085 + ], 1086 + "engines": { 1087 + "node": ">=12" 1088 + } 1089 + }, 1090 + "node_modules/esbuild-android-arm64": { 1091 + "version": "0.15.18", 1092 + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", 1093 + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", 1094 + "cpu": [ 1095 + "arm64" 1096 + ], 1097 + "dev": true, 1098 + "optional": true, 1099 + "os": [ 1100 + "android" 1101 + ], 1102 + "engines": { 1103 + "node": ">=12" 1104 + } 1105 + }, 1106 + "node_modules/esbuild-darwin-64": { 1107 + "version": "0.15.18", 1108 + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", 1109 + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", 1110 + "cpu": [ 1111 + "x64" 1112 + ], 1113 + "dev": true, 1114 + "optional": true, 1115 + "os": [ 1116 + "darwin" 1117 + ], 1118 + "engines": { 1119 + "node": ">=12" 1120 + } 1121 + }, 1122 + "node_modules/esbuild-darwin-arm64": { 1123 + "version": "0.15.18", 1124 + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", 1125 + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", 1126 + "cpu": [ 1127 + "arm64" 1128 + ], 1129 + "dev": true, 1130 + "optional": true, 1131 + "os": [ 1132 + "darwin" 1133 + ], 1134 + "engines": { 1135 + "node": ">=12" 1136 + } 1137 + }, 1138 + "node_modules/esbuild-freebsd-64": { 1139 + "version": "0.15.18", 1140 + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", 1141 + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", 1142 + "cpu": [ 1143 + "x64" 1144 + ], 1145 + "dev": true, 1146 + "optional": true, 1147 + "os": [ 1148 + "freebsd" 1149 + ], 1150 + "engines": { 1151 + "node": ">=12" 1152 + } 1153 + }, 1154 + "node_modules/esbuild-freebsd-arm64": { 1155 + "version": "0.15.18", 1156 + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", 1157 + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", 1158 + "cpu": [ 1159 + "arm64" 1160 + ], 1161 + "dev": true, 1162 + "optional": true, 1163 + "os": [ 1164 + "freebsd" 1165 + ], 1166 + "engines": { 1167 + "node": ">=12" 1168 + } 1169 + }, 1170 + "node_modules/esbuild-linux-32": { 1171 + "version": "0.15.18", 1172 + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", 1173 + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", 1174 + "cpu": [ 1175 + "ia32" 1176 + ], 1177 + "dev": true, 1178 + "optional": true, 1179 + "os": [ 1180 + "linux" 1181 + ], 1182 + "engines": { 1183 + "node": ">=12" 1184 + } 1185 + }, 1186 + "node_modules/esbuild-linux-64": { 1187 + "version": "0.15.18", 1188 + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", 1189 + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", 1190 + "cpu": [ 1191 + "x64" 1192 + ], 1193 + "dev": true, 1194 + "optional": true, 1195 + "os": [ 1196 + "linux" 1197 + ], 1198 + "engines": { 1199 + "node": ">=12" 1200 + } 1201 + }, 1202 + "node_modules/esbuild-linux-arm": { 1203 + "version": "0.15.18", 1204 + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", 1205 + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", 1206 + "cpu": [ 1207 + "arm" 1208 + ], 1209 + "dev": true, 1210 + "optional": true, 1211 + "os": [ 1212 + "linux" 1213 + ], 1214 + "engines": { 1215 + "node": ">=12" 1216 + } 1217 + }, 1218 + "node_modules/esbuild-linux-arm64": { 1219 + "version": "0.15.18", 1220 + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", 1221 + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", 1222 + "cpu": [ 1223 + "arm64" 1224 + ], 1225 + "dev": true, 1226 + "optional": true, 1227 + "os": [ 1228 + "linux" 1229 + ], 1230 + "engines": { 1231 + "node": ">=12" 1232 + } 1233 + }, 1234 + "node_modules/esbuild-linux-mips64le": { 1235 + "version": "0.15.18", 1236 + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", 1237 + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", 1238 + "cpu": [ 1239 + "mips64el" 1240 + ], 1241 + "dev": true, 1242 + "optional": true, 1243 + "os": [ 1244 + "linux" 1245 + ], 1246 + "engines": { 1247 + "node": ">=12" 1248 + } 1249 + }, 1250 + "node_modules/esbuild-linux-ppc64le": { 1251 + "version": "0.15.18", 1252 + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", 1253 + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", 1254 + "cpu": [ 1255 + "ppc64" 1256 + ], 1257 + "dev": true, 1258 + "optional": true, 1259 + "os": [ 1260 + "linux" 1261 + ], 1262 + "engines": { 1263 + "node": ">=12" 1264 + } 1265 + }, 1266 + "node_modules/esbuild-linux-riscv64": { 1267 + "version": "0.15.18", 1268 + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", 1269 + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", 1270 + "cpu": [ 1271 + "riscv64" 1272 + ], 1273 + "dev": true, 1274 + "optional": true, 1275 + "os": [ 1276 + "linux" 1277 + ], 1278 + "engines": { 1279 + "node": ">=12" 1280 + } 1281 + }, 1282 + "node_modules/esbuild-linux-s390x": { 1283 + "version": "0.15.18", 1284 + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", 1285 + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", 1286 + "cpu": [ 1287 + "s390x" 1288 + ], 1289 + "dev": true, 1290 + "optional": true, 1291 + "os": [ 1292 + "linux" 1293 + ], 1294 + "engines": { 1295 + "node": ">=12" 1296 + } 1297 + }, 1298 + "node_modules/esbuild-netbsd-64": { 1299 + "version": "0.15.18", 1300 + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", 1301 + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", 1302 + "cpu": [ 1303 + "x64" 1304 + ], 1305 + "dev": true, 1306 + "optional": true, 1307 + "os": [ 1308 + "netbsd" 1309 + ], 1310 + "engines": { 1311 + "node": ">=12" 1312 + } 1313 + }, 1314 + "node_modules/esbuild-openbsd-64": { 1315 + "version": "0.15.18", 1316 + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", 1317 + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", 1318 + "cpu": [ 1319 + "x64" 1320 + ], 1321 + "dev": true, 1322 + "optional": true, 1323 + "os": [ 1324 + "openbsd" 1325 + ], 1326 + "engines": { 1327 + "node": ">=12" 1328 + } 1329 + }, 1330 + "node_modules/esbuild-sunos-64": { 1331 + "version": "0.15.18", 1332 + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", 1333 + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", 1334 + "cpu": [ 1335 + "x64" 1336 + ], 1337 + "dev": true, 1338 + "optional": true, 1339 + "os": [ 1340 + "sunos" 1341 + ], 1342 + "engines": { 1343 + "node": ">=12" 1344 + } 1345 + }, 1346 + "node_modules/esbuild-windows-32": { 1347 + "version": "0.15.18", 1348 + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", 1349 + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", 1350 + "cpu": [ 1351 + "ia32" 1352 + ], 1353 + "dev": true, 1354 + "optional": true, 1355 + "os": [ 1356 + "win32" 1357 + ], 1358 + "engines": { 1359 + "node": ">=12" 1360 + } 1361 + }, 1362 + "node_modules/esbuild-windows-64": { 1363 + "version": "0.15.18", 1364 + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", 1365 + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", 1366 + "cpu": [ 1367 + "x64" 1368 + ], 1369 + "dev": true, 1370 + "optional": true, 1371 + "os": [ 1372 + "win32" 1373 + ], 1374 + "engines": { 1375 + "node": ">=12" 1376 + } 1377 + }, 1378 + "node_modules/esbuild-windows-arm64": { 1379 + "version": "0.15.18", 1380 + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", 1381 + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", 1382 + "cpu": [ 1383 + "arm64" 1384 + ], 1385 + "dev": true, 1386 + "optional": true, 1387 + "os": [ 1388 + "win32" 1389 + ], 1390 + "engines": { 1391 + "node": ">=12" 1392 + } 1393 + }, 1394 + "node_modules/escalade": { 1395 + "version": "3.1.1", 1396 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1397 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1398 + "engines": { 1399 + "node": ">=6" 1400 + } 1401 + }, 1402 + "node_modules/escape-string-regexp": { 1403 + "version": "1.0.5", 1404 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1405 + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1406 + "dev": true, 1407 + "engines": { 1408 + "node": ">=0.8.0" 1409 + } 1410 + }, 1411 + "node_modules/estree-walker": { 1412 + "version": "2.0.2", 1413 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1414 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1415 + "dev": true 1416 + }, 1417 + "node_modules/eventemitter3": { 1418 + "version": "5.0.0", 1419 + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.0.tgz", 1420 + "integrity": "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==" 1421 + }, 1422 + "node_modules/fast-blurhash": { 1423 + "version": "1.1.2", 1424 + "resolved": "https://registry.npmjs.org/fast-blurhash/-/fast-blurhash-1.1.2.tgz", 1425 + "integrity": "sha512-lJVOgYSlahqkRhrKumNx/SGB2F/qS0D1z7xjGYjb5EZJRtlzySGMniZjkQ9h9Rv8sPmM/V9orEgRiMwazDNH6A==" 1426 + }, 1427 + "node_modules/follow-redirects": { 1428 + "version": "1.15.2", 1429 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1430 + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 1431 + "funding": [ 1432 + { 1433 + "type": "individual", 1434 + "url": "https://github.com/sponsors/RubenVerborgh" 1435 + } 1436 + ], 1437 + "engines": { 1438 + "node": ">=4.0" 1439 + }, 1440 + "peerDependenciesMeta": { 1441 + "debug": { 1442 + "optional": true 1443 + } 1444 + } 1445 + }, 1446 + "node_modules/form-data": { 1447 + "version": "4.0.0", 1448 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1449 + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1450 + "dependencies": { 1451 + "asynckit": "^0.4.0", 1452 + "combined-stream": "^1.0.8", 1453 + "mime-types": "^2.1.12" 1454 + }, 1455 + "engines": { 1456 + "node": ">= 6" 1457 + } 1458 + }, 1459 + "node_modules/fraction.js": { 1460 + "version": "4.2.0", 1461 + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 1462 + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 1463 + "engines": { 1464 + "node": "*" 1465 + }, 1466 + "funding": { 1467 + "type": "patreon", 1468 + "url": "https://www.patreon.com/infusion" 1469 + } 1470 + }, 1471 + "node_modules/fsevents": { 1472 + "version": "2.3.2", 1473 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1474 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1475 + "dev": true, 1476 + "hasInstallScript": true, 1477 + "optional": true, 1478 + "os": [ 1479 + "darwin" 1480 + ], 1481 + "engines": { 1482 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1483 + } 1484 + }, 1485 + "node_modules/function-bind": { 1486 + "version": "1.1.1", 1487 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1488 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1489 + "devOptional": true 1490 + }, 1491 + "node_modules/gensync": { 1492 + "version": "1.0.0-beta.2", 1493 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1494 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1495 + "dev": true, 1496 + "engines": { 1497 + "node": ">=6.9.0" 1498 + } 1499 + }, 1500 + "node_modules/globals": { 1501 + "version": "11.12.0", 1502 + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1503 + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1504 + "dev": true, 1505 + "engines": { 1506 + "node": ">=4" 1507 + } 1508 + }, 1509 + "node_modules/has": { 1510 + "version": "1.0.3", 1511 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1512 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1513 + "devOptional": true, 1514 + "dependencies": { 1515 + "function-bind": "^1.1.1" 1516 + }, 1517 + "engines": { 1518 + "node": ">= 0.4.0" 1519 + } 1520 + }, 1521 + "node_modules/has-flag": { 1522 + "version": "3.0.0", 1523 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1524 + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1525 + "dev": true, 1526 + "engines": { 1527 + "node": ">=4" 1528 + } 1529 + }, 1530 + "node_modules/header-case": { 1531 + "version": "2.0.4", 1532 + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", 1533 + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", 1534 + "dependencies": { 1535 + "capital-case": "^1.0.4", 1536 + "tslib": "^2.0.3" 1537 + } 1538 + }, 1539 + "node_modules/history": { 1540 + "version": "5.3.0", 1541 + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", 1542 + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", 1543 + "dependencies": { 1544 + "@babel/runtime": "^7.7.6" 1545 + } 1546 + }, 1547 + "node_modules/iconify-icon": { 1548 + "version": "1.0.2", 1549 + "resolved": "https://registry.npmjs.org/iconify-icon/-/iconify-icon-1.0.2.tgz", 1550 + "integrity": "sha512-mehAvz2a4eUAlPo76Wul4zzsPNr3hbOHiauMhPrTVIdLOt0AnccnNloh1EeTO3tYeBv7iaJZfdCPHczvi+CkXQ==", 1551 + "dependencies": { 1552 + "@iconify/types": "^2.0.0" 1553 + }, 1554 + "funding": { 1555 + "url": "https://github.com/sponsors/cyberalien" 1556 + } 1557 + }, 1558 + "node_modules/is-core-module": { 1559 + "version": "2.11.0", 1560 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 1561 + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 1562 + "devOptional": true, 1563 + "dependencies": { 1564 + "has": "^1.0.3" 1565 + }, 1566 + "funding": { 1567 + "url": "https://github.com/sponsors/ljharb" 1568 + } 1569 + }, 1570 + "node_modules/isomorphic-form-data": { 1571 + "version": "2.0.0", 1572 + "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-2.0.0.tgz", 1573 + "integrity": "sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==", 1574 + "dependencies": { 1575 + "form-data": "^2.3.2" 1576 + } 1577 + }, 1578 + "node_modules/isomorphic-form-data/node_modules/form-data": { 1579 + "version": "2.5.1", 1580 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 1581 + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 1582 + "dependencies": { 1583 + "asynckit": "^0.4.0", 1584 + "combined-stream": "^1.0.6", 1585 + "mime-types": "^2.1.12" 1586 + }, 1587 + "engines": { 1588 + "node": ">= 0.12" 1589 + } 1590 + }, 1591 + "node_modules/isomorphic-ws": { 1592 + "version": "5.0.0", 1593 + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", 1594 + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", 1595 + "peerDependencies": { 1596 + "ws": "*" 1597 + } 1598 + }, 1599 + "node_modules/javascript-natural-sort": { 1600 + "version": "0.7.1", 1601 + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", 1602 + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", 1603 + "dev": true 1604 + }, 1605 + "node_modules/js-tokens": { 1606 + "version": "4.0.0", 1607 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1608 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1609 + }, 1610 + "node_modules/jsesc": { 1611 + "version": "2.5.2", 1612 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1613 + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1614 + "dev": true, 1615 + "bin": { 1616 + "jsesc": "bin/jsesc" 1617 + }, 1618 + "engines": { 1619 + "node": ">=4" 1620 + } 1621 + }, 1622 + "node_modules/json5": { 1623 + "version": "2.2.1", 1624 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 1625 + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 1626 + "dev": true, 1627 + "bin": { 1628 + "json5": "lib/cli.js" 1629 + }, 1630 + "engines": { 1631 + "node": ">=6" 1632 + } 1633 + }, 1634 + "node_modules/kolorist": { 1635 + "version": "1.6.0", 1636 + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.6.0.tgz", 1637 + "integrity": "sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==", 1638 + "dev": true 1639 + }, 1640 + "node_modules/lodash": { 1641 + "version": "4.17.21", 1642 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1643 + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1644 + "dev": true 1645 + }, 1646 + "node_modules/loose-envify": { 1647 + "version": "1.4.0", 1648 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1649 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1650 + "peer": true, 1651 + "dependencies": { 1652 + "js-tokens": "^3.0.0 || ^4.0.0" 1653 + }, 1654 + "bin": { 1655 + "loose-envify": "cli.js" 1656 + } 1657 + }, 1658 + "node_modules/lower-case": { 1659 + "version": "2.0.2", 1660 + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1661 + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1662 + "dependencies": { 1663 + "tslib": "^2.0.3" 1664 + } 1665 + }, 1666 + "node_modules/lru-cache": { 1667 + "version": "6.0.0", 1668 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1669 + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1670 + "dependencies": { 1671 + "yallist": "^4.0.0" 1672 + }, 1673 + "engines": { 1674 + "node": ">=10" 1675 + } 1676 + }, 1677 + "node_modules/magic-string": { 1678 + "version": "0.25.9", 1679 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 1680 + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 1681 + "dev": true, 1682 + "peer": true, 1683 + "dependencies": { 1684 + "sourcemap-codec": "^1.4.8" 1685 + } 1686 + }, 1687 + "node_modules/map-age-cleaner": { 1688 + "version": "0.1.3", 1689 + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 1690 + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 1691 + "dependencies": { 1692 + "p-defer": "^1.0.0" 1693 + }, 1694 + "engines": { 1695 + "node": ">=6" 1696 + } 1697 + }, 1698 + "node_modules/masto": { 1699 + "version": "4.9.1", 1700 + "resolved": "https://registry.npmjs.org/masto/-/masto-4.9.1.tgz", 1701 + "integrity": "sha512-3jdNqCgI0ZKiG+WzYcJamwt32fd9aChjKSjP8glMUSttQ+OnMYlXb7MdqJivKFNrnRz1R5aorJQL+v18/+o7ng==", 1702 + "dependencies": { 1703 + "axios": "1.1.3", 1704 + "change-case": "^4.1.2", 1705 + "eventemitter3": "^5.0.0", 1706 + "isomorphic-form-data": "^2.0.0", 1707 + "isomorphic-ws": "^5.0.0", 1708 + "semver": "^7.3.7", 1709 + "ws": "^8.8.0" 1710 + } 1711 + }, 1712 + "node_modules/masto/node_modules/semver": { 1713 + "version": "7.3.8", 1714 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 1715 + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 1716 + "dependencies": { 1717 + "lru-cache": "^6.0.0" 1718 + }, 1719 + "bin": { 1720 + "semver": "bin/semver.js" 1721 + }, 1722 + "engines": { 1723 + "node": ">=10" 1724 + } 1725 + }, 1726 + "node_modules/mem": { 1727 + "version": "9.0.2", 1728 + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", 1729 + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", 1730 + "dependencies": { 1731 + "map-age-cleaner": "^0.1.3", 1732 + "mimic-fn": "^4.0.0" 1733 + }, 1734 + "engines": { 1735 + "node": ">=12.20" 1736 + }, 1737 + "funding": { 1738 + "url": "https://github.com/sindresorhus/mem?sponsor=1" 1739 + } 1740 + }, 1741 + "node_modules/mime-db": { 1742 + "version": "1.52.0", 1743 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1744 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1745 + "engines": { 1746 + "node": ">= 0.6" 1747 + } 1748 + }, 1749 + "node_modules/mime-types": { 1750 + "version": "2.1.35", 1751 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1752 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1753 + "dependencies": { 1754 + "mime-db": "1.52.0" 1755 + }, 1756 + "engines": { 1757 + "node": ">= 0.6" 1758 + } 1759 + }, 1760 + "node_modules/mimic-fn": { 1761 + "version": "4.0.0", 1762 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 1763 + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", 1764 + "engines": { 1765 + "node": ">=12" 1766 + }, 1767 + "funding": { 1768 + "url": "https://github.com/sponsors/sindresorhus" 1769 + } 1770 + }, 1771 + "node_modules/ms": { 1772 + "version": "2.1.2", 1773 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1774 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1775 + "dev": true 1776 + }, 1777 + "node_modules/nanoid": { 1778 + "version": "3.3.4", 1779 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1780 + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1781 + "bin": { 1782 + "nanoid": "bin/nanoid.cjs" 1783 + }, 1784 + "engines": { 1785 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1786 + } 1787 + }, 1788 + "node_modules/no-case": { 1789 + "version": "3.0.4", 1790 + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1791 + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1792 + "dependencies": { 1793 + "lower-case": "^2.0.2", 1794 + "tslib": "^2.0.3" 1795 + } 1796 + }, 1797 + "node_modules/node-releases": { 1798 + "version": "2.0.6", 1799 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 1800 + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" 1801 + }, 1802 + "node_modules/normalize-range": { 1803 + "version": "0.1.2", 1804 + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1805 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1806 + "engines": { 1807 + "node": ">=0.10.0" 1808 + } 1809 + }, 1810 + "node_modules/p-defer": { 1811 + "version": "1.0.0", 1812 + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 1813 + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", 1814 + "engines": { 1815 + "node": ">=4" 1816 + } 1817 + }, 1818 + "node_modules/param-case": { 1819 + "version": "3.0.4", 1820 + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", 1821 + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", 1822 + "dependencies": { 1823 + "dot-case": "^3.0.4", 1824 + "tslib": "^2.0.3" 1825 + } 1826 + }, 1827 + "node_modules/pascal-case": { 1828 + "version": "3.1.2", 1829 + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 1830 + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 1831 + "dependencies": { 1832 + "no-case": "^3.0.4", 1833 + "tslib": "^2.0.3" 1834 + } 1835 + }, 1836 + "node_modules/path-case": { 1837 + "version": "3.0.4", 1838 + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", 1839 + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", 1840 + "dependencies": { 1841 + "dot-case": "^3.0.4", 1842 + "tslib": "^2.0.3" 1843 + } 1844 + }, 1845 + "node_modules/path-parse": { 1846 + "version": "1.0.7", 1847 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1848 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1849 + "devOptional": true 1850 + }, 1851 + "node_modules/picocolors": { 1852 + "version": "1.0.0", 1853 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1854 + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1855 + }, 1856 + "node_modules/picomatch": { 1857 + "version": "2.3.1", 1858 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1859 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1860 + "dev": true, 1861 + "engines": { 1862 + "node": ">=8.6" 1863 + }, 1864 + "funding": { 1865 + "url": "https://github.com/sponsors/jonschlinkert" 1866 + } 1867 + }, 1868 + "node_modules/postcss": { 1869 + "version": "8.4.19", 1870 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 1871 + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 1872 + "funding": [ 1873 + { 1874 + "type": "opencollective", 1875 + "url": "https://opencollective.com/postcss/" 1876 + }, 1877 + { 1878 + "type": "tidelift", 1879 + "url": "https://tidelift.com/funding/github/npm/postcss" 1880 + } 1881 + ], 1882 + "dependencies": { 1883 + "nanoid": "^3.3.4", 1884 + "picocolors": "^1.0.0", 1885 + "source-map-js": "^1.0.2" 1886 + }, 1887 + "engines": { 1888 + "node": "^10 || ^12 || >=14" 1889 + } 1890 + }, 1891 + "node_modules/postcss-dark-theme-class": { 1892 + "version": "0.7.3", 1893 + "resolved": "https://registry.npmjs.org/postcss-dark-theme-class/-/postcss-dark-theme-class-0.7.3.tgz", 1894 + "integrity": "sha512-M9vtfh8ORzQsVdT9BWb+xpEDAzC7nHBn7wVc988/JkEVLPupKcUnV0jw7RZ8sSj0ovpqN1POf6PLdt19JCHfhQ==", 1895 + "dev": true, 1896 + "engines": { 1897 + "node": ">=12.0" 1898 + }, 1899 + "funding": { 1900 + "type": "opencollective", 1901 + "url": "https://opencollective.com/postcss/" 1902 + }, 1903 + "peerDependencies": { 1904 + "postcss": "^8.2.14" 1905 + } 1906 + }, 1907 + "node_modules/postcss-value-parser": { 1908 + "version": "4.2.0", 1909 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1910 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 1911 + }, 1912 + "node_modules/preact": { 1913 + "version": "10.11.3", 1914 + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", 1915 + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", 1916 + "funding": { 1917 + "type": "opencollective", 1918 + "url": "https://opencollective.com/preact" 1919 + } 1920 + }, 1921 + "node_modules/preact-router": { 1922 + "version": "4.1.0", 1923 + "resolved": "https://registry.npmjs.org/preact-router/-/preact-router-4.1.0.tgz", 1924 + "integrity": "sha512-y1w2YvVpKAju9FMV+fAVR1NpH4MW5q07BZrziMZeg6F/rGJ9KvLUZtjOqsy2I8fDYiX36AM1AQTXIIK3jigBhA==", 1925 + "peerDependencies": { 1926 + "preact": ">=10" 1927 + } 1928 + }, 1929 + "node_modules/prettier": { 1930 + "version": "2.8.0", 1931 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", 1932 + "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", 1933 + "dev": true, 1934 + "peer": true, 1935 + "bin": { 1936 + "prettier": "bin-prettier.js" 1937 + }, 1938 + "engines": { 1939 + "node": ">=10.13.0" 1940 + }, 1941 + "funding": { 1942 + "url": "https://github.com/prettier/prettier?sponsor=1" 1943 + } 1944 + }, 1945 + "node_modules/proxy-compare": { 1946 + "version": "2.3.0", 1947 + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.3.0.tgz", 1948 + "integrity": "sha512-c3L2CcAi7f7pvlD0D7xsF+2CQIW8C3HaYx2Pfgq8eA4HAl3GAH6/dVYsyBbYF/0XJs2ziGLrzmz5fmzPm6A0pQ==" 1949 + }, 1950 + "node_modules/proxy-from-env": { 1951 + "version": "1.1.0", 1952 + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1953 + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1954 + }, 1955 + "node_modules/react": { 1956 + "version": "18.2.0", 1957 + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1958 + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1959 + "peer": true, 1960 + "dependencies": { 1961 + "loose-envify": "^1.1.0" 1962 + }, 1963 + "engines": { 1964 + "node": ">=0.10.0" 1965 + } 1966 + }, 1967 + "node_modules/react-intersection-observer": { 1968 + "version": "9.4.1", 1969 + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.4.1.tgz", 1970 + "integrity": "sha512-IXpIsPe6BleFOEHKzKh5UjwRUaz/JYS0lT/HPsupWEQou2hDqjhLMStc5zyE3eQVT4Fk3FufM8Fw33qW1uyeiw==", 1971 + "peerDependencies": { 1972 + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" 1973 + } 1974 + }, 1975 + "node_modules/regenerator-runtime": { 1976 + "version": "0.13.11", 1977 + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 1978 + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" 1979 + }, 1980 + "node_modules/resolve": { 1981 + "version": "1.22.1", 1982 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1983 + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1984 + "devOptional": true, 1985 + "dependencies": { 1986 + "is-core-module": "^2.9.0", 1987 + "path-parse": "^1.0.7", 1988 + "supports-preserve-symlinks-flag": "^1.0.0" 1989 + }, 1990 + "bin": { 1991 + "resolve": "bin/resolve" 1992 + }, 1993 + "funding": { 1994 + "url": "https://github.com/sponsors/ljharb" 1995 + } 1996 + }, 1997 + "node_modules/rollup": { 1998 + "version": "2.79.1", 1999 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", 2000 + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", 2001 + "devOptional": true, 2002 + "bin": { 2003 + "rollup": "dist/bin/rollup" 2004 + }, 2005 + "engines": { 2006 + "node": ">=10.0.0" 2007 + }, 2008 + "optionalDependencies": { 2009 + "fsevents": "~2.3.2" 2010 + } 2011 + }, 2012 + "node_modules/semver": { 2013 + "version": "6.3.0", 2014 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2015 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2016 + "dev": true, 2017 + "bin": { 2018 + "semver": "bin/semver.js" 2019 + } 2020 + }, 2021 + "node_modules/sentence-case": { 2022 + "version": "3.0.4", 2023 + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", 2024 + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", 2025 + "dependencies": { 2026 + "no-case": "^3.0.4", 2027 + "tslib": "^2.0.3", 2028 + "upper-case-first": "^2.0.2" 2029 + } 2030 + }, 2031 + "node_modules/snake-case": { 2032 + "version": "3.0.4", 2033 + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", 2034 + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", 2035 + "dependencies": { 2036 + "dot-case": "^3.0.4", 2037 + "tslib": "^2.0.3" 2038 + } 2039 + }, 2040 + "node_modules/source-map": { 2041 + "version": "0.6.1", 2042 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2043 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2044 + "dev": true, 2045 + "peer": true, 2046 + "engines": { 2047 + "node": ">=0.10.0" 2048 + } 2049 + }, 2050 + "node_modules/source-map-js": { 2051 + "version": "1.0.2", 2052 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2053 + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2054 + "engines": { 2055 + "node": ">=0.10.0" 2056 + } 2057 + }, 2058 + "node_modules/sourcemap-codec": { 2059 + "version": "1.4.8", 2060 + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 2061 + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 2062 + "dev": true, 2063 + "peer": true 2064 + }, 2065 + "node_modules/supports-color": { 2066 + "version": "5.5.0", 2067 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2068 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2069 + "dev": true, 2070 + "dependencies": { 2071 + "has-flag": "^3.0.0" 2072 + }, 2073 + "engines": { 2074 + "node": ">=4" 2075 + } 2076 + }, 2077 + "node_modules/supports-preserve-symlinks-flag": { 2078 + "version": "1.0.0", 2079 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2080 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2081 + "devOptional": true, 2082 + "engines": { 2083 + "node": ">= 0.4" 2084 + }, 2085 + "funding": { 2086 + "url": "https://github.com/sponsors/ljharb" 2087 + } 2088 + }, 2089 + "node_modules/to-fast-properties": { 2090 + "version": "2.0.0", 2091 + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2092 + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2093 + "devOptional": true, 2094 + "engines": { 2095 + "node": ">=4" 2096 + } 2097 + }, 2098 + "node_modules/tslib": { 2099 + "version": "2.4.1", 2100 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 2101 + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" 2102 + }, 2103 + "node_modules/update-browserslist-db": { 2104 + "version": "1.0.10", 2105 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 2106 + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 2107 + "funding": [ 2108 + { 2109 + "type": "opencollective", 2110 + "url": "https://opencollective.com/browserslist" 2111 + }, 2112 + { 2113 + "type": "tidelift", 2114 + "url": "https://tidelift.com/funding/github/npm/browserslist" 2115 + } 2116 + ], 2117 + "dependencies": { 2118 + "escalade": "^3.1.1", 2119 + "picocolors": "^1.0.0" 2120 + }, 2121 + "bin": { 2122 + "browserslist-lint": "cli.js" 2123 + }, 2124 + "peerDependencies": { 2125 + "browserslist": ">= 4.21.0" 2126 + } 2127 + }, 2128 + "node_modules/upper-case": { 2129 + "version": "2.0.2", 2130 + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", 2131 + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", 2132 + "dependencies": { 2133 + "tslib": "^2.0.3" 2134 + } 2135 + }, 2136 + "node_modules/upper-case-first": { 2137 + "version": "2.0.2", 2138 + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", 2139 + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", 2140 + "dependencies": { 2141 + "tslib": "^2.0.3" 2142 + } 2143 + }, 2144 + "node_modules/use-sync-external-store": { 2145 + "version": "1.2.0", 2146 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", 2147 + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", 2148 + "peerDependencies": { 2149 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 2150 + } 2151 + }, 2152 + "node_modules/valtio": { 2153 + "version": "1.7.6", 2154 + "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.7.6.tgz", 2155 + "integrity": "sha512-zsGrCCYOIpy8egQxftduFyJusF/BMu3CganhHKUOE/I6t6V6yA1MDfZZkrYoWYCGkC3rSBYcIHEEsoYQM9lV2w==", 2156 + "dependencies": { 2157 + "proxy-compare": "2.3.0", 2158 + "use-sync-external-store": "1.2.0" 2159 + }, 2160 + "engines": { 2161 + "node": ">=12.7.0" 2162 + }, 2163 + "peerDependencies": { 2164 + "@babel/helper-module-imports": ">=7.12", 2165 + "@babel/types": ">=7.13", 2166 + "aslemammad-vite-plugin-macro": ">=1.0.0-alpha.1", 2167 + "babel-plugin-macros": ">=3.0", 2168 + "react": ">=16.8", 2169 + "vite": ">=2.8.6" 2170 + }, 2171 + "peerDependenciesMeta": { 2172 + "@babel/helper-module-imports": { 2173 + "optional": true 2174 + }, 2175 + "@babel/types": { 2176 + "optional": true 2177 + }, 2178 + "aslemammad-vite-plugin-macro": { 2179 + "optional": true 2180 + }, 2181 + "babel-plugin-macros": { 2182 + "optional": true 2183 + }, 2184 + "react": { 2185 + "optional": true 2186 + }, 2187 + "vite": { 2188 + "optional": true 2189 + } 2190 + } 2191 + }, 2192 + "node_modules/vite": { 2193 + "version": "3.2.5", 2194 + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", 2195 + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", 2196 + "devOptional": true, 2197 + "dependencies": { 2198 + "esbuild": "^0.15.9", 2199 + "postcss": "^8.4.18", 2200 + "resolve": "^1.22.1", 2201 + "rollup": "^2.79.1" 2202 + }, 2203 + "bin": { 2204 + "vite": "bin/vite.js" 2205 + }, 2206 + "engines": { 2207 + "node": "^14.18.0 || >=16.0.0" 2208 + }, 2209 + "optionalDependencies": { 2210 + "fsevents": "~2.3.2" 2211 + }, 2212 + "peerDependencies": { 2213 + "@types/node": ">= 14", 2214 + "less": "*", 2215 + "sass": "*", 2216 + "stylus": "*", 2217 + "sugarss": "*", 2218 + "terser": "^5.4.0" 2219 + }, 2220 + "peerDependenciesMeta": { 2221 + "@types/node": { 2222 + "optional": true 2223 + }, 2224 + "less": { 2225 + "optional": true 2226 + }, 2227 + "sass": { 2228 + "optional": true 2229 + }, 2230 + "stylus": { 2231 + "optional": true 2232 + }, 2233 + "sugarss": { 2234 + "optional": true 2235 + }, 2236 + "terser": { 2237 + "optional": true 2238 + } 2239 + } 2240 + }, 2241 + "node_modules/ws": { 2242 + "version": "8.11.0", 2243 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", 2244 + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", 2245 + "engines": { 2246 + "node": ">=10.0.0" 2247 + }, 2248 + "peerDependencies": { 2249 + "bufferutil": "^4.0.1", 2250 + "utf-8-validate": "^5.0.2" 2251 + }, 2252 + "peerDependenciesMeta": { 2253 + "bufferutil": { 2254 + "optional": true 2255 + }, 2256 + "utf-8-validate": { 2257 + "optional": true 2258 + } 2259 + } 2260 + }, 2261 + "node_modules/yallist": { 2262 + "version": "4.0.0", 2263 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2264 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2265 + } 2266 + }, 2267 + "dependencies": { 2268 + "@ampproject/remapping": { 2269 + "version": "2.2.0", 2270 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 2271 + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 2272 + "dev": true, 2273 + "requires": { 2274 + "@jridgewell/gen-mapping": "^0.1.0", 2275 + "@jridgewell/trace-mapping": "^0.3.9" 2276 + } 2277 + }, 2278 + "@babel/code-frame": { 2279 + "version": "7.18.6", 2280 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 2281 + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 2282 + "dev": true, 2283 + "requires": { 2284 + "@babel/highlight": "^7.18.6" 2285 + } 2286 + }, 2287 + "@babel/compat-data": { 2288 + "version": "7.20.1", 2289 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", 2290 + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", 2291 + "dev": true 2292 + }, 2293 + "@babel/core": { 2294 + "version": "7.20.2", 2295 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", 2296 + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", 2297 + "dev": true, 2298 + "requires": { 2299 + "@ampproject/remapping": "^2.1.0", 2300 + "@babel/code-frame": "^7.18.6", 2301 + "@babel/generator": "^7.20.2", 2302 + "@babel/helper-compilation-targets": "^7.20.0", 2303 + "@babel/helper-module-transforms": "^7.20.2", 2304 + "@babel/helpers": "^7.20.1", 2305 + "@babel/parser": "^7.20.2", 2306 + "@babel/template": "^7.18.10", 2307 + "@babel/traverse": "^7.20.1", 2308 + "@babel/types": "^7.20.2", 2309 + "convert-source-map": "^1.7.0", 2310 + "debug": "^4.1.0", 2311 + "gensync": "^1.0.0-beta.2", 2312 + "json5": "^2.2.1", 2313 + "semver": "^6.3.0" 2314 + } 2315 + }, 2316 + "@babel/generator": { 2317 + "version": "7.20.4", 2318 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", 2319 + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", 2320 + "dev": true, 2321 + "requires": { 2322 + "@babel/types": "^7.20.2", 2323 + "@jridgewell/gen-mapping": "^0.3.2", 2324 + "jsesc": "^2.5.1" 2325 + }, 2326 + "dependencies": { 2327 + "@jridgewell/gen-mapping": { 2328 + "version": "0.3.2", 2329 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 2330 + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 2331 + "dev": true, 2332 + "requires": { 2333 + "@jridgewell/set-array": "^1.0.1", 2334 + "@jridgewell/sourcemap-codec": "^1.4.10", 2335 + "@jridgewell/trace-mapping": "^0.3.9" 2336 + } 2337 + } 2338 + } 2339 + }, 2340 + "@babel/helper-annotate-as-pure": { 2341 + "version": "7.18.6", 2342 + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", 2343 + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", 2344 + "dev": true, 2345 + "requires": { 2346 + "@babel/types": "^7.18.6" 2347 + } 2348 + }, 2349 + "@babel/helper-compilation-targets": { 2350 + "version": "7.20.0", 2351 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", 2352 + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", 2353 + "dev": true, 2354 + "requires": { 2355 + "@babel/compat-data": "^7.20.0", 2356 + "@babel/helper-validator-option": "^7.18.6", 2357 + "browserslist": "^4.21.3", 2358 + "semver": "^6.3.0" 2359 + } 2360 + }, 2361 + "@babel/helper-environment-visitor": { 2362 + "version": "7.18.9", 2363 + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 2364 + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 2365 + "dev": true 2366 + }, 2367 + "@babel/helper-function-name": { 2368 + "version": "7.19.0", 2369 + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", 2370 + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", 2371 + "dev": true, 2372 + "requires": { 2373 + "@babel/template": "^7.18.10", 2374 + "@babel/types": "^7.19.0" 2375 + } 2376 + }, 2377 + "@babel/helper-hoist-variables": { 2378 + "version": "7.18.6", 2379 + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 2380 + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 2381 + "dev": true, 2382 + "requires": { 2383 + "@babel/types": "^7.18.6" 2384 + } 2385 + }, 2386 + "@babel/helper-module-imports": { 2387 + "version": "7.18.6", 2388 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 2389 + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 2390 + "devOptional": true, 2391 + "requires": { 2392 + "@babel/types": "^7.18.6" 2393 + } 2394 + }, 2395 + "@babel/helper-module-transforms": { 2396 + "version": "7.20.2", 2397 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", 2398 + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", 2399 + "dev": true, 2400 + "requires": { 2401 + "@babel/helper-environment-visitor": "^7.18.9", 2402 + "@babel/helper-module-imports": "^7.18.6", 2403 + "@babel/helper-simple-access": "^7.20.2", 2404 + "@babel/helper-split-export-declaration": "^7.18.6", 2405 + "@babel/helper-validator-identifier": "^7.19.1", 2406 + "@babel/template": "^7.18.10", 2407 + "@babel/traverse": "^7.20.1", 2408 + "@babel/types": "^7.20.2" 2409 + } 2410 + }, 2411 + "@babel/helper-plugin-utils": { 2412 + "version": "7.20.2", 2413 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", 2414 + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", 2415 + "dev": true 2416 + }, 2417 + "@babel/helper-simple-access": { 2418 + "version": "7.20.2", 2419 + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", 2420 + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", 2421 + "dev": true, 2422 + "requires": { 2423 + "@babel/types": "^7.20.2" 2424 + } 2425 + }, 2426 + "@babel/helper-split-export-declaration": { 2427 + "version": "7.18.6", 2428 + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 2429 + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 2430 + "dev": true, 2431 + "requires": { 2432 + "@babel/types": "^7.18.6" 2433 + } 2434 + }, 2435 + "@babel/helper-string-parser": { 2436 + "version": "7.19.4", 2437 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", 2438 + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", 2439 + "devOptional": true 2440 + }, 2441 + "@babel/helper-validator-identifier": { 2442 + "version": "7.19.1", 2443 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 2444 + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 2445 + "devOptional": true 2446 + }, 2447 + "@babel/helper-validator-option": { 2448 + "version": "7.18.6", 2449 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", 2450 + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", 2451 + "dev": true 2452 + }, 2453 + "@babel/helpers": { 2454 + "version": "7.20.1", 2455 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", 2456 + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", 2457 + "dev": true, 2458 + "requires": { 2459 + "@babel/template": "^7.18.10", 2460 + "@babel/traverse": "^7.20.1", 2461 + "@babel/types": "^7.20.0" 2462 + } 2463 + }, 2464 + "@babel/highlight": { 2465 + "version": "7.18.6", 2466 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 2467 + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 2468 + "dev": true, 2469 + "requires": { 2470 + "@babel/helper-validator-identifier": "^7.18.6", 2471 + "chalk": "^2.0.0", 2472 + "js-tokens": "^4.0.0" 2473 + } 2474 + }, 2475 + "@babel/parser": { 2476 + "version": "7.20.3", 2477 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", 2478 + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", 2479 + "dev": true 2480 + }, 2481 + "@babel/plugin-syntax-jsx": { 2482 + "version": "7.18.6", 2483 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", 2484 + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", 2485 + "dev": true, 2486 + "requires": { 2487 + "@babel/helper-plugin-utils": "^7.18.6" 2488 + } 2489 + }, 2490 + "@babel/plugin-transform-react-jsx": { 2491 + "version": "7.19.0", 2492 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", 2493 + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", 2494 + "dev": true, 2495 + "requires": { 2496 + "@babel/helper-annotate-as-pure": "^7.18.6", 2497 + "@babel/helper-module-imports": "^7.18.6", 2498 + "@babel/helper-plugin-utils": "^7.19.0", 2499 + "@babel/plugin-syntax-jsx": "^7.18.6", 2500 + "@babel/types": "^7.19.0" 2501 + } 2502 + }, 2503 + "@babel/plugin-transform-react-jsx-development": { 2504 + "version": "7.18.6", 2505 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", 2506 + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", 2507 + "dev": true, 2508 + "requires": { 2509 + "@babel/plugin-transform-react-jsx": "^7.18.6" 2510 + } 2511 + }, 2512 + "@babel/runtime": { 2513 + "version": "7.20.6", 2514 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", 2515 + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", 2516 + "requires": { 2517 + "regenerator-runtime": "^0.13.11" 2518 + } 2519 + }, 2520 + "@babel/template": { 2521 + "version": "7.18.10", 2522 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", 2523 + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", 2524 + "dev": true, 2525 + "requires": { 2526 + "@babel/code-frame": "^7.18.6", 2527 + "@babel/parser": "^7.18.10", 2528 + "@babel/types": "^7.18.10" 2529 + } 2530 + }, 2531 + "@babel/traverse": { 2532 + "version": "7.20.1", 2533 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", 2534 + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", 2535 + "dev": true, 2536 + "requires": { 2537 + "@babel/code-frame": "^7.18.6", 2538 + "@babel/generator": "^7.20.1", 2539 + "@babel/helper-environment-visitor": "^7.18.9", 2540 + "@babel/helper-function-name": "^7.19.0", 2541 + "@babel/helper-hoist-variables": "^7.18.6", 2542 + "@babel/helper-split-export-declaration": "^7.18.6", 2543 + "@babel/parser": "^7.20.1", 2544 + "@babel/types": "^7.20.0", 2545 + "debug": "^4.1.0", 2546 + "globals": "^11.1.0" 2547 + } 2548 + }, 2549 + "@babel/types": { 2550 + "version": "7.20.2", 2551 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", 2552 + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", 2553 + "devOptional": true, 2554 + "requires": { 2555 + "@babel/helper-string-parser": "^7.19.4", 2556 + "@babel/helper-validator-identifier": "^7.19.1", 2557 + "to-fast-properties": "^2.0.0" 2558 + } 2559 + }, 2560 + "@esbuild/android-arm": { 2561 + "version": "0.15.18", 2562 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", 2563 + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", 2564 + "dev": true, 2565 + "optional": true 2566 + }, 2567 + "@esbuild/linux-loong64": { 2568 + "version": "0.15.18", 2569 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", 2570 + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", 2571 + "dev": true, 2572 + "optional": true 2573 + }, 2574 + "@github/combobox-nav": { 2575 + "version": "2.1.5", 2576 + "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.1.5.tgz", 2577 + "integrity": "sha512-dmG1PuppNKHnBBEcfylWDwj9SSxd/E/qd8mC1G/klQC3s7ps5q6JZ034mwkkG0LKfI+Y+UgEua/ROD776N400w==" 2578 + }, 2579 + "@github/text-expander-element": { 2580 + "version": "2.3.0", 2581 + "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.3.0.tgz", 2582 + "integrity": "sha512-E1KCxTOA/7Y4dP5g7vXbfRDFU6/SjU0TuJxx6JMwvxzI/NlBrXyXsx/fjFskD2T/un6i6CNKnXu1ZwExDLjcqw==", 2583 + "requires": { 2584 + "@github/combobox-nav": "^2.0.2" 2585 + } 2586 + }, 2587 + "@github/time-elements": { 2588 + "version": "4.0.0", 2589 + "resolved": "https://registry.npmjs.org/@github/time-elements/-/time-elements-4.0.0.tgz", 2590 + "integrity": "sha512-oTPpERR/FylYCyUdVjufmF5MmlrIZ7gYzN59xe5mF3aQA+zn5IWiNj+5/D/6NgQWFNXoRB84DILnP/YlkETKhg==" 2591 + }, 2592 + "@iconify/types": { 2593 + "version": "2.0.0", 2594 + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", 2595 + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" 2596 + }, 2597 + "@jridgewell/gen-mapping": { 2598 + "version": "0.1.1", 2599 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 2600 + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 2601 + "dev": true, 2602 + "requires": { 2603 + "@jridgewell/set-array": "^1.0.0", 2604 + "@jridgewell/sourcemap-codec": "^1.4.10" 2605 + } 2606 + }, 2607 + "@jridgewell/resolve-uri": { 2608 + "version": "3.1.0", 2609 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 2610 + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 2611 + "dev": true 2612 + }, 2613 + "@jridgewell/set-array": { 2614 + "version": "1.1.2", 2615 + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 2616 + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 2617 + "dev": true 2618 + }, 2619 + "@jridgewell/sourcemap-codec": { 2620 + "version": "1.4.14", 2621 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 2622 + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 2623 + "dev": true 2624 + }, 2625 + "@jridgewell/trace-mapping": { 2626 + "version": "0.3.17", 2627 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 2628 + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 2629 + "dev": true, 2630 + "requires": { 2631 + "@jridgewell/resolve-uri": "3.1.0", 2632 + "@jridgewell/sourcemap-codec": "1.4.14" 2633 + } 2634 + }, 2635 + "@preact/preset-vite": { 2636 + "version": "2.4.0", 2637 + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.4.0.tgz", 2638 + "integrity": "sha512-EiUMHuiCThuTuK+eH2r5uDg+CJbbt4aWJGePuszrHuXUpRv6WAeO4S+/DTJsEHtPtGmPRR3cLQ68N5097eOSRA==", 2639 + "dev": true, 2640 + "requires": { 2641 + "@babel/plugin-transform-react-jsx": "^7.14.9", 2642 + "@babel/plugin-transform-react-jsx-development": "^7.16.7", 2643 + "@prefresh/vite": "^2.2.8", 2644 + "@rollup/pluginutils": "^4.1.1", 2645 + "babel-plugin-transform-hook-names": "^1.0.2", 2646 + "debug": "^4.3.1", 2647 + "kolorist": "^1.2.10", 2648 + "resolve": "^1.20.0" 2649 + } 2650 + }, 2651 + "@prefresh/babel-plugin": { 2652 + "version": "0.4.4", 2653 + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.4.4.tgz", 2654 + "integrity": "sha512-/EvgIFMDL+nd20WNvMO0JQnzIl1EJPgmSaSYrZUww7A+aSdKsi37aL07TljrZR1cBMuzFxcr4xvqsUQLFJEukw==", 2655 + "dev": true 2656 + }, 2657 + "@prefresh/core": { 2658 + "version": "1.4.1", 2659 + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.4.1.tgz", 2660 + "integrity": "sha512-og1vaBj3LMJagVncNrDb37Gqc0cWaUcDbpVt5hZtsN4i2Iwzd/5hyTsDHvlMirhSym3wL9ihU0Xa2VhSaOue7g==", 2661 + "dev": true, 2662 + "requires": {} 2663 + }, 2664 + "@prefresh/utils": { 2665 + "version": "1.1.3", 2666 + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.1.3.tgz", 2667 + "integrity": "sha512-Mb9abhJTOV4yCfkXrMrcgFiFT7MfNOw8sDa+XyZBdq/Ai2p4Zyxqsb3EgHLOEdHpMj6J9aiZ54W8H6FTam1u+A==", 2668 + "dev": true 2669 + }, 2670 + "@prefresh/vite": { 2671 + "version": "2.2.9", 2672 + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.2.9.tgz", 2673 + "integrity": "sha512-1ERBF85Ja9/lkrfaltmo4Gca7R2ClQPSHHDDysFgfvPzHmLUeyB0x9WHwhwov/AA1DnyPhsfYT54z3yQd8XrgA==", 2674 + "dev": true, 2675 + "requires": { 2676 + "@babel/core": "^7.9.6", 2677 + "@prefresh/babel-plugin": "0.4.4", 2678 + "@prefresh/core": "^1.3.3", 2679 + "@prefresh/utils": "^1.1.2", 2680 + "@rollup/pluginutils": "^4.1.0" 2681 + } 2682 + }, 2683 + "@rollup/pluginutils": { 2684 + "version": "4.2.1", 2685 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 2686 + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 2687 + "dev": true, 2688 + "requires": { 2689 + "estree-walker": "^2.0.1", 2690 + "picomatch": "^2.2.2" 2691 + } 2692 + }, 2693 + "@trivago/prettier-plugin-sort-imports": { 2694 + "version": "4.0.0", 2695 + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.0.0.tgz", 2696 + "integrity": "sha512-Tyuk5ZY4a0e2MNFLdluQO9F6d1awFQYXVVujEPFfvKPPXz8DADNHzz73NMhwCSXGSuGGZcA/rKOyZBrxVNMxaA==", 2697 + "dev": true, 2698 + "requires": { 2699 + "@babel/core": "7.17.8", 2700 + "@babel/generator": "7.17.7", 2701 + "@babel/parser": "7.18.9", 2702 + "@babel/traverse": "7.17.3", 2703 + "@babel/types": "7.17.0", 2704 + "javascript-natural-sort": "0.7.1", 2705 + "lodash": "4.17.21" 2706 + }, 2707 + "dependencies": { 2708 + "@babel/core": { 2709 + "version": "7.17.8", 2710 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", 2711 + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", 2712 + "dev": true, 2713 + "requires": { 2714 + "@ampproject/remapping": "^2.1.0", 2715 + "@babel/code-frame": "^7.16.7", 2716 + "@babel/generator": "^7.17.7", 2717 + "@babel/helper-compilation-targets": "^7.17.7", 2718 + "@babel/helper-module-transforms": "^7.17.7", 2719 + "@babel/helpers": "^7.17.8", 2720 + "@babel/parser": "^7.17.8", 2721 + "@babel/template": "^7.16.7", 2722 + "@babel/traverse": "^7.17.3", 2723 + "@babel/types": "^7.17.0", 2724 + "convert-source-map": "^1.7.0", 2725 + "debug": "^4.1.0", 2726 + "gensync": "^1.0.0-beta.2", 2727 + "json5": "^2.1.2", 2728 + "semver": "^6.3.0" 2729 + } 2730 + }, 2731 + "@babel/generator": { 2732 + "version": "7.17.7", 2733 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", 2734 + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", 2735 + "dev": true, 2736 + "requires": { 2737 + "@babel/types": "^7.17.0", 2738 + "jsesc": "^2.5.1", 2739 + "source-map": "^0.5.0" 2740 + } 2741 + }, 2742 + "@babel/parser": { 2743 + "version": "7.18.9", 2744 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", 2745 + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", 2746 + "dev": true 2747 + }, 2748 + "@babel/traverse": { 2749 + "version": "7.17.3", 2750 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", 2751 + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", 2752 + "dev": true, 2753 + "requires": { 2754 + "@babel/code-frame": "^7.16.7", 2755 + "@babel/generator": "^7.17.3", 2756 + "@babel/helper-environment-visitor": "^7.16.7", 2757 + "@babel/helper-function-name": "^7.16.7", 2758 + "@babel/helper-hoist-variables": "^7.16.7", 2759 + "@babel/helper-split-export-declaration": "^7.16.7", 2760 + "@babel/parser": "^7.17.3", 2761 + "@babel/types": "^7.17.0", 2762 + "debug": "^4.1.0", 2763 + "globals": "^11.1.0" 2764 + } 2765 + }, 2766 + "@babel/types": { 2767 + "version": "7.17.0", 2768 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", 2769 + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", 2770 + "dev": true, 2771 + "requires": { 2772 + "@babel/helper-validator-identifier": "^7.16.7", 2773 + "to-fast-properties": "^2.0.0" 2774 + } 2775 + }, 2776 + "source-map": { 2777 + "version": "0.5.7", 2778 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2779 + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 2780 + "dev": true 2781 + } 2782 + } 2783 + }, 2784 + "@vue/compiler-core": { 2785 + "version": "3.2.45", 2786 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", 2787 + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", 2788 + "dev": true, 2789 + "peer": true, 2790 + "requires": { 2791 + "@babel/parser": "^7.16.4", 2792 + "@vue/shared": "3.2.45", 2793 + "estree-walker": "^2.0.2", 2794 + "source-map": "^0.6.1" 2795 + } 2796 + }, 2797 + "@vue/compiler-dom": { 2798 + "version": "3.2.45", 2799 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", 2800 + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", 2801 + "dev": true, 2802 + "peer": true, 2803 + "requires": { 2804 + "@vue/compiler-core": "3.2.45", 2805 + "@vue/shared": "3.2.45" 2806 + } 2807 + }, 2808 + "@vue/compiler-sfc": { 2809 + "version": "3.2.45", 2810 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", 2811 + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", 2812 + "dev": true, 2813 + "peer": true, 2814 + "requires": { 2815 + "@babel/parser": "^7.16.4", 2816 + "@vue/compiler-core": "3.2.45", 2817 + "@vue/compiler-dom": "3.2.45", 2818 + "@vue/compiler-ssr": "3.2.45", 2819 + "@vue/reactivity-transform": "3.2.45", 2820 + "@vue/shared": "3.2.45", 2821 + "estree-walker": "^2.0.2", 2822 + "magic-string": "^0.25.7", 2823 + "postcss": "^8.1.10", 2824 + "source-map": "^0.6.1" 2825 + } 2826 + }, 2827 + "@vue/compiler-ssr": { 2828 + "version": "3.2.45", 2829 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", 2830 + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", 2831 + "dev": true, 2832 + "peer": true, 2833 + "requires": { 2834 + "@vue/compiler-dom": "3.2.45", 2835 + "@vue/shared": "3.2.45" 2836 + } 2837 + }, 2838 + "@vue/reactivity-transform": { 2839 + "version": "3.2.45", 2840 + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", 2841 + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", 2842 + "dev": true, 2843 + "peer": true, 2844 + "requires": { 2845 + "@babel/parser": "^7.16.4", 2846 + "@vue/compiler-core": "3.2.45", 2847 + "@vue/shared": "3.2.45", 2848 + "estree-walker": "^2.0.2", 2849 + "magic-string": "^0.25.7" 2850 + } 2851 + }, 2852 + "@vue/shared": { 2853 + "version": "3.2.45", 2854 + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", 2855 + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==", 2856 + "dev": true, 2857 + "peer": true 2858 + }, 2859 + "ansi-styles": { 2860 + "version": "3.2.1", 2861 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2862 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2863 + "dev": true, 2864 + "requires": { 2865 + "color-convert": "^1.9.0" 2866 + } 2867 + }, 2868 + "asynckit": { 2869 + "version": "0.4.0", 2870 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 2871 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 2872 + }, 2873 + "autoprefixer": { 2874 + "version": "10.4.13", 2875 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", 2876 + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", 2877 + "requires": { 2878 + "browserslist": "^4.21.4", 2879 + "caniuse-lite": "^1.0.30001426", 2880 + "fraction.js": "^4.2.0", 2881 + "normalize-range": "^0.1.2", 2882 + "picocolors": "^1.0.0", 2883 + "postcss-value-parser": "^4.2.0" 2884 + } 2885 + }, 2886 + "axios": { 2887 + "version": "1.1.3", 2888 + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", 2889 + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", 2890 + "requires": { 2891 + "follow-redirects": "^1.15.0", 2892 + "form-data": "^4.0.0", 2893 + "proxy-from-env": "^1.1.0" 2894 + } 2895 + }, 2896 + "babel-plugin-transform-hook-names": { 2897 + "version": "1.0.2", 2898 + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", 2899 + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", 2900 + "dev": true, 2901 + "requires": {} 2902 + }, 2903 + "browserslist": { 2904 + "version": "4.21.4", 2905 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 2906 + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 2907 + "requires": { 2908 + "caniuse-lite": "^1.0.30001400", 2909 + "electron-to-chromium": "^1.4.251", 2910 + "node-releases": "^2.0.6", 2911 + "update-browserslist-db": "^1.0.9" 2912 + } 2913 + }, 2914 + "camel-case": { 2915 + "version": "4.1.2", 2916 + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", 2917 + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", 2918 + "requires": { 2919 + "pascal-case": "^3.1.2", 2920 + "tslib": "^2.0.3" 2921 + } 2922 + }, 2923 + "caniuse-lite": { 2924 + "version": "1.0.30001431", 2925 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", 2926 + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==" 2927 + }, 2928 + "capital-case": { 2929 + "version": "1.0.4", 2930 + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", 2931 + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", 2932 + "requires": { 2933 + "no-case": "^3.0.4", 2934 + "tslib": "^2.0.3", 2935 + "upper-case-first": "^2.0.2" 2936 + } 2937 + }, 2938 + "chalk": { 2939 + "version": "2.4.2", 2940 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2941 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2942 + "dev": true, 2943 + "requires": { 2944 + "ansi-styles": "^3.2.1", 2945 + "escape-string-regexp": "^1.0.5", 2946 + "supports-color": "^5.3.0" 2947 + } 2948 + }, 2949 + "change-case": { 2950 + "version": "4.1.2", 2951 + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", 2952 + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", 2953 + "requires": { 2954 + "camel-case": "^4.1.2", 2955 + "capital-case": "^1.0.4", 2956 + "constant-case": "^3.0.4", 2957 + "dot-case": "^3.0.4", 2958 + "header-case": "^2.0.4", 2959 + "no-case": "^3.0.4", 2960 + "param-case": "^3.0.4", 2961 + "pascal-case": "^3.1.2", 2962 + "path-case": "^3.0.4", 2963 + "sentence-case": "^3.0.4", 2964 + "snake-case": "^3.0.4", 2965 + "tslib": "^2.0.3" 2966 + } 2967 + }, 2968 + "color-convert": { 2969 + "version": "1.9.3", 2970 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2971 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2972 + "dev": true, 2973 + "requires": { 2974 + "color-name": "1.1.3" 2975 + } 2976 + }, 2977 + "color-name": { 2978 + "version": "1.1.3", 2979 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2980 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 2981 + "dev": true 2982 + }, 2983 + "combined-stream": { 2984 + "version": "1.0.8", 2985 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 2986 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 2987 + "requires": { 2988 + "delayed-stream": "~1.0.0" 2989 + } 2990 + }, 2991 + "constant-case": { 2992 + "version": "3.0.4", 2993 + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", 2994 + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", 2995 + "requires": { 2996 + "no-case": "^3.0.4", 2997 + "tslib": "^2.0.3", 2998 + "upper-case": "^2.0.2" 2999 + } 3000 + }, 3001 + "convert-source-map": { 3002 + "version": "1.9.0", 3003 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 3004 + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 3005 + "dev": true 3006 + }, 3007 + "debug": { 3008 + "version": "4.3.4", 3009 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 3010 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 3011 + "dev": true, 3012 + "requires": { 3013 + "ms": "2.1.2" 3014 + } 3015 + }, 3016 + "delayed-stream": { 3017 + "version": "1.0.0", 3018 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 3019 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 3020 + }, 3021 + "dot-case": { 3022 + "version": "3.0.4", 3023 + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 3024 + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 3025 + "requires": { 3026 + "no-case": "^3.0.4", 3027 + "tslib": "^2.0.3" 3028 + } 3029 + }, 3030 + "electron-to-chromium": { 3031 + "version": "1.4.284", 3032 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 3033 + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" 3034 + }, 3035 + "esbuild": { 3036 + "version": "0.15.18", 3037 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", 3038 + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", 3039 + "devOptional": true, 3040 + "requires": { 3041 + "@esbuild/android-arm": "0.15.18", 3042 + "@esbuild/linux-loong64": "0.15.18", 3043 + "esbuild-android-64": "0.15.18", 3044 + "esbuild-android-arm64": "0.15.18", 3045 + "esbuild-darwin-64": "0.15.18", 3046 + "esbuild-darwin-arm64": "0.15.18", 3047 + "esbuild-freebsd-64": "0.15.18", 3048 + "esbuild-freebsd-arm64": "0.15.18", 3049 + "esbuild-linux-32": "0.15.18", 3050 + "esbuild-linux-64": "0.15.18", 3051 + "esbuild-linux-arm": "0.15.18", 3052 + "esbuild-linux-arm64": "0.15.18", 3053 + "esbuild-linux-mips64le": "0.15.18", 3054 + "esbuild-linux-ppc64le": "0.15.18", 3055 + "esbuild-linux-riscv64": "0.15.18", 3056 + "esbuild-linux-s390x": "0.15.18", 3057 + "esbuild-netbsd-64": "0.15.18", 3058 + "esbuild-openbsd-64": "0.15.18", 3059 + "esbuild-sunos-64": "0.15.18", 3060 + "esbuild-windows-32": "0.15.18", 3061 + "esbuild-windows-64": "0.15.18", 3062 + "esbuild-windows-arm64": "0.15.18" 3063 + } 3064 + }, 3065 + "esbuild-android-64": { 3066 + "version": "0.15.18", 3067 + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", 3068 + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", 3069 + "dev": true, 3070 + "optional": true 3071 + }, 3072 + "esbuild-android-arm64": { 3073 + "version": "0.15.18", 3074 + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", 3075 + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", 3076 + "dev": true, 3077 + "optional": true 3078 + }, 3079 + "esbuild-darwin-64": { 3080 + "version": "0.15.18", 3081 + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", 3082 + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", 3083 + "dev": true, 3084 + "optional": true 3085 + }, 3086 + "esbuild-darwin-arm64": { 3087 + "version": "0.15.18", 3088 + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", 3089 + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", 3090 + "dev": true, 3091 + "optional": true 3092 + }, 3093 + "esbuild-freebsd-64": { 3094 + "version": "0.15.18", 3095 + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", 3096 + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", 3097 + "dev": true, 3098 + "optional": true 3099 + }, 3100 + "esbuild-freebsd-arm64": { 3101 + "version": "0.15.18", 3102 + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", 3103 + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", 3104 + "dev": true, 3105 + "optional": true 3106 + }, 3107 + "esbuild-linux-32": { 3108 + "version": "0.15.18", 3109 + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", 3110 + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", 3111 + "dev": true, 3112 + "optional": true 3113 + }, 3114 + "esbuild-linux-64": { 3115 + "version": "0.15.18", 3116 + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", 3117 + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", 3118 + "dev": true, 3119 + "optional": true 3120 + }, 3121 + "esbuild-linux-arm": { 3122 + "version": "0.15.18", 3123 + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", 3124 + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", 3125 + "dev": true, 3126 + "optional": true 3127 + }, 3128 + "esbuild-linux-arm64": { 3129 + "version": "0.15.18", 3130 + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", 3131 + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", 3132 + "dev": true, 3133 + "optional": true 3134 + }, 3135 + "esbuild-linux-mips64le": { 3136 + "version": "0.15.18", 3137 + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", 3138 + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", 3139 + "dev": true, 3140 + "optional": true 3141 + }, 3142 + "esbuild-linux-ppc64le": { 3143 + "version": "0.15.18", 3144 + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", 3145 + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", 3146 + "dev": true, 3147 + "optional": true 3148 + }, 3149 + "esbuild-linux-riscv64": { 3150 + "version": "0.15.18", 3151 + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", 3152 + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", 3153 + "dev": true, 3154 + "optional": true 3155 + }, 3156 + "esbuild-linux-s390x": { 3157 + "version": "0.15.18", 3158 + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", 3159 + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", 3160 + "dev": true, 3161 + "optional": true 3162 + }, 3163 + "esbuild-netbsd-64": { 3164 + "version": "0.15.18", 3165 + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", 3166 + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", 3167 + "dev": true, 3168 + "optional": true 3169 + }, 3170 + "esbuild-openbsd-64": { 3171 + "version": "0.15.18", 3172 + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", 3173 + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", 3174 + "dev": true, 3175 + "optional": true 3176 + }, 3177 + "esbuild-sunos-64": { 3178 + "version": "0.15.18", 3179 + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", 3180 + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", 3181 + "dev": true, 3182 + "optional": true 3183 + }, 3184 + "esbuild-windows-32": { 3185 + "version": "0.15.18", 3186 + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", 3187 + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", 3188 + "dev": true, 3189 + "optional": true 3190 + }, 3191 + "esbuild-windows-64": { 3192 + "version": "0.15.18", 3193 + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", 3194 + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", 3195 + "dev": true, 3196 + "optional": true 3197 + }, 3198 + "esbuild-windows-arm64": { 3199 + "version": "0.15.18", 3200 + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", 3201 + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", 3202 + "dev": true, 3203 + "optional": true 3204 + }, 3205 + "escalade": { 3206 + "version": "3.1.1", 3207 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 3208 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 3209 + }, 3210 + "escape-string-regexp": { 3211 + "version": "1.0.5", 3212 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 3213 + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 3214 + "dev": true 3215 + }, 3216 + "estree-walker": { 3217 + "version": "2.0.2", 3218 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 3219 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 3220 + "dev": true 3221 + }, 3222 + "eventemitter3": { 3223 + "version": "5.0.0", 3224 + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.0.tgz", 3225 + "integrity": "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==" 3226 + }, 3227 + "fast-blurhash": { 3228 + "version": "1.1.2", 3229 + "resolved": "https://registry.npmjs.org/fast-blurhash/-/fast-blurhash-1.1.2.tgz", 3230 + "integrity": "sha512-lJVOgYSlahqkRhrKumNx/SGB2F/qS0D1z7xjGYjb5EZJRtlzySGMniZjkQ9h9Rv8sPmM/V9orEgRiMwazDNH6A==" 3231 + }, 3232 + "follow-redirects": { 3233 + "version": "1.15.2", 3234 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 3235 + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 3236 + }, 3237 + "form-data": { 3238 + "version": "4.0.0", 3239 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 3240 + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 3241 + "requires": { 3242 + "asynckit": "^0.4.0", 3243 + "combined-stream": "^1.0.8", 3244 + "mime-types": "^2.1.12" 3245 + } 3246 + }, 3247 + "fraction.js": { 3248 + "version": "4.2.0", 3249 + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 3250 + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" 3251 + }, 3252 + "fsevents": { 3253 + "version": "2.3.2", 3254 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 3255 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 3256 + "dev": true, 3257 + "optional": true 3258 + }, 3259 + "function-bind": { 3260 + "version": "1.1.1", 3261 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 3262 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 3263 + "devOptional": true 3264 + }, 3265 + "gensync": { 3266 + "version": "1.0.0-beta.2", 3267 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 3268 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 3269 + "dev": true 3270 + }, 3271 + "globals": { 3272 + "version": "11.12.0", 3273 + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 3274 + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 3275 + "dev": true 3276 + }, 3277 + "has": { 3278 + "version": "1.0.3", 3279 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 3280 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 3281 + "devOptional": true, 3282 + "requires": { 3283 + "function-bind": "^1.1.1" 3284 + } 3285 + }, 3286 + "has-flag": { 3287 + "version": "3.0.0", 3288 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 3289 + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 3290 + "dev": true 3291 + }, 3292 + "header-case": { 3293 + "version": "2.0.4", 3294 + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", 3295 + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", 3296 + "requires": { 3297 + "capital-case": "^1.0.4", 3298 + "tslib": "^2.0.3" 3299 + } 3300 + }, 3301 + "history": { 3302 + "version": "5.3.0", 3303 + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", 3304 + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", 3305 + "requires": { 3306 + "@babel/runtime": "^7.7.6" 3307 + } 3308 + }, 3309 + "iconify-icon": { 3310 + "version": "1.0.2", 3311 + "resolved": "https://registry.npmjs.org/iconify-icon/-/iconify-icon-1.0.2.tgz", 3312 + "integrity": "sha512-mehAvz2a4eUAlPo76Wul4zzsPNr3hbOHiauMhPrTVIdLOt0AnccnNloh1EeTO3tYeBv7iaJZfdCPHczvi+CkXQ==", 3313 + "requires": { 3314 + "@iconify/types": "^2.0.0" 3315 + } 3316 + }, 3317 + "is-core-module": { 3318 + "version": "2.11.0", 3319 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 3320 + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 3321 + "devOptional": true, 3322 + "requires": { 3323 + "has": "^1.0.3" 3324 + } 3325 + }, 3326 + "isomorphic-form-data": { 3327 + "version": "2.0.0", 3328 + "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-2.0.0.tgz", 3329 + "integrity": "sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==", 3330 + "requires": { 3331 + "form-data": "^2.3.2" 3332 + }, 3333 + "dependencies": { 3334 + "form-data": { 3335 + "version": "2.5.1", 3336 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 3337 + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 3338 + "requires": { 3339 + "asynckit": "^0.4.0", 3340 + "combined-stream": "^1.0.6", 3341 + "mime-types": "^2.1.12" 3342 + } 3343 + } 3344 + } 3345 + }, 3346 + "isomorphic-ws": { 3347 + "version": "5.0.0", 3348 + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", 3349 + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", 3350 + "requires": {} 3351 + }, 3352 + "javascript-natural-sort": { 3353 + "version": "0.7.1", 3354 + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", 3355 + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", 3356 + "dev": true 3357 + }, 3358 + "js-tokens": { 3359 + "version": "4.0.0", 3360 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 3361 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 3362 + }, 3363 + "jsesc": { 3364 + "version": "2.5.2", 3365 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 3366 + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 3367 + "dev": true 3368 + }, 3369 + "json5": { 3370 + "version": "2.2.1", 3371 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 3372 + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 3373 + "dev": true 3374 + }, 3375 + "kolorist": { 3376 + "version": "1.6.0", 3377 + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.6.0.tgz", 3378 + "integrity": "sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==", 3379 + "dev": true 3380 + }, 3381 + "lodash": { 3382 + "version": "4.17.21", 3383 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 3384 + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 3385 + "dev": true 3386 + }, 3387 + "loose-envify": { 3388 + "version": "1.4.0", 3389 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 3390 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 3391 + "peer": true, 3392 + "requires": { 3393 + "js-tokens": "^3.0.0 || ^4.0.0" 3394 + } 3395 + }, 3396 + "lower-case": { 3397 + "version": "2.0.2", 3398 + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 3399 + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 3400 + "requires": { 3401 + "tslib": "^2.0.3" 3402 + } 3403 + }, 3404 + "lru-cache": { 3405 + "version": "6.0.0", 3406 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 3407 + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 3408 + "requires": { 3409 + "yallist": "^4.0.0" 3410 + } 3411 + }, 3412 + "magic-string": { 3413 + "version": "0.25.9", 3414 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 3415 + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 3416 + "dev": true, 3417 + "peer": true, 3418 + "requires": { 3419 + "sourcemap-codec": "^1.4.8" 3420 + } 3421 + }, 3422 + "map-age-cleaner": { 3423 + "version": "0.1.3", 3424 + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 3425 + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 3426 + "requires": { 3427 + "p-defer": "^1.0.0" 3428 + } 3429 + }, 3430 + "masto": { 3431 + "version": "4.9.1", 3432 + "resolved": "https://registry.npmjs.org/masto/-/masto-4.9.1.tgz", 3433 + "integrity": "sha512-3jdNqCgI0ZKiG+WzYcJamwt32fd9aChjKSjP8glMUSttQ+OnMYlXb7MdqJivKFNrnRz1R5aorJQL+v18/+o7ng==", 3434 + "requires": { 3435 + "axios": "1.1.3", 3436 + "change-case": "^4.1.2", 3437 + "eventemitter3": "^5.0.0", 3438 + "isomorphic-form-data": "^2.0.0", 3439 + "isomorphic-ws": "^5.0.0", 3440 + "semver": "^7.3.7", 3441 + "ws": "^8.8.0" 3442 + }, 3443 + "dependencies": { 3444 + "semver": { 3445 + "version": "7.3.8", 3446 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 3447 + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 3448 + "requires": { 3449 + "lru-cache": "^6.0.0" 3450 + } 3451 + } 3452 + } 3453 + }, 3454 + "mem": { 3455 + "version": "9.0.2", 3456 + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", 3457 + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", 3458 + "requires": { 3459 + "map-age-cleaner": "^0.1.3", 3460 + "mimic-fn": "^4.0.0" 3461 + } 3462 + }, 3463 + "mime-db": { 3464 + "version": "1.52.0", 3465 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 3466 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 3467 + }, 3468 + "mime-types": { 3469 + "version": "2.1.35", 3470 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 3471 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 3472 + "requires": { 3473 + "mime-db": "1.52.0" 3474 + } 3475 + }, 3476 + "mimic-fn": { 3477 + "version": "4.0.0", 3478 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 3479 + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" 3480 + }, 3481 + "ms": { 3482 + "version": "2.1.2", 3483 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3484 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 3485 + "dev": true 3486 + }, 3487 + "nanoid": { 3488 + "version": "3.3.4", 3489 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 3490 + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" 3491 + }, 3492 + "no-case": { 3493 + "version": "3.0.4", 3494 + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 3495 + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 3496 + "requires": { 3497 + "lower-case": "^2.0.2", 3498 + "tslib": "^2.0.3" 3499 + } 3500 + }, 3501 + "node-releases": { 3502 + "version": "2.0.6", 3503 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 3504 + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" 3505 + }, 3506 + "normalize-range": { 3507 + "version": "0.1.2", 3508 + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 3509 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" 3510 + }, 3511 + "p-defer": { 3512 + "version": "1.0.0", 3513 + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 3514 + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==" 3515 + }, 3516 + "param-case": { 3517 + "version": "3.0.4", 3518 + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", 3519 + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", 3520 + "requires": { 3521 + "dot-case": "^3.0.4", 3522 + "tslib": "^2.0.3" 3523 + } 3524 + }, 3525 + "pascal-case": { 3526 + "version": "3.1.2", 3527 + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 3528 + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 3529 + "requires": { 3530 + "no-case": "^3.0.4", 3531 + "tslib": "^2.0.3" 3532 + } 3533 + }, 3534 + "path-case": { 3535 + "version": "3.0.4", 3536 + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", 3537 + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", 3538 + "requires": { 3539 + "dot-case": "^3.0.4", 3540 + "tslib": "^2.0.3" 3541 + } 3542 + }, 3543 + "path-parse": { 3544 + "version": "1.0.7", 3545 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3546 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 3547 + "devOptional": true 3548 + }, 3549 + "picocolors": { 3550 + "version": "1.0.0", 3551 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 3552 + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 3553 + }, 3554 + "picomatch": { 3555 + "version": "2.3.1", 3556 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3557 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3558 + "dev": true 3559 + }, 3560 + "postcss": { 3561 + "version": "8.4.19", 3562 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 3563 + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 3564 + "requires": { 3565 + "nanoid": "^3.3.4", 3566 + "picocolors": "^1.0.0", 3567 + "source-map-js": "^1.0.2" 3568 + } 3569 + }, 3570 + "postcss-dark-theme-class": { 3571 + "version": "0.7.3", 3572 + "resolved": "https://registry.npmjs.org/postcss-dark-theme-class/-/postcss-dark-theme-class-0.7.3.tgz", 3573 + "integrity": "sha512-M9vtfh8ORzQsVdT9BWb+xpEDAzC7nHBn7wVc988/JkEVLPupKcUnV0jw7RZ8sSj0ovpqN1POf6PLdt19JCHfhQ==", 3574 + "dev": true, 3575 + "requires": {} 3576 + }, 3577 + "postcss-value-parser": { 3578 + "version": "4.2.0", 3579 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 3580 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 3581 + }, 3582 + "preact": { 3583 + "version": "10.11.3", 3584 + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", 3585 + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==" 3586 + }, 3587 + "preact-router": { 3588 + "version": "4.1.0", 3589 + "resolved": "https://registry.npmjs.org/preact-router/-/preact-router-4.1.0.tgz", 3590 + "integrity": "sha512-y1w2YvVpKAju9FMV+fAVR1NpH4MW5q07BZrziMZeg6F/rGJ9KvLUZtjOqsy2I8fDYiX36AM1AQTXIIK3jigBhA==", 3591 + "requires": {} 3592 + }, 3593 + "prettier": { 3594 + "version": "2.8.0", 3595 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", 3596 + "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", 3597 + "dev": true, 3598 + "peer": true 3599 + }, 3600 + "proxy-compare": { 3601 + "version": "2.3.0", 3602 + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.3.0.tgz", 3603 + "integrity": "sha512-c3L2CcAi7f7pvlD0D7xsF+2CQIW8C3HaYx2Pfgq8eA4HAl3GAH6/dVYsyBbYF/0XJs2ziGLrzmz5fmzPm6A0pQ==" 3604 + }, 3605 + "proxy-from-env": { 3606 + "version": "1.1.0", 3607 + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 3608 + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 3609 + }, 3610 + "react": { 3611 + "version": "18.2.0", 3612 + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 3613 + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 3614 + "peer": true, 3615 + "requires": { 3616 + "loose-envify": "^1.1.0" 3617 + } 3618 + }, 3619 + "react-intersection-observer": { 3620 + "version": "9.4.1", 3621 + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.4.1.tgz", 3622 + "integrity": "sha512-IXpIsPe6BleFOEHKzKh5UjwRUaz/JYS0lT/HPsupWEQou2hDqjhLMStc5zyE3eQVT4Fk3FufM8Fw33qW1uyeiw==", 3623 + "requires": {} 3624 + }, 3625 + "regenerator-runtime": { 3626 + "version": "0.13.11", 3627 + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 3628 + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" 3629 + }, 3630 + "resolve": { 3631 + "version": "1.22.1", 3632 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 3633 + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 3634 + "devOptional": true, 3635 + "requires": { 3636 + "is-core-module": "^2.9.0", 3637 + "path-parse": "^1.0.7", 3638 + "supports-preserve-symlinks-flag": "^1.0.0" 3639 + } 3640 + }, 3641 + "rollup": { 3642 + "version": "2.79.1", 3643 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", 3644 + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", 3645 + "devOptional": true, 3646 + "requires": { 3647 + "fsevents": "~2.3.2" 3648 + } 3649 + }, 3650 + "semver": { 3651 + "version": "6.3.0", 3652 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 3653 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 3654 + "dev": true 3655 + }, 3656 + "sentence-case": { 3657 + "version": "3.0.4", 3658 + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", 3659 + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", 3660 + "requires": { 3661 + "no-case": "^3.0.4", 3662 + "tslib": "^2.0.3", 3663 + "upper-case-first": "^2.0.2" 3664 + } 3665 + }, 3666 + "snake-case": { 3667 + "version": "3.0.4", 3668 + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", 3669 + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", 3670 + "requires": { 3671 + "dot-case": "^3.0.4", 3672 + "tslib": "^2.0.3" 3673 + } 3674 + }, 3675 + "source-map": { 3676 + "version": "0.6.1", 3677 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3678 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3679 + "dev": true, 3680 + "peer": true 3681 + }, 3682 + "source-map-js": { 3683 + "version": "1.0.2", 3684 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 3685 + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 3686 + }, 3687 + "sourcemap-codec": { 3688 + "version": "1.4.8", 3689 + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 3690 + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 3691 + "dev": true, 3692 + "peer": true 3693 + }, 3694 + "supports-color": { 3695 + "version": "5.5.0", 3696 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3697 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3698 + "dev": true, 3699 + "requires": { 3700 + "has-flag": "^3.0.0" 3701 + } 3702 + }, 3703 + "supports-preserve-symlinks-flag": { 3704 + "version": "1.0.0", 3705 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3706 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3707 + "devOptional": true 3708 + }, 3709 + "to-fast-properties": { 3710 + "version": "2.0.0", 3711 + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3712 + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 3713 + "devOptional": true 3714 + }, 3715 + "tslib": { 3716 + "version": "2.4.1", 3717 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 3718 + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" 3719 + }, 3720 + "update-browserslist-db": { 3721 + "version": "1.0.10", 3722 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 3723 + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 3724 + "requires": { 3725 + "escalade": "^3.1.1", 3726 + "picocolors": "^1.0.0" 3727 + } 3728 + }, 3729 + "upper-case": { 3730 + "version": "2.0.2", 3731 + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", 3732 + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", 3733 + "requires": { 3734 + "tslib": "^2.0.3" 3735 + } 3736 + }, 3737 + "upper-case-first": { 3738 + "version": "2.0.2", 3739 + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", 3740 + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", 3741 + "requires": { 3742 + "tslib": "^2.0.3" 3743 + } 3744 + }, 3745 + "use-sync-external-store": { 3746 + "version": "1.2.0", 3747 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", 3748 + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", 3749 + "requires": {} 3750 + }, 3751 + "valtio": { 3752 + "version": "1.7.6", 3753 + "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.7.6.tgz", 3754 + "integrity": "sha512-zsGrCCYOIpy8egQxftduFyJusF/BMu3CganhHKUOE/I6t6V6yA1MDfZZkrYoWYCGkC3rSBYcIHEEsoYQM9lV2w==", 3755 + "requires": { 3756 + "proxy-compare": "2.3.0", 3757 + "use-sync-external-store": "1.2.0" 3758 + } 3759 + }, 3760 + "vite": { 3761 + "version": "3.2.5", 3762 + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", 3763 + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", 3764 + "devOptional": true, 3765 + "requires": { 3766 + "esbuild": "^0.15.9", 3767 + "fsevents": "~2.3.2", 3768 + "postcss": "^8.4.18", 3769 + "resolve": "^1.22.1", 3770 + "rollup": "^2.79.1" 3771 + } 3772 + }, 3773 + "ws": { 3774 + "version": "8.11.0", 3775 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", 3776 + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", 3777 + "requires": {} 3778 + }, 3779 + "yallist": { 3780 + "version": "4.0.0", 3781 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3782 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 3783 + } 3784 + } 3785 + }
+38
package.json
··· 1 + { 2 + "name": "phanpy", 3 + "version": "0.1.0", 4 + "type": "module", 5 + "scripts": { 6 + "dev": "vite", 7 + "build": "vite build", 8 + "preview": "vite preview", 9 + "fetch-instances": "env $(cat .env.dev | grep -v \"#\" | xargs) node scripts/fetch-instances-list.js" 10 + }, 11 + "dependencies": { 12 + "@github/text-expander-element": "~2.3.0", 13 + "@github/time-elements": "~4.0.0", 14 + "autoprefixer": "~10.4.13", 15 + "fast-blurhash": "~1.1.2", 16 + "history": "~5.3.0", 17 + "iconify-icon": "~1.0.2", 18 + "masto": "~4.9.1", 19 + "mem": "~9.0.2", 20 + "preact": "~10.11.3", 21 + "preact-router": "~4.1.0", 22 + "react-intersection-observer": "~9.4.1", 23 + "valtio": "~1.7.6" 24 + }, 25 + "devDependencies": { 26 + "@preact/preset-vite": "~2.4.0", 27 + "@trivago/prettier-plugin-sort-imports": "~4.0.0", 28 + "postcss": "~8.4.19", 29 + "postcss-dark-theme-class": "~0.7.3", 30 + "vite": "3.2.5" 31 + }, 32 + "postcss": { 33 + "plugins": { 34 + "postcss-dark-theme-class": {}, 35 + "autoprefixer": {} 36 + } 37 + } 38 + }
+1
public/favicon.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"><rect id="Artboard1" x="0" y="0" width="8" height="8" style="fill:none;"/><g id="Artboard11" serif:id="Artboard1"><path d="M7,2.5c-0.227,-0.681 -0.839,-1.28 -1.5,-1.5c-0.75,-0.25 -2.25,-0.25 -3,0c-0.661,0.22 -1.273,0.819 -1.5,1.5c-0.25,0.75 -0.25,2.25 -0,3c0.227,0.681 0.839,1.28 1.5,1.5c0.75,0.25 2.25,0.25 3,0c0.661,-0.22 1.273,-0.819 1.5,-1.5c0.25,-0.75 0.25,-2.25 0,-3Z" style="fill:#d8e7fe;stroke:#a4bff7;stroke-width:1px;"/><path d="M4.766,3c0.154,0.522 0.292,1.28 0.307,2" style="fill:none;stroke:#6892e2;stroke-width:1px;"/><path d="M3.27,3c-0.154,0.522 -0.292,1.28 -0.307,2" style="fill:none;stroke:#6892e2;stroke-width:1px;"/></g></svg>
+23
scripts/fetch-instances-list.js
··· 1 + import fs from 'fs'; 2 + 3 + const { INSTANCES_SOCIAL_SECRET_TOKEN } = process.env; 4 + 5 + const params = new URLSearchParams({ 6 + count: 200, 7 + sort_by: 'active_users', 8 + sort_order: 'desc', 9 + }); 10 + 11 + const url = `https://instances.social/api/1.0/instances/list?${params.toString()}`; 12 + const results = await fetch(url, { 13 + headers: { 14 + Authorization: `Bearer ${INSTANCES_SOCIAL_SECRET_TOKEN}`, 15 + }, 16 + }); 17 + 18 + const json = await results.json(); 19 + const names = json.instances.map((instance) => instance.name); 20 + 21 + // Write to file 22 + const path = './src/data/instances.json'; 23 + fs.writeFileSync(path, JSON.stringify(names, null, '\t'), 'utf8');
+433
src/app.css
··· 1 + html, body { 2 + margin: 0; 3 + padding: 0; 4 + background-color: var(--bg-faded-color); 5 + color: var(--text-color); 6 + overflow: hidden; 7 + } 8 + 9 + #app { 10 + min-height: 100vh; 11 + display: flex; 12 + align-items: center; 13 + justify-content: center; 14 + } 15 + 16 + .deck-container { 17 + width: 100%; 18 + height: 100vh; 19 + overflow: auto; 20 + transition: opacity 1s ease-in-out; 21 + } 22 + .deck-container[hidden] { 23 + display: block; 24 + position: absolute; 25 + user-select: none; 26 + pointer-events: none; 27 + opacity: 0; 28 + content-visibility: hidden; 29 + } 30 + 31 + .deck-container, 32 + .deck.contained { 33 + scroll-padding-top: 4em; 34 + } 35 + 36 + .deck { 37 + min-height: 100vh; 38 + margin: auto; 39 + width: 40em; 40 + max-width: 100vw; 41 + border-left: 1px solid rgba(0, 0, 0, 0.1); 42 + border-right: 1px solid rgba(0, 0, 0, 0.1); 43 + background-color: var(--bg-color); 44 + } 45 + .deck.contained { 46 + overflow: auto; 47 + height: 100vh; 48 + } 49 + 50 + .deck header { 51 + min-height: 4em; 52 + padding: 0 8px; 53 + position: sticky; 54 + top: 0; 55 + background-color: var(--bg-blur-color); 56 + backdrop-filter: blur(12px); 57 + border-bottom: 1px solid var(--divider-color); 58 + z-index: 1; 59 + display: flex; 60 + align-items: center; 61 + cursor: default; 62 + } 63 + .deck header > *:not(button) { 64 + flex-grow: 1; 65 + min-width: 44px; 66 + } 67 + .deck header > .header-side:last-of-type { 68 + text-align: right; 69 + } 70 + .deck header h1 { 71 + margin: 0; 72 + padding: 0; 73 + font-size: 1.2em; 74 + text-align: center; 75 + } 76 + .deck header h1:first-child { 77 + text-align: left; 78 + padding-left: 8px; 79 + } 80 + .deck h2 { 81 + font-size: 1.45em; 82 + } 83 + .deck.padded-bottom .timeline li:last-child { 84 + padding-bottom: 80vh; 85 + } 86 + 87 + .timeline { 88 + margin: 0 auto; 89 + padding: 0; 90 + } 91 + .timeline li { 92 + list-style: none; 93 + margin: 0; 94 + padding: 0; 95 + border-bottom: 1px solid var(--divider-color); 96 + } 97 + .timeline.flat li { 98 + border-bottom: none; 99 + } 100 + /* .timeline li.insignificant { 101 + filter: opacity(0.5); 102 + background-color: var(--bg-faded-color); 103 + } 104 + .timeline li.insignificant > * { 105 + opacity: 0.75; 106 + } 107 + .timeline li.insignificant:hover > * { 108 + opacity: 1; 109 + } */ 110 + 111 + .timeline.contextual li { 112 + --width: 3px; 113 + --left: 40px; 114 + --right: calc(var(--left) + var(--width)); 115 + background-image: linear-gradient(to right, transparent, transparent var(--left), var(--comment-line-color) var(--left), var(--comment-line-color) var(--right), transparent var(--right), transparent); 116 + background-repeat: no-repeat; 117 + } 118 + .timeline.contextual li:first-child { 119 + background-position: 0 16px; 120 + } 121 + .timeline.contextual li:last-child { 122 + background-size: 100% 20px; 123 + } 124 + .timeline.contextual li.descendant { 125 + position: relative; 126 + } 127 + .timeline.contextual li.descendant.indirect:before { 128 + --radius: 10px; 129 + --diameter: calc(var(--radius) * 2); 130 + content: ''; 131 + position: absolute; 132 + top: 10px; 133 + left: 40px; 134 + width: var(--diameter); 135 + height: var(--diameter); 136 + border-radius: var(--radius); 137 + border-style: solid; 138 + border-width: var(--width); 139 + border-color: transparent transparent var(--comment-line-color) transparent; 140 + transform: rotate(45deg); 141 + } 142 + .timeline.contextual li.descendant.indirect .status-link { 143 + position: relative; 144 + } 145 + 146 + .timeline-deck { 147 + padding-bottom: 100px; /* faux nav height */ 148 + } 149 + .timeline-deck.compact .status { 150 + max-height: max(25vh, 160px); 151 + overflow: hidden; 152 + mask-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 1) 80%, transparent 95%); 153 + } 154 + .timeline-deck.compact .status .meta ~ * { 155 + pointer-events: none; 156 + } 157 + 158 + .timeline-header { 159 + padding: 0 16px; 160 + opacity: 0.75; 161 + } 162 + 163 + .timeline-empty { 164 + color: var(--text-insignificant-color); 165 + padding: 0 16px; 166 + margin-bottom: 3em; 167 + } 168 + 169 + .status-loading { 170 + text-align: center; 171 + color: var(--text-insignificant-color); 172 + } 173 + 174 + .status-link { 175 + display: block; 176 + text-decoration-line: none; 177 + color: inherit; 178 + transition: background-color 0.2s ease-out; 179 + } 180 + .status-link:hover { 181 + background-color: var(--link-bg-hover-color); 182 + } 183 + 184 + .ui-state { 185 + padding: 16px; 186 + text-align: center; 187 + } 188 + 189 + .deck-backdrop { 190 + position: fixed; 191 + top: 0; 192 + right: 0; 193 + height: 100%; 194 + width: 100%; 195 + z-index: 1000; 196 + display: flex; 197 + background-color: var(--backdrop-color); 198 + } 199 + .deck-backdrop > a { 200 + flex-grow: 1; 201 + backdrop-filter: saturate(.75); 202 + } 203 + @keyframes slide-in { 204 + 0% { 205 + opacity: 0; 206 + transform: translateX(100%); 207 + } 208 + 100% { 209 + opacity: 1; 210 + transform: translateX(0); 211 + } 212 + } 213 + .deck-backdrop .deck { 214 + width: 40em; 215 + max-width: 100vw; 216 + border-left: 1px solid var(--divider-color); 217 + background-color: var(--bg-color); 218 + animation: slide-in 0.2s ease-out; 219 + box-shadow: -1px 0 var(--bg-color); 220 + } 221 + .deck-backdrop .deck .status { 222 + max-width: 40em; 223 + } 224 + 225 + .decks { 226 + flex-grow: 1; 227 + transition: transform 0.2s ease-in-out; 228 + } 229 + 230 + .deck-close { 231 + color: var(--text-insignificant-color) !important; 232 + } 233 + .deck-close:hover { 234 + color: var(--text-color) !important; 235 + } 236 + 237 + :is(button, .button).plain.has-badge:after { 238 + content: ""; 239 + display: inline-block; 240 + position: absolute; 241 + right: 10px; 242 + width: 4px; 243 + height: 4px; 244 + border-radius: 50%; 245 + background-color: var(--link-color); 246 + opacity: .5; 247 + } 248 + 249 + @keyframes fade-from-top { 250 + 0% { 251 + transform: translate(-50%, -100%); 252 + opacity: 0; 253 + } 254 + 100% { 255 + transform: translate(-50%, 0); 256 + opacity: 1; 257 + } 258 + } 259 + .updates-button { 260 + position: absolute; 261 + animation: fade-from-top 2s ease-out; 262 + left: 50%; 263 + transform: translate(-50%, 0); 264 + } 265 + 266 + /* BOX */ 267 + 268 + .box { 269 + width: 40em; 270 + max-width: 100vw; 271 + text-align: center; 272 + padding: 16px; 273 + margin: 16px; 274 + background-color: var(--bg-color); 275 + border-radius: 8px; 276 + border: 1px solid var(--divider-color); 277 + } 278 + 279 + .box-shadow { 280 + box-shadow: 0px 36px 89px rgb(0 0 0 / 4%), 0px 23.3333px 52.1227px rgb(0 0 0 / 3%), 0px 13.8667px 28.3481px rgb(0 0 0 / 2%), 0px 7.2px 14.4625px rgb(0 0 0 / 2%), 0px 2.93333px 7.25185px rgb(0 0 0 / 2%), 0px 0.666667px 3.50231px rgb(0 0 0 / 1%); 281 + } 282 + 283 + /* CAROUSEL */ 284 + /* use snap, center children, max width viewport */ 285 + 286 + .carousel { 287 + display: flex; 288 + overflow-x: auto; 289 + scroll-snap-type: x mandatory; 290 + /* scroll-behavior: smooth; */ 291 + scrollbar-width: none; 292 + } 293 + .carousel::-webkit-scrollbar { 294 + display: none; 295 + } 296 + .carousel > * { 297 + scroll-snap-align: center; 298 + flex-shrink: 0; 299 + display: flex; 300 + justify-content: center; 301 + align-items: center; 302 + width: 100vw; 303 + height: 100vh; 304 + } 305 + .carousel > * :is(img, video) { 306 + width: auto; 307 + max-width: 100vw; 308 + height: auto; 309 + max-height: 100vh; 310 + } 311 + 312 + .carousel-controls { 313 + position: fixed; 314 + width: 100%; 315 + bottom: 0; 316 + text-align: center; 317 + padding: 32px; 318 + display: flex; 319 + gap: 8px; 320 + justify-content: space-between; 321 + } 322 + button.carousel-button { 323 + font-weight: bold; 324 + color: var(--link-color); 325 + } 326 + button.carousel-button[hidden] { 327 + display: inline-block; 328 + opacity: 0; 329 + pointer-events: none; 330 + } 331 + .carousel-dots { 332 + border-radius: 999px; 333 + backdrop-filter: blur(12px); 334 + } 335 + button.carousel-dot { 336 + color: var(--text-insignificant-color) !important; 337 + font-weight: bold; 338 + backdrop-filter: none !important; 339 + } 340 + button.carousel-dot:hover, 341 + button.carousel-dot.active { 342 + color: var(--link-color) !important; 343 + } 344 + 345 + /* COMPOSE BUTTON */ 346 + 347 + #compose-button { 348 + position: fixed; 349 + bottom: 16px; 350 + right: 16px; 351 + padding: 16px; 352 + box-shadow: 0 0 32px var(--bg-color); 353 + z-index: 1; 354 + outline: 1px solid var(--bg-color); 355 + opacity: .75; 356 + } 357 + 358 + /* SHEET */ 359 + 360 + @keyframes slide-up { 361 + 0% { 362 + transform: translateY(100%); 363 + opacity: 0; 364 + } 365 + 100% { 366 + transform: translateY(0); 367 + opacity: 1; 368 + } 369 + } 370 + .sheet { 371 + align-self: flex-end; 372 + max-height: 90vh; 373 + overflow: auto; 374 + background-color: var(--bg-color); 375 + width: 100%; 376 + max-width: calc(40em - 50px - 16px); 377 + border-radius: 36px 36px 0 0; 378 + padding: 16px; 379 + box-shadow: 0 -1px 32px var(--divider-color); 380 + animation: slide-up 0.2s ease-out; 381 + outline: 1px solid var(--outline-color); 382 + } 383 + 384 + /* TAG */ 385 + 386 + .tag { 387 + font-size: smaller; 388 + color: var(--bg-faded-color); 389 + background-color: var(--text-insignificant-color); 390 + padding: 2px 4px; 391 + border-radius: 4px; 392 + display: inline-block; 393 + margin: 4px; 394 + align-self: center; 395 + } 396 + 397 + @media (min-width: 40em) { 398 + #app { 399 + display: flex; 400 + } 401 + .decks:has(~ .deck-backdrop) { 402 + transform: translateX(-5vw); 403 + } 404 + .deck-backdrop .deck { 405 + width: 50%; 406 + min-width: 40em; 407 + } 408 + .timeline-deck { 409 + border: 0; 410 + background-color: transparent; 411 + } 412 + .timeline-deck header { 413 + min-height: 6em; 414 + border-bottom: 0; 415 + background-color: var(--bg-faded-blur-color); 416 + border-bottom: 0; 417 + mask-image: linear-gradient(rgba(0, 0, 0, 1) 50%, rgba(0, 0, 0, .7) 80%, rgba(0, 0, 0, .5) 90%, transparent); 418 + } 419 + .deck header h1 { 420 + font-size: 1.5em; 421 + } 422 + .timeline-deck .timeline:not(.flat) li { 423 + border: 1px solid var(--divider-color); 424 + margin: 16px 0; 425 + background-color: var(--bg-color); 426 + border-radius: 16px; 427 + overflow: hidden; 428 + box-shadow: 0px 1px var(--bg-blur-color); 429 + } 430 + .box { 431 + padding: 32px; 432 + } 433 + }
+306
src/app.jsx
··· 1 + import './app.css'; 2 + 3 + import { createHashHistory } from 'history'; 4 + import { login } from 'masto/fetch'; 5 + import Router from 'preact-router'; 6 + import { useEffect, useLayoutEffect, useState } from 'preact/hooks'; 7 + import { useSnapshot } from 'valtio'; 8 + 9 + import Account from './components/account'; 10 + import Compose from './components/compose'; 11 + import Icon from './components/icon'; 12 + import Loader from './components/loader'; 13 + import Modal from './components/modal'; 14 + import Home from './pages/home'; 15 + import Login from './pages/login'; 16 + import Notifications from './pages/notifications'; 17 + import Settings from './pages/settings'; 18 + import Status from './pages/status'; 19 + import Welcome from './pages/welcome'; 20 + import { getAccessToken } from './utils/auth'; 21 + import states from './utils/states'; 22 + import store from './utils/store'; 23 + 24 + const { VITE_CLIENT_NAME: CLIENT_NAME } = import.meta.env; 25 + 26 + window._STATES = states; 27 + 28 + async function startStream() { 29 + const stream = await masto.stream.streamUser(); 30 + console.log('STREAM START', { stream }); 31 + stream.on('update', (status) => { 32 + console.log('UPDATE', status); 33 + 34 + const inHomeNew = states.homeNew.find((s) => s.id === status.id); 35 + const inHome = states.home.find((s) => s.id === status.id); 36 + if (!inHomeNew && !inHome) { 37 + states.homeNew.unshift({ 38 + id: status.id, 39 + reblog: status.reblog?.id, 40 + reply: !!status.inReplyToAccountId, 41 + }); 42 + } 43 + 44 + states.statuses.set(status.id, status); 45 + if (status.reblog) { 46 + states.statuses.set(status.reblog.id, status.reblog); 47 + } 48 + }); 49 + stream.on('status.update', (status) => { 50 + console.log('STATUS.UPDATE', status); 51 + states.statuses.set(status.id, status); 52 + if (status.reblog) { 53 + states.statuses.set(status.reblog.id, status.reblog); 54 + } 55 + }); 56 + stream.on('delete', (statusID) => { 57 + console.log('DELETE', statusID); 58 + states.statuses.delete(statusID); 59 + }); 60 + stream.on('notification', (notification) => { 61 + console.log('NOTIFICATION', notification); 62 + 63 + const inNotificationsNew = states.notificationsNew.find( 64 + (n) => n.id === notification.id, 65 + ); 66 + const inNotifications = states.notifications.find( 67 + (n) => n.id === notification.id, 68 + ); 69 + if (!inNotificationsNew && !inNotifications) { 70 + states.notificationsNew.unshift(notification); 71 + } 72 + 73 + if (notification.status && !states.statuses.has(notification.status.id)) { 74 + states.statuses.set(notification.status.id, notification.status); 75 + if ( 76 + notification.status.reblog && 77 + !states.statuses.has(notification.status.reblog.id) 78 + ) { 79 + states.statuses.set( 80 + notification.status.reblog.id, 81 + notification.status.reblog, 82 + ); 83 + } 84 + } 85 + }); 86 + 87 + stream.ws.onclose = () => { 88 + console.log('STREAM CLOSED!'); 89 + 90 + requestAnimationFrame(() => { 91 + startStream(); 92 + }); 93 + }; 94 + 95 + return { 96 + stream, 97 + stopStream: () => { 98 + stream.ws.close(); 99 + }, 100 + }; 101 + } 102 + 103 + export function App() { 104 + const snapStates = useSnapshot(states); 105 + const [isLoggedIn, setIsLoggedIn] = useState(false); 106 + const [uiState, setUIState] = useState('default'); 107 + 108 + useLayoutEffect(() => { 109 + const theme = store.local.get('theme'); 110 + if (theme) { 111 + document.documentElement.classList.add(`is-${theme}`); 112 + document 113 + .querySelector('meta[name="color-scheme"]') 114 + .setAttribute('content', theme); 115 + } 116 + }, []); 117 + 118 + useEffect(() => { 119 + const instanceURL = store.local.get('instanceURL'); 120 + const accounts = store.local.getJSON('accounts') || []; 121 + const code = (window.location.search.match(/code=([^&]+)/) || [])[1]; 122 + 123 + if (code) { 124 + console.log({ code }); 125 + // Clear the code from the URL 126 + window.history.replaceState({}, document.title, '/'); 127 + 128 + const clientID = store.session.get('clientID'); 129 + const clientSecret = store.session.get('clientSecret'); 130 + 131 + (async () => { 132 + setUIState('loading'); 133 + const tokenJSON = await getAccessToken({ 134 + instanceURL, 135 + client_id: clientID, 136 + client_secret: clientSecret, 137 + code, 138 + }); 139 + const { access_token: accessToken } = tokenJSON; 140 + store.session.set('accessToken', accessToken); 141 + 142 + window.masto = await login({ 143 + url: `https://${instanceURL}`, 144 + accessToken, 145 + }); 146 + 147 + const mastoAccount = await masto.accounts.verifyCredentials(); 148 + 149 + console.log({ tokenJSON, mastoAccount }); 150 + 151 + let account = accounts.find((a) => a.info.id === mastoAccount.id); 152 + if (account) { 153 + account.info = mastoAccount; 154 + account.instanceURL = instanceURL; 155 + account.accessToken = accessToken; 156 + } else { 157 + account = { 158 + info: mastoAccount, 159 + instanceURL, 160 + accessToken, 161 + }; 162 + accounts.push(account); 163 + } 164 + 165 + store.local.setJSON('accounts', accounts); 166 + store.session.set('currentAccount', account.info.id); 167 + 168 + setIsLoggedIn(true); 169 + setUIState('default'); 170 + })(); 171 + } else if (accounts.length) { 172 + const currentAccount = store.session.get('currentAccount'); 173 + const account = 174 + accounts.find((a) => a.info.id === currentAccount) || accounts[0]; 175 + const instanceURL = account.instanceURL; 176 + const accessToken = account.accessToken; 177 + store.session.set('currentAccount', account.info.id); 178 + 179 + (async () => { 180 + try { 181 + setUIState('loading'); 182 + window.masto = await login({ 183 + url: `https://${instanceURL}`, 184 + accessToken, 185 + }); 186 + setIsLoggedIn(true); 187 + } catch (e) { 188 + setIsLoggedIn(false); 189 + } 190 + setUIState('default'); 191 + })(); 192 + } 193 + }, []); 194 + 195 + const [currentDeck, setCurrentDeck] = useState('home'); 196 + 197 + useEffect(() => { 198 + // HACK: prevent this from running again due to HMR 199 + if (states.init) return; 200 + 201 + if (isLoggedIn) { 202 + requestAnimationFrame(() => { 203 + startStream(); 204 + 205 + // Collect instance info 206 + (async () => { 207 + const info = await masto.instances.fetch(); 208 + console.log(info); 209 + const { uri } = info; 210 + const instances = store.local.getJSON('instances') || {}; 211 + instances[uri] = info; 212 + store.local.setJSON('instances', instances); 213 + })(); 214 + }); 215 + states.init = true; 216 + } 217 + }, [isLoggedIn]); 218 + 219 + return ( 220 + <> 221 + {isLoggedIn && currentDeck && ( 222 + <> 223 + <button 224 + type="button" 225 + id="compose-button" 226 + onClick={() => (states.showCompose = true)} 227 + > 228 + <Icon icon="quill" size="xxl" alt="Compose" /> 229 + </button> 230 + <div class="decks"> 231 + {/* Home will never be unmounted */} 232 + <Home hidden={currentDeck !== 'home'} /> 233 + {/* Notifications can be unmounted */} 234 + {currentDeck === 'notifications' && <Notifications />} 235 + </div> 236 + </> 237 + )} 238 + {!isLoggedIn && uiState === 'loading' && <Loader />} 239 + <Router 240 + history={createHashHistory()} 241 + onChange={(e) => { 242 + // Special handling for Home and Notifications 243 + const { url } = e; 244 + if (/notifications/i.test(url)) { 245 + setCurrentDeck('notifications'); 246 + } else if (url === '/') { 247 + setCurrentDeck('home'); 248 + document.title = `Home / ${CLIENT_NAME}}`; 249 + } else if (url === '/login' || url === '/welcome') { 250 + setCurrentDeck(null); 251 + } 252 + states.history.push(url); 253 + }} 254 + > 255 + {!isLoggedIn && uiState !== 'loading' && <Welcome path="/" />} 256 + <Welcome path="/welcome" /> 257 + {isLoggedIn && <Status path="/s/:id" />} 258 + <Login path="/login" /> 259 + </Router> 260 + {!!snapStates.showCompose && ( 261 + <Modal> 262 + <Compose 263 + replyToStatus={ 264 + typeof snapStates.showCompose !== 'boolean' 265 + ? snapStates.showCompose.replyToStatus 266 + : null 267 + } 268 + onClose={(result) => { 269 + states.showCompose = false; 270 + if (result) { 271 + states.reloadStatusPage++; 272 + } 273 + }} 274 + /> 275 + </Modal> 276 + )} 277 + {!!snapStates.showSettings && ( 278 + <Modal 279 + onClick={(e) => { 280 + if (e.target === e.currentTarget) { 281 + states.showSettings = false; 282 + } 283 + }} 284 + > 285 + <Settings 286 + onClose={() => { 287 + states.showSettings = false; 288 + }} 289 + /> 290 + </Modal> 291 + )} 292 + {!!snapStates.showAccount && ( 293 + <Modal 294 + class="light" 295 + onClick={(e) => { 296 + if (e.target === e.currentTarget) { 297 + states.showAccount = false; 298 + } 299 + }} 300 + > 301 + <Account account={snapStates.showAccount} /> 302 + </Modal> 303 + )} 304 + </> 305 + ); 306 + }
+30
src/components/account.css
··· 1 + #account-container.skeleton { 2 + color: var(--outline-color); 3 + } 4 + 5 + #account-container header{ 6 + display: flex; 7 + align-items: center; 8 + gap: 8px; 9 + } 10 + 11 + #account-container .note { 12 + font-size: 95%; 13 + line-height: 1.5; 14 + } 15 + 16 + #account-container .stats { 17 + display: flex; 18 + flex-wrap: wrap; 19 + gap: 8px; 20 + } 21 + 22 + #account-container .actions { 23 + display: flex; 24 + gap: 8px; 25 + justify-content: space-between; 26 + min-height: 2.5em; 27 + } 28 + #account-container .actions button { 29 + align-self: flex-end; 30 + }
+167
src/components/account.jsx
··· 1 + import './account.css'; 2 + 3 + import { useEffect, useState } from 'preact/hooks'; 4 + 5 + import shortenNumber from '../utils/shorten-number'; 6 + 7 + import Avatar from './avatar'; 8 + import NameText from './name-text'; 9 + 10 + export default ({ account }) => { 11 + const [uiState, setUIState] = useState('default'); 12 + const isString = typeof account === 'string'; 13 + const [info, setInfo] = useState(isString ? null : account); 14 + 15 + useEffect(() => { 16 + if (isString) { 17 + setUIState('loading'); 18 + (async () => { 19 + try { 20 + const info = await masto.accounts.lookup({ 21 + acct: account, 22 + skip_webfinger: false, 23 + }); 24 + setInfo(info); 25 + setUIState('default'); 26 + } catch (e) { 27 + alert(e); 28 + setUIState('error'); 29 + } 30 + })(); 31 + } 32 + }, []); 33 + 34 + const { 35 + acct, 36 + avatar, 37 + avatarStatic, 38 + bot, 39 + createdAt, 40 + displayName, 41 + emojis, 42 + fields, 43 + followersCount, 44 + followingCount, 45 + group, 46 + header, 47 + headerStatic, 48 + id, 49 + lastStatusAt, 50 + locked, 51 + note, 52 + statusesCount, 53 + url, 54 + username, 55 + } = info || {}; 56 + 57 + const [relationshipUIState, setRelationshipUIState] = useState('default'); 58 + const [relationship, setRelationship] = useState(null); 59 + useEffect(() => { 60 + if (info) { 61 + setRelationshipUIState('loading'); 62 + (async () => { 63 + try { 64 + const relationships = await masto.accounts.fetchRelationships([id]); 65 + console.log('fetched relationship', relationships); 66 + if (relationships.length) { 67 + setRelationship(relationships[0]); 68 + } 69 + setRelationshipUIState('default'); 70 + } catch (e) { 71 + console.error(e); 72 + setRelationshipUIState('error'); 73 + } 74 + })(); 75 + } 76 + }, [info]); 77 + 78 + const { 79 + following, 80 + showingReblogs, 81 + notifying, 82 + followedBy, 83 + blocking, 84 + blockedBy, 85 + muting, 86 + mutingNotifications, 87 + requested, 88 + domainBlocking, 89 + endorsed, 90 + } = relationship || {}; 91 + 92 + return ( 93 + <div 94 + id="account-container" 95 + class={`sheet ${uiState === 'loading' ? 'skeleton' : ''}`} 96 + > 97 + {!info || uiState === 'loading' ? ( 98 + <> 99 + <header> 100 + <Avatar size="xxl" /> 101 + ███ ████████████ 102 + </header> 103 + <div class="note"> 104 + <p>████████ ███████</p> 105 + <p>███████████████ ███████████████</p> 106 + </div> 107 + <p class="stats"> 108 + <span>██ Posts</span> 109 + <span>██ Following</span> 110 + <span>██ Followers</span> 111 + </p> 112 + </> 113 + ) : ( 114 + <> 115 + <header> 116 + <Avatar url={avatar} size="xxl" /> 117 + <NameText account={info} showAcct external /> 118 + </header> 119 + <div class="note" dangerouslySetInnerHTML={{ __html: note }} /> 120 + <p class="stats"> 121 + <span> 122 + <b title={statusesCount}>{shortenNumber(statusesCount)}</b> Posts 123 + </span> 124 + <span> 125 + <b title={followingCount}>{shortenNumber(followingCount)}</b>{' '} 126 + Following 127 + </span> 128 + <span> 129 + <b title={followersCount}>{shortenNumber(followersCount)}</b>{' '} 130 + Followers 131 + </span> 132 + </p> 133 + <p class="actions"> 134 + {followedBy ? <span class="tag">Following you</span> : <span />}{' '} 135 + {relationshipUIState !== 'loading' && relationship && ( 136 + <button 137 + type="button" 138 + class={following ? 'light' : ''} 139 + disabled={relationshipUIState === 'loading'} 140 + onClick={() => { 141 + setRelationshipUIState('loading'); 142 + (async () => { 143 + try { 144 + let newRelationship; 145 + if (following) { 146 + newRelationship = await masto.accounts.unfollow(id); 147 + } else { 148 + newRelationship = await masto.accounts.follow(id); 149 + } 150 + setRelationship(newRelationship); 151 + setRelationshipUIState('default'); 152 + } catch (e) { 153 + alert(e); 154 + setRelationshipUIState('error'); 155 + } 156 + })(); 157 + }} 158 + > 159 + {following ? 'Unfollow' : 'Follow'} 160 + </button> 161 + )} 162 + </p> 163 + </> 164 + )} 165 + </div> 166 + ); 167 + };
+17
src/components/avatar.css
··· 1 + .avatar { 2 + display: inline-block; 3 + line-height: 0; 4 + aspect-ratio: 1/1; 5 + border-radius: 50%; 6 + overflow: hidden; 7 + background-color: var(--bg-faded-color); 8 + outline: 1px solid var(--outline-color); 9 + flex-shrink: 0; 10 + } 11 + 12 + .avatar img { 13 + width: 100%; 14 + height: 100%; 15 + object-fit: cover; 16 + background-color: var(--img-bg-color); 17 + }
+26
src/components/avatar.jsx
··· 1 + import './avatar.css'; 2 + 3 + const SIZES = { 4 + s: 16, 5 + m: 20, 6 + l: 24, 7 + xl: 32, 8 + xxl: 50, 9 + }; 10 + 11 + export default ({ url, size, alt = '' }) => { 12 + size = SIZES[size] || size || SIZES.m; 13 + return ( 14 + <span 15 + class="avatar" 16 + style={{ 17 + width: size, 18 + height: size, 19 + }} 20 + > 21 + {!!url && ( 22 + <img src={url} width={size} height={size} alt={alt} loading="lazy" /> 23 + )} 24 + </span> 25 + ); 26 + };
+232
src/components/compose.css
··· 1 + #compose-container { 2 + width: 40em; 3 + max-width: 100vw; 4 + align-self: stretch; 5 + animation: fade-in 0.2s ease-out; 6 + max-height: 100vh; 7 + overflow: auto; 8 + } 9 + 10 + #compose-container .compose-top { 11 + text-align: right; 12 + display: flex; 13 + justify-content: space-between; 14 + gap: 8px; 15 + align-items: center; 16 + padding: 16px; 17 + position: sticky; 18 + top: 0; 19 + z-index: 100; 20 + } 21 + 22 + #compose-container .close-button { 23 + padding: 6px; 24 + color: var(--text-insignificant-color); 25 + } 26 + 27 + #compose-container textarea{ 28 + width: 100%; 29 + max-width: 100%; 30 + height: 3em; 31 + min-height: 3em; 32 + max-height: 10em; 33 + resize: vertical; 34 + } 35 + @keyframes appear-up { 36 + 0% { 37 + opacity: 0; 38 + transform: translateY(10px); 39 + } 40 + 100% { 41 + opacity: 1; 42 + transform: translateY(0); 43 + } 44 + } 45 + #compose-container .reply-to { 46 + border-radius: 8px 8px 0 0; 47 + max-height: 160px; 48 + pointer-events: none; 49 + filter: saturate(0.25) opacity(0.75); 50 + background-color: var(--bg-blur-color); 51 + margin: 0 12px; 52 + border: 1px solid var(--outline-color); 53 + border-bottom: 0; 54 + /* box-shadow: 0 0 12px var(--divider-color); */ 55 + /* mask-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 1) 90%, transparent); */ 56 + animation: appear-up 1s ease-in-out; 57 + } 58 + @keyframes appear-down { 59 + 0% { 60 + transform: translateY(-2em); 61 + } 62 + 100% { 63 + transform: translateY(0); 64 + } 65 + } 66 + #compose-container form { 67 + border-radius: 8px; 68 + padding: 4px 12px; 69 + background-image: linear-gradient(var(--bg-color) 75%, transparent); 70 + /* outline: 1px solid var(--outline-color); */ 71 + /* box-shadow: 0 0 12px var(--divider-color); */ 72 + position: relative; 73 + z-index: 1; 74 + } 75 + #compose-container .reply-to ~ form { 76 + animation: appear-down 1s ease-in-out; 77 + box-shadow: 0 -12px 12px -12px var(--divider-color); 78 + } 79 + 80 + #compose-container .toolbar { 81 + display: flex; 82 + justify-content: space-between; 83 + padding: 8px 0; 84 + gap: 8px; 85 + } 86 + #compose-container .toolbar.stretch { 87 + justify-content: stretch; 88 + } 89 + #compose-container .toolbar .spoiler-text-field { 90 + flex: 1; 91 + min-width: 0; 92 + } 93 + #compose-container .toolbar-button { 94 + cursor: pointer; 95 + display: inline-block; 96 + background-color: var(--bg-faded-color); 97 + padding: 0 8px; 98 + border-radius: 8px; 99 + min-height: 2.5em; 100 + line-height: 2.5em; 101 + min-width: 2.5em; 102 + text-align: center; 103 + overflow: hidden; 104 + position: relative; 105 + white-space: nowrap; 106 + } 107 + #compose-container .toolbar-button > * { 108 + vertical-align: middle; 109 + cursor: inherit; 110 + } 111 + #compose-container .toolbar-button:has([disabled]) { 112 + cursor: not-allowed; 113 + } 114 + #compose-container .toolbar-button:has([disabled]) > * { 115 + filter: opacity(0.3); 116 + } 117 + #compose-container .toolbar-button:not(.show-field) :is(input[type="checkbox"], select, input[type="file"]) { 118 + opacity: 0; 119 + position: absolute; 120 + left: 0; 121 + height: 100%; 122 + } 123 + #compose-container .toolbar-button input[type="file"] { 124 + /* Move this out of the way, to fix cursor: pointer bug */ 125 + left: -100vw !important; 126 + } 127 + #compose-container .toolbar-button select { 128 + background-color: transparent; 129 + border: 0; 130 + outline: 0; 131 + padding: 0 0 0 8px; 132 + } 133 + #compose-container .toolbar-button:not(.show-field) select { 134 + right: 0; 135 + left: auto !important; 136 + } 137 + #compose-container .toolbar-button:hover { 138 + outline: 2px solid var(--divider-color); 139 + } 140 + #compose-container .toolbar-button:active { 141 + filter: brightness(0.8); 142 + } 143 + 144 + #compose-container text-expander { 145 + position: relative; 146 + } 147 + #compose-container .text-expander-menu { 148 + color: var(--text-color); 149 + background-color: var(--bg-color); 150 + position: absolute; 151 + margin: 0 0 0 -8px; 152 + padding: 0; 153 + list-style: none; 154 + outline: 1px solid var(--outline-color); 155 + /* box-shadow: 0 0 12px var(--outline-color); */ 156 + border-radius: 8px; 157 + overflow: hidden; 158 + top: 0 !important; 159 + z-index: 100; 160 + min-width: 50vw; 161 + } 162 + #compose-container .text-expander-menu li { 163 + white-space: nowrap; 164 + padding: 8px; 165 + cursor: pointer; 166 + overflow: hidden; 167 + text-overflow: ellipsis; 168 + display: flex; 169 + gap: 8px; 170 + align-items: center; 171 + font-size: 90%; 172 + } 173 + #compose-container .text-expander-menu li img { 174 + /* The shortcode emojis */ 175 + width: 1em; 176 + height: 1em; 177 + } 178 + #compose-container .text-expander-menu li .avatar { 179 + width: 2.2em; 180 + height: 2.2em; 181 + } 182 + #compose-container .text-expander-menu li:hover { 183 + color: var(--bg-color); 184 + background-color: var(--link-color); 185 + } 186 + 187 + #compose-container .media-attachments { 188 + background-color: var(--bg-faded-color); 189 + padding: 8px; 190 + border-radius: 8px; 191 + margin: 8px 0 0; 192 + display: flex; 193 + flex-direction: column; 194 + gap: 8px; 195 + } 196 + #compose-container .media-attachment { 197 + display: flex; 198 + gap: 8px; 199 + align-items: stretch; 200 + } 201 + #compose-container .media-preview { 202 + flex-shrink: 1; 203 + } 204 + #compose-container .media-preview > *{ 205 + min-width: 80px; 206 + width: 80px !important; 207 + height: 80px; 208 + object-fit: contain; 209 + background-color: var(--img-bg-color); 210 + border-radius: 8px; 211 + outline: 1px solid var(--outline-color); 212 + } 213 + #compose-container .media-attachment textarea { 214 + height: 80px; 215 + flex-grow: 1; 216 + resize: none; 217 + } 218 + #compose-container .media-aside { 219 + display: flex; 220 + flex-direction: column; 221 + justify-content: space-between; 222 + align-items: center; 223 + } 224 + #compose-container .media-aside .close-button { 225 + padding: 4px; 226 + align-self: flex-start; 227 + color: var(--text-insignificant-color); 228 + } 229 + #compose-container .media-aside .uploaded { 230 + color: var(--green-color); 231 + margin-bottom: 4px; 232 + }
+527
src/components/compose.jsx
··· 1 + import './compose.css'; 2 + 3 + import '@github/text-expander-element'; 4 + import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; 5 + 6 + import emojifyText from '../utils/emojify-text'; 7 + import store from '../utils/store'; 8 + import visibilityIconsMap from '../utils/visibility-icons-map'; 9 + 10 + import Avatar from './avatar'; 11 + import Icon from './icon'; 12 + import Loader from './loader'; 13 + import Status from './status'; 14 + 15 + /* NOTES: 16 + - Max character limit includes BOTH status text and Content Warning text 17 + */ 18 + 19 + export default ({ onClose, replyToStatus }) => { 20 + const [uiState, setUIState] = useState('default'); 21 + 22 + const accounts = store.local.getJSON('accounts'); 23 + const currentAccount = store.session.get('currentAccount'); 24 + const currentAccountInfo = accounts.find( 25 + (a) => a.info.id === currentAccount, 26 + ).info; 27 + 28 + const configuration = useMemo(() => { 29 + const instances = store.local.getJSON('instances'); 30 + const currentInstance = accounts.find( 31 + (a) => a.info.id === currentAccount, 32 + ).instanceURL; 33 + const config = instances[currentInstance].configuration; 34 + console.log(config); 35 + return config; 36 + }, []); 37 + 38 + const { 39 + statuses: { maxCharacters, maxMediaAttachments, charactersReservedPerUrl }, 40 + mediaAttachments: { 41 + supportedMimeTypes, 42 + imageSizeLimit, 43 + imageMatrixLimit, 44 + videoSizeLimit, 45 + videoMatrixLimit, 46 + videoFrameRateLimit, 47 + }, 48 + polls: { maxOptions, maxCharactersPerOption, maxExpiration, minExpiration }, 49 + } = configuration; 50 + 51 + const textareaRef = useRef(); 52 + 53 + const [visibility, setVisibility] = useState( 54 + replyToStatus?.visibility || 'public', 55 + ); 56 + const [sensitive, setSensitive] = useState(replyToStatus?.sensitive || false); 57 + const spoilerTextRef = useRef(); 58 + 59 + useEffect(() => { 60 + let timer = setTimeout(() => { 61 + const spoilerText = replyToStatus?.spoilerText; 62 + if (spoilerText && spoilerTextRef.current) { 63 + spoilerTextRef.current.value = spoilerText; 64 + spoilerTextRef.current.focus(); 65 + } else { 66 + textareaRef.current?.focus(); 67 + } 68 + }, 0); 69 + return () => clearTimeout(timer); 70 + }, []); 71 + 72 + const textExpanderRef = useRef(); 73 + const textExpanderTextRef = useRef(''); 74 + useEffect(() => { 75 + if (textExpanderRef.current) { 76 + const handleChange = (e) => { 77 + console.log('text-expander-change', e); 78 + const { key, provide, text } = e.detail; 79 + textExpanderTextRef.current = text; 80 + if (text === '') { 81 + provide( 82 + Promise.resolve({ 83 + matched: false, 84 + }), 85 + ); 86 + return; 87 + } 88 + const type = { 89 + '@': 'accounts', 90 + '#': 'hashtags', 91 + }[key]; 92 + provide( 93 + new Promise((resolve) => { 94 + const resultsIterator = masto.search({ 95 + type, 96 + q: text, 97 + limit: 5, 98 + }); 99 + resultsIterator.next().then(({ value }) => { 100 + if (text !== textExpanderTextRef.current) { 101 + return; 102 + } 103 + const results = value[type]; 104 + console.log('RESULTS', value, results); 105 + const menu = document.createElement('ul'); 106 + menu.role = 'listbox'; 107 + menu.className = 'text-expander-menu'; 108 + results.forEach((result) => { 109 + const { 110 + name, 111 + avatarStatic, 112 + displayName, 113 + username, 114 + acct, 115 + emojis, 116 + } = result; 117 + const displayNameWithEmoji = emojifyText(displayName, emojis); 118 + const item = document.createElement('li'); 119 + item.setAttribute('role', 'option'); 120 + if (acct) { 121 + item.dataset.value = acct; 122 + // Want to use <Avatar /> here, but will need to render to string 😅 123 + item.innerHTML = ` 124 + <span class="avatar"> 125 + <img src="${avatarStatic}" width="16" height="16" alt="" loading="lazy" /> 126 + </span> 127 + <span> 128 + <b>${displayNameWithEmoji || username}</b> 129 + <br>@${acct} 130 + </span> 131 + `; 132 + } else { 133 + item.dataset.value = name; 134 + item.innerHTML = ` 135 + <span>#<b>${name}</b></span> 136 + `; 137 + } 138 + menu.appendChild(item); 139 + }); 140 + console.log('MENU', results, menu); 141 + resolve({ 142 + matched: results.length > 0, 143 + fragment: menu, 144 + }); 145 + }); 146 + }), 147 + ); 148 + }; 149 + 150 + textExpanderRef.current.addEventListener( 151 + 'text-expander-change', 152 + handleChange, 153 + ); 154 + 155 + textExpanderRef.current.addEventListener('text-expander-value', (e) => { 156 + const { key, item } = e.detail; 157 + e.detail.value = key + item.dataset.value; 158 + }); 159 + } 160 + }, []); 161 + 162 + const [mediaAttachments, setMediaAttachments] = useState([]); 163 + 164 + const formRef = useRef(); 165 + 166 + const beforeUnloadCopy = 167 + 'You have unsaved changes. Are you sure you want to discard this post?'; 168 + const canClose = () => { 169 + // check for status or mediaAttachments 170 + if (textareaRef.current.value || mediaAttachments.length > 0) { 171 + const yes = confirm(beforeUnloadCopy); 172 + return yes; 173 + } 174 + return true; 175 + }; 176 + 177 + useEffect(() => { 178 + // Show warning if user tries to close window with unsaved changes 179 + const handleBeforeUnload = (e) => { 180 + if (!canClose()) { 181 + e.preventDefault(); 182 + e.returnValue = beforeUnloadCopy; 183 + } 184 + }; 185 + window.addEventListener('beforeunload', handleBeforeUnload, { 186 + capture: true, 187 + }); 188 + return () => 189 + window.removeEventListener('beforeunload', handleBeforeUnload, { 190 + capture: true, 191 + }); 192 + }, []); 193 + 194 + return ( 195 + <div id="compose-container"> 196 + <div class="compose-top"> 197 + {currentAccountInfo?.avatarStatic && ( 198 + <Avatar 199 + url={currentAccountInfo.avatarStatic} 200 + size="l" 201 + alt={currentAccountInfo.username} 202 + /> 203 + )} 204 + <button 205 + type="button" 206 + class="light close-button" 207 + onClick={() => { 208 + if (canClose()) { 209 + onClose(); 210 + } 211 + }} 212 + > 213 + <Icon icon="x" /> 214 + </button> 215 + </div> 216 + {!!replyToStatus && ( 217 + <div class="reply-to"> 218 + <Status status={replyToStatus} size="s" /> 219 + </div> 220 + )} 221 + <form 222 + ref={formRef} 223 + style={{ 224 + pointerEvents: uiState === 'loading' ? 'none' : 'auto', 225 + opacity: uiState === 'loading' ? 0.5 : 1, 226 + }} 227 + onSubmit={(e) => { 228 + e.preventDefault(); 229 + 230 + const formData = new FormData(e.target); 231 + const entries = Object.fromEntries(formData.entries()); 232 + console.log('ENTRIES', entries); 233 + let { status, visibility, sensitive, spoilerText } = entries; 234 + 235 + // Pre-cleanup 236 + sensitive = sensitive === 'on'; // checkboxes return "on" if checked 237 + 238 + // Validation 239 + if (status.length > maxCharacters) { 240 + alert(`Status is too long! Max characters: ${maxCharacters}`); 241 + return; 242 + } 243 + if (sensitive && status.length + spoilerText.length > maxCharacters) { 244 + alert( 245 + `Status and content warning is too long! Max characters: ${maxCharacters}`, 246 + ); 247 + return; 248 + } 249 + // TODO: check for URLs and use `charactersReservedPerUrl` to calculate max characters 250 + 251 + // Post-cleanup 252 + spoilerText = (sensitive && spoilerText) || undefined; 253 + status = status === '' ? undefined : status; 254 + 255 + setUIState('loading'); 256 + (async () => { 257 + try { 258 + console.log('MEDIA ATTACHMENTS', mediaAttachments); 259 + if (mediaAttachments.length > 0) { 260 + // Upload media attachments first 261 + const mediaPromises = mediaAttachments.map((attachment) => { 262 + const params = { 263 + file: attachment.file, 264 + description: attachment.description || undefined, 265 + }; 266 + return masto.mediaAttachments.create(params).then((res) => { 267 + // Update media attachment with ID 268 + if (res.id) { 269 + attachment.id = res.id; 270 + } 271 + return res; 272 + }); 273 + }); 274 + const results = await Promise.allSettled(mediaPromises); 275 + 276 + // If any failed, return 277 + if ( 278 + results.some( 279 + (result) => 280 + result.status === 'rejected' || !result.value.id, 281 + ) 282 + ) { 283 + setUIState('error'); 284 + // Alert all the reasons 285 + results.forEach((result) => { 286 + if (result.status === 'rejected') { 287 + alert(result.reason || `Attachment #${i} failed`); 288 + } 289 + }); 290 + return; 291 + } 292 + 293 + console.log({ results, mediaAttachments }); 294 + } 295 + 296 + const params = { 297 + status, 298 + visibility, 299 + sensitive, 300 + spoilerText, 301 + inReplyToId: replyToStatus?.id || undefined, 302 + mediaIds: mediaAttachments.map((attachment) => attachment.id), 303 + }; 304 + console.log('POST', params); 305 + const newStatus = await masto.statuses.create(params); 306 + setUIState('default'); 307 + 308 + // Close 309 + onClose({ 310 + newStatus, 311 + }); 312 + } catch (e) { 313 + alert(e); 314 + setUIState('error'); 315 + } 316 + })(); 317 + }} 318 + > 319 + <div class="toolbar stretch"> 320 + <input 321 + ref={spoilerTextRef} 322 + type="text" 323 + name="spoilerText" 324 + placeholder="Spoiler text" 325 + disabled={uiState === 'loading'} 326 + class="spoiler-text-field" 327 + style={{ 328 + opacity: sensitive ? 1 : 0, 329 + pointerEvents: sensitive ? 'auto' : 'none', 330 + }} 331 + /> 332 + <label 333 + class="toolbar-button" 334 + title="Content warning or sensitive media" 335 + > 336 + <input 337 + name="sensitive" 338 + type="checkbox" 339 + disabled={uiState === 'loading'} 340 + onChange={(e) => { 341 + const sensitive = e.target.checked; 342 + setSensitive(sensitive); 343 + if (sensitive) { 344 + spoilerTextRef.current?.focus(); 345 + } else { 346 + textareaRef.current?.focus(); 347 + } 348 + }} 349 + /> 350 + <Icon icon={`eye-${sensitive ? 'close' : 'open'}`} /> 351 + </label>{' '} 352 + <label 353 + class={`toolbar-button ${ 354 + visibility !== 'public' && !sensitive ? 'show-field' : '' 355 + }`} 356 + title={`Visibility: ${visibility}`} 357 + > 358 + <Icon icon={visibilityIconsMap[visibility]} alt={visibility} /> 359 + <select 360 + name="visibility" 361 + value={visibility} 362 + onChange={(e) => { 363 + setVisibility(e.target.value); 364 + }} 365 + disabled={uiState === 'loading'} 366 + > 367 + <option value="public"> 368 + Public <Icon icon="earth" /> 369 + </option> 370 + <option value="unlisted">Unlisted</option> 371 + <option value="private">Followers only</option> 372 + <option value="direct">Direct</option> 373 + </select> 374 + </label>{' '} 375 + </div> 376 + <text-expander ref={textExpanderRef} keys="@ #"> 377 + <textarea 378 + class="large" 379 + ref={textareaRef} 380 + placeholder={ 381 + replyToStatus ? 'Post your reply' : 'What are you doing?' 382 + } 383 + required={mediaAttachments.length === 0} 384 + autoCapitalize="sentences" 385 + autoComplete="on" 386 + autoCorrect="on" 387 + spellCheck="true" 388 + dir="auto" 389 + rows="6" 390 + cols="50" 391 + name="status" 392 + disabled={uiState === 'loading'} 393 + onInput={(e) => { 394 + const { scrollHeight, offsetHeight, clientHeight, value } = 395 + e.target; 396 + const offset = offsetHeight - clientHeight; 397 + e.target.style.height = value 398 + ? scrollHeight + offset + 'px' 399 + : null; 400 + }} 401 + style={{ 402 + maxHeight: `${maxCharacters / 50}em`, 403 + }} 404 + ></textarea> 405 + </text-expander> 406 + {mediaAttachments.length > 0 && ( 407 + <div class="media-attachments"> 408 + {mediaAttachments.map((attachment, i) => { 409 + const { url, type, id } = attachment; 410 + const suffixType = type.split('/')[0]; 411 + return ( 412 + <div class="media-attachment" key={i + id}> 413 + <div class="media-preview"> 414 + {suffixType === 'image' ? ( 415 + <img src={url} alt="" /> 416 + ) : suffixType === 'video' ? ( 417 + <video src={url} playsinline muted /> 418 + ) : suffixType === 'audio' ? ( 419 + <audio src={url} controls /> 420 + ) : null} 421 + </div> 422 + <textarea 423 + placeholder={ 424 + { 425 + image: 'Image description', 426 + video: 'Video description', 427 + audio: 'Audio description', 428 + }[suffixType] 429 + } 430 + autoCapitalize="sentences" 431 + autoComplete="on" 432 + autoCorrect="on" 433 + spellCheck="true" 434 + dir="auto" 435 + disabled={uiState === 'loading'} 436 + maxlength="1500" 437 + // TODO: Un-hard-code this maxlength, ref: https://github.com/mastodon/mastodon/blob/b59fb28e90bc21d6fd1a6bafd13cfbd81ab5be54/app/models/media_attachment.rb#L39 438 + onInput={(e) => { 439 + const { value } = e.target; 440 + // Modify `description` in media attachment 441 + setMediaAttachments((attachments) => { 442 + const newAttachments = [...attachments]; 443 + newAttachments[i].description = value; 444 + return newAttachments; 445 + }); 446 + }} 447 + ></textarea> 448 + <div class="media-aside"> 449 + <button 450 + type="button" 451 + class="plain close-button" 452 + disabled={uiState === 'loading'} 453 + onClick={() => { 454 + setMediaAttachments((attachments) => { 455 + return attachments.filter((_, j) => j !== i); 456 + }); 457 + }} 458 + > 459 + <Icon icon="x" /> 460 + </button> 461 + {!!id && ( 462 + <Icon icon="upload" title="Uploaded" class="uploaded" /> 463 + )} 464 + </div> 465 + </div> 466 + ); 467 + })} 468 + </div> 469 + )} 470 + <div class="toolbar"> 471 + <div> 472 + <label class="toolbar-button"> 473 + <input 474 + type="file" 475 + accept={supportedMimeTypes.join(',')} 476 + multiple={mediaAttachments.length < maxMediaAttachments - 1} 477 + disabled={ 478 + uiState === 'loading' || 479 + mediaAttachments.length >= maxMediaAttachments 480 + } 481 + onChange={(e) => { 482 + const files = e.target.files; 483 + if (!files) return; 484 + 485 + const mediaFiles = Array.from(files).map((file) => ({ 486 + file, 487 + type: file.type, 488 + size: file.size, 489 + url: URL.createObjectURL(file), 490 + id: null, // indicate uploaded state 491 + description: null, 492 + })); 493 + console.log('MEDIA ATTACHMENTS', files, mediaFiles); 494 + 495 + // Validate max media attachments 496 + if ( 497 + mediaAttachments.length + mediaFiles.length > 498 + maxMediaAttachments 499 + ) { 500 + alert( 501 + `You can only attach up to ${maxMediaAttachments} files.`, 502 + ); 503 + } else { 504 + setMediaAttachments((attachments) => { 505 + return attachments.concat(mediaFiles); 506 + }); 507 + } 508 + }} 509 + /> 510 + <Icon icon="attachment" /> 511 + </label> 512 + </div> 513 + <div> 514 + {uiState === 'loading' && <Loader />}{' '} 515 + <button 516 + type="submit" 517 + class="large" 518 + disabled={uiState === 'loading'} 519 + > 520 + {replyToStatus ? 'Reply' : 'Post'} 521 + </button> 522 + </div> 523 + </div> 524 + </form> 525 + </div> 526 + ); 527 + };
+59
src/components/icon.jsx
··· 1 + const SIZES = { 2 + s: 12, 3 + m: 16, 4 + l: 20, 5 + xl: 24, 6 + xxl: 32, 7 + }; 8 + 9 + const ICONS = { 10 + x: 'mingcute:close-line', 11 + heart: 'mingcute:heart-line', 12 + bookmark: 'mingcute:bookmark-line', 13 + 'check-circle': 'mingcute:check-circle-line', 14 + transfer: 'mingcute:transfer-4-line', 15 + rocket: 'mingcute:rocket-line', 16 + 'arrow-left': 'mingcute:arrow-left-line', 17 + 'arrow-right': 'mingcute:arrow-right-line', 18 + 'arrow-up': 'mingcute:arrow-up-line', 19 + earth: 'mingcute:earth-line', 20 + lock: 'mingcute:lock-line', 21 + unlock: 'mingcute:unlock-line', 22 + 'eye-close': 'mingcute:eye-close-line', 23 + 'eye-open': 'mingcute:eye-2-line', 24 + message: 'mingcute:mail-line', 25 + comment: 'mingcute:chat-3-line', 26 + home: 'mingcute:home-5-line', 27 + notification: 'mingcute:notification-line', 28 + follow: 'mingcute:user-follow-line', 29 + 'follow-add': 'mingcute:user-add-line', 30 + poll: 'mingcute:chart-bar-line', 31 + pencil: 'mingcute:pencil-line', 32 + quill: 'mingcute:quill-pen-line', 33 + at: 'mingcute:at-line', 34 + attachment: 'mingcute:attachment-line', 35 + upload: 'mingcute:upload-3-line', 36 + gear: 'mingcute:settings-3-line', 37 + }; 38 + 39 + export default ({ icon, size = 'm', alt, title, class: className = '' }) => { 40 + const iconSize = SIZES[size]; 41 + const iconName = ICONS[icon]; 42 + return ( 43 + <div 44 + class={`icon ${className}`} 45 + title={title || alt} 46 + style={{ 47 + width: `${iconSize}px`, 48 + height: `${iconSize}px`, 49 + display: 'inline-block', 50 + overflow: 'hidden', 51 + lineHeight: 0, 52 + }} 53 + > 54 + <iconify-icon width={iconSize} height={iconSize} icon={iconName}> 55 + {alt} 56 + </iconify-icon> 57 + </div> 58 + ); 59 + };
+43
src/components/loader.css
··· 1 + .loader-container { 2 + display: inline-block; 3 + width: 16px; 4 + height: 16px; 5 + pointer-events: none; 6 + animation: slow-appear .3s ease-in-out 1s both; 7 + vertical-align: middle; 8 + } 9 + @keyframes slow-appear { 10 + 0% { 11 + opacity: 0; 12 + } 13 + 100% { 14 + opacity: 1; 15 + } 16 + } 17 + .loader-container.abrupt { 18 + animation: none; 19 + } 20 + .loader-container.hidden { 21 + visibility: hidden; 22 + } 23 + 24 + .loader { 25 + display: inline-block; 26 + width: 16px; 27 + height: 16px; 28 + border-radius: 50%; 29 + border: 2.5px solid; 30 + border-color: var(--loader-color) var(--loader-color) transparent transparent; 31 + animation: loader 1s infinite linear; 32 + } 33 + @keyframes loader { 34 + 0% { 35 + transform: rotate(0deg); 36 + } 37 + 100% { 38 + transform: rotate(360deg); 39 + } 40 + } 41 + .loader-container.hidden .loader { 42 + animation: none; 43 + }
+11
src/components/loader.jsx
··· 1 + import './loader.css'; 2 + 3 + export default ({ abrupt, hidden }) => ( 4 + <div 5 + class={`loader-container ${abrupt ? 'abrupt' : ''} ${ 6 + hidden ? 'hidden' : '' 7 + }`} 8 + > 9 + <div class="loader" /> 10 + </div> 11 + );
+17
src/components/modal.css
··· 1 + #modal-container > div { 2 + position: fixed; 3 + top: 0; 4 + right: 0; 5 + height: 100%; 6 + width: 100%; 7 + z-index: 1000; 8 + display: flex; 9 + justify-content: center; 10 + align-items: center; 11 + background-color: var(--backdrop-color); 12 + backdrop-filter: blur(24px); 13 + } 14 + 15 + #modal-container > .light { 16 + backdrop-filter: saturate(.75); 17 + }
+20
src/components/modal.jsx
··· 1 + import './modal.css'; 2 + 3 + import { createPortal } from 'preact/compat'; 4 + import { useEffect } from 'preact/hooks'; 5 + 6 + const $modalContainer = document.getElementById('modal-container'); 7 + 8 + export default ({ children, onClick, class: className }) => { 9 + if (!children) return null; 10 + 11 + const Modal = ( 12 + <div className={className} onClick={onClick}> 13 + {children} 14 + </div> 15 + ); 16 + 17 + return createPortal(Modal, $modalContainer); 18 + 19 + // return createPortal(children, $modalContainer); 20 + };
+19
src/components/name-text.css
··· 1 + .name-text { 2 + color: inherit; 3 + text-decoration: none; 4 + display: inline-block; 5 + } 6 + a.name-text:hover b, 7 + a.name-text.short:hover i { 8 + text-decoration: underline; 9 + text-decoration-color: var(--text-insignificant-color); 10 + } 11 + .name-text i { 12 + font-style: normal; 13 + opacity: 0.75; 14 + } 15 + 16 + .name-text .avatar { 17 + vertical-align: middle; 18 + margin-right: 4px; 19 + }
+58
src/components/name-text.jsx
··· 1 + import './name-text.css'; 2 + 3 + import emojifyText from '../utils/emojify-text'; 4 + import states from '../utils/states'; 5 + 6 + import Avatar from './avatar'; 7 + 8 + export default ({ account, showAvatar, showAcct, short, external }) => { 9 + const { acct, avatar, avatarStatic, id, url, displayName, username, emojis } = 10 + account; 11 + 12 + const displayNameWithEmoji = emojifyText(displayName, emojis); 13 + 14 + return ( 15 + <a 16 + class={`name-text ${short ? 'short' : ''}`} 17 + href={url} 18 + target="_blank" 19 + title={`@${acct}`} 20 + onClick={(e) => { 21 + if (external) return; 22 + e.preventDefault(); 23 + states.showAccount = account; 24 + }} 25 + > 26 + {showAvatar && ( 27 + <> 28 + <Avatar url={avatar} />{' '} 29 + </> 30 + )} 31 + {displayName && !short ? ( 32 + <> 33 + <b 34 + dangerouslySetInnerHTML={{ 35 + __html: displayNameWithEmoji, 36 + }} 37 + /> 38 + {!showAcct && ( 39 + <> 40 + {' '} 41 + <i>@{username}</i> 42 + </> 43 + )} 44 + </> 45 + ) : short ? ( 46 + <i>@{username}</i> 47 + ) : ( 48 + <b>@{username}</b> 49 + )} 50 + {showAcct && ( 51 + <> 52 + <br /> 53 + <i>@{acct}</i> 54 + </> 55 + )} 56 + </a> 57 + ); 58 + };
+438
src/components/status.css
··· 1 + /* REBLOG + REPLY-TO */ 2 + 3 + .status-reblog { 4 + background: linear-gradient(to bottom right, var( 5 + --reblog-faded-color 6 + ), transparent 160px); 7 + } 8 + .status-reply-to { 9 + background: linear-gradient(to bottom right, var( 10 + --reply-to-faded-color 11 + ), transparent 160px); 12 + } 13 + .status-reblog .status-reply-to { 14 + background: linear-gradient(to top left, var( 15 + --reply-to-faded-color 16 + ), transparent 160px); 17 + } 18 + 19 + /* STATUS PRE META */ 20 + 21 + .status-pre-meta { 22 + line-height: 1.5; 23 + padding: 8px 16px 0; 24 + opacity: 0.75; 25 + font-size: smaller; 26 + vertical-align: middle; 27 + } 28 + .status-pre-meta .icon { 29 + color: var(--reblog-color); 30 + vertical-align: middle; 31 + margin-right: 4px; 32 + } 33 + 34 + /* STATUS */ 35 + 36 + .status { 37 + display: flex; 38 + padding: 16px 16px 20px; 39 + line-height: 1.5; 40 + align-items: flex-start; 41 + } 42 + .status.large { 43 + padding-bottom: 8px; 44 + } 45 + .status-pre-meta + .status { 46 + padding-top: 8px; 47 + } 48 + .status.small { 49 + font-size: 95%; 50 + } 51 + .status.skeleton { 52 + color: var(--outline-color); 53 + } 54 + 55 + .status.skeleton > .avatar { 56 + background-color: var(--outline-color); 57 + } 58 + .indirect .status { 59 + padding-left: 57px; 60 + } 61 + .indirect .status > .avatar { 62 + width: 25px !important; 63 + height: 25px !important; 64 + } 65 + 66 + .status:not(.small) .container { 67 + padding-left: 16px; 68 + flex-grow: 1; 69 + min-width: 0; 70 + } 71 + 72 + .status.large > .container > .meta { 73 + display: flex; 74 + gap: 8px; 75 + min-height: 50px; 76 + justify-content: space-between; 77 + } 78 + .status > .container > .meta .arrow { 79 + color: var(--reply-to-color); 80 + vertical-align: middle; 81 + } 82 + .status > .container > .meta .time { 83 + color: inherit; 84 + text-align: end; 85 + opacity: 0.5; 86 + text-decoration: none; 87 + flex-shrink: 0; 88 + margin-left: 4px; 89 + white-space: nowrap; 90 + } 91 + .status > .container > .meta a.time:hover { 92 + text-decoration: underline; 93 + } 94 + .status > .container > .meta .reply-to { 95 + opacity: 0.5; 96 + font-size: smaller; 97 + } 98 + 99 + .status.large .content-container { 100 + margin-left: calc(-50px - 16px); 101 + background-image: linear-gradient(to bottom, transparent, var(--bg-color) 10px, var(--bg-color)); 102 + padding-top: 10px; 103 + padding-bottom: 10px; 104 + } 105 + 106 + .status .content-container.has-spoiler .spoiler { 107 + margin: 8px 0; 108 + font-size: 90%; 109 + outline: 1px dashed var(--button-bg-color); 110 + display: flex; 111 + gap: 8px; 112 + align-items: center; 113 + } 114 + .status .content-container.has-spoiler .spoiler ~ * { 115 + filter: blur(6px) invert(.5); 116 + pointer-events: none; 117 + transition: filter .5s; 118 + user-select: none; 119 + } 120 + .status .content-container.has-spoiler .spoiler ~ .content ~ * { 121 + opacity: .5; 122 + } 123 + .status .content-container.show-spoiler .spoiler { 124 + outline-style: dotted; 125 + } 126 + .status .content-container.show-spoiler .spoiler ~ * { 127 + filter: none; 128 + pointer-events: auto; 129 + user-select: auto; 130 + } 131 + .status .content-container.has-spoiler .spoiler ~ .content ~ * { 132 + opacity: 1; 133 + } 134 + 135 + .status .content { 136 + margin-top: 8px; 137 + } 138 + .status .content p { 139 + margin-block: .75em; 140 + } 141 + .status .content p:first-child { 142 + margin-block-start: 0; 143 + } 144 + .status .content p:last-child { 145 + margin-block-end: 0; 146 + } 147 + .status .content .invisible { 148 + display: none; 149 + } 150 + .status .content .ellipsis::after { 151 + content: '…'; 152 + } 153 + .status:hover .content a { 154 + text-decoration-line: underline; 155 + } 156 + .status .content a.mention { 157 + text-decoration-line: none; 158 + } 159 + .status .content a.mention span { 160 + text-decoration-line: underline; 161 + text-decoration-color: inherit; 162 + } 163 + .status .content a.hashtag { 164 + color: var(--link-light-color); 165 + } 166 + .status .content a.hashtag span{ 167 + color: var(--text-color); 168 + } 169 + .status .content a.u-url span{ 170 + color: var(--text-color); 171 + } 172 + .status.large .content { 173 + font-size: 150%; 174 + } 175 + .status.large .poll, 176 + .status.large .actions { 177 + font-size: 125%; 178 + } 179 + 180 + /* MEDIA */ 181 + 182 + .status .media-container { 183 + margin-top: 8px; 184 + display: flex; 185 + flex-wrap: wrap; 186 + gap: 8px; 187 + flex-direction: row; 188 + } 189 + .status .media { 190 + flex-grow: 1; 191 + flex-basis: calc(50% - 8px); 192 + border-radius: 8px; 193 + overflow: hidden; 194 + max-height: 160px; 195 + outline: 1px solid var(--outline-color); 196 + } 197 + .status .media:hover { 198 + outline-color: var(--outline-hover-color); 199 + } 200 + .status .media.block { 201 + flex-basis: 100%; 202 + max-height: auto; 203 + } 204 + .status .media :is(img, video) { 205 + width: 100%; 206 + height: 100%; 207 + object-fit: cover; 208 + cursor: pointer; 209 + } 210 + @keyframes position-object { 211 + 0% { 212 + object-position: 50% 50%; 213 + } 214 + 25% { 215 + object-position: 0% 0%; 216 + } 217 + 75% { 218 + object-position: 100% 100%; 219 + } 220 + 100% { 221 + object-position: 50% 50%; 222 + } 223 + } 224 + .status .media img:hover { 225 + animation: position-object 5s ease-in-out 1s infinite; 226 + } 227 + .status .media video { 228 + width: 100%; 229 + height: 100%; 230 + object-fit: contain; 231 + } 232 + .status .media-video { 233 + position: relative; 234 + } 235 + .status .media-video:after { 236 + /* show play icon */ 237 + content: ''; 238 + position: absolute; 239 + top: 50%; 240 + left: 50%; 241 + transform: translate(-50%, -50%); 242 + width: 0; 243 + height: 0; 244 + border-style: solid; 245 + border-width: 15px 0 15px 26.0px; 246 + border-color: transparent transparent transparent var(--text-color); 247 + pointer-events: none; 248 + filter: drop-shadow(0 0 10px var(--bg-color)) drop-shadow(0 0 10px var(--bg-color)) drop-shadow(0 0 10px var(--bg-color)) drop-shadow(0 0 10px var(--bg-color)) drop-shadow(0 0 10px var(--bg-color)); 249 + opacity: 0.75; 250 + } 251 + .status .media-video:hover:after { 252 + opacity: 1; 253 + } 254 + .status .media-gif video { 255 + object-fit: cover; 256 + } 257 + .status .media-audio { 258 + outline: 0; 259 + } 260 + .status .media-audio audio { 261 + width: 100%; 262 + } 263 + 264 + /* CARD */ 265 + 266 + .card { 267 + display: flex; 268 + margin-top: 8px; 269 + border-radius: 8px; 270 + outline: 1px solid var(--outline-color); 271 + overflow: hidden; 272 + gap: 8px; 273 + color: inherit; 274 + align-items: center; 275 + background: var(--bg-color); 276 + } 277 + .card .image { 278 + min-width: 120px; 279 + max-width: 160px; 280 + height: auto; 281 + min-height: 120px; 282 + max-height: 160px; 283 + object-fit: cover; 284 + outline: 1px solid var(--outline-color); 285 + } 286 + .card:hover .image { 287 + animation: position-object 5s ease-in-out 1s infinite; 288 + } 289 + .card p { 290 + margin: 0; 291 + } 292 + .card .meta-container { 293 + padding: 4px; 294 + } 295 + .card .title { 296 + font-weight: normal; 297 + text-overflow: ellipsis; 298 + overflow: hidden; 299 + display: -webkit-box; 300 + display: box; 301 + -webkit-box-orient: vertical; 302 + box-orient: vertical; 303 + -webkit-line-clamp: 2; 304 + line-clamp: 2; 305 + } 306 + .card .meta { 307 + font-size: smaller; 308 + opacity: 0.75; 309 + margin: 0; 310 + } 311 + .card .meta.domain { 312 + opacity: 1; 313 + color: var(--link-color); 314 + } 315 + a.card { 316 + text-decoration: none; 317 + transition: opacity 0.2s ease-in-out; 318 + } 319 + a.card:hover { 320 + outline: 1px solid var(--outline-hover-color); 321 + } 322 + .card.video { 323 + max-width: 320px; 324 + max-height: 320px; 325 + } 326 + .card.video iframe { 327 + width: 100%; 328 + height: 100%; 329 + } 330 + 331 + /* POLLS */ 332 + 333 + .poll-option { 334 + margin-top: 8px; 335 + padding: 8px; 336 + display: flex; 337 + gap: 8px; 338 + justify-content: space-between; 339 + background-image: linear-gradient(to right, var(--link-faded-color), var(--link-faded-color) var(--percentage), transparent var(--percentage), transparent); 340 + border-radius: 8px; 341 + outline: 1px solid rgba(128, 128, 128, .1); 342 + align-items: center; 343 + } 344 + .poll-label { 345 + width: 100%; 346 + display: flex; 347 + gap: 8px; 348 + cursor: pointer; 349 + } 350 + .poll-vote-button { 351 + margin-top: 8px; 352 + } 353 + .poll-meta { 354 + margin: 8px 0; 355 + } 356 + 357 + /* ACTIONS */ 358 + 359 + .status .actions { 360 + margin-left: -8px; /* visual balance */ 361 + padding-top: 16px; 362 + display: flex; 363 + gap: 8px; 364 + justify-content: space-between; 365 + } 366 + .status.large .actions { 367 + /* margin-left: -12px; */ 368 + padding-top: 8px; 369 + padding-bottom: 16px; 370 + margin-left: calc(-50px - 16px); 371 + background-image: linear-gradient(to bottom, var(--bg-color), var(--bg-color) calc(100% - 10px), transparent); 372 + } 373 + .status .actions > * { 374 + opacity: .5; 375 + transition: opacity 0.2s ease-in-out; 376 + } 377 + .status:hover .actions > * { 378 + opacity: 1; 379 + } 380 + .status .actions > button { 381 + min-height: 40px; 382 + min-width: 40px; 383 + padding: 0 8px; 384 + } 385 + .status .actions > button.plain { 386 + color: var(--text-insignificant-color); 387 + } 388 + .status .actions > button.plain:hover { 389 + color: var(--link-color); 390 + background-color: var(--button-plain-bg-hover-color); 391 + } 392 + .status .actions > button.plain.reblog-button:hover { 393 + color: var(--reblog-color); 394 + } 395 + .status .actions > button.plain.reblog-button.reblogged { 396 + color: var(--reblog-color); 397 + outline: 1.5px solid var(--reblog-color); 398 + } 399 + .status .actions > button.plain.favourite-button:hover { 400 + color: var(--favourite-color); 401 + } 402 + .status .actions > button.plain.favourite-button.favourited { 403 + color: var(--favourite-color); 404 + outline: 1.5px solid var(--favourite-color); 405 + } 406 + .status .actions > button.plain.bookmark-button.bookmarked { 407 + color: var(--link-color); 408 + outline: 1.5px solid var(--link-color); 409 + } 410 + 411 + /* ENHANCED CONTENT */ 412 + 413 + .status .content pre { 414 + border-radius: 8px; 415 + padding: 8px; 416 + margin: 8px 0; 417 + overflow: auto; 418 + width: 100%; 419 + font-size: 90%; 420 + outline: 1px solid var(--outline-color); 421 + background: linear-gradient(to bottom right, var( 422 + --bg-faded-color 423 + ), transparent 160px); 424 + } 425 + 426 + /* MISC */ 427 + 428 + .status-aside { 429 + padding: 0 16px 16px 80px; 430 + color: var(--text-insignificant-color); 431 + } 432 + 433 + .shortcode-emoji { 434 + width: 1.2em; 435 + height: 1.2em; 436 + vertical-align: middle; 437 + object-fit: contain; 438 + }
+835
src/components/status.jsx
··· 1 + import './status.css'; 2 + 3 + import { getBlurHashAverageColor } from 'fast-blurhash'; 4 + import mem from 'mem'; 5 + import { useEffect, useRef, useState } from 'preact/hooks'; 6 + import { useSnapshot } from 'valtio'; 7 + 8 + import Modal from '../components/modal'; 9 + import NameText from '../components/name-text'; 10 + import enhanceContent from '../utils/enhance-content'; 11 + import shortenNumber from '../utils/shorten-number'; 12 + import states from '../utils/states'; 13 + import visibilityIconsMap from '../utils/visibility-icons-map'; 14 + 15 + import Avatar from './avatar'; 16 + import Icon from './icon'; 17 + 18 + /* 19 + Media type 20 + === 21 + unknown = unsupported or unrecognized file type 22 + image = Static image 23 + gifv = Looping, soundless animation 24 + video = Video clip 25 + audio = Audio track 26 + */ 27 + 28 + function Media({ media, showOriginal, onClick }) { 29 + const { blurhash, description, meta, previewUrl, remoteUrl, url, type } = 30 + media; 31 + const { original, small, focus } = meta || {}; 32 + 33 + const width = showOriginal ? original?.width : small?.width; 34 + const height = showOriginal ? original?.height : small?.height; 35 + const mediaURL = showOriginal ? url : previewUrl; 36 + 37 + const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null; 38 + 39 + const videoRef = useRef(); 40 + 41 + let focalBackgroundPosition; 42 + if (focus) { 43 + // Convert focal point to CSS background position 44 + // Formula from jquery-focuspoint 45 + // x = -1, y = 1 => 0% 0% 46 + // x = 0, y = 0 => 50% 50% 47 + // x = 1, y = -1 => 100% 100% 48 + const x = ((focus.x + 1) / 2) * 100; 49 + const y = ((1 - focus.y) / 2) * 100; 50 + focalBackgroundPosition = `${x.toFixed(0)}% ${y.toFixed(0)}%`; 51 + } 52 + 53 + if (type === 'image') { 54 + return ( 55 + <div 56 + class={`media media-image`} 57 + onClick={onClick} 58 + style={ 59 + showOriginal && { 60 + backgroundImage: `url(${previewUrl})`, 61 + backgroundSize: 'contain', 62 + backgroundRepeat: 'no-repeat', 63 + backgroundPosition: focalBackgroundPosition || 'center', 64 + aspectRatio: `${width}/${height}`, 65 + width, 66 + height, 67 + maxWidth: '100%', 68 + maxHeight: '100%', 69 + display: 'flex', 70 + justifyContent: 'center', 71 + alignItems: 'center', 72 + } 73 + } 74 + > 75 + <img 76 + src={mediaURL} 77 + alt={description} 78 + width={width} 79 + height={height} 80 + style={ 81 + !showOriginal && { 82 + backgroundColor: `rgb(${rgbAverageColor.join(',')})`, 83 + backgroundPosition: focalBackgroundPosition || 'center', 84 + } 85 + } 86 + /> 87 + </div> 88 + ); 89 + } else if (type === 'gifv' || type === 'video') { 90 + // 20 seconds, treat as a gif 91 + const isGIF = type === 'gifv' && original.duration <= 20; 92 + return ( 93 + <div 94 + class={`media media-${isGIF ? 'gif' : 'video'}`} 95 + style={{ 96 + backgroundColor: `rgb(${rgbAverageColor.join(',')})`, 97 + }} 98 + onClick={onClick} 99 + onMouseEnter={() => { 100 + if (isGIF) { 101 + try { 102 + videoRef.current?.play(); 103 + } catch (e) {} 104 + } 105 + }} 106 + onMouseLeave={() => { 107 + if (isGIF) { 108 + try { 109 + videoRef.current?.pause(); 110 + } catch (e) {} 111 + } 112 + }} 113 + > 114 + {showOriginal ? ( 115 + <video 116 + src={url} 117 + poster={previewUrl} 118 + width={width} 119 + height={height} 120 + preload 121 + autoplay 122 + controls={!isGIF} 123 + playsinline 124 + loop 125 + ></video> 126 + ) : isGIF ? ( 127 + <video 128 + ref={videoRef} 129 + src={url} 130 + poster={previewUrl} 131 + width={width} 132 + height={height} 133 + preload 134 + // controls 135 + playsinline 136 + loop 137 + muted 138 + /> 139 + ) : ( 140 + <img 141 + src={previewUrl} 142 + alt={description} 143 + width={width} 144 + height={height} 145 + /> 146 + )} 147 + </div> 148 + ); 149 + } else if (type === 'audio') { 150 + return ( 151 + <div class="media media-audio"> 152 + <audio src={remoteUrl || url} preload="none" controls /> 153 + </div> 154 + ); 155 + } 156 + } 157 + 158 + function Card({ card }) { 159 + const { 160 + blurhash, 161 + title, 162 + description, 163 + html, 164 + providerName, 165 + authorName, 166 + width, 167 + height, 168 + image, 169 + url, 170 + type, 171 + embedUrl, 172 + } = card; 173 + 174 + /* type 175 + link = Link OEmbed 176 + photo = Photo OEmbed 177 + video = Video OEmbed 178 + rich = iframe OEmbed. Not currently accepted, so won’t show up in practice. 179 + */ 180 + 181 + const hasText = title || providerName || authorName; 182 + 183 + if (hasText && image) { 184 + const domain = new URL(url).hostname; 185 + return ( 186 + <a 187 + href={url} 188 + target="_blank" 189 + rel="nofollow noopener noreferrer" 190 + class="card link" 191 + > 192 + <img 193 + class="image" 194 + src={image} 195 + width={width} 196 + height={height} 197 + alt="" 198 + onError={() => { 199 + this.style.display = 'none'; 200 + }} 201 + /> 202 + <div class="meta-container"> 203 + <p 204 + class="title" 205 + dangerouslySetInnerHTML={{ 206 + __html: title, 207 + }} 208 + /> 209 + <p class="meta">{providerName || authorName}</p> 210 + <p class="meta domain">{domain}</p> 211 + </div> 212 + </a> 213 + ); 214 + } else if (type === 'photo') { 215 + return ( 216 + <a 217 + href={url} 218 + target="_blank" 219 + rel="nofollow noopener noreferrer" 220 + class="card photo" 221 + > 222 + <img 223 + src={embedUrl} 224 + width={width} 225 + height={height} 226 + alt={title || description} 227 + style={{ 228 + height: 'auto', 229 + aspectRatio: `${width}/${height}`, 230 + }} 231 + /> 232 + </a> 233 + ); 234 + } else if (type === 'video') { 235 + return ( 236 + <div 237 + class="card video" 238 + style={{ 239 + aspectRatio: `${width}/${height}`, 240 + }} 241 + dangerouslySetInnerHTML={{ __html: html }} 242 + /> 243 + ); 244 + } 245 + } 246 + 247 + function Poll({ poll }) { 248 + const [pollSnapshot, setPollSnapshot] = useState(poll); 249 + const [uiState, setUIState] = useState('default'); 250 + 251 + const { 252 + expired, 253 + expiresAt, 254 + id, 255 + multiple, 256 + options, 257 + ownVotes, 258 + voted, 259 + votersCount, 260 + votesCount, 261 + } = pollSnapshot; 262 + 263 + const expiresAtDate = new Date(expiresAt); 264 + 265 + return ( 266 + <div class="poll"> 267 + {voted || expired ? ( 268 + options.map((option, i) => { 269 + const { title, votesCount: optionVotesCount } = option; 270 + const percentage = Math.round((optionVotesCount / votesCount) * 100); 271 + return ( 272 + <div 273 + class="poll-option" 274 + style={{ 275 + '--percentage': `${percentage}%`, 276 + }} 277 + > 278 + <div class="poll-option-title"> 279 + {title} 280 + {voted && ownVotes.includes(i) && ( 281 + <> 282 + {' '} 283 + <Icon icon="check" size="s" /> 284 + </> 285 + )} 286 + </div> 287 + <div 288 + class="poll-option-votes" 289 + title={`${optionVotesCount} vote${ 290 + optionVotesCount === 1 ? '' : 's' 291 + }`} 292 + > 293 + {percentage}% 294 + </div> 295 + </div> 296 + ); 297 + }) 298 + ) : ( 299 + <form 300 + onSubmit={async (e) => { 301 + e.preventDefault(); 302 + const form = e.target; 303 + const formData = new FormData(form); 304 + const votes = []; 305 + formData.forEach((value, key) => { 306 + if (key === 'poll') { 307 + votes.push(value); 308 + } 309 + }); 310 + console.log(votes); 311 + setUIState('loading'); 312 + const pollResponse = await masto.poll.vote(id, { 313 + choices: votes, 314 + }); 315 + console.log(pollResponse); 316 + setPollSnapshot(pollResponse); 317 + setUIState('default'); 318 + }} 319 + style={{ 320 + pointerEvents: uiState === 'loading' ? 'none' : 'auto', 321 + opacity: uiState === 'loading' ? 0.5 : 1, 322 + }} 323 + > 324 + {options.map((option, i) => { 325 + const { title } = option; 326 + return ( 327 + <div class="poll-option"> 328 + <label class="poll-label"> 329 + <input 330 + type={multiple ? 'checkbox' : 'radio'} 331 + name="poll" 332 + value={i} 333 + disabled={uiState === 'loading'} 334 + /> 335 + <span class="poll-option-title">{title}</span> 336 + </label> 337 + </div> 338 + ); 339 + })} 340 + <button 341 + class="poll-vote-button" 342 + type="submit" 343 + disabled={uiState === 'loading'} 344 + > 345 + Vote 346 + </button> 347 + </form> 348 + )} 349 + <p class="poll-meta"> 350 + <span title={votersCount}>{shortenNumber(votersCount)}</span>{' '} 351 + {votersCount === 1 ? 'voter' : 'voters'} 352 + {votersCount !== votesCount && ( 353 + <> 354 + {' '} 355 + &bull; <span title={votesCount}> 356 + {shortenNumber(votesCount)} 357 + </span>{' '} 358 + vote 359 + {votesCount === 1 ? '' : 's'} 360 + </> 361 + )}{' '} 362 + &bull; {expired ? 'Ended' : 'Ending'}{' '} 363 + <relative-time datetime={expiresAtDate.toISOString()} /> 364 + </p> 365 + </div> 366 + ); 367 + } 368 + 369 + function fetchAccount(id) { 370 + return masto.accounts.fetch(id); 371 + } 372 + const memFetchAccount = mem(fetchAccount); 373 + 374 + function Status({ statusID, status, withinContext, size = 'm', skeleton }) { 375 + if (skeleton) { 376 + return ( 377 + <div class="status skeleton"> 378 + <Avatar size="xxl" /> 379 + <div class="container"> 380 + <div class="meta">███ ████████████</div> 381 + <div class="content-container"> 382 + <div class="content"> 383 + <p>████ ████████████</p> 384 + </div> 385 + </div> 386 + </div> 387 + </div> 388 + ); 389 + } 390 + 391 + const snapStates = useSnapshot(states); 392 + if (!status) { 393 + status = snapStates.statuses.get(statusID); 394 + } 395 + if (!status) { 396 + return null; 397 + } 398 + 399 + const { 400 + account: { 401 + acct, 402 + avatar, 403 + avatarStatic, 404 + id: accountId, 405 + url, 406 + displayName, 407 + username, 408 + emojis: accountEmojis, 409 + }, 410 + id, 411 + repliesCount, 412 + reblogged, 413 + reblogsCount, 414 + favourited, 415 + favouritesCount, 416 + bookmarked, 417 + poll, 418 + muted, 419 + sensitive, 420 + spoilerText, 421 + visibility, // public, unlisted, private, direct 422 + language, 423 + editedAt, 424 + filtered, 425 + card, 426 + createdAt, 427 + inReplyToAccountId, 428 + content, 429 + mentions, 430 + mediaAttachments, 431 + reblog, 432 + uri, 433 + emojis, 434 + } = status; 435 + 436 + const createdAtDate = new Date(createdAt); 437 + 438 + let inReplyToAccountRef = mentions.find( 439 + (mention) => mention.id === inReplyToAccountId, 440 + ); 441 + if (!inReplyToAccountRef && inReplyToAccountId === id) { 442 + inReplyToAccountRef = { url, username, displayName }; 443 + } 444 + const [inReplyToAccount, setInReplyToAccount] = useState(inReplyToAccountRef); 445 + if (!withinContext && !inReplyToAccount && inReplyToAccountId) { 446 + const account = states.accounts.get(inReplyToAccountId); 447 + if (account) { 448 + setInReplyToAccount(account); 449 + } else { 450 + memFetchAccount(inReplyToAccountId) 451 + .then((account) => { 452 + setInReplyToAccount(account); 453 + states.accounts.set(account.id, account); 454 + }) 455 + .catch((e) => {}); 456 + } 457 + } 458 + 459 + const [showSpoiler, setShowSpoiler] = useState(false); 460 + 461 + const debugHover = (e) => { 462 + if (e.shiftKey) { 463 + console.log(status); 464 + } 465 + }; 466 + 467 + const [showMediaModal, setShowMediaModal] = useState(false); 468 + const carouselFocusItem = useRef(null); 469 + const prevShowMediaModal = useRef(showMediaModal); 470 + useEffect(() => { 471 + if (showMediaModal !== false) { 472 + carouselFocusItem.current?.scrollIntoView({ 473 + behavior: prevShowMediaModal.current === false ? 'auto' : 'smooth', 474 + }); 475 + } 476 + prevShowMediaModal.current = showMediaModal; 477 + }, [showMediaModal]); 478 + 479 + if (reblog) { 480 + return ( 481 + <div class="status-reblog" onMouseEnter={debugHover}> 482 + <div class="status-pre-meta"> 483 + <Icon icon="rocket" size="l" />{' '} 484 + <NameText account={status.account} showAvatar /> boosted 485 + </div> 486 + <Status status={reblog} size={size} /> 487 + </div> 488 + ); 489 + } 490 + 491 + return ( 492 + <div 493 + class={`status ${ 494 + !withinContext && inReplyToAccount ? 'status-reply-to' : '' 495 + } ${ 496 + { 497 + s: 'small', 498 + m: 'medium', 499 + l: 'large', 500 + }[size] 501 + }`} 502 + onMouseEnter={debugHover} 503 + > 504 + {size !== 's' && ( 505 + <a 506 + href={url} 507 + target="_blank" 508 + title={`@${acct}`} 509 + onClick={(e) => { 510 + e.preventDefault(); 511 + e.stopPropagation(); 512 + states.showAccount = status.account; 513 + }} 514 + > 515 + <Avatar url={avatarStatic} size="xxl" /> 516 + </a> 517 + )} 518 + <div class="container"> 519 + <div class="meta"> 520 + <span> 521 + <NameText 522 + account={status.account} 523 + showAvatar={size === 's'} 524 + showAcct={size === 'l'} 525 + /> 526 + {inReplyToAccount && !withinContext && size !== 's' && ( 527 + <> 528 + {' '} 529 + <span class="ib"> 530 + <Icon icon="arrow-right" class="arrow" />{' '} 531 + <NameText account={inReplyToAccount} short /> 532 + </span> 533 + </> 534 + )} 535 + </span>{' '} 536 + <a href={uri} target="_blank" class="time"> 537 + <Icon 538 + icon={visibilityIconsMap[visibility]} 539 + alt={visibility} 540 + size="s" 541 + />{' '} 542 + <relative-time 543 + datetime={createdAtDate.toISOString()} 544 + format="micro" 545 + threshold="P1D" 546 + prefix="" 547 + > 548 + {createdAtDate.toLocaleString()} 549 + </relative-time> 550 + </a> 551 + </div> 552 + <div 553 + class={`content-container ${ 554 + sensitive || spoilerText ? 'has-spoiler' : '' 555 + } ${showSpoiler ? 'show-spoiler' : ''}`} 556 + > 557 + {!!spoilerText && sensitive && ( 558 + <> 559 + <div class="content"> 560 + <p>{spoilerText}</p> 561 + </div> 562 + <button 563 + class="light spoiler" 564 + type="button" 565 + onClick={(e) => { 566 + e.preventDefault(); 567 + e.stopPropagation(); 568 + setShowSpoiler(!showSpoiler); 569 + }} 570 + > 571 + <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '} 572 + {showSpoiler ? 'Show less' : 'Show more'} 573 + </button> 574 + </> 575 + )} 576 + <div 577 + class="content" 578 + onClick={(e) => { 579 + let { target } = e; 580 + if (target.parentNode.tagName.toLowerCase() === 'a') { 581 + target = target.parentNode; 582 + } 583 + console.log('click', target, e); 584 + if ( 585 + target.tagName.toLowerCase() === 'a' && 586 + target.classList.contains('mention') 587 + ) { 588 + e.preventDefault(); 589 + e.stopPropagation(); 590 + const username = target.querySelector('span'); 591 + const mention = mentions.find( 592 + (mention) => mention.username === username?.innerText.trim(), 593 + ); 594 + if (mention) { 595 + states.showAccount = mention.acct; 596 + } else { 597 + const href = target.getAttribute('href'); 598 + states.showAccount = href; 599 + } 600 + } 601 + }} 602 + dangerouslySetInnerHTML={{ 603 + __html: enhanceContent(content, { 604 + emojis, 605 + }), 606 + }} 607 + /> 608 + {!!poll && <Poll poll={poll} />} 609 + {!spoilerText && sensitive && !!mediaAttachments.length && ( 610 + <button 611 + class="plain spoiler" 612 + type="button" 613 + onClick={(e) => { 614 + e.preventDefault(); 615 + e.stopPropagation(); 616 + setShowSpoiler(!showSpoiler); 617 + }} 618 + > 619 + <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} /> Sensitive 620 + content 621 + </button> 622 + )} 623 + {!!mediaAttachments.length && size !== 's' && ( 624 + <div class="media-container"> 625 + {mediaAttachments.map((media, i) => ( 626 + <Media 627 + media={media} 628 + onClick={(e) => { 629 + e.preventDefault(); 630 + e.stopPropagation(); 631 + setShowMediaModal(i); 632 + }} 633 + /> 634 + ))} 635 + </div> 636 + )} 637 + {!!card && 638 + (size === 'l' || 639 + (size === 'm' && !poll && !mediaAttachments.length)) && ( 640 + <Card card={card} /> 641 + )} 642 + </div> 643 + {size === 'l' && ( 644 + <div class="actions"> 645 + <button 646 + type="button" 647 + title="Comment" 648 + class="plain reply-button" 649 + onClick={(e) => { 650 + e.preventDefault(); 651 + e.stopPropagation(); 652 + states.showCompose = { 653 + replyToStatus: status, 654 + }; 655 + }} 656 + > 657 + <Icon icon="comment" size="l" alt="Reply" /> 658 + {!!repliesCount && ( 659 + <> 660 + {' '} 661 + <small>{shortenNumber(repliesCount)}</small> 662 + </> 663 + )} 664 + </button> 665 + {/* TODO: if visibility = private, only can reblog own statuses */} 666 + {visibility !== 'direct' && ( 667 + <button 668 + type="button" 669 + title={reblogged ? 'Unboost' : 'Boost'} 670 + class={`plain reblog-button ${reblogged ? 'reblogged' : ''}`} 671 + onClick={async (e) => { 672 + e.preventDefault(); 673 + e.stopPropagation(); 674 + const yes = confirm( 675 + reblogged ? 'Unboost this status?' : 'Boost this status?', 676 + ); 677 + if (!yes) return; 678 + if (reblogged) { 679 + const newStatus = await masto.statuses.unreblog(id); 680 + states.statuses.set(newStatus.id, newStatus); 681 + } else { 682 + const newStatus = await masto.statuses.reblog(id); 683 + states.statuses.set(newStatus.id, newStatus); 684 + states.statuses.set(newStatus.reblog.id, newStatus.reblog); 685 + } 686 + }} 687 + > 688 + <Icon 689 + icon="rocket" 690 + size="l" 691 + alt={reblogged ? 'Boosted' : 'Boost'} 692 + /> 693 + {!!reblogsCount && ( 694 + <> 695 + {' '} 696 + <small>{shortenNumber(reblogsCount)}</small> 697 + </> 698 + )} 699 + </button> 700 + )} 701 + <button 702 + type="button" 703 + title={favourited ? 'Unfavourite' : 'Favourite'} 704 + class={`plain favourite-button ${favourited ? 'favourited' : ''}`} 705 + onClick={async (e) => { 706 + e.preventDefault(); 707 + e.stopPropagation(); 708 + try { 709 + if (favourited) { 710 + const newStatus = await masto.statuses.unfavourite(id); 711 + states.statuses.set(newStatus.id, newStatus); 712 + } else { 713 + const newStatus = await masto.statuses.favourite(id); 714 + states.statuses.set(newStatus.id, newStatus); 715 + } 716 + } catch (e) {} 717 + }} 718 + > 719 + <Icon 720 + icon="heart" 721 + size="l" 722 + alt={favourited ? 'Favourited' : 'Favourite'} 723 + /> 724 + {!!favouritesCount && ( 725 + <> 726 + {' '} 727 + <small>{shortenNumber(favouritesCount)}</small> 728 + </> 729 + )} 730 + </button> 731 + <button 732 + type="button" 733 + title={bookmarked ? 'Unbookmark' : 'Bookmark'} 734 + class={`plain bookmark-button ${bookmarked ? 'bookmarked' : ''}`} 735 + onClick={async (e) => { 736 + e.preventDefault(); 737 + e.stopPropagation(); 738 + try { 739 + if (bookmarked) { 740 + const newStatus = await masto.statuses.unbookmark(id); 741 + states.statuses.set(newStatus.id, newStatus); 742 + } else { 743 + const newStatus = await masto.statuses.bookmark(id); 744 + states.statuses.set(newStatus.id, newStatus); 745 + } 746 + } catch (e) {} 747 + }} 748 + > 749 + <Icon 750 + icon="bookmark" 751 + size="l" 752 + alt={bookmarked ? 'Bookmarked' : 'Bookmark'} 753 + /> 754 + </button> 755 + </div> 756 + )} 757 + </div> 758 + {showMediaModal !== false && ( 759 + <Modal> 760 + <div 761 + class="carousel" 762 + onClick={() => { 763 + setShowMediaModal(false); 764 + }} 765 + tabindex="0" 766 + > 767 + {mediaAttachments?.map((media, i) => ( 768 + <div 769 + class="carousel-item" 770 + tabindex="0" 771 + key={media.id} 772 + ref={i === showMediaModal ? carouselFocusItem : null} 773 + > 774 + <Media media={media} showOriginal /> 775 + </div> 776 + ))} 777 + </div> 778 + {mediaAttachments?.length > 1 && ( 779 + <div class="carousel-controls"> 780 + <button 781 + type="button" 782 + class="carousel-button plain" 783 + hidden={showMediaModal === 0} 784 + onClick={(e) => { 785 + e.preventDefault(); 786 + e.stopPropagation(); 787 + setShowMediaModal( 788 + (showMediaModal - 1 + mediaAttachments.length) % 789 + mediaAttachments.length, 790 + ); 791 + }} 792 + > 793 + <Icon icon="arrow-left" /> 794 + </button> 795 + <span class="carousel-dots"> 796 + {mediaAttachments?.map((media, i) => ( 797 + <button 798 + key={media.id} 799 + type="button" 800 + class={`plain carousel-dot ${ 801 + i === showMediaModal ? 'active' : '' 802 + }`} 803 + onClick={(e) => { 804 + e.preventDefault(); 805 + e.stopPropagation(); 806 + setShowMediaModal(i); 807 + }} 808 + > 809 + &bull; 810 + </button> 811 + ))} 812 + </span> 813 + <button 814 + type="button" 815 + class="carousel-button plain" 816 + hidden={showMediaModal === mediaAttachments.length - 1} 817 + onClick={(e) => { 818 + e.preventDefault(); 819 + e.stopPropagation(); 820 + setShowMediaModal( 821 + (showMediaModal + 1) % mediaAttachments.length, 822 + ); 823 + }} 824 + > 825 + <Icon icon="arrow-right" /> 826 + </button> 827 + </div> 828 + )} 829 + </Modal> 830 + )} 831 + </div> 832 + ); 833 + } 834 + 835 + export default Status;
+202
src/data/instances.json
··· 1 + [ 2 + "mastodon.social", 3 + "mastodon.world", 4 + "mas.to", 5 + "pawoo.net", 6 + "mastodon.online", 7 + "mstdn.jp", 8 + "universeodon.com", 9 + "mastodon.lol", 10 + "mastodonapp.uk", 11 + "infosec.exchange", 12 + "mastodon.uno", 13 + "techhub.social", 14 + "mastodon.sdf.org", 15 + "fosstodon.org", 16 + "troet.cafe", 17 + "masto.ai", 18 + "mstdn.party", 19 + "c.im", 20 + "hachyderm.io", 21 + "m.cmx.im", 22 + "mstdn.ca", 23 + "sfba.social", 24 + "kolektiva.social", 25 + "mastodon.scot", 26 + "ohai.social", 27 + "fedibird.com", 28 + "piaille.fr", 29 + "home.social", 30 + "mindly.social", 31 + "mastodon.nl", 32 + "toot.community", 33 + "aus.social", 34 + "thu.closed.social", 35 + "mastodon.gamedev.place", 36 + "nerdculture.de", 37 + "mastodon.cloud", 38 + "mastodon.ie", 39 + "det.social", 40 + "mastodon.au", 41 + "nrw.social", 42 + "mastodon.art", 43 + "chaos.social", 44 + "norden.social", 45 + "ioc.exchange", 46 + "alive.bar", 47 + "tkz.one", 48 + "sueden.social", 49 + "mastodon.nu", 50 + "mastodon.top", 51 + "mastouille.fr", 52 + "mastodontech.de", 53 + "o3o.ca", 54 + "social.tchncs.de", 55 + "noagendasocial.com", 56 + "newsie.social", 57 + "masto.es", 58 + "planet.moe", 59 + "social.vivaldi.net", 60 + "ravenation.club", 61 + "wxw.moe", 62 + "mathstodon.xyz", 63 + "social.cologne", 64 + "mastodon.nz", 65 + "qoto.org", 66 + "hessen.social", 67 + "mastodon.com.tr", 68 + "ruhr.social", 69 + "muenchen.social", 70 + "mamot.fr", 71 + "twit.social", 72 + "dice.camp", 73 + "meow.social", 74 + "www.masto.pt", 75 + "social.anoxinon.de", 76 + "www.sociale.network", 77 + "tech.lgbt", 78 + "econtwitter.net", 79 + "masthead.social", 80 + "glasgow.social", 81 + "ieji.de", 82 + "toot.wales", 83 + "ecoevo.social", 84 + "ro-mastodon.puyo.jp", 85 + "noc.social", 86 + "indieweb.social", 87 + "zirk.us", 88 + "twingyeo.kr", 89 + "social.linux.pizza", 90 + "mastodont.cat", 91 + "social.dev-wiki.de", 92 + "mastodonczech.cz", 93 + "climatejustice.social", 94 + "eldritch.cafe", 95 + "g0v.social", 96 + "socel.net", 97 + "dju.social", 98 + "mastodontti.fi", 99 + "101010.pl", 100 + "framapiaf.org", 101 + "wien.rocks", 102 + "botsin.space", 103 + "mastodon.bida.im", 104 + "bildung.social", 105 + "pouet.chapril.org", 106 + "urbanists.social", 107 + "wandering.shop", 108 + "masto.pt", 109 + "union.place", 110 + "metalhead.club", 111 + "ruby.social", 112 + "hiveway.net", 113 + "h4.io", 114 + "genomic.social", 115 + "mastodon-belgium.be", 116 + "mastodon.xyz", 117 + "octodon.social", 118 + "pol.social", 119 + "tooot.im", 120 + "berlin.social", 121 + "sciences.social", 122 + "mstdn.guru", 123 + "qdon.space", 124 + "mastodon.radio", 125 + "lile.cl", 126 + "masto.nu", 127 + "witches.live", 128 + "mastodonners.nl", 129 + "muenster.im", 130 + "lor.sh", 131 + "phpc.social", 132 + "pewtix.com", 133 + "social.librem.one", 134 + "rollenspiel.social", 135 + "peoplemaking.games", 136 + "kinky.business", 137 + "mastodon.fun", 138 + "me.ns.ci", 139 + "mastodon.eus", 140 + "dresden.network", 141 + "hostux.social", 142 + "scholar.social", 143 + "freiburg.social", 144 + "todon.eu", 145 + "writing.exchange", 146 + "toot.aquilenet.fr", 147 + "digitalcourage.social", 148 + "rheinneckar.social", 149 + "discuss.systems", 150 + "defcon.social", 151 + "snabelen.no", 152 + "mastodon.se", 153 + "rubber.social", 154 + "fulda.social", 155 + "vis.social", 156 + "toot.funami.tech", 157 + "mast.dragon-fly.club", 158 + "disabled.social", 159 + "medibubble.org", 160 + "mastodon.technology", 161 + "vmst.io", 162 + "mstdn.io", 163 + "equestria.social", 164 + "vocalodon.net", 165 + "mastodon.ml", 166 + "libretooth.gr", 167 + "tooting.ch", 168 + "dizl.de", 169 + "best-friends.chat", 170 + "romancelandia.club", 171 + "queer.party", 172 + "tilde.zone", 173 + "xarxa.cloud", 174 + "abdl.link", 175 + "bitcoinhackers.org", 176 + "photog.social", 177 + "macaw.social", 178 + "yiff.life", 179 + "sociale.network", 180 + "ursal.zone", 181 + "eupolicy.social", 182 + "gruene.social", 183 + "artisan.chat", 184 + "graz.social", 185 + "social.coop", 186 + "mstdn.id", 187 + "social.sciences.re", 188 + "ludosphere.fr", 189 + "social.politicaconciencia.org", 190 + "oslo.town", 191 + "scicomm.xyz", 192 + "floss.social", 193 + "creators.social", 194 + "tabletop.social", 195 + "bonn.social", 196 + "openbiblio.social", 197 + "mastodon.la", 198 + "halifaxsocial.ca", 199 + "freeradical.zone", 200 + "kfem.cat", 201 + "federated.press" 202 + ]
+191
src/index.css
··· 1 + :root { 2 + --blue-color: royalblue; 3 + --purple-color: blueviolet; 4 + --green-color: green; 5 + --orange-color: orange; 6 + --red-color: orangered; 7 + --bg-color: #fff; 8 + --bg-faded-color: #f0f2f5; 9 + --bg-blur-color: #fff9; 10 + --bg-faded-blur-color: #f0f2f599; 11 + --text-color: #1c1e21; 12 + --text-insignificant-color: #1c1e2199; 13 + --link-color: var(--blue-color); 14 + --link-light-color: #4169e199; 15 + --link-faded-color: #4169e122; 16 + --link-bg-hover-color: #f0f2f599; 17 + --button-bg-color: var(--blue-color); 18 + --button-bg-blur-color: #4169e1aa; 19 + --button-text-color: white; 20 + --button-plain-bg-hover-color: rgba(128, 128, 128, 0.1); 21 + --reblog-color: var(--purple-color); 22 + --reblog-faded-color: #892be220; 23 + --reply-to-color: var(--orange-color); 24 + --favourite-color: var(--red-color); 25 + --reply-to-faded-color: #ffa6001a; 26 + --outline-color: rgba(128, 128, 128, .2); 27 + --outline-hover-color: rgba(128, 128, 128, .7); 28 + --divider-color: rgba(0, 0, 0, 0.1); 29 + --backdrop-color: rgba(255, 255, 255, 0.5); 30 + --img-bg-color: rgba(128, 128, 128, 0.2); 31 + --loader-color: #1c1e2199; 32 + --comment-line-color: #e5e5e5; 33 + } 34 + 35 + @media (prefers-color-scheme: dark) { 36 + :root { 37 + --blue-color: CornflowerBlue; 38 + --purple-color: mediumpurple; 39 + --green-color: MediumSeaGreen; 40 + --bg-color: #242526; 41 + --bg-faded-color: #18191a; 42 + --bg-blur-color: #0009; 43 + --bg-faded-blur-color: #18191a99; 44 + --text-color: #f0f2f5; 45 + --text-insignificant-color: #f0f2f599; 46 + --link-bg-hover-color: #34353799; 47 + --divider-color: rgba(255, 255, 255, 0.1); 48 + --bg-blur-color: #24252699; 49 + --backdrop-color: rgba(0, 0, 0, 0.5); 50 + --comment-line-color: #565656; 51 + } 52 + } 53 + 54 + *, *::before, *::after { 55 + box-sizing: border-box; 56 + } 57 + 58 + body { 59 + font-family: system-ui, -apple-system, BlinkMacSystemFont, '.SFNSText-Regular', sans-serif; 60 + font-size: 15px; 61 + word-wrap: break-word; 62 + overflow-wrap: break-word; 63 + } 64 + 65 + a { 66 + color: var(--link-color); 67 + text-decoration-color: var(--link-faded-color); 68 + text-decoration-thickness: 2px; 69 + text-underline-offset: 2px; 70 + overflow-wrap: anywhere; 71 + } 72 + a:hover { 73 + text-decoration-color: var(--link-color); 74 + } 75 + 76 + img { 77 + max-width: 100%; 78 + } 79 + 80 + hr { 81 + height: 2px; 82 + border: 0; 83 + padding: 0; 84 + margin: 16px 0; 85 + background-image: linear-gradient(to right, transparent, var(--divider-color), transparent); 86 + } 87 + 88 + button, input, select, textarea { 89 + font-family: inherit; 90 + font-size: inherit; 91 + line-height: inherit; 92 + max-width: 100%; 93 + } 94 + 95 + button, .button { 96 + display: inline-block; 97 + margin: 2px; 98 + padding: 8px 12px; 99 + border-radius: 2.5em; 100 + border: 0; 101 + background-color: var(--button-bg-color); 102 + color: var(--button-text-color); 103 + cursor: pointer; 104 + line-height: 1; 105 + vertical-align: middle; 106 + text-decoration: none; 107 + } 108 + button > * { 109 + vertical-align: middle; 110 + } 111 + :is(button, .button):not([disabled]):hover { 112 + filter: brightness(1.2); 113 + } 114 + :is(button, .button):active { 115 + filter: brightness(0.8); 116 + } 117 + :is(button, .button)[disabled] { 118 + cursor: auto; 119 + opacity: 0.5; 120 + } 121 + 122 + :is(button, .button).plain { 123 + background-color: transparent; 124 + color: var(--link-color); 125 + backdrop-filter: blur(12px); 126 + } 127 + :is(button, .button).light { 128 + background-color: var(--bg-faded-color); 129 + color: var(--text-color); 130 + outline: 1px solid var(--outline-color); 131 + } 132 + 133 + :is(button, .button).block { 134 + display: block; 135 + width: 100%; 136 + padding: 12px; 137 + } 138 + 139 + input[type="text"], textarea, select { 140 + color: var(--text-color); 141 + background-color: var(--bg-color); 142 + border: 2px solid var(--divider-color); 143 + padding: 8px; 144 + border-radius: 4px; 145 + } 146 + input[type="text"]:focus, textarea:focus, select:focus { 147 + border-color: var(--outline-color); 148 + } 149 + input[type="text"].large, textarea.large, select.large, button.large { 150 + font-size: 125%; 151 + padding: 12px; 152 + } 153 + 154 + button.small { 155 + font-size: 90%; 156 + padding: 4px 8px; 157 + } 158 + 159 + select.plain { 160 + border: 0; 161 + background-color: transparent; 162 + } 163 + 164 + @media (prefers-color-scheme: dark) { 165 + img, video { 166 + filter: brightness(0.7); 167 + transition: filter 0.3s ease-out; 168 + } 169 + img:hover, video:hover { 170 + filter: brightness(1); 171 + } 172 + } 173 + 174 + /* UTILS */ 175 + 176 + .ib { 177 + display: inline-block; 178 + } 179 + 180 + /* KEYFRAMES */ 181 + 182 + @keyframes fade-in { 183 + from { 184 + opacity: 0; 185 + transform: translateY(10px); 186 + } 187 + to { 188 + opacity: 1; 189 + transform: translateY(0); 190 + } 191 + }
+9
src/main.jsx
··· 1 + import { render } from 'preact'; 2 + import { App } from './app'; 3 + 4 + import 'iconify-icon'; 5 + import '@github/time-elements'; 6 + 7 + import './index.css'; 8 + 9 + render(<App />, document.getElementById('app'));
+217
src/pages/home.jsx
··· 1 + import { Link } from 'preact-router/match'; 2 + import { useEffect, useRef, useState } from 'preact/hooks'; 3 + import { InView } from 'react-intersection-observer'; 4 + import { useSnapshot } from 'valtio'; 5 + 6 + import Icon from '../components/icon'; 7 + import Loader from '../components/loader'; 8 + import Status from '../components/status'; 9 + import states from '../utils/states'; 10 + import store from '../utils/store'; 11 + 12 + const LIMIT = 20; 13 + 14 + export default ({ hidden }) => { 15 + const snapStates = useSnapshot(states); 16 + const [uiState, setUIState] = useState('default'); 17 + const [showMore, setShowMore] = useState(false); 18 + 19 + const statusIterator = useRef( 20 + masto.timelines.getHomeIterable({ 21 + limit: LIMIT, 22 + }), 23 + ).current; 24 + async function fetchStatuses(firstLoad) { 25 + const allStatuses = await statusIterator.next( 26 + firstLoad 27 + ? { 28 + limit: LIMIT, 29 + } 30 + : undefined, 31 + ); 32 + if (allStatuses.value <= 0) { 33 + return { done: true }; 34 + } 35 + const homeValues = allStatuses.value.map((status) => { 36 + states.statuses.set(status.id, status); 37 + if (status.reblog) { 38 + states.statuses.set(status.reblog.id, status.reblog); 39 + } 40 + return { 41 + id: status.id, 42 + reblog: status.reblog?.id, 43 + reply: !!status.inReplyToAccountId, 44 + }; 45 + }); 46 + if (firstLoad) { 47 + states.home = homeValues; 48 + } else { 49 + states.home.push(...homeValues); 50 + } 51 + states.homeLastFetchTime = Date.now(); 52 + console.log(allStatuses); 53 + return allStatuses; 54 + } 55 + 56 + const loadStatuses = (firstLoad) => { 57 + setUIState('loading'); 58 + (async () => { 59 + try { 60 + const { done } = await fetchStatuses(firstLoad); 61 + setShowMore(!done); 62 + setUIState('default'); 63 + } catch (e) { 64 + console.warn(e); 65 + setUIState('error'); 66 + } 67 + })(); 68 + }; 69 + 70 + useEffect(() => { 71 + loadStatuses(true); 72 + }, []); 73 + 74 + useEffect(() => { 75 + const handleVisibilityChange = () => { 76 + if (document.hidden) { 77 + const timestamp = Date.now(); 78 + store.session.set('lastHidden', timestamp); 79 + console.log('hidden', timestamp); 80 + } else { 81 + const timestamp = Date.now(); 82 + const lastHidden = store.session.get('lastHidden'); 83 + const diff = timestamp - lastHidden; 84 + const diffMins = Math.round(diff / 1000 / 60); 85 + console.log('visible', { timestamp, diff, diffMins }); 86 + if (diffMins > 1) { 87 + setTimeout(() => { 88 + loadStatuses(true); 89 + states.homeNew = []; 90 + }, 100); 91 + } 92 + } 93 + }; 94 + document.addEventListener('visibilitychange', handleVisibilityChange); 95 + return () => { 96 + document.removeEventListener('visibilitychange', handleVisibilityChange); 97 + }; 98 + }, []); 99 + 100 + const scrollableRef = useRef(); 101 + 102 + return ( 103 + <div class="deck-container" hidden={hidden} ref={scrollableRef}> 104 + <div class="timeline-deck deck"> 105 + <header 106 + onClick={() => { 107 + scrollableRef.current?.scrollTo({ top: 0, behavior: 'smooth' }); 108 + }} 109 + > 110 + <div class="header-side"> 111 + <button 112 + type="button" 113 + class="plain" 114 + onClick={(e) => { 115 + e.preventDefault(); 116 + e.stopPropagation(); 117 + states.showSettings = true; 118 + }} 119 + > 120 + <Icon icon="gear" size="l" alt="Settings" /> 121 + </button> 122 + </div> 123 + <h1>Home</h1> 124 + <div class="header-side"> 125 + <Loader hidden={uiState !== 'loading'} />{' '} 126 + <a 127 + href="#/notifications" 128 + class={`button plain ${ 129 + snapStates.notificationsNew.length > 0 ? 'has-badge' : '' 130 + }`} 131 + > 132 + <Icon icon="notification" size="l" alt="Notifications" /> 133 + </a> 134 + </div> 135 + {snapStates.homeNew.length > 1 && ( 136 + <button 137 + class="updates-button" 138 + type="button" 139 + onClick={() => { 140 + const uniqueHomeNew = snapStates.homeNew.filter( 141 + (status) => !states.home.some((s) => s.id === status.id), 142 + ); 143 + states.home.unshift(...uniqueHomeNew); 144 + loadStatuses(true); 145 + states.homeNew = []; 146 + 147 + scrollableRef.current?.scrollTo({ 148 + top: 0, 149 + behavior: 'smooth', 150 + }); 151 + }} 152 + > 153 + <Icon icon="arrow-up" /> New posts 154 + </button> 155 + )} 156 + </header> 157 + {snapStates.home.length ? ( 158 + <> 159 + <ul class="timeline"> 160 + {snapStates.home.map(({ id: statusID, reblog }) => { 161 + const actualStatusID = reblog || statusID; 162 + return ( 163 + <li key={statusID}> 164 + <Link 165 + activeClassName="active" 166 + class="status-link" 167 + href={`#/s/${actualStatusID}`} 168 + > 169 + <Status statusID={statusID} /> 170 + </Link> 171 + </li> 172 + ); 173 + })} 174 + {showMore && ( 175 + <InView 176 + onChange={(inView) => { 177 + if (inView) loadStatuses(); 178 + }} 179 + > 180 + <li 181 + style={{ 182 + height: '25vh', 183 + }} 184 + > 185 + <Status skeleton /> 186 + </li> 187 + <li 188 + style={{ 189 + height: '25vh', 190 + }} 191 + > 192 + <Status skeleton /> 193 + </li> 194 + </InView> 195 + )} 196 + </ul> 197 + </> 198 + ) : ( 199 + <> 200 + {uiState === 'loading' && ( 201 + <ul class="timeline"> 202 + {Array.from({ length: 5 }).map((_, i) => ( 203 + <li key={i}> 204 + <Status skeleton /> 205 + </li> 206 + ))} 207 + </ul> 208 + )} 209 + {uiState === 'error' && ( 210 + <p class="ui-state">Error loading statuses</p> 211 + )} 212 + </> 213 + )} 214 + </div> 215 + </div> 216 + ); 217 + };
+99
src/pages/login.jsx
··· 1 + import { useEffect, useRef, useState } from 'preact/hooks'; 2 + 3 + import Loader from '../components/loader'; 4 + import instancesList from '../data/instances.json'; 5 + import { getAuthorizationURL, registerApplication } from '../utils/auth'; 6 + import store from '../utils/store'; 7 + import useTitle from '../utils/useTitle'; 8 + 9 + export default () => { 10 + useTitle('Log in'); 11 + const instanceURLRef = useRef(); 12 + const cachedInstanceURL = store.local.get('instanceURL'); 13 + const [uiState, setUIState] = useState('default'); 14 + 15 + useEffect(() => { 16 + if (cachedInstanceURL) { 17 + instanceURLRef.current.value = cachedInstanceURL; 18 + } 19 + }, []); 20 + 21 + const onSubmit = (e) => { 22 + e.preventDefault(); 23 + const { elements } = e.target; 24 + let instanceURL = elements.instanceURL.value; 25 + // Remove protocol from instance URL 26 + instanceURL = instanceURL.replace(/(^\w+:|^)\/\//, ''); 27 + store.local.set('instanceURL', instanceURL); 28 + 29 + (async () => { 30 + setUIState('loading'); 31 + try { 32 + const { client_id, client_secret } = await registerApplication({ 33 + instanceURL, 34 + }); 35 + 36 + if (client_id && client_secret) { 37 + store.session.set('clientID', client_id); 38 + store.session.set('clientSecret', client_secret); 39 + 40 + location.href = await getAuthorizationURL({ 41 + instanceURL, 42 + client_id, 43 + }); 44 + } else { 45 + alert('Failed to register application'); 46 + } 47 + setUIState('default'); 48 + } catch (e) { 49 + console.error(e); 50 + setUIState('error'); 51 + } 52 + })(); 53 + }; 54 + 55 + return ( 56 + <main class="box"> 57 + <form onSubmit={onSubmit}> 58 + <h1>Log in</h1> 59 + <label> 60 + <p>Instance</p> 61 + <input 62 + required 63 + type="text" 64 + class="large" 65 + id="instanceURL" 66 + ref={instanceURLRef} 67 + disabled={uiState === 'loading'} 68 + list="instances-list" 69 + /> 70 + <datalist id="instances-list"> 71 + {instancesList.map((instance) => ( 72 + <option value={instance} /> 73 + ))} 74 + </datalist> 75 + </label> 76 + {uiState === 'error' && ( 77 + <p class="error"> 78 + Failed to log in. Please try again or another instance. 79 + </p> 80 + )} 81 + <p> 82 + <button class="large" disabled={uiState === 'loading'}> 83 + Log in 84 + </button>{' '} 85 + <Loader hidden={uiState !== 'loading'} /> 86 + </p> 87 + <hr /> 88 + <p> 89 + <a href="https://joinmastodon.org/servers" target="_blank"> 90 + Don't have an account? Create one! 91 + </a> 92 + </p> 93 + <p> 94 + <a href="/#">Go home</a> 95 + </p> 96 + </form> 97 + </main> 98 + ); 99 + };
+49
src/pages/notifications.css
··· 1 + .notification { 2 + display: flex; 3 + padding: 16px !important; 4 + gap: 16px; 5 + } 6 + .notification.skeleton { 7 + color: var(--outline-color); 8 + } 9 + 10 + .notification-type { 11 + width: 24px; 12 + flex-shrink: 0; 13 + opacity: 0.75; 14 + color: var(--text-insignificant-color); 15 + } 16 + .notification-type.favourite { 17 + color: var(--favourite-color); 18 + } 19 + .notification-type.reblog { 20 + color: var(--reblog-color); 21 + } 22 + .notification-type.poll, 23 + .notification-type.mention { 24 + color: var(--link-color); 25 + } 26 + 27 + .notification .status-link { 28 + border-radius: 8px 8px 0 0; 29 + border: 1px solid var(--divider-color); 30 + max-height: 160px; 31 + overflow: hidden; 32 + /* fade out mask gradient bottom */ 33 + mask-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 1) 50%, transparent); 34 + filter: saturate(0.25); 35 + } 36 + .notification .status-link:hover { 37 + background-color: var(--bg-blur-color); 38 + filter: saturate(1); 39 + } 40 + .notification .status-link > * { 41 + pointer-events: none; 42 + } 43 + 44 + .notification-content { 45 + flex-grow: 1; 46 + } 47 + .notification-content p:first-child { 48 + margin-top: 0; 49 + }
+292
src/pages/notifications.jsx
··· 1 + import './notifications.css'; 2 + 3 + import { Link } from 'preact-router/match'; 4 + import { useEffect, useRef, useState } from 'preact/hooks'; 5 + import { useSnapshot } from 'valtio'; 6 + 7 + import Icon from '../components/icon'; 8 + import Loader from '../components/loader'; 9 + import NameText from '../components/name-text'; 10 + import Status from '../components/status'; 11 + import states from '../utils/states'; 12 + import useTitle from '../utils/useTitle'; 13 + 14 + /* 15 + Notification types 16 + ================== 17 + mention = Someone mentioned you in their status 18 + status = Someone you enabled notifications for has posted a status 19 + reblog = Someone boosted one of your statuses 20 + follow = Someone followed you 21 + follow_request = Someone requested to follow you 22 + favourite = Someone favourited one of your statuses 23 + poll = A poll you have voted in or created has ended 24 + update = A status you interacted with has been edited 25 + admin.sign_up = Someone signed up (optionally sent to admins) 26 + admin.report = A new report has been filed 27 + */ 28 + 29 + const contentText = { 30 + mention: 'mentioned you in their status.', 31 + status: 'posted a status.', 32 + reblog: 'boosted your status.', 33 + follow: 'followed you.', 34 + follow_request: 'requested to follow you.', 35 + favourite: 'favourited your status.', 36 + poll: 'A poll you have voted in or created has ended.', 37 + update: 'A status you interacted with has been edited.', 38 + }; 39 + 40 + const LIMIT = 20; 41 + 42 + function Notification({ notification }) { 43 + const { id, type, status, account } = notification; 44 + 45 + // status = Attached when type of the notification is favourite, reblog, status, mention, poll, or update 46 + const actualStatusID = status?.reblog?.id || status?.id; 47 + 48 + return ( 49 + <> 50 + <div 51 + class={`notification-type ${type}`} 52 + title={new Date(notification.createdAt).toLocaleString()} 53 + > 54 + <Icon 55 + icon={ 56 + { 57 + mention: 'comment', 58 + status: 'notification', 59 + reblog: 'reblog', 60 + follow: 'follow', 61 + follow_request: 'follow-add', 62 + favourite: 'heart', 63 + poll: 'poll', 64 + update: 'pencil', 65 + }[type] || 'notification' 66 + } 67 + size="xl" 68 + alt={type} 69 + /> 70 + </div> 71 + <div class="notification-content"> 72 + <p> 73 + {!/poll|update/i.test(type) && ( 74 + <> 75 + <NameText account={account} showAvatar />{' '} 76 + </> 77 + )} 78 + {contentText[type]} 79 + </p> 80 + {status && ( 81 + <Link class="status-link" href={`#/s/${actualStatusID}`}> 82 + <Status status={status} size="s" /> 83 + </Link> 84 + )} 85 + </div> 86 + </> 87 + ); 88 + } 89 + 90 + function NotificationsList({ notifications, emptyCopy }) { 91 + if (!notifications.length && emptyCopy) { 92 + return <p class="timeline-empty">{emptyCopy}</p>; 93 + } 94 + return ( 95 + <ul class="timeline flat"> 96 + {notifications.map((notification) => { 97 + const { id, type } = notification; 98 + return ( 99 + <li key={id} class={`notification ${type}`}> 100 + <Notification notification={notification} /> 101 + </li> 102 + ); 103 + })} 104 + </ul> 105 + ); 106 + } 107 + 108 + export default () => { 109 + useTitle('Notifications'); 110 + const snapStates = useSnapshot(states); 111 + const [uiState, setUIState] = useState('default'); 112 + const [showMore, setShowMore] = useState(false); 113 + 114 + const notificationsIterator = useRef( 115 + masto.notifications.getIterator({ 116 + limit: LIMIT, 117 + }), 118 + ).current; 119 + async function fetchNotifications(firstLoad) { 120 + const allNotifications = await notificationsIterator.next( 121 + firstLoad 122 + ? { 123 + limit: LIMIT, 124 + } 125 + : undefined, 126 + ); 127 + if (allNotifications.value <= 0) { 128 + return { done: true }; 129 + } 130 + const notificationsValues = allNotifications.value.map((notification) => { 131 + if (notification.status) { 132 + states.statuses.set(notification.status.id, notification.status); 133 + } 134 + return notification; 135 + }); 136 + if (firstLoad) { 137 + states.notifications = notificationsValues; 138 + } else { 139 + states.notifications.push(...notificationsValues); 140 + } 141 + states.notificationsLastFetchTime = Date.now(); 142 + console.log(allNotifications); 143 + return allNotifications; 144 + } 145 + 146 + const loadNotifications = (firstLoad) => { 147 + setUIState('loading'); 148 + (async () => { 149 + try { 150 + const { done } = await fetchNotifications(firstLoad); 151 + setShowMore(!done); 152 + setUIState('default'); 153 + } catch (e) { 154 + setUIState('error'); 155 + } 156 + })(); 157 + }; 158 + 159 + useEffect(() => { 160 + loadNotifications(true); 161 + }, []); 162 + 163 + const scrollableRef = useRef(); 164 + 165 + // Group notifications by today, yesterday, and older 166 + const groupedNotifications = snapStates.notifications.reduce( 167 + (acc, notification) => { 168 + const date = new Date(notification.created_at); 169 + const today = new Date(); 170 + const yesterday = new Date(); 171 + yesterday.setDate(today.getDate() - 1); 172 + if ( 173 + date.getDate() === today.getDate() && 174 + date.getMonth() === today.getMonth() && 175 + date.getFullYear() === today.getFullYear() 176 + ) { 177 + acc.today.push(notification); 178 + } else if ( 179 + date.getDate() === yesterday.getDate() && 180 + date.getMonth() === yesterday.getMonth() && 181 + date.getFullYear() === yesterday.getFullYear() 182 + ) { 183 + acc.yesterday.push(notification); 184 + } else { 185 + acc.older.push(notification); 186 + } 187 + return acc; 188 + }, 189 + { today: [], yesterday: [], older: [] }, 190 + ); 191 + 192 + console.log(groupedNotifications); 193 + 194 + return ( 195 + <div class="deck-container" ref={scrollableRef}> 196 + <div class="timeline-deck deck"> 197 + <header> 198 + <div class="header-side"> 199 + <a href="#" class="button plain"> 200 + <Icon icon="home" size="l" /> 201 + </a> 202 + </div> 203 + <h1>Notifications</h1> 204 + <div class="header-side"> 205 + <Loader hidden={uiState !== 'loading'} /> 206 + </div> 207 + {snapStates.notificationsNew.length > 0 && ( 208 + <button 209 + class="updates-button" 210 + type="button" 211 + onClick={() => { 212 + const uniqueNotificationsNew = 213 + snapStates.notificationsNew.filter( 214 + (notification) => 215 + !snapStates.notifications.some( 216 + (n) => n.id === notification.id, 217 + ), 218 + ); 219 + states.notifications.unshift(...uniqueNotificationsNew); 220 + loadNotifications(true); 221 + states.notificationsNew = []; 222 + 223 + scrollableRef.current?.scrollTo({ 224 + top: 0, 225 + behavior: 'smooth', 226 + }); 227 + }} 228 + > 229 + <Icon icon="arrow-up" /> New notifications 230 + </button> 231 + )} 232 + </header> 233 + {snapStates.notifications.length ? ( 234 + <> 235 + <h2 class="timeline-header">Today</h2> 236 + <NotificationsList 237 + notifications={groupedNotifications.today} 238 + emptyCopy="You're all caught up." 239 + /> 240 + {groupedNotifications.yesterday.length > 0 && ( 241 + <> 242 + <h2 class="timeline-header">Yesterday</h2> 243 + <NotificationsList 244 + notifications={groupedNotifications.yesterday} 245 + /> 246 + </> 247 + )} 248 + {groupedNotifications.older.length > 0 && ( 249 + <> 250 + <h2 class="timeline-header">Older</h2> 251 + <NotificationsList notifications={groupedNotifications.older} /> 252 + </> 253 + )} 254 + {showMore && ( 255 + <button 256 + type="button" 257 + class="plain block" 258 + disabled={uiState === 'loading'} 259 + onClick={() => loadNotifications()} 260 + > 261 + {uiState === 'loading' ? <Loader /> : <>Show more&hellip;</>} 262 + </button> 263 + )} 264 + </> 265 + ) : ( 266 + <> 267 + {uiState === 'loading' && ( 268 + <> 269 + <h2 class="timeline-header">Today</h2> 270 + <ul class="timeline flat"> 271 + {Array.from({ length: 5 }).map((_, i) => ( 272 + <li class="notification skeleton"> 273 + <div class="notification-type"> 274 + <Icon icon="notification" size="xl" /> 275 + </div> 276 + <div class="notification-content"> 277 + <p>███████████ ████</p> 278 + </div> 279 + </li> 280 + ))} 281 + </ul> 282 + </> 283 + )} 284 + {uiState === 'error' && ( 285 + <p class="ui-state">Error loading notifications</p> 286 + )} 287 + </> 288 + )} 289 + </div> 290 + </div> 291 + ); 292 + };
+95
src/pages/settings.css
··· 1 + #settings-container { 2 + text-align: left; 3 + padding-bottom: 3em; 4 + animation: fade-in 0.2s ease-out; 5 + max-height: 100vh; 6 + overflow: auto; 7 + } 8 + 9 + #settings-container .close-button { 10 + float: right; 11 + } 12 + 13 + #settings-container h2 { 14 + margin: 3em 0 1em; 15 + font-size: .9em; 16 + text-transform: uppercase; 17 + color: var(--text-insignificant-color); 18 + } 19 + 20 + #settings-container ul { 21 + margin: 0; 22 + padding: 0; 23 + list-style: none; 24 + } 25 + #settings-container ul li { 26 + padding: 8px 0; 27 + display: flex; 28 + justify-content: space-between; 29 + align-items: center; 30 + flex-wrap: wrap; 31 + } 32 + #settings-container ul li .current { 33 + margin-right: 8px; 34 + color: var(--green-color); 35 + opacity: 0.1; 36 + } 37 + #settings-container ul li .current.is-current { 38 + opacity: 1; 39 + } 40 + #settings-container ul li .current.is-current + .avatar { 41 + outline-color: var(--green-color); 42 + outline-width: 2px; 43 + } 44 + #settings-container ul li > div { 45 + flex-grow: 1; 46 + max-width: 100%; 47 + } 48 + #settings-container ul li > div.actions { 49 + flex-basis: min-content; 50 + margin-top: 8px; 51 + } 52 + #settings-container ul li > div:last-child { 53 + text-align: right; 54 + } 55 + #settings-container div, 56 + #settings-container div > *{ 57 + vertical-align: middle; 58 + } 59 + #settings-container .avatar { 60 + margin-right: 8px; 61 + } 62 + 63 + #settings-container .radio-group { 64 + display: inline-flex; 65 + align-items: center; 66 + border-radius: 999px; 67 + border: 1px solid var(--button-bg-color); 68 + overflow: hidden; 69 + padding: 1px; 70 + } 71 + #settings-container .radio-group input[type="radio"] { 72 + opacity: 0; 73 + position: absolute; 74 + pointer-events: none; 75 + } 76 + #settings-container .radio-group label { 77 + display: inline-block; 78 + padding: 6px 12px; 79 + cursor: pointer; 80 + } 81 + #settings-container .radio-group label input:checked + span { 82 + color: var(--link-color); 83 + font-weight: bold; 84 + } 85 + #settings-container .radio-group label:hover { 86 + color: var(--button-bg-color); 87 + } 88 + #settings-container .radio-group label:has(input:checked) { 89 + border-radius: 999px; 90 + color: var(--button-text-color); 91 + background-color: var(--button-bg-color); 92 + } 93 + #settings-container .radio-group label:has(input:checked) input:checked + span { 94 + color: inherit; 95 + }
+186
src/pages/settings.jsx
··· 1 + import './settings.css'; 2 + 3 + import { useRef, useState } from 'preact/hooks'; 4 + 5 + import Avatar from '../components/avatar'; 6 + import Icon from '../components/icon'; 7 + import NameText from '../components/name-text'; 8 + import store from '../utils/store'; 9 + 10 + /* 11 + Settings component that shows these settings: 12 + - Accounts list for switching 13 + - Dark/light/auto theme switch (done with adding/removing 'is-light' or 'is-dark' class on the body) 14 + */ 15 + 16 + export default ({ onClose }) => { 17 + // Accounts 18 + const accounts = store.local.getJSON('accounts'); 19 + const currentAccount = store.session.get('currentAccount'); 20 + const currentTheme = store.local.get('theme') || 'auto'; 21 + const themeFormRef = useRef(); 22 + const moreThanOneAccount = accounts.length > 1; 23 + const [currentDefault, setCurrentDefault] = useState(0); 24 + 25 + return ( 26 + <div id="settings-container" class="box"> 27 + <div> 28 + <button type="button" class="close-button plain" onClick={onClose}> 29 + <Icon icon="x" alt="Close" /> 30 + </button> 31 + </div> 32 + <div> 33 + <h2>Accounts</h2> 34 + <ul class="accounts-list"> 35 + {accounts.map((account, i) => { 36 + const isCurrent = account.info.id === currentAccount; 37 + const isDefault = i === (currentDefault || 0); 38 + return ( 39 + <li> 40 + <div> 41 + {moreThanOneAccount && ( 42 + <span class={`current ${isCurrent ? 'is-current' : ''}`}> 43 + <Icon icon="check-circle" alt="Current" /> 44 + </span> 45 + )} 46 + <Avatar url={account.info.avatarStatic} size="xxl" /> 47 + <NameText account={account.info} showAcct /> 48 + </div> 49 + <div class="actions"> 50 + {isDefault && moreThanOneAccount && ( 51 + <> 52 + <span class="tag">Default</span>{' '} 53 + </> 54 + )} 55 + {!isCurrent && ( 56 + <button 57 + type="button" 58 + class="light" 59 + onClick={() => { 60 + store.session.set('currentAccount', account.info.id); 61 + location.reload(); 62 + }} 63 + > 64 + <Icon icon="transfer" /> Switch 65 + </button> 66 + )} 67 + <div> 68 + {!isDefault && moreThanOneAccount && ( 69 + <button 70 + type="button" 71 + class="plain small" 72 + onClick={() => { 73 + // Move account to the top of the list 74 + accounts.splice(i, 1); 75 + accounts.unshift(account); 76 + store.local.setJSON('accounts', accounts); 77 + setCurrentDefault(i); 78 + }} 79 + > 80 + Set as default 81 + </button> 82 + )} 83 + {isCurrent && ( 84 + <> 85 + {' '} 86 + <button 87 + type="button" 88 + class="plain small" 89 + onClick={() => { 90 + const yes = confirm( 91 + 'Are you sure you want to log out?', 92 + ); 93 + if (!yes) return; 94 + accounts.splice(i, 1); 95 + store.local.setJSON('accounts', accounts); 96 + location.reload(); 97 + }} 98 + > 99 + Log out 100 + </button> 101 + </> 102 + )} 103 + </div> 104 + </div> 105 + </li> 106 + ); 107 + })} 108 + </ul> 109 + {moreThanOneAccount && ( 110 + <p> 111 + <small> 112 + Note: <i>Default</i> account will always be used for first load. 113 + Switched accounts will persist during the session. 114 + </small> 115 + </p> 116 + )} 117 + <p style={{ textAlign: 'end' }}> 118 + <a href="/#/login" class="button" onClick={onClose}> 119 + Add new account 120 + </a> 121 + </p> 122 + </div> 123 + <div> 124 + <h2>Theme</h2> 125 + <form 126 + ref={themeFormRef} 127 + onInput={(e) => { 128 + console.log(e); 129 + e.preventDefault(); 130 + const formData = new FormData(themeFormRef.current); 131 + const theme = formData.get('theme'); 132 + const html = document.documentElement; 133 + 134 + if (theme === 'auto') { 135 + html.classList.remove('is-light', 'is-dark'); 136 + } else { 137 + html.classList.toggle('is-light', theme === 'light'); 138 + html.classList.toggle('is-dark', theme === 'dark'); 139 + } 140 + document 141 + .querySelector('meta[name="color-scheme"]') 142 + .setAttribute('content', theme); 143 + 144 + if (theme === 'auto') { 145 + store.local.del('theme'); 146 + } else { 147 + store.local.set('theme', theme); 148 + } 149 + }} 150 + > 151 + <div class="radio-group"> 152 + <label> 153 + <input 154 + type="radio" 155 + name="theme" 156 + value="light" 157 + defaultChecked={currentTheme === 'light'} 158 + /> 159 + <span>Light</span> 160 + </label> 161 + <label> 162 + <input 163 + type="radio" 164 + name="theme" 165 + value="dark" 166 + defaultChecked={currentTheme === 'dark'} 167 + /> 168 + <span>Dark</span> 169 + </label> 170 + <label> 171 + <input 172 + type="radio" 173 + name="theme" 174 + value="auto" 175 + defaultChecked={ 176 + currentTheme !== 'light' && currentTheme !== 'dark' 177 + } 178 + /> 179 + <span>Auto</span> 180 + </label> 181 + </div> 182 + </form> 183 + </div> 184 + </div> 185 + ); 186 + };
+210
src/pages/status.jsx
··· 1 + import { Link } from 'preact-router/match'; 2 + import { 3 + useEffect, 4 + useLayoutEffect, 5 + useMemo, 6 + useRef, 7 + useState, 8 + } from 'preact/hooks'; 9 + import { useSnapshot } from 'valtio'; 10 + 11 + import Icon from '../components/icon'; 12 + import Loader from '../components/loader'; 13 + import Status from '../components/status'; 14 + import states from '../utils/states'; 15 + import useTitle from '../utils/useTitle'; 16 + 17 + export default ({ id }) => { 18 + const snapStates = useSnapshot(states); 19 + const [statuses, setStatuses] = useState([{ id }]); 20 + const [uiState, setUIState] = useState('default'); 21 + const heroStatusRef = useRef(); 22 + 23 + useEffect(async () => { 24 + // If id is completely new, reset the whole list 25 + if (!statuses.find((s) => s.id === id)) { 26 + setStatuses([{ id }]); 27 + } 28 + 29 + setUIState('loading'); 30 + 31 + if (!states.statuses.has(id)) { 32 + try { 33 + const status = await masto.statuses.fetch(id); 34 + states.statuses.set(id, status); 35 + } catch (e) { 36 + setUIState('error'); 37 + alert('Error fetching status'); 38 + return; 39 + } 40 + } 41 + 42 + try { 43 + const context = await masto.statuses.fetchContext(id); 44 + const { ancestors, descendants } = context; 45 + 46 + ancestors.forEach((status) => { 47 + states.statuses.set(status.id, status); 48 + }); 49 + const directReplies = []; 50 + descendants.forEach((status) => { 51 + states.statuses.set(status.id, status); 52 + if (status.inReplyToId === id) { 53 + directReplies.push(status); 54 + } 55 + }); 56 + console.log({ ancestors, descendants, directReplies }); 57 + 58 + if (directReplies.length) { 59 + const heroStatus = states.statuses.get(id); 60 + const heroStatusRepliesCount = heroStatus.repliesCount; 61 + if (heroStatusRepliesCount != directReplies.length) { 62 + // If replies count doesn't match, refetch the status 63 + const status = await masto.statuses.fetch(id); 64 + states.statuses.set(id, status); 65 + } 66 + } 67 + 68 + const allStatuses = [ 69 + ...ancestors.map((s) => ({ id: s.id, ancestor: true })), 70 + { id }, 71 + ...descendants.map((s) => ({ 72 + id: s.id, 73 + descendant: true, 74 + directReply: 75 + s.inReplyToId === id || s.inReplyToAccountId === s.account.id, 76 + // I can assume if the reply is to the same account, it's a direct reply. In other words, it's a thread?!? 77 + })), 78 + ]; 79 + setStatuses(allStatuses); 80 + } catch (e) { 81 + setUIState('error'); 82 + } 83 + 84 + setUIState('default'); 85 + }, [id, snapStates.reloadStatusPage]); 86 + 87 + useLayoutEffect(() => { 88 + if (heroStatusRef.current && statuses.length > 1) { 89 + heroStatusRef.current.scrollIntoView({ 90 + behavior: 'smooth', 91 + block: 'start', 92 + }); 93 + } 94 + }, [id]); 95 + 96 + useLayoutEffect(() => { 97 + heroStatusRef.current?.scrollIntoView({ 98 + // behavior: 'smooth', 99 + block: 'start', 100 + }); 101 + }, [statuses]); 102 + 103 + const heroStatus = states.statuses.get(id); 104 + const heroDisplayName = useMemo(() => { 105 + // Remove shortcodes from display name 106 + if (!heroStatus) return ''; 107 + const { account } = heroStatus; 108 + const div = document.createElement('div'); 109 + div.innerHTML = account.displayName; 110 + return div.innerText.trim(); 111 + }, [heroStatus]); 112 + const heroContentText = useMemo(() => { 113 + if (!heroStatus) return ''; 114 + const { content } = heroStatus; 115 + const div = document.createElement('div'); 116 + div.innerHTML = content; 117 + let text = div.innerText.trim(); 118 + if (text.length > 64) { 119 + text = text.slice(0, 64) + '…'; 120 + } 121 + return text; 122 + }, [heroStatus]); 123 + useTitle( 124 + heroDisplayName && heroContentText 125 + ? `${heroDisplayName}: ${heroContentText}` 126 + : 'Status', 127 + ); 128 + 129 + const comments = statuses.filter((s) => s.descendant); 130 + const replies = comments.filter((s) => s.directReply); 131 + 132 + const prevRoute = states.history.findLast((h) => { 133 + return h === '/' || /notifications/i.test(h); 134 + }); 135 + const closeLink = `#${prevRoute || '/'}`; 136 + 137 + return ( 138 + <div class="deck-backdrop"> 139 + <Link href={closeLink}></Link> 140 + <div 141 + class={`status-deck deck contained ${ 142 + statuses.length > 1 ? 'padded-bottom' : '' 143 + }`} 144 + > 145 + <header> 146 + <h1>Status</h1> 147 + <div class="header-side"> 148 + <Loader hidden={uiState !== 'loading'} /> 149 + <Link class="button plain deck-close" href={closeLink}> 150 + <Icon icon="x" size="xl" /> 151 + </Link> 152 + </div> 153 + </header> 154 + <ul class="timeline flat contextual"> 155 + {statuses.map((status) => { 156 + const { id: statusID, ancestor, descendant, directReply } = status; 157 + const isHero = statusID === id; 158 + return ( 159 + <li 160 + key={statusID} 161 + ref={isHero ? heroStatusRef : null} 162 + class={`${isHero ? '' : 'insignificant'} ${ 163 + ancestor ? 'ancestor' : '' 164 + } ${descendant ? 'descendant' : ''} ${ 165 + descendant && !directReply ? 'indirect' : '' 166 + }`} 167 + > 168 + {isHero ? ( 169 + <Status statusID={statusID} withinContext size="l" /> 170 + ) : ( 171 + <Link 172 + class=" 173 + status-link 174 + " 175 + href={`#/s/${statusID}`} 176 + > 177 + <Status statusID={statusID} withinContext /> 178 + </Link> 179 + )} 180 + {uiState === 'loading' && 181 + isHero && 182 + !!heroStatus?.repliesCount && ( 183 + <div class="status-loading"> 184 + <Loader />{' '} 185 + <span> 186 + {!!replies.length && 187 + replies.length !== comments.length && ( 188 + <> 189 + {replies.length} repl 190 + {replies.length > 1 ? 'ies' : 'y'} 191 + </> 192 + )} 193 + {!!comments.length && ( 194 + <> 195 + {' '} 196 + &bull; {comments.length} comment 197 + {comments.length > 1 ? 's' : ''} 198 + </> 199 + )} 200 + </span> 201 + </div> 202 + )} 203 + </li> 204 + ); 205 + })} 206 + </ul> 207 + </div> 208 + </div> 209 + ); 210 + };
+40
src/pages/welcome.css
··· 1 + #welcome { 2 + overflow: auto; 3 + max-height: 90vh; 4 + } 5 + 6 + #welcome img { 7 + margin-top: 16px; 8 + height: auto; 9 + } 10 + @keyframes dance { 11 + 0% { 12 + transform: rotate(0deg); 13 + } 14 + 20% { 15 + transform: rotate(5deg); 16 + } 17 + 40% { 18 + transform: rotate(-5deg); 19 + } 20 + 60% { 21 + transform: rotate(5deg); 22 + } 23 + 80% { 24 + transform: rotate(-5deg); 25 + } 26 + 100% { 27 + transform: rotate(0deg); 28 + } 29 + } 30 + #welcome:hover img { 31 + animation: dance 2s infinite 15s linear; 32 + } 33 + 34 + #welcome .warning { 35 + font-weight: bold; 36 + padding: 16px; 37 + background: lemonchiffon; 38 + color: chocolate; 39 + border-radius: 16px; 40 + }
+35
src/pages/welcome.jsx
··· 1 + import './welcome.css'; 2 + 3 + import useTitle from '../utils/useTitle'; 4 + 5 + export default () => { 6 + useTitle(); 7 + return ( 8 + <main id="welcome" class="box"> 9 + <img 10 + src="../design/logo-2.svg" 11 + alt="" 12 + width="140" 13 + height="140" 14 + style={{ 15 + aspectRatio: '1/1', 16 + }} 17 + /> 18 + <h1>Welcome</h1> 19 + <p>Phanpy is a minimalistic opinionated Mastodon web client.</p> 20 + <p class="warning"> 21 + 🚧 This is an early ALPHA project. Many features are missing, many bugs 22 + are present. Please report issues as detailed as possible. Thanks 🙏 23 + </p> 24 + <p> 25 + <big> 26 + <b> 27 + <a href="#/login" class="button"> 28 + Log in 29 + </a> 30 + </b> 31 + </big> 32 + </p> 33 + </main> 34 + ); 35 + };
+62
src/utils/auth.js
··· 1 + const { VITE_CLIENT_NAME: CLIENT_NAME, VITE_WEBSITE: WEBSITE } = import.meta 2 + .env; 3 + 4 + export async function registerApplication({ instanceURL }) { 5 + const registrationParams = new URLSearchParams({ 6 + client_name: CLIENT_NAME, 7 + redirect_uris: location.origin, 8 + scopes: 'read write follow', 9 + website: WEBSITE, 10 + }); 11 + const registrationResponse = await fetch( 12 + `https://${instanceURL}/api/v1/apps`, 13 + { 14 + method: 'POST', 15 + headers: { 16 + 'Content-Type': 'application/x-www-form-urlencoded', 17 + }, 18 + body: registrationParams.toString(), 19 + }, 20 + ); 21 + const registrationJSON = await registrationResponse.json(); 22 + console.log({ registrationJSON }); 23 + return registrationJSON; 24 + } 25 + 26 + export async function getAuthorizationURL({ instanceURL, client_id }) { 27 + const authorizationParams = new URLSearchParams({ 28 + client_id, 29 + scope: 'read write follow', 30 + redirect_uri: location.origin, 31 + // redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', 32 + response_type: 'code', 33 + }); 34 + const authorizationURL = `https://${instanceURL}/oauth/authorize?${authorizationParams.toString()}`; 35 + return authorizationURL; 36 + } 37 + 38 + export async function getAccessToken({ 39 + instanceURL, 40 + client_id, 41 + client_secret, 42 + code, 43 + }) { 44 + const params = new URLSearchParams({ 45 + client_id, 46 + client_secret, 47 + redirect_uri: location.origin, 48 + grant_type: 'authorization_code', 49 + code, 50 + scope: 'read write follow', 51 + }); 52 + const tokenResponse = await fetch(`https://${instanceURL}/oauth/token`, { 53 + method: 'POST', 54 + headers: { 55 + 'Content-Type': 'application/x-www-form-urlencoded', 56 + }, 57 + body: params.toString(), 58 + }); 59 + const tokenJSON = await tokenResponse.json(); 60 + console.log({ tokenJSON }); 61 + return tokenJSON; 62 + }
+16
src/utils/emojify-text.js
··· 1 + function emojifyText(text, emojis = []) { 2 + if (!emojis.length) return text; 3 + // Replace shortcodes in text with emoji 4 + // emojis = [{ shortcode: 'smile', url: 'https://example.com/emoji.png' }] 5 + emojis.forEach((emoji) => { 6 + const { shortcode, staticUrl, url } = emoji; 7 + text = text.replace( 8 + new RegExp(`:${shortcode}:`, 'g'), 9 + `<img class="shortcode-emoji emoji" src="${url}" alt=":${shortcode}:" width="12" height="12" loading="lazy" />`, 10 + ); 11 + }); 12 + // console.log(text, emojis); 13 + return text; 14 + } 15 + 16 + export default emojifyText;
+34
src/utils/enhance-content.js
··· 1 + import emojifyText from './emojify-text'; 2 + 3 + export default (content, { emojis }) => { 4 + // 1. Emojis 5 + let enhancedContent = content; 6 + 7 + if (emojis) { 8 + enhancedContent = emojifyText(enhancedContent, emojis); 9 + } 10 + 11 + // 2. Code blocks 12 + const dom = document.createElement('div'); 13 + dom.innerHTML = enhancedContent; 14 + // Check for <p> with markdown-like content "```" 15 + const blocks = Array.from(dom.querySelectorAll('p')).filter((p) => 16 + /^```[^]+```$/g.test(p.innerText.trim()), 17 + ); 18 + blocks.forEach((block) => { 19 + const pre = document.createElement('pre'); 20 + const code = document.createElement('code'); 21 + const breaks = block.querySelectorAll('br'); 22 + Array.from(breaks).forEach((br) => br.replaceWith('\n')); 23 + code.innerHTML = block.innerText 24 + .trim() 25 + // .replace(/^```/g, '') 26 + // .replace(/```$/g, '') 27 + .replace(/^[\n\r]+/, ''); 28 + pre.appendChild(code); 29 + block.replaceWith(pre); 30 + }); 31 + enhancedContent = dom.innerHTML; 32 + 33 + return enhancedContent; 34 + };
+5
src/utils/shorten-number.jsx
··· 1 + export default function shortenNumber(num) { 2 + return Intl.NumberFormat('en-US', { 3 + notation: 'compact', 4 + }).format(num); 5 + }
+19
src/utils/states.js
··· 1 + import { proxy } from 'valtio'; 2 + import { proxyMap } from 'valtio/utils'; 3 + 4 + export default proxy({ 5 + history: [], 6 + statuses: proxyMap([]), 7 + home: [], 8 + homeNew: [], 9 + homeLastFetchTime: null, 10 + notifications: [], 11 + notificationsNew: [], 12 + notificationsLastFetchTime: null, 13 + accounts: new WeakMap(), 14 + reloadStatusPage: 0, 15 + // Modals 16 + showCompose: false, 17 + showSettings: false, 18 + showAccount: false, 19 + });
+87
src/utils/store.js
··· 1 + const local = { 2 + get: (key) => { 3 + try { 4 + return localStorage.getItem(key); 5 + } catch (e) { 6 + console.warn(e); 7 + return null; 8 + } 9 + }, 10 + getJSON: (key) => { 11 + try { 12 + return JSON.parse(local.get(key)); 13 + } catch (e) { 14 + console.warn(e); 15 + return null; 16 + } 17 + }, 18 + set: (key, value) => { 19 + try { 20 + return localStorage.setItem(key, value); 21 + } catch (e) { 22 + console.warn(e); 23 + return null; 24 + } 25 + }, 26 + setJSON: (key, value) => { 27 + try { 28 + return local.set(key, JSON.stringify(value)); 29 + } catch (e) { 30 + console.warn(e); 31 + return null; 32 + } 33 + }, 34 + del: (key) => { 35 + try { 36 + return localStorage.removeItem(key); 37 + } catch (e) { 38 + console.warn(e); 39 + return null; 40 + } 41 + }, 42 + }; 43 + 44 + const session = { 45 + get: (key) => { 46 + try { 47 + return sessionStorage.getItem(key); 48 + } catch (e) { 49 + console.warn(e); 50 + return null; 51 + } 52 + }, 53 + getJSON: (key) => { 54 + try { 55 + return JSON.parse(session.get(key)); 56 + } catch (e) { 57 + console.warn(e); 58 + return null; 59 + } 60 + }, 61 + set: (key, value) => { 62 + try { 63 + return sessionStorage.setItem(key, value); 64 + } catch (e) { 65 + console.warn(e); 66 + return null; 67 + } 68 + }, 69 + setJSON: (key, value) => { 70 + try { 71 + return session.set(key, JSON.stringify(value)); 72 + } catch (e) { 73 + console.warn(e); 74 + return null; 75 + } 76 + }, 77 + del: (key) => { 78 + try { 79 + return sessionStorage.removeItem(key); 80 + } catch (e) { 81 + console.warn(e); 82 + return null; 83 + } 84 + }, 85 + }; 86 + 87 + export default { local, session };
+9
src/utils/useTitle.js
··· 1 + import { useEffect } from 'preact/hooks'; 2 + 3 + const { VITE_CLIENT_NAME: CLIENT_NAME } = import.meta.env; 4 + 5 + export default (title) => { 6 + useEffect(() => { 7 + document.title = title ? `${title} - ${CLIENT_NAME}` : CLIENT_NAME; 8 + }, [title]); 9 + };
+6
src/utils/visibility-icons-map.js
··· 1 + export default { 2 + public: 'earth', 3 + unlisted: 'unlock', 4 + private: 'lock', 5 + direct: 'at', 6 + };
+7
vite.config.js
··· 1 + import preact from '@preact/preset-vite'; 2 + import { defineConfig } from 'vite'; 3 + 4 + // https://vitejs.dev/config/ 5 + export default defineConfig({ 6 + plugins: [preact()], 7 + });