mirror of
https://iceshrimp.dev/limepotato/jormungandr-bite.git
synced 2024-11-27 12:27:29 -07:00
Compare commits
40 commits
f70f61523d
...
cc098b1af8
Author | SHA1 | Date | |
---|---|---|---|
|
cc098b1af8 | ||
|
01f66a4039 | ||
|
55bb476ada | ||
|
9ba71c86dc | ||
41337a0f1b | |||
|
e8a21fd579 | ||
aed654b219 | |||
13b6dc5e2d | |||
ff1eea6c3b | |||
86633506f7 | |||
ed290d74d7 | |||
023b5897d4 | |||
02daa6b02a | |||
733fd1892a | |||
93a9a10c8a | |||
|
f82c3fa928 | ||
ec098c059f | |||
be2ea8af29 | |||
6b6be527d4 | |||
3ad4cbb5b5 | |||
1e9a7096e1 | |||
35d88fa3af | |||
989e30c6d9 | |||
1d0ff68688 | |||
e93373d72c | |||
bebe68dab1 | |||
98f3f55371 | |||
50eb66e375 | |||
866a598aad | |||
941fc66512 | |||
a358ef5dc0 | |||
17532215ed | |||
97c57405eb | |||
ecae6145a2 | |||
ff4b51cd37 | |||
a44a89276d | |||
6c2131fdcc | |||
|
4410989fa2 | ||
ba0e5eec93 | |||
|
cc4a0d3e58 |
126 changed files with 1187 additions and 503 deletions
|
@ -163,10 +163,14 @@ reservedUsernames: [
|
||||||
# cleanHeaders: false
|
# cleanHeaders: false
|
||||||
|
|
||||||
# Status code images
|
# Status code images
|
||||||
#images:
|
images:
|
||||||
# info: '/twemoji/1f440.svg'
|
info: '/static-assets/badges/info.png'
|
||||||
# notFound: '/twemoji/2049.svg'
|
notFound: '/static-assets/badges/not-found.png'
|
||||||
# error: '/twemoji/1f480.svg'
|
error: '/static-assets/badges/error.png'
|
||||||
|
|
||||||
|
# Pinned Post Limit
|
||||||
|
pinLimit: 5
|
||||||
|
|
||||||
|
|
||||||
# Search engine (MFM)
|
# Search engine (MFM)
|
||||||
#searchEngine: 'https://duckduckgo.com/?q='
|
#searchEngine: 'https://duckduckgo.com/?q='
|
||||||
|
|
|
@ -175,10 +175,13 @@ reservedUsernames: [
|
||||||
# cleanHeaders: false
|
# cleanHeaders: false
|
||||||
|
|
||||||
# Status code images
|
# Status code images
|
||||||
#images:
|
images:
|
||||||
# info: '/twemoji/1f440.svg'
|
info: '/static-assets/badges/info.png'
|
||||||
# notFound: '/twemoji/2049.svg'
|
notFound: '/static-assets/badges/not-found.png'
|
||||||
# error: '/twemoji/1f480.svg'
|
error: '/static-assets/badges/error.png'
|
||||||
|
|
||||||
|
# Pinned Post Limit
|
||||||
|
pinLimit: 5
|
||||||
|
|
||||||
# Search engine (MFM)
|
# Search engine (MFM)
|
||||||
#searchEngine: 'https://duckduckgo.com/?q='
|
#searchEngine: 'https://duckduckgo.com/?q='
|
||||||
|
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,3 +1,6 @@
|
||||||
|
# LimePot
|
||||||
|
run.sh
|
||||||
|
|
||||||
# Visual Studio Code
|
# Visual Studio Code
|
||||||
/.vscode
|
/.vscode
|
||||||
!/.vscode/extensions.json
|
!/.vscode/extensions.json
|
||||||
|
|
BIN
.yarn/corepack.tgz
(Stored with Git LFS)
BIN
.yarn/corepack.tgz
(Stored with Git LFS)
Binary file not shown.
|
@ -2,6 +2,8 @@ compressionLevel: mixed
|
||||||
|
|
||||||
enableGlobalCache: false
|
enableGlobalCache: false
|
||||||
|
|
||||||
|
enableTelemetry: false
|
||||||
|
|
||||||
nodeLinker: pnp
|
nodeLinker: pnp
|
||||||
|
|
||||||
npmScopes:
|
npmScopes:
|
||||||
|
|
38
README.md
38
README.md
|
@ -1,20 +1,29 @@
|
||||||
<p><img src="assets/logo.png" alt="Iceshrimp" width="400px"></p>
|
# Jörmungandr
|
||||||
<p><strong>Iceshrimp</strong> is a decentralized and federated social networking service, implementing the <strong>ActivityPub</strong> standard.<br>
|
|
||||||
It was forked from <del>Calckey</del> Firefish (itself a fork of Misskey) in mid-2023, to focus on stability, performance and usability instead of new features.</p>
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
> This project is **not** inactive.
|
> DO NOT USE THIS FORK, as I am dumbb and just a lil guy.
|
||||||
>
|
>
|
||||||
> Most of our current development resources are going into the [rewrite](/iceshrimp/Iceshrimp.NET), to further our goal of increasing stability and performance.
|
> This is a softer fork of [Iceshrimp Bite](https://iceshrimp.dev/mia/iceshrimp-bite) which is a fork of [Iceshrimp](https://iceshrimp.dev/iceshrimp/iceshrimp) which is a fork of [Firefish](https://firefish.dev/firefish/firefish) which is a rebranding of Calckey, which is a fork of [Misskey](https://github.com/misskey-dev/misskey), Confused? I hope so.
|
||||||
>
|
|
||||||
> This means that major changes to the JS codebase (this project), and especially to the database schema, are on hold for the time being. Bugs will of course still be fixed, and support is still available on the usual channels.
|
|
||||||
>
|
|
||||||
> Once the rewrite is finished, there will be an easy upgrade path for existing Iceshrimp instances.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
- Highlighted changes:
|
- Jormungandr changes:
|
||||||
|
- Full Catppuccin theme support
|
||||||
|
- Configuarble pinned post limit
|
||||||
|
- Menhera error images
|
||||||
|
- Post button now says "Beep" instead of "Post"
|
||||||
|
- Fix "Find Another Server" link
|
||||||
|
- For more see [Jormungandr Changelog](./limepot-CHANGELOG.md)
|
||||||
|
- IceShrimp Bite!
|
||||||
|
- Withdrawal Patches
|
||||||
|
- silence-email
|
||||||
|
- replacements
|
||||||
|
- robots
|
||||||
|
- hide-federation
|
||||||
|
- yarn telemetry
|
||||||
|
- traumatize
|
||||||
|
- Highlighted Iceshrimp changes:
|
||||||
- First-class Mastodon client API support
|
- First-class Mastodon client API support
|
||||||
- Significantly improved database performance
|
- Significantly improved database performance
|
||||||
- Options to prune cached remote media automatically
|
- Options to prune cached remote media automatically
|
||||||
|
@ -24,15 +33,6 @@ It was forked from <del>Calckey</del> Firefish (itself a fork of Misskey) in mid
|
||||||
- [Elk](https://elk.zone), [Phanpy](https://phanpy.social/), [Enafore](https://enafore.social/), [Masto-FE-standalone](https://iceshrimp.dev/iceshrimp/masto-fe-standalone) (Web)
|
- [Elk](https://elk.zone), [Phanpy](https://phanpy.social/), [Enafore](https://enafore.social/), [Masto-FE-standalone](https://iceshrimp.dev/iceshrimp/masto-fe-standalone) (Web)
|
||||||
- [Mona](https://apps.apple.com/us/app/mona-for-mastodon/id1659154653), [Toot!](https://apps.apple.com/us/app/toot-for-mastodon/id1229021451), [Ice Cubes](https://apps.apple.com/us/app/ice-cubes-for-mastodon/id6444915884), [Tusker](https://apps.apple.com/us/app/tusker/id1498334597), [Feditext](https://github.com/feditext/feditext), [Mastodon](https://apps.apple.com/us/app/mastodon-for-iphone-and-ipad/id1571998974) (iOS)
|
- [Mona](https://apps.apple.com/us/app/mona-for-mastodon/id1659154653), [Toot!](https://apps.apple.com/us/app/toot-for-mastodon/id1229021451), [Ice Cubes](https://apps.apple.com/us/app/ice-cubes-for-mastodon/id6444915884), [Tusker](https://apps.apple.com/us/app/tusker/id1498334597), [Feditext](https://github.com/feditext/feditext), [Mastodon](https://apps.apple.com/us/app/mastodon-for-iphone-and-ipad/id1571998974) (iOS)
|
||||||
- [Tusky](https://tusky.app/), [Moshidon](https://lucasggamerm.github.io/moshidon/), [Megalodon](https://sk22.github.io/megalodon/), [Mastodon](https://play.google.com/store/apps/details?id=org.joinmastodon.android) (Android)
|
- [Tusky](https://tusky.app/), [Moshidon](https://lucasggamerm.github.io/moshidon/), [Megalodon](https://sk22.github.io/megalodon/), [Mastodon](https://play.google.com/store/apps/details?id=org.joinmastodon.android) (Android)
|
||||||
- Project goals:
|
|
||||||
- No-nonsense bug fixes
|
|
||||||
- QoL improvements
|
|
||||||
- Better performance
|
|
||||||
- Change of focus to actual community needs
|
|
||||||
- Prioritization of user choice and configurability
|
|
||||||
- Project anti-goals:
|
|
||||||
- Flashy marketing
|
|
||||||
- Commercialization of any kind
|
|
||||||
- Documentation on installing (and updating) Iceshrimp using:
|
- Documentation on installing (and updating) Iceshrimp using:
|
||||||
- [Binary packages](https://iceshrimp.dev/iceshrimp/packaging)
|
- [Binary packages](https://iceshrimp.dev/iceshrimp/packaging)
|
||||||
- [Docker Compose](docs/docker-compose-install.md)
|
- [Docker Compose](docs/docker-compose-install.md)
|
||||||
|
|
22
TODO.md
Normal file
22
TODO.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# TODO
|
||||||
|
## Things I want to change or add
|
||||||
|
- [ ] Achievements
|
||||||
|
- [ ] Allow admins to install optional themes instance-wide
|
||||||
|
- [ ] Misskey v14-like roles
|
||||||
|
- [ ] Implement any new MFM that has been added since the fork.
|
||||||
|
- [ ] UI elements can be round (as in Misskey) or square-ish
|
||||||
|
- [ ] federated listenbrainz
|
||||||
|
- [ ] admin moderation notes (on user profiles)
|
||||||
|
- [ ] user memos (on user profiles)
|
||||||
|
- [ ] Make error message images configurable in Control Panel
|
||||||
|
- [ ] Approval based signups
|
||||||
|
- [ ] Control Panel based reserved username list
|
||||||
|
- [ ] FediBlock reasons
|
||||||
|
- [ ] Allow admins to set instance-wide default sounds
|
||||||
|
- [ ] settings/privacy "Add 're:' at the beginning of comment in reply to a post with a CW" from FireFish
|
||||||
|
- [ ] settings/general "Update timelines automatically" from FireFish
|
||||||
|
- [ ] settings/general "Show server information by clicking the server ticker on a post" from FireFish
|
||||||
|
- [ ] settings/general "Show a warning if you attempt to post files without a description" from FireFish
|
||||||
|
- [ ] settings/general "Get assets from CDN" from FireFish
|
||||||
|
- [ ] Robot-Mode, much like cat-mode but, Robot antenna, and beeps and boops
|
||||||
|
- [X] When not signed-in, approvals off, try to signup, "Find another server" leads to dead link
|
22
limepot-CHANGELOG.md
Normal file
22
limepot-CHANGELOG.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# Jormungandr Changelog
|
||||||
|
|
||||||
|
## [Iceshrimp Changelog](./CHANGELOG.md)
|
||||||
|
|
||||||
|
## 2023.12.7-jormungandr-bite.0.5.2
|
||||||
|
- I forgot to do a changelog so heres everything up until now:
|
||||||
|
- Jormungandr changes:
|
||||||
|
- Full Catppuccin theme support
|
||||||
|
- Configuarble pinned post limit
|
||||||
|
- Menhera error images
|
||||||
|
- Post button now says "Beep" instead of "Post"
|
||||||
|
- Fix "Find Another Server" link
|
||||||
|
- IceShrimp Bite!
|
||||||
|
- Withdrawal Patches
|
||||||
|
- silence-email
|
||||||
|
- replacements
|
||||||
|
- robots
|
||||||
|
- hide-federation
|
||||||
|
- yarn telemetry
|
||||||
|
- traumatize
|
||||||
|
- Also changed the about iceshrimp page to direct to this source-code and mention jormungandr
|
||||||
|
- changed versioning scheme for jormungandr at least, to be SemVer
|
|
@ -88,8 +88,8 @@ lists: "Lists"
|
||||||
listsDesc: "Lists let you create timelines with specified users. They can be accessed
|
listsDesc: "Lists let you create timelines with specified users. They can be accessed
|
||||||
from the timelines page."
|
from the timelines page."
|
||||||
noLists: "You don't have any lists"
|
noLists: "You don't have any lists"
|
||||||
note: "Post"
|
note: "Beep"
|
||||||
notes: "Posts"
|
notes: "Beeps"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
followsYou: "Follows you"
|
followsYou: "Follows you"
|
||||||
|
@ -116,10 +116,10 @@ enterEmoji: "Enter an emoji"
|
||||||
renote: "Boost"
|
renote: "Boost"
|
||||||
unrenote: "Take back boost"
|
unrenote: "Take back boost"
|
||||||
renoted: "Boosted."
|
renoted: "Boosted."
|
||||||
cantRenote: "This post can't be boosted."
|
cantRenote: "This beep can't be boosted."
|
||||||
cantReRenote: "A boost can't be boosted."
|
cantReRenote: "A boost can't be boosted."
|
||||||
quote: "Quote"
|
quote: "Quote"
|
||||||
pinnedNote: "Pinned post"
|
pinnedNote: "Pinned beep"
|
||||||
pinned: "Pin to profile"
|
pinned: "Pin to profile"
|
||||||
you: "You"
|
you: "You"
|
||||||
clickToShow: "Click to show"
|
clickToShow: "Click to show"
|
||||||
|
@ -131,7 +131,7 @@ enableEmojiReactions: "Enable emoji reactions"
|
||||||
showEmojisInReactionNotifications: "Show emojis in reaction notifications"
|
showEmojisInReactionNotifications: "Show emojis in reaction notifications"
|
||||||
reactionSetting: "Reactions to show in the reaction picker"
|
reactionSetting: "Reactions to show in the reaction picker"
|
||||||
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
||||||
rememberNoteVisibility: "Remember post visibility settings"
|
rememberNoteVisibility: "Remember beep visibility settings"
|
||||||
attachCancel: "Remove attachment"
|
attachCancel: "Remove attachment"
|
||||||
markAsSensitive: "Mark as sensitive"
|
markAsSensitive: "Mark as sensitive"
|
||||||
unmarkAsSensitive: "Unmark as sensitive"
|
unmarkAsSensitive: "Unmark as sensitive"
|
||||||
|
@ -173,9 +173,9 @@ flagAsBotDescription: "Enable this option if this account is controlled by a pro
|
||||||
flagAsCat: "Are you a cat? 😺"
|
flagAsCat: "Are you a cat? 😺"
|
||||||
flagAsCatDescription: "You'll get cat ears and speak like a cat!"
|
flagAsCatDescription: "You'll get cat ears and speak like a cat!"
|
||||||
flagSpeakAsCat: "Speak as a cat"
|
flagSpeakAsCat: "Speak as a cat"
|
||||||
flagSpeakAsCatDescription: "Your posts will get nyanified when in cat mode"
|
flagSpeakAsCatDescription: "Your beeps will get nyanified when in cat mode"
|
||||||
flagShowTimelineReplies: "Show replies in timeline"
|
flagShowTimelineReplies: "Show replies in timeline"
|
||||||
flagShowTimelineRepliesDescription: "Shows replies of users to posts of other users
|
flagShowTimelineRepliesDescription: "Shows replies of users to beeps of other users
|
||||||
in the timeline if turned on."
|
in the timeline if turned on."
|
||||||
autoAcceptFollowed: "Automatically approve follow requests from users you're following"
|
autoAcceptFollowed: "Automatically approve follow requests from users you're following"
|
||||||
addAccount: "Add account"
|
addAccount: "Add account"
|
||||||
|
@ -225,7 +225,7 @@ instanceInfo: "Server Information"
|
||||||
statistics: "Statistics"
|
statistics: "Statistics"
|
||||||
clearQueue: "Clear queue"
|
clearQueue: "Clear queue"
|
||||||
clearQueueConfirmTitle: "Are you sure that you want to clear the queue?"
|
clearQueueConfirmTitle: "Are you sure that you want to clear the queue?"
|
||||||
clearQueueConfirmText: "Any undelivered posts remaining in the queue will not be federated.
|
clearQueueConfirmText: "Any undelivered beeps remaining in the queue will not be federated.
|
||||||
Usually this operation is not needed."
|
Usually this operation is not needed."
|
||||||
clearCachedFiles: "Clear cache"
|
clearCachedFiles: "Clear cache"
|
||||||
clearCachedFilesConfirm: "Are you sure that you want to delete all cached remote files?"
|
clearCachedFilesConfirm: "Are you sure that you want to delete all cached remote files?"
|
||||||
|
@ -247,8 +247,8 @@ blockedUsers: "Blocked users"
|
||||||
noUsers: "There are no users"
|
noUsers: "There are no users"
|
||||||
noInstances: "There are no servers"
|
noInstances: "There are no servers"
|
||||||
editProfile: "Edit profile"
|
editProfile: "Edit profile"
|
||||||
noteDeleteConfirm: "Are you sure you want to delete this post?"
|
noteDeleteConfirm: "Are you sure you want to delete this beep?"
|
||||||
pinLimitExceeded: "You cannot pin any more posts"
|
pinLimitExceeded: "You cannot pin any more beeps"
|
||||||
intro: "Installation of Iceshrimp has been finished! Please create an admin user."
|
intro: "Installation of Iceshrimp has been finished! Please create an admin user."
|
||||||
done: "Done"
|
done: "Done"
|
||||||
processing: "Processing…"
|
processing: "Processing…"
|
||||||
|
@ -397,7 +397,7 @@ pinnedPages: "Pinned Pages"
|
||||||
pinnedPagesDescription: "Enter the paths of the Pages you want to pin to the top page
|
pinnedPagesDescription: "Enter the paths of the Pages you want to pin to the top page
|
||||||
of this server, separated by line breaks."
|
of this server, separated by line breaks."
|
||||||
pinnedClipId: "ID of the clip to pin"
|
pinnedClipId: "ID of the clip to pin"
|
||||||
pinnedNotes: "Pinned posts"
|
pinnedNotes: "Pinned beeps"
|
||||||
hcaptcha: "hCaptcha"
|
hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Enable hCaptcha"
|
enableHcaptcha: "Enable hCaptcha"
|
||||||
hcaptchaSiteKey: "Site key"
|
hcaptchaSiteKey: "Site key"
|
||||||
|
@ -410,7 +410,7 @@ avoidMultiCaptchaConfirm: "Using multiple Captcha systems may cause interference
|
||||||
them. Would you like to disable the other Captcha systems currently active? If you
|
them. Would you like to disable the other Captcha systems currently active? If you
|
||||||
would like them to stay enabled, press cancel."
|
would like them to stay enabled, press cancel."
|
||||||
antennas: "Antennas"
|
antennas: "Antennas"
|
||||||
antennasDesc: "Antennas display new posts matching the criteria you set!\n They can
|
antennasDesc: "Antennas display new beeps matching the criteria you set!\n They can
|
||||||
be accessed from the timelines page."
|
be accessed from the timelines page."
|
||||||
manageAntennas: "Manage Antennas"
|
manageAntennas: "Manage Antennas"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
|
@ -419,17 +419,17 @@ antennaKeywords: "Keywords to listen to"
|
||||||
antennaExcludeKeywords: "Keywords to exclude"
|
antennaExcludeKeywords: "Keywords to exclude"
|
||||||
antennaKeywordsDescription: "Separate with spaces for an AND condition or with line
|
antennaKeywordsDescription: "Separate with spaces for an AND condition or with line
|
||||||
breaks for an OR condition."
|
breaks for an OR condition."
|
||||||
notifyAntenna: "Notify about new posts"
|
notifyAntenna: "Notify about new beeps"
|
||||||
withFileAntenna: "Only posts with files"
|
withFileAntenna: "Only beeps with files"
|
||||||
enableServiceworker: "Enable Push-Notifications for your Browser"
|
enableServiceworker: "Enable Push-Notifications for your Browser"
|
||||||
antennaUsersDescription: "List one username per line"
|
antennaUsersDescription: "List one username per line"
|
||||||
antennaInstancesDescription: "List one server host per line"
|
antennaInstancesDescription: "List one server host per line"
|
||||||
antennaTimelineHint: "Antennas display matching posts in order they have been received
|
antennaTimelineHint: "Antennas display matching beeps in order they have been received
|
||||||
in, which is not necessarily chronological."
|
in, which is not necessarily chronological."
|
||||||
caseSensitive: "Case sensitive"
|
caseSensitive: "Case sensitive"
|
||||||
withReplies: "Include replies"
|
withReplies: "Include replies"
|
||||||
connectedTo: "Following account(s) are connected"
|
connectedTo: "Following account(s) are connected"
|
||||||
notesAndReplies: "Posts and replies"
|
notesAndReplies: "Beeps and replies"
|
||||||
withFiles: "With attachments"
|
withFiles: "With attachments"
|
||||||
silence: "Silence"
|
silence: "Silence"
|
||||||
silenceConfirm: "Are you sure that you want to silence this user?"
|
silenceConfirm: "Are you sure that you want to silence this user?"
|
||||||
|
@ -444,7 +444,7 @@ exploreFediverse: "Explore the Fediverse"
|
||||||
popularTags: "Popular tags"
|
popularTags: "Popular tags"
|
||||||
userList: "Lists"
|
userList: "Lists"
|
||||||
about: "About"
|
about: "About"
|
||||||
aboutIceshrimp: "About Iceshrimp"
|
aboutIceshrimp: "About Jörmungandr"
|
||||||
administrator: "Administrator"
|
administrator: "Administrator"
|
||||||
token: "Token"
|
token: "Token"
|
||||||
twoStepAuthentication: "Two-factor authentication"
|
twoStepAuthentication: "Two-factor authentication"
|
||||||
|
@ -466,7 +466,7 @@ notFoundDescription: "No page corresponding to this URL could be found."
|
||||||
uploadFolder: "Default folder for uploads"
|
uploadFolder: "Default folder for uploads"
|
||||||
cacheClear: "Clear cache"
|
cacheClear: "Clear cache"
|
||||||
markAsReadAllNotifications: "Mark all notifications as read"
|
markAsReadAllNotifications: "Mark all notifications as read"
|
||||||
markAsReadAllUnreadNotes: "Mark all posts as read"
|
markAsReadAllUnreadNotes: "Mark all beeps as read"
|
||||||
markAsReadAllTalkMessages: "Mark all messages as read"
|
markAsReadAllTalkMessages: "Mark all messages as read"
|
||||||
help: "Help"
|
help: "Help"
|
||||||
inputMessageHere: "Enter message here"
|
inputMessageHere: "Enter message here"
|
||||||
|
@ -487,7 +487,7 @@ text: "Text"
|
||||||
enable: "Enable"
|
enable: "Enable"
|
||||||
next: "Next"
|
next: "Next"
|
||||||
retype: "Enter again"
|
retype: "Enter again"
|
||||||
noteOf: "Post by {user}"
|
noteOf: "Beep by {user}"
|
||||||
inviteToGroup: "Invite to group"
|
inviteToGroup: "Invite to group"
|
||||||
quoteAttached: "Quote"
|
quoteAttached: "Quote"
|
||||||
quoteQuestion: "Append as quote?"
|
quoteQuestion: "Append as quote?"
|
||||||
|
@ -546,8 +546,8 @@ accountSettings: "Account Settings"
|
||||||
promotion: "Promoted"
|
promotion: "Promoted"
|
||||||
promote: "Promote"
|
promote: "Promote"
|
||||||
numberOfDays: "Number of days"
|
numberOfDays: "Number of days"
|
||||||
hideThisNote: "Hide this post"
|
hideThisNote: "Hide this beep"
|
||||||
showFeaturedNotesInTimeline: "Show featured posts in timelines"
|
showFeaturedNotesInTimeline: "Show featured beeps in timelines"
|
||||||
objectStorage: "Object Storage"
|
objectStorage: "Object Storage"
|
||||||
useObjectStorage: "Use object storage"
|
useObjectStorage: "Use object storage"
|
||||||
objectStorageBaseUrl: "Base URL"
|
objectStorageBaseUrl: "Base URL"
|
||||||
|
@ -574,8 +574,8 @@ objectStorageUseProxyDesc: "Turn this off if you are not going to use a Proxy fo
|
||||||
objectStorageSetPublicRead: "Set \"public-read\" on upload"
|
objectStorageSetPublicRead: "Set \"public-read\" on upload"
|
||||||
serverLogs: "Server logs"
|
serverLogs: "Server logs"
|
||||||
deleteAll: "Delete all"
|
deleteAll: "Delete all"
|
||||||
showFixedPostForm: "Display the posting form at the top of the timeline"
|
showFixedPostForm: "Display the beeping form at the top of the timeline"
|
||||||
newNoteRecived: "There are new posts"
|
newNoteRecived: "There are new beeps"
|
||||||
sounds: "Sounds"
|
sounds: "Sounds"
|
||||||
listen: "Listen"
|
listen: "Listen"
|
||||||
none: "None"
|
none: "None"
|
||||||
|
@ -604,8 +604,8 @@ scratchpadDescription: "The scratchpad provides an environment for AiScript expe
|
||||||
output: "Output"
|
output: "Output"
|
||||||
script: "Script"
|
script: "Script"
|
||||||
disablePagesScript: "Disable AiScript on Pages"
|
disablePagesScript: "Disable AiScript on Pages"
|
||||||
expandOnNoteClick: "Open post on click"
|
expandOnNoteClick: "Open beep on click"
|
||||||
expandOnNoteClickDesc: "If disabled, you can still open posts in the right-click menu
|
expandOnNoteClickDesc: "If disabled, you can still open beeps in the right-click menu
|
||||||
or by clicking the timestamp."
|
or by clicking the timestamp."
|
||||||
updateRemoteUser: "Update remote user information"
|
updateRemoteUser: "Update remote user information"
|
||||||
deleteAllFiles: "Delete all files"
|
deleteAllFiles: "Delete all files"
|
||||||
|
@ -627,11 +627,11 @@ addRelay: "Add Relay"
|
||||||
inboxUrl: "Inbox URL"
|
inboxUrl: "Inbox URL"
|
||||||
addedRelays: "Added Relays"
|
addedRelays: "Added Relays"
|
||||||
serviceworkerInfo: "Must be enabled for push notifications."
|
serviceworkerInfo: "Must be enabled for push notifications."
|
||||||
deletedNote: "Deleted post"
|
deletedNote: "Deleted beep"
|
||||||
invisibleNote: "Invisible post"
|
invisibleNote: "Invisible beep"
|
||||||
enableInfiniteScroll: "Automatically load more"
|
enableInfiniteScroll: "Automatically load more"
|
||||||
visibility: "Visiblility"
|
visibility: "Visiblility"
|
||||||
cannotChangeScopeWhenEditing: "You can't change visibility of this post while editing"
|
cannotChangeScopeWhenEditing: "You can't change visibility of this beep while editing"
|
||||||
poll: "Poll"
|
poll: "Poll"
|
||||||
useCw: "Hide content"
|
useCw: "Hide content"
|
||||||
enablePlayer: "Open video player"
|
enablePlayer: "Open video player"
|
||||||
|
@ -687,9 +687,9 @@ regexpErrorDescription: "An error occurred in the regular expression on line {li
|
||||||
instanceMute: "Server Mutes"
|
instanceMute: "Server Mutes"
|
||||||
userSaysSomething: "{name} said something"
|
userSaysSomething: "{name} said something"
|
||||||
userSaysSomethingReason: "{name} said {reason}"
|
userSaysSomethingReason: "{name} said {reason}"
|
||||||
userSaysSomethingReasonReply: "{name} replied to a post containing {reason}"
|
userSaysSomethingReasonReply: "{name} replied to a beep containing {reason}"
|
||||||
userSaysSomethingReasonRenote: "{name} boosted a post containing {reason}"
|
userSaysSomethingReasonRenote: "{name} boosted a beep containing {reason}"
|
||||||
userSaysSomethingReasonQuote: "{name} quoted a post containing {reason}"
|
userSaysSomethingReasonQuote: "{name} quoted a beep containing {reason}"
|
||||||
makeActive: "Activate"
|
makeActive: "Activate"
|
||||||
display: "Display"
|
display: "Display"
|
||||||
copy: "Copy"
|
copy: "Copy"
|
||||||
|
@ -719,7 +719,7 @@ abuseReports: "Reports"
|
||||||
reportAbuse: "Report"
|
reportAbuse: "Report"
|
||||||
reportAbuseOf: "Report {name}"
|
reportAbuseOf: "Report {name}"
|
||||||
fillAbuseReportDescription: "Please fill in details regarding this report. If it is
|
fillAbuseReportDescription: "Please fill in details regarding this report. If it is
|
||||||
about a specific post, please include its URL."
|
about a specific beep, please include its URL."
|
||||||
abuseReported: "Your report has been sent. Thank you very much."
|
abuseReported: "Your report has been sent. Thank you very much."
|
||||||
reporter: "Reporter"
|
reporter: "Reporter"
|
||||||
reporteeOrigin: "Reportee Origin"
|
reporteeOrigin: "Reportee Origin"
|
||||||
|
@ -733,7 +733,7 @@ openInNewTab: "Open in new tab"
|
||||||
openInSideView: "Open in side view"
|
openInSideView: "Open in side view"
|
||||||
defaultNavigationBehaviour: "Default navigation behavior"
|
defaultNavigationBehaviour: "Default navigation behavior"
|
||||||
editTheseSettingsMayBreakAccount: "Editing these settings may damage your account."
|
editTheseSettingsMayBreakAccount: "Editing these settings may damage your account."
|
||||||
instanceTicker: "Server information of posts"
|
instanceTicker: "Server information of beeps"
|
||||||
waitingFor: "Waiting for {x}"
|
waitingFor: "Waiting for {x}"
|
||||||
random: "Random"
|
random: "Random"
|
||||||
system: "System"
|
system: "System"
|
||||||
|
@ -744,14 +744,14 @@ createNew: "Create new"
|
||||||
optional: "Optional"
|
optional: "Optional"
|
||||||
createNewClip: "Create new clip"
|
createNewClip: "Create new clip"
|
||||||
unclip: "Unclip"
|
unclip: "Unclip"
|
||||||
confirmToUnclipAlreadyClippedNote: "This post is already part of the \"{name}\" clip.
|
confirmToUnclipAlreadyClippedNote: "This beep is already part of the \"{name}\" clip.
|
||||||
Do you want to remove it from this clip instead?"
|
Do you want to remove it from this clip instead?"
|
||||||
public: "Public"
|
public: "Public"
|
||||||
i18nInfo: "Iceshrimp is being translated into various languages by volunteers. You
|
i18nInfo: "Iceshrimp is being translated into various languages by volunteers. You
|
||||||
can help at {link}."
|
can help at {link}."
|
||||||
manageAccessTokens: "Manage access tokens"
|
manageAccessTokens: "Manage access tokens"
|
||||||
accountInfo: "Account Info"
|
accountInfo: "Account Info"
|
||||||
notesCount: "Number of posts"
|
notesCount: "Number of beeps"
|
||||||
repliesCount: "Number of replies sent"
|
repliesCount: "Number of replies sent"
|
||||||
renotesCount: "Number of boosts sent"
|
renotesCount: "Number of boosts sent"
|
||||||
repliedCount: "Number of replies received"
|
repliedCount: "Number of replies received"
|
||||||
|
@ -767,10 +767,10 @@ no: "No"
|
||||||
driveFilesCount: "Number of Drive files"
|
driveFilesCount: "Number of Drive files"
|
||||||
driveUsage: "Drive space usage"
|
driveUsage: "Drive space usage"
|
||||||
noCrawle: "Reject crawler indexing"
|
noCrawle: "Reject crawler indexing"
|
||||||
noCrawleDescription: "Ask search engines to not index your profile page, posts, Pages,
|
noCrawleDescription: "Ask search engines to not index your profile page, beeps, Pages,
|
||||||
etc."
|
etc."
|
||||||
lockedAccountInfo: "Unless you set your post visiblity to \"Followers only\", your
|
lockedAccountInfo: "Unless you set your beep visiblity to \"Followers only\", your
|
||||||
posts will be visible to anyone, even if you require followers to be manually approved."
|
beeps will be visible to anyone, even if you require followers to be manually approved."
|
||||||
alwaysMarkSensitive: "Mark as sensitive by default"
|
alwaysMarkSensitive: "Mark as sensitive by default"
|
||||||
loadRawImages: "Load original images instead of showing thumbnails"
|
loadRawImages: "Load original images instead of showing thumbnails"
|
||||||
disableShowingAnimatedImages: "Don't play animated images"
|
disableShowingAnimatedImages: "Don't play animated images"
|
||||||
|
@ -778,20 +778,20 @@ verificationEmailSent: "A verification email has been sent. Please follow the in
|
||||||
link to complete verification."
|
link to complete verification."
|
||||||
notSet: "Not set"
|
notSet: "Not set"
|
||||||
emailVerified: "Email has been verified"
|
emailVerified: "Email has been verified"
|
||||||
noteFavoritesCount: "Number of bookmarked posts"
|
noteFavoritesCount: "Number of bookmarked beeps"
|
||||||
pageLikesCount: "Number of liked Pages"
|
pageLikesCount: "Number of liked Pages"
|
||||||
pageLikedCount: "Number of received Page likes"
|
pageLikedCount: "Number of received Page likes"
|
||||||
contact: "Contact"
|
contact: "Contact"
|
||||||
useSystemFont: "Use the system's default font"
|
useSystemFont: "Use the system's default font"
|
||||||
clips: "Clips"
|
clips: "Clips"
|
||||||
clipsDesc: "Clips are like share-able categorized bookmarks. You can create clips
|
clipsDesc: "Clips are like share-able categorized bookmarks. You can create clips
|
||||||
from the menu of individual posts."
|
from the menu of individual beeps."
|
||||||
experimentalFeatures: "Experimental features"
|
experimentalFeatures: "Experimental features"
|
||||||
developer: "Developer"
|
developer: "Developer"
|
||||||
makeExplorable: "Make account visible in \"Explore\""
|
makeExplorable: "Make account visible in \"Explore\""
|
||||||
makeExplorableDescription: "If you turn this off, your account will not show up in
|
makeExplorableDescription: "If you turn this off, your account will not show up in
|
||||||
the \"Explore\" section."
|
the \"Explore\" section."
|
||||||
showGapBetweenNotesInTimeline: "Show a gap between posts on the timeline"
|
showGapBetweenNotesInTimeline: "Show a gap between beeps on the timeline"
|
||||||
duplicate: "Duplicate"
|
duplicate: "Duplicate"
|
||||||
left: "Left"
|
left: "Left"
|
||||||
center: "Center"
|
center: "Center"
|
||||||
|
@ -803,7 +803,7 @@ showTitlebar: "Show title bar"
|
||||||
clearCache: "Clear cache"
|
clearCache: "Clear cache"
|
||||||
onlineUsersCount: "{n} users are online"
|
onlineUsersCount: "{n} users are online"
|
||||||
nUsers: "{n} Users"
|
nUsers: "{n} Users"
|
||||||
nNotes: "{n} Posts"
|
nNotes: "{n} Beeps"
|
||||||
sendErrorReports: "Send error reports"
|
sendErrorReports: "Send error reports"
|
||||||
sendErrorReportsDescription: "When turned on, detailed error information will be shared
|
sendErrorReportsDescription: "When turned on, detailed error information will be shared
|
||||||
with Iceshrimp when a problem occurs, helping to improve the quality of Iceshrimp.\n
|
with Iceshrimp when a problem occurs, helping to improve the quality of Iceshrimp.\n
|
||||||
|
@ -847,9 +847,9 @@ unlikeConfirm: "Really remove your like?"
|
||||||
fullView: "Full view"
|
fullView: "Full view"
|
||||||
quitFullView: "Exit full view"
|
quitFullView: "Exit full view"
|
||||||
addDescription: "Add description"
|
addDescription: "Add description"
|
||||||
userPagePinTip: "You can display posts here by selecting \"Pin to profile\" from the
|
userPagePinTip: "You can display beeps here by selecting \"Pin to profile\" from the
|
||||||
menu of individual posts."
|
menu of individual beeps."
|
||||||
notSpecifiedMentionWarning: "This post contains mentions of users not included as
|
notSpecifiedMentionWarning: "This beep contains mentions of users not included as
|
||||||
recipients"
|
recipients"
|
||||||
info: "About"
|
info: "About"
|
||||||
userInfo: "User information"
|
userInfo: "User information"
|
||||||
|
@ -876,11 +876,11 @@ switch: "Switch"
|
||||||
noMaintainerInformationWarning: "Maintainer information is not configured."
|
noMaintainerInformationWarning: "Maintainer information is not configured."
|
||||||
noBotProtectionWarning: "Bot protection is not configured."
|
noBotProtectionWarning: "Bot protection is not configured."
|
||||||
configure: "Configure"
|
configure: "Configure"
|
||||||
postToGallery: "Create new gallery post"
|
postToGallery: "Create new gallery beep"
|
||||||
gallery: "Gallery"
|
gallery: "Gallery"
|
||||||
recentPosts: "Recent pages"
|
recentPosts: "Recent pages"
|
||||||
popularPosts: "Popular pages"
|
popularPosts: "Popular pages"
|
||||||
shareWithNote: "Share with post"
|
shareWithNote: "Share with beep"
|
||||||
ads: "Advertisements"
|
ads: "Advertisements"
|
||||||
expiration: "Deadline"
|
expiration: "Deadline"
|
||||||
memo: "Memo"
|
memo: "Memo"
|
||||||
|
@ -895,7 +895,7 @@ instanceSecurity: "Server Security"
|
||||||
secureModeInfo: "When requesting from other servers, do not send back without proof."
|
secureModeInfo: "When requesting from other servers, do not send back without proof."
|
||||||
privateMode: "Private Mode"
|
privateMode: "Private Mode"
|
||||||
privateModeInfo: "When enabled, only the listed servers can federate with your server.
|
privateModeInfo: "When enabled, only the listed servers can federate with your server.
|
||||||
All posts will be hidden from the public."
|
All beeps will be hidden from the public."
|
||||||
allowedInstances: "Allowlisted Servers"
|
allowedInstances: "Allowlisted Servers"
|
||||||
allowedInstancesDescription: "Hosts of servers to be allowed to federate with, each
|
allowedInstancesDescription: "Hosts of servers to be allowed to federate with, each
|
||||||
separated by a new line (only applies in private mode)."
|
separated by a new line (only applies in private mode)."
|
||||||
|
@ -1083,7 +1083,7 @@ migrationConfirm: "Are you absolutely sure you want to migrate your account to {
|
||||||
Once you do this, you won't be able to reverse it, and you won't be able to use
|
Once you do this, you won't be able to reverse it, and you won't be able to use
|
||||||
your account normally again.\nAlso, please ensure that you've set this current account
|
your account normally again.\nAlso, please ensure that you've set this current account
|
||||||
as the account you're moving from."
|
as the account you're moving from."
|
||||||
defaultReaction: "Default emoji reaction for outgoing and incoming posts"
|
defaultReaction: "Default emoji reaction for outgoing and incoming beeps"
|
||||||
license: "License"
|
license: "License"
|
||||||
customKaTeXMacro: "Custom KaTeX macros"
|
customKaTeXMacro: "Custom KaTeX macros"
|
||||||
customKaTeXMacroDescription: "Set up macros to write mathematical expressions easily!
|
customKaTeXMacroDescription: "Set up macros to write mathematical expressions easily!
|
||||||
|
@ -1096,7 +1096,7 @@ customKaTeXMacroDescription: "Set up macros to write mathematical expressions ea
|
||||||
lines are simply ignored. Only simple string substitution functions are supported;
|
lines are simply ignored. Only simple string substitution functions are supported;
|
||||||
advanced syntax, such as conditional branching, cannot be used here."
|
advanced syntax, such as conditional branching, cannot be used here."
|
||||||
enableCustomKaTeXMacro: "Enable custom KaTeX macros"
|
enableCustomKaTeXMacro: "Enable custom KaTeX macros"
|
||||||
noteId: "Post ID"
|
noteId: "Beep ID"
|
||||||
signupsDisabled: "Signups on this server are currently disabled, but you can always
|
signupsDisabled: "Signups on this server are currently disabled, but you can always
|
||||||
sign up at another server! If you have an invitation code for this server, please
|
sign up at another server! If you have an invitation code for this server, please
|
||||||
enter it below."
|
enter it below."
|
||||||
|
@ -1105,7 +1105,7 @@ apps: "Apps"
|
||||||
sendModMail: "Send Moderation Notice"
|
sendModMail: "Send Moderation Notice"
|
||||||
preventAiLearning: "Prevent AI bot scraping"
|
preventAiLearning: "Prevent AI bot scraping"
|
||||||
preventAiLearningDescription: "Request third-party AI language models not to study
|
preventAiLearningDescription: "Request third-party AI language models not to study
|
||||||
content you upload, such as posts and images."
|
content you upload, such as beeps and images."
|
||||||
noGraze: "Please disable the \"Graze for Mastodon\" browser extension, as it interferes
|
noGraze: "Please disable the \"Graze for Mastodon\" browser extension, as it interferes
|
||||||
with Iceshrimp."
|
with Iceshrimp."
|
||||||
silencedWarning: "This page is showing because these users are from servers your admin
|
silencedWarning: "This page is showing because these users are from servers your admin
|
||||||
|
@ -1132,6 +1132,11 @@ openInMainColumn: "Open in main column"
|
||||||
searchNotLoggedIn_1: "You have to be authenticated in order to use full text search."
|
searchNotLoggedIn_1: "You have to be authenticated in order to use full text search."
|
||||||
searchNotLoggedIn_2: "However, you can search using hashtags, and search users."
|
searchNotLoggedIn_2: "However, you can search using hashtags, and search users."
|
||||||
searchEmptyQuery: "Please enter a search term."
|
searchEmptyQuery: "Please enter a search term."
|
||||||
|
bite: "Bite"
|
||||||
|
biteBack: "Bite back"
|
||||||
|
bittenBack: "Bitten back"
|
||||||
|
bitYou: "bit you"
|
||||||
|
bitYouBack: "bit you back"
|
||||||
|
|
||||||
_sensitiveMediaDetection:
|
_sensitiveMediaDetection:
|
||||||
description: "Reduces the effort of server moderation through automatically recognizing
|
description: "Reduces the effort of server moderation through automatically recognizing
|
||||||
|
@ -1184,7 +1189,7 @@ _forgotPassword:
|
||||||
the server administrator to reset your password instead."
|
the server administrator to reset your password instead."
|
||||||
_gallery:
|
_gallery:
|
||||||
my: "My Gallery"
|
my: "My Gallery"
|
||||||
liked: "Liked Posts"
|
liked: "Liked beeps"
|
||||||
like: "Like"
|
like: "Like"
|
||||||
unlike: "Remove like"
|
unlike: "Remove like"
|
||||||
_email:
|
_email:
|
||||||
|
@ -1225,11 +1230,10 @@ _registry:
|
||||||
domain: "Domain"
|
domain: "Domain"
|
||||||
createKey: "Create key"
|
createKey: "Create key"
|
||||||
_aboutIceshrimp:
|
_aboutIceshrimp:
|
||||||
about: "Iceshrimp is yet another fork of Misskey, bringing you no-nonsense fixes,
|
about: "Jörmungandr-bite is a fork of Iceshrimp Bite which is a fork of Iceshrimp which is a fork of Firefish which is a rebranding of Calckey, which is a fork of Misskey, Confused? I hope so."
|
||||||
features & improvements you actually want since 2023."
|
|
||||||
contributors: "Main contributors"
|
contributors: "Main contributors"
|
||||||
allContributors: "All contributors"
|
allContributors: "All contributors"
|
||||||
source: "Iceshrimp development"
|
source: "Jörmungandr-bite development"
|
||||||
translation: "Translations"
|
translation: "Translations"
|
||||||
chatroom: "Chat room"
|
chatroom: "Chat room"
|
||||||
documentation: "Documentation"
|
documentation: "Documentation"
|
||||||
|
@ -1258,7 +1262,7 @@ _mfm:
|
||||||
alwaysPlay: "Always autoplay all animated MFM"
|
alwaysPlay: "Always autoplay all animated MFM"
|
||||||
cheatSheet: "MFM Cheatsheet"
|
cheatSheet: "MFM Cheatsheet"
|
||||||
intro: "MFM is a markup language used on Iceshrimp, Misskey, Akkoma, and more that
|
intro: "MFM is a markup language used on Iceshrimp, Misskey, Akkoma, and more that
|
||||||
can be used in posts and chats. Here you can view a list of all available MFM
|
can be used in beeps and chats. Here you can view a list of all available MFM
|
||||||
syntax."
|
syntax."
|
||||||
dummy: "Iceshrimp expands the world of the Fediverse"
|
dummy: "Iceshrimp expands the world of the Fediverse"
|
||||||
advanced: "Advanced MFM"
|
advanced: "Advanced MFM"
|
||||||
|
@ -1359,7 +1363,7 @@ _channel:
|
||||||
owned: "Owned"
|
owned: "Owned"
|
||||||
following: "Followed"
|
following: "Followed"
|
||||||
usersCount: "{n} Participants"
|
usersCount: "{n} Participants"
|
||||||
notesCount: "{n} Posts"
|
notesCount: "{n} Beeps"
|
||||||
nameAndDescription: "Name and description"
|
nameAndDescription: "Name and description"
|
||||||
nameOnly: "Name only"
|
nameOnly: "Name only"
|
||||||
_messaging:
|
_messaging:
|
||||||
|
@ -1375,18 +1379,18 @@ _wordMute:
|
||||||
muteWordsDescription: "Separate with spaces for an AND condition or with line breaks
|
muteWordsDescription: "Separate with spaces for an AND condition or with line breaks
|
||||||
for an OR condition."
|
for an OR condition."
|
||||||
muteWordsDescription2: "Surround keywords with slashes to use regular expressions."
|
muteWordsDescription2: "Surround keywords with slashes to use regular expressions."
|
||||||
softDescription: "Hide posts that fulfil the set conditions from the timeline."
|
softDescription: "Hide beeps that fulfil the set conditions from the timeline."
|
||||||
hardDescription: "Prevents posts fulfilling the set conditions from being added
|
hardDescription: "Prevents beeps fulfilling the set conditions from being added
|
||||||
to the timeline. In addition, these posts will not be added to the timeline even
|
to the timeline. In addition, these beeps will not be added to the timeline even
|
||||||
if the conditions are changed."
|
if the conditions are changed."
|
||||||
soft: "Soft"
|
soft: "Soft"
|
||||||
hard: "Hard"
|
hard: "Hard"
|
||||||
mutedNotes: "Muted posts"
|
mutedNotes: "Muted beeps"
|
||||||
_instanceMute:
|
_instanceMute:
|
||||||
instanceMuteDescription: "This will mute any posts/boosts from the listed servers,
|
instanceMuteDescription: "This will mute any beeps/boosts from the listed servers,
|
||||||
including those of users replying to a user from a muted server."
|
including those of users replying to a user from a muted server."
|
||||||
instanceMuteDescription2: "Separate with newlines"
|
instanceMuteDescription2: "Separate with newlines"
|
||||||
title: "Hides posts from listed servers."
|
title: "Hides beeps from listed servers."
|
||||||
heading: "List of servers to be muted"
|
heading: "List of servers to be muted"
|
||||||
_theme:
|
_theme:
|
||||||
explore: "Explore Themes"
|
explore: "Explore Themes"
|
||||||
|
@ -1463,8 +1467,8 @@ _theme:
|
||||||
accentLighten: "Accent (Lightened)"
|
accentLighten: "Accent (Lightened)"
|
||||||
fgHighlighted: "Highlighted Text"
|
fgHighlighted: "Highlighted Text"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "New post"
|
note: "New beep"
|
||||||
noteMy: "Own post"
|
noteMy: "Own beep"
|
||||||
notification: "Notifications"
|
notification: "Notifications"
|
||||||
chat: "Chat"
|
chat: "Chat"
|
||||||
chatBg: "Chat (Background)"
|
chatBg: "Chat (Background)"
|
||||||
|
@ -1489,11 +1493,11 @@ _filters:
|
||||||
_dialog:
|
_dialog:
|
||||||
title: "Search filter syntax"
|
title: "Search filter syntax"
|
||||||
learnMore: "View filter syntax"
|
learnMore: "View filter syntax"
|
||||||
wordFilters: "Filter by post text"
|
wordFilters: "Filter by beep text"
|
||||||
inFilters: "Filter by bookmark and/or favorite status"
|
inFilters: "Filter by bookmark and/or favorite status"
|
||||||
miscFilters: "Filter by following relationship and/or note type"
|
miscFilters: "Filter by following relationship and/or note type"
|
||||||
userDomain: "Filter by author, mentioned users, reply user or instance domain"
|
userDomain: "Filter by author, mentioned users, reply user or instance domain"
|
||||||
postDate: "Filter by post date"
|
postDate: "Filter by beep date"
|
||||||
exclusivity: "Note that the before: filter is exclusive, while the after: filter
|
exclusivity: "Note that the before: filter is exclusive, while the after: filter
|
||||||
is inclusive."
|
is inclusive."
|
||||||
word: "word"
|
word: "word"
|
||||||
|
@ -1515,8 +1519,8 @@ _filters:
|
||||||
inBookmarks: "Bookmarked"
|
inBookmarks: "Bookmarked"
|
||||||
withFile: "Has attachment"
|
withFile: "Has attachment"
|
||||||
fromDomain: "Specific instance only"
|
fromDomain: "Specific instance only"
|
||||||
notesBefore: "Posts before"
|
notesBefore: "Beeps before"
|
||||||
notesAfter: "Posts after"
|
notesAfter: "Beeps after"
|
||||||
followingOnly: "Following only"
|
followingOnly: "Following only"
|
||||||
followersOnly: "Followers only"
|
followersOnly: "Followers only"
|
||||||
repliesOnly: "Replies only"
|
repliesOnly: "Replies only"
|
||||||
|
@ -1530,24 +1534,24 @@ _tutorial:
|
||||||
step1_2: "Let's get you set up. You'll be up and running in no time!"
|
step1_2: "Let's get you set up. You'll be up and running in no time!"
|
||||||
step2_1: "First, please fill out your profile."
|
step2_1: "First, please fill out your profile."
|
||||||
step2_2: "Providing some information about who you are will make it easier for others
|
step2_2: "Providing some information about who you are will make it easier for others
|
||||||
to tell if they want to see your posts or follow you."
|
to tell if they want to see your beeps or follow you."
|
||||||
step3_1: "Now it's time to follow some people!"
|
step3_1: "Now it's time to follow some people!"
|
||||||
step3_2: "Your home and social timelines are based off of who you follow, so try
|
step3_2: "Your home and social timelines are based off of who you follow, so try
|
||||||
following a couple accounts to get started.\nClick the plus circle on the top
|
following a couple accounts to get started.\nClick the plus circle on the top
|
||||||
right of a profile to follow them."
|
right of a profile to follow them."
|
||||||
step4_1: "Let's get you out there."
|
step4_1: "Let's get you out there."
|
||||||
step4_2: "For your first post, some people like to make an {introduction} post or
|
step4_2: "For your first beep, some people like to make an {introduction} beep or
|
||||||
a simple \"Hello world!\""
|
a simple \"Hello world!\""
|
||||||
step5_1: "Timelines, timelines everywhere!"
|
step5_1: "Timelines, timelines everywhere!"
|
||||||
step5_2: "Your server has {timelines} different timelines enabled."
|
step5_2: "Your server has {timelines} different timelines enabled."
|
||||||
step5_3: "The Home {icon} timeline is where you can see posts from the accounts
|
step5_3: "The Home {icon} timeline is where you can see beeps from the accounts
|
||||||
you follow."
|
you follow."
|
||||||
step5_4: "The Local {icon} timeline is where you can see posts from everyone else
|
step5_4: "The Local {icon} timeline is where you can see beeps from everyone else
|
||||||
on this server."
|
on this server."
|
||||||
step5_5: "The Social {icon} timeline is a combination of the Home and Local timelines."
|
step5_5: "The Social {icon} timeline is a combination of the Home and Local timelines."
|
||||||
step5_6: "The Recommended {icon} timeline is where you can see posts from servers
|
step5_6: "The Recommended {icon} timeline is where you can see beeps from servers
|
||||||
the admins recommend."
|
the admins recommend."
|
||||||
step5_7: "The Global {icon} timeline is where you can see posts from every other
|
step5_7: "The Global {icon} timeline is where you can see beeps from every other
|
||||||
connected server."
|
connected server."
|
||||||
step6_1: "So, what is this place?"
|
step6_1: "So, what is this place?"
|
||||||
step6_2: "Well, you didn't just join Iceshrimp. You joined a portal to the Fediverse,
|
step6_2: "Well, you didn't just join Iceshrimp. You joined a portal to the Fediverse,
|
||||||
|
@ -1602,7 +1606,7 @@ _permissions:
|
||||||
"write:messaging": "Compose or delete chat messages"
|
"write:messaging": "Compose or delete chat messages"
|
||||||
"read:mutes": "View your list of muted users"
|
"read:mutes": "View your list of muted users"
|
||||||
"write:mutes": "Edit your list of muted users"
|
"write:mutes": "Edit your list of muted users"
|
||||||
"write:notes": "Compose or delete posts"
|
"write:notes": "Compose or delete beeps"
|
||||||
"read:notifications": "View your notifications"
|
"read:notifications": "View your notifications"
|
||||||
"write:notifications": "Manage your notifications"
|
"write:notifications": "Manage your notifications"
|
||||||
"read:reactions": "View your reactions"
|
"read:reactions": "View your reactions"
|
||||||
|
@ -1618,8 +1622,8 @@ _permissions:
|
||||||
"write:channels": "Edit your channels"
|
"write:channels": "Edit your channels"
|
||||||
"read:gallery": "View your gallery"
|
"read:gallery": "View your gallery"
|
||||||
"write:gallery": "Edit your gallery"
|
"write:gallery": "Edit your gallery"
|
||||||
"read:gallery-likes": "View your list of liked gallery posts"
|
"read:gallery-likes": "View your list of liked gallery beeps"
|
||||||
"write:gallery-likes": "Edit your list of liked gallery posts"
|
"write:gallery-likes": "Edit your list of liked gallery beeps"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
|
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
|
||||||
shareAccessAsk: "Are you sure you want to authorize this application to access your
|
shareAccessAsk: "Are you sure you want to authorize this application to access your
|
||||||
|
@ -1633,12 +1637,12 @@ _auth:
|
||||||
signedInAs: "Signed in as"
|
signedInAs: "Signed in as"
|
||||||
authRequired: "Authorization required"
|
authRequired: "Authorization required"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "All posts"
|
all: "All beeps"
|
||||||
homeTimeline: "Posts from followed users"
|
homeTimeline: "Beeps from followed users"
|
||||||
users: "Posts from specific users"
|
users: "Beeps from specific users"
|
||||||
userList: "Posts from a specified list of users"
|
userList: "Beeps from a specified list of users"
|
||||||
userGroup: "Posts from users in a specified group"
|
userGroup: "Beeps from users in a specified group"
|
||||||
instances: "Posts from all users on an server"
|
instances: "Beeps from all users on an server"
|
||||||
_weekday:
|
_weekday:
|
||||||
sunday: "Sunday"
|
sunday: "Sunday"
|
||||||
monday: "Monday"
|
monday: "Monday"
|
||||||
|
@ -1662,7 +1666,7 @@ _widgets:
|
||||||
unixClock: "UNIX Clock"
|
unixClock: "UNIX Clock"
|
||||||
federation: "Federation"
|
federation: "Federation"
|
||||||
instanceCloud: "Server Cloud"
|
instanceCloud: "Server Cloud"
|
||||||
postForm: "Posting Form"
|
postForm: "Beeping Form"
|
||||||
slideshow: "Slideshow"
|
slideshow: "Slideshow"
|
||||||
button: "Button"
|
button: "Button"
|
||||||
onlineUsers: "Online Users"
|
onlineUsers: "Online Users"
|
||||||
|
@ -1675,7 +1679,7 @@ _widgets:
|
||||||
chooseList: "Select a list"
|
chooseList: "Select a list"
|
||||||
meiliStatus: "Server Status"
|
meiliStatus: "Server Status"
|
||||||
meiliSize: "Index size"
|
meiliSize: "Index size"
|
||||||
meiliIndexCount: "Indexed posts"
|
meiliIndexCount: "Indexed beeps"
|
||||||
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Hide content"
|
hide: "Hide content"
|
||||||
|
@ -1706,9 +1710,9 @@ _poll:
|
||||||
remainingSeconds: "{s} second(s) remaining"
|
remainingSeconds: "{s} second(s) remaining"
|
||||||
_visibility:
|
_visibility:
|
||||||
public: "Public"
|
public: "Public"
|
||||||
publicDescription: "Your post will be visible in all public timelines"
|
publicDescription: "Your beep will be visible in all public timelines"
|
||||||
home: "Unlisted"
|
home: "Unlisted"
|
||||||
homeDescription: "Post to home timeline only"
|
homeDescription: "Beep to home timeline only"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
followersDescription: "Make visible to your followers and mentioned users only"
|
followersDescription: "Make visible to your followers and mentioned users only"
|
||||||
specified: "Direct"
|
specified: "Direct"
|
||||||
|
@ -1716,9 +1720,9 @@ _visibility:
|
||||||
localOnly: "Local only"
|
localOnly: "Local only"
|
||||||
localOnlyDescription: "Not visible to remote users"
|
localOnlyDescription: "Not visible to remote users"
|
||||||
_postForm:
|
_postForm:
|
||||||
replyPlaceholder: "Reply to this post…"
|
replyPlaceholder: "Reply to this beep…"
|
||||||
quotePlaceholder: "Quote this post…"
|
quotePlaceholder: "Quote this beep…"
|
||||||
channelPlaceholder: "Post to a channel…"
|
channelPlaceholder: "Beep to a channel…"
|
||||||
_placeholders:
|
_placeholders:
|
||||||
a: "What are you up to?"
|
a: "What are you up to?"
|
||||||
b: "What's happening around you?"
|
b: "What's happening around you?"
|
||||||
|
@ -1743,7 +1747,7 @@ _profile:
|
||||||
locationDescription: "If you enter your city first, it will display your local time
|
locationDescription: "If you enter your city first, it will display your local time
|
||||||
to other users."
|
to other users."
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "All posts"
|
allNotes: "All beeps"
|
||||||
followingList: "Followed users"
|
followingList: "Followed users"
|
||||||
muteList: "Muted users"
|
muteList: "Muted users"
|
||||||
blockingList: "Blocked users"
|
blockingList: "Blocked users"
|
||||||
|
@ -1756,10 +1760,10 @@ _charts:
|
||||||
usersIncDec: "Difference in the number of users"
|
usersIncDec: "Difference in the number of users"
|
||||||
usersTotal: "Total number of users"
|
usersTotal: "Total number of users"
|
||||||
activeUsers: "Active users"
|
activeUsers: "Active users"
|
||||||
notesIncDec: "Difference in the number of posts"
|
notesIncDec: "Difference in the number of beeps"
|
||||||
localNotesIncDec: "Difference in the number of local posts"
|
localNotesIncDec: "Difference in the number of local beeps"
|
||||||
remoteNotesIncDec: "Difference in the number of remote posts"
|
remoteNotesIncDec: "Difference in the number of remote beeps"
|
||||||
notesTotal: "Total number of posts"
|
notesTotal: "Total number of beeps"
|
||||||
filesIncDec: "Difference in the number of files"
|
filesIncDec: "Difference in the number of files"
|
||||||
filesTotal: "Total number of files"
|
filesTotal: "Total number of files"
|
||||||
storageUsageIncDec: "Difference in storage usage"
|
storageUsageIncDec: "Difference in storage usage"
|
||||||
|
@ -1768,8 +1772,8 @@ _instanceCharts:
|
||||||
requests: "Requests"
|
requests: "Requests"
|
||||||
users: "Difference in the number of users"
|
users: "Difference in the number of users"
|
||||||
usersTotal: "Cumulative number of users"
|
usersTotal: "Cumulative number of users"
|
||||||
notes: "Difference in the number of posts"
|
notes: "Difference in the number of beeps"
|
||||||
notesTotal: "Cumulative number of posts"
|
notesTotal: "Cumulative number of beeps"
|
||||||
ff: "Difference in the number of followed users / followers "
|
ff: "Difference in the number of followed users / followers "
|
||||||
ffTotal: "Cumulative number of followed users / followers"
|
ffTotal: "Cumulative number of followed users / followers"
|
||||||
cacheSize: "Difference in cache size"
|
cacheSize: "Difference in cache size"
|
||||||
|
@ -1831,7 +1835,7 @@ _pages:
|
||||||
if: "If"
|
if: "If"
|
||||||
_if:
|
_if:
|
||||||
variable: "Variable"
|
variable: "Variable"
|
||||||
post: "Posting form"
|
post: "Beeping form"
|
||||||
_post:
|
_post:
|
||||||
text: "Content"
|
text: "Content"
|
||||||
attachCanvasImage: "Attach canvas image"
|
attachCanvasImage: "Attach canvas image"
|
||||||
|
@ -1856,10 +1860,10 @@ _pages:
|
||||||
id: "Canvas ID"
|
id: "Canvas ID"
|
||||||
width: "Width"
|
width: "Width"
|
||||||
height: "Height"
|
height: "Height"
|
||||||
note: "Embedded post"
|
note: "Embedded beep"
|
||||||
_note:
|
_note:
|
||||||
id: "Post ID"
|
id: "Beep ID"
|
||||||
idDescription: "You can alternatively paste the post URL here."
|
idDescription: "You can alternatively paste the beep URL here."
|
||||||
detailed: "Detailed view"
|
detailed: "Detailed view"
|
||||||
switch: "Switch"
|
switch: "Switch"
|
||||||
_switch:
|
_switch:
|
||||||
|
@ -2092,7 +2096,7 @@ _notification:
|
||||||
pollEnded: "Poll results have become available"
|
pollEnded: "Poll results have become available"
|
||||||
emptyPushNotificationMessage: "Push notifications have been updated"
|
emptyPushNotificationMessage: "Push notifications have been updated"
|
||||||
reacted: "reacted to your post"
|
reacted: "reacted to your post"
|
||||||
renoted: "boosted your post"
|
renoted: "boosted your beep"
|
||||||
voted: "voted on your poll"
|
voted: "voted on your poll"
|
||||||
_types:
|
_types:
|
||||||
all: "All"
|
all: "All"
|
||||||
|
@ -2108,6 +2112,7 @@ _notification:
|
||||||
followRequestAccepted: "Accepted follow requests"
|
followRequestAccepted: "Accepted follow requests"
|
||||||
groupInvited: "Group invitations"
|
groupInvited: "Group invitations"
|
||||||
app: "Notifications from linked apps"
|
app: "Notifications from linked apps"
|
||||||
|
bite: "Bites"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "followed you back"
|
followBack: "followed you back"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
|
@ -2145,8 +2150,8 @@ _deck:
|
||||||
direct: "Direct messages"
|
direct: "Direct messages"
|
||||||
_experiments:
|
_experiments:
|
||||||
title: "Experiments"
|
title: "Experiments"
|
||||||
enablePostImports: "Enable post imports"
|
enablePostImports: "Enable beep imports"
|
||||||
postImportsCaption: "Allows users to import their posts from past Iceshrimp, Misskey,
|
postImportsCaption: "Allows users to import their beeps from past Iceshrimp, Misskey,
|
||||||
Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during load if
|
Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during load if
|
||||||
your queue is bottlenecked."
|
your queue is bottlenecked."
|
||||||
_dialog:
|
_dialog:
|
||||||
|
@ -2169,12 +2174,12 @@ _cwStyle:
|
||||||
modern: "Modern"
|
modern: "Modern"
|
||||||
classic: "Classic (Misskey/Foundkey-like)"
|
classic: "Classic (Misskey/Foundkey-like)"
|
||||||
alternative: "Alternative (Firefish-like)"
|
alternative: "Alternative (Firefish-like)"
|
||||||
alwaysExpandCws: "Always expand posts with content warnings"
|
alwaysExpandCws: "Always expand beeps with content warnings"
|
||||||
hideFromHome: "Hide from home timeline"
|
hideFromHome: "Hide from home timeline"
|
||||||
_wellness:
|
_wellness:
|
||||||
name: "Wellness"
|
name: "Wellness"
|
||||||
description: "These settings allow you to adjust possibly addictive or anxiety-inducing
|
description: "These settings allow you to adjust possibly addictive or anxiety-inducing
|
||||||
aspects of social media. Choose the settings that are ideal for you."
|
aspects of social media. Choose the settings that are ideal for you."
|
||||||
newPostsButton: "Enable new posts alert button"
|
newPostsButton: "Enable new beeps alert button"
|
||||||
newPostsGlowOpacity: "New posts glow opacity"
|
newPostsGlowOpacity: "New beeps glow opacity"
|
||||||
immediacy: "Immediacy"
|
immediacy: "Immediacy"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "iceshrimp",
|
"name": "iceshrimp",
|
||||||
"version": "2023.12.7",
|
"version": "2023.12.7-jormungandr-bite.0.5.2",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://iceshrimp.dev/iceshrimp/iceshrimp.git"
|
"url": "https://iceshrimp.dev/iceshrimp/iceshrimp.git"
|
||||||
|
|
BIN
packages/backend/assets/apple-touch-icon.png
(Stored with Git LFS)
BIN
packages/backend/assets/apple-touch-icon.png
(Stored with Git LFS)
Binary file not shown.
BIN
packages/backend/assets/badges/error.png
(Stored with Git LFS)
Normal file
BIN
packages/backend/assets/badges/error.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
packages/backend/assets/badges/info.png
(Stored with Git LFS)
Normal file
BIN
packages/backend/assets/badges/info.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
packages/backend/assets/badges/not-found.png
(Stored with Git LFS)
Normal file
BIN
packages/backend/assets/badges/not-found.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
packages/backend/assets/favicon.ico
(Stored with Git LFS)
BIN
packages/backend/assets/favicon.ico
(Stored with Git LFS)
Binary file not shown.
BIN
packages/backend/assets/favicon.png
(Stored with Git LFS)
BIN
packages/backend/assets/favicon.png
(Stored with Git LFS)
Binary file not shown.
BIN
packages/backend/assets/icons/192.png
(Stored with Git LFS)
BIN
packages/backend/assets/icons/192.png
(Stored with Git LFS)
Binary file not shown.
BIN
packages/backend/assets/icons/512.png
(Stored with Git LFS)
BIN
packages/backend/assets/icons/512.png
(Stored with Git LFS)
Binary file not shown.
BIN
packages/backend/assets/icons/maskable.png
(Stored with Git LFS)
BIN
packages/backend/assets/icons/maskable.png
(Stored with Git LFS)
Binary file not shown.
BIN
packages/backend/assets/icons/monochrome.png
(Stored with Git LFS)
BIN
packages/backend/assets/icons/monochrome.png
(Stored with Git LFS)
Binary file not shown.
|
@ -1,4 +1,37 @@
|
||||||
user-agent: *
|
user-agent: *
|
||||||
allow: /
|
disallow: /
|
||||||
|
|
||||||
# todo: sitemap
|
# explicit disallows because some bots are assholes that need that
|
||||||
|
|
||||||
|
User-Agent: Googlebot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-Agent: Storebot-Google
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-Agent: GoogleOther
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-Agent: Google-Extended
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: CCBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: ChatGPT-User
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: GPTBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Google-Extended
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Omgilibot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-Agent: FacebookBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Amazonbot
|
||||||
|
Disallow: /
|
||||||
|
|
BIN
packages/backend/assets/splash.png
(Stored with Git LFS)
BIN
packages/backend/assets/splash.png
(Stored with Git LFS)
Binary file not shown.
|
@ -54,6 +54,8 @@ export default function load() {
|
||||||
...config.images,
|
...config.images,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
config.pinLimit = config.pinLimit || parseInt(process.env.pinLimit || "", 100);
|
||||||
|
|
||||||
config.htmlCache = {
|
config.htmlCache = {
|
||||||
ttlSeconds: parseDuration(config.htmlCache?.ttl ?? '1h', 's')!,
|
ttlSeconds: parseDuration(config.htmlCache?.ttl ?? '1h', 's')!,
|
||||||
prewarm: false,
|
prewarm: false,
|
||||||
|
|
|
@ -53,6 +53,8 @@ export type Source = {
|
||||||
info?: string;
|
info?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pinLimit?: number;
|
||||||
|
|
||||||
htmlCache?: {
|
htmlCache?: {
|
||||||
ttl?: string;
|
ttl?: string;
|
||||||
ttlSeconds?: number;
|
ttlSeconds?: number;
|
||||||
|
|
|
@ -77,6 +77,7 @@ import { OAuthToken } from "@/models/entities/oauth-token.js";
|
||||||
import { HtmlNoteCacheEntry } from "@/models/entities/html-note-cache-entry.js";
|
import { HtmlNoteCacheEntry } from "@/models/entities/html-note-cache-entry.js";
|
||||||
import { HtmlUserCacheEntry } from "@/models/entities/html-user-cache-entry.js";
|
import { HtmlUserCacheEntry } from "@/models/entities/html-user-cache-entry.js";
|
||||||
import { TypeORMLoggingOptions } from "@/config/types.js";
|
import { TypeORMLoggingOptions } from "@/config/types.js";
|
||||||
|
import { Bite } from "@/models/entities/bite.js";
|
||||||
|
|
||||||
const sqlLogger = dbLogger.createSubLogger("sql", "gray", false);
|
const sqlLogger = dbLogger.createSubLogger("sql", "gray", false);
|
||||||
const isLogEnabled = (level: TypeORMLoggingOptions): boolean => {
|
const isLogEnabled = (level: TypeORMLoggingOptions): boolean => {
|
||||||
|
@ -194,6 +195,7 @@ export const entities = [
|
||||||
OAuthToken,
|
OAuthToken,
|
||||||
HtmlNoteCacheEntry,
|
HtmlNoteCacheEntry,
|
||||||
HtmlUserCacheEntry,
|
HtmlUserCacheEntry,
|
||||||
|
Bite,
|
||||||
...charts,
|
...charts,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
|
export class FederatedBite1705528046452 implements MigrationInterface {
|
||||||
|
name = 'FederatedBite1705528046452'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."bite_targettype_enum" AS ENUM('user', 'bite')`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "bite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "uri" character varying(512), "userId" character varying(32) NOT NULL, "targetType" "public"."bite_targettype_enum" NOT NULL, "targetUserId" character varying(32), "targetBiteId" character varying(32), "replied" boolean NOT NULL DEFAULT true, CONSTRAINT "CHK_c3a20c5756ccff3133f8927500" CHECK ("targetUserId" IS NOT NULL OR "targetBiteId" IS NOT NULL), CONSTRAINT "PK_1887f3f621a4a7655a1b78bfd66" PRIMARY KEY ("id")); COMMENT ON COLUMN "bite"."uri" IS 'null if local'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD "biteId" character varying(32)`);
|
||||||
|
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum" RENAME TO "user_profile_mutingnotificationtypes_enum_old"`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'bite')`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum"[]`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum_old"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "bite" ADD CONSTRAINT "FK_8d00aa79e157364ac1f60c15098" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "bite" ADD CONSTRAINT "FK_a646fbbeb6efa2531c75fec46b9" FOREIGN KEY ("targetUserId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "bite" ADD CONSTRAINT "FK_5d5f68610583f2e0b6785d3c0e9" FOREIGN KEY ("targetBiteId") REFERENCES "bite"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_c54844158c1eead7042e7ca4c83" FOREIGN KEY ("biteId") REFERENCES "bite"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum" RENAME TO "notification_type_enum_old"`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'bite')`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum" USING "type"::"text"::"public"."notification_type_enum"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."notification_type_enum_old"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_c54844158c1eead7042e7ca4c83"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_5d5f68610583f2e0b6785d3c0e9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_a646fbbeb6efa2531c75fec46b9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_8d00aa79e157364ac1f60c15098"`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum_old"[]`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum"`);
|
||||||
|
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum_old" RENAME TO "user_profile_mutingnotificationtypes_enum"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "biteId"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "bite"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."bite_targettype_enum"`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum_old" USING "type"::"text"::"public"."notification_type_enum_old"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."notification_type_enum"`);
|
||||||
|
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum_old" RENAME TO "notification_type_enum"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,6 +31,7 @@ import { packedQueueCountSchema } from "@/models/schema/queue.js";
|
||||||
import { packedGalleryPostSchema } from "@/models/schema/gallery-post.js";
|
import { packedGalleryPostSchema } from "@/models/schema/gallery-post.js";
|
||||||
import { packedEmojiSchema } from "@/models/schema/emoji.js";
|
import { packedEmojiSchema } from "@/models/schema/emoji.js";
|
||||||
import { packedNoteEdit } from "@/models/schema/note-edit.js";
|
import { packedNoteEdit } from "@/models/schema/note-edit.js";
|
||||||
|
import { packedBiteSchema } from "@/models/schema/bite.js";
|
||||||
|
|
||||||
export const refs = {
|
export const refs = {
|
||||||
UserLite: packedUserLiteSchema,
|
UserLite: packedUserLiteSchema,
|
||||||
|
@ -65,6 +66,7 @@ export const refs = {
|
||||||
FederationInstance: packedFederationInstanceSchema,
|
FederationInstance: packedFederationInstanceSchema,
|
||||||
GalleryPost: packedGalleryPostSchema,
|
GalleryPost: packedGalleryPostSchema,
|
||||||
Emoji: packedEmojiSchema,
|
Emoji: packedEmojiSchema,
|
||||||
|
Bite: packedBiteSchema,
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Packed<x extends keyof typeof refs> = SchemaType<typeof refs[x]>;
|
export type Packed<x extends keyof typeof refs> = SchemaType<typeof refs[x]>;
|
||||||
|
|
56
packages/backend/src/models/entities/bite.ts
Normal file
56
packages/backend/src/models/entities/bite.ts
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
import { Check, Column, Entity, ManyToOne, PrimaryColumn } from "typeorm";
|
||||||
|
import { id } from "../id.js";
|
||||||
|
import { User } from "./user.js";
|
||||||
|
|
||||||
|
@Entity()
|
||||||
|
@Check(`"targetUserId" IS NOT NULL OR "targetBiteId" IS NOT NULL`)
|
||||||
|
export class Bite {
|
||||||
|
@PrimaryColumn(id())
|
||||||
|
public id: string;
|
||||||
|
|
||||||
|
@Column("timestamp with time zone")
|
||||||
|
public createdAt: Date;
|
||||||
|
|
||||||
|
@Column("varchar", {
|
||||||
|
length: 512,
|
||||||
|
nullable: true,
|
||||||
|
comment: "null if local",
|
||||||
|
})
|
||||||
|
public uri: string | null;
|
||||||
|
|
||||||
|
@Column(id())
|
||||||
|
public userId: string;
|
||||||
|
|
||||||
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
|
public user: User;
|
||||||
|
|
||||||
|
@Column("enum", {
|
||||||
|
enum: ["user", "bite"],
|
||||||
|
})
|
||||||
|
public targetType: "user" | "bite";
|
||||||
|
|
||||||
|
@Column({ ...id(), nullable: true })
|
||||||
|
public targetUserId: string | null;
|
||||||
|
|
||||||
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
nullable: true,
|
||||||
|
})
|
||||||
|
public targetUser: User | null;
|
||||||
|
|
||||||
|
@Column({ ...id(), nullable: true })
|
||||||
|
public targetBiteId: string | null;
|
||||||
|
|
||||||
|
@ManyToOne(() => Bite, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
nullable: true,
|
||||||
|
})
|
||||||
|
public targetBite: Bite | null;
|
||||||
|
|
||||||
|
@Column("boolean", {
|
||||||
|
default: true,
|
||||||
|
})
|
||||||
|
public replied: boolean;
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ import { FollowRequest } from "./follow-request.js";
|
||||||
import { UserGroupInvitation } from "./user-group-invitation.js";
|
import { UserGroupInvitation } from "./user-group-invitation.js";
|
||||||
import { AccessToken } from "./access-token.js";
|
import { AccessToken } from "./access-token.js";
|
||||||
import { notificationTypes } from "@/types.js";
|
import { notificationTypes } from "@/types.js";
|
||||||
|
import { Bite } from "./bite.js";
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Notification {
|
export class Notification {
|
||||||
|
@ -181,4 +182,12 @@ export class Notification {
|
||||||
})
|
})
|
||||||
@JoinColumn()
|
@JoinColumn()
|
||||||
public appAccessToken: AccessToken | null;
|
public appAccessToken: AccessToken | null;
|
||||||
|
|
||||||
|
@Column({ ...id(), nullable: true })
|
||||||
|
public biteId: Bite["id"] | null;
|
||||||
|
|
||||||
|
@ManyToOne((type) => Bite, {
|
||||||
|
onDelete: "CASCADE", nullable: true
|
||||||
|
})
|
||||||
|
public bite: Bite | null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,7 @@ import { OAuthToken } from "@/models/entities/oauth-token.js";
|
||||||
import { UserProfileRepository } from "@/models/repositories/user-profile.js";
|
import { UserProfileRepository } from "@/models/repositories/user-profile.js";
|
||||||
import { HtmlNoteCacheEntry } from "@/models/entities/html-note-cache-entry.js";
|
import { HtmlNoteCacheEntry } from "@/models/entities/html-note-cache-entry.js";
|
||||||
import { HtmlUserCacheEntry } from "@/models/entities/html-user-cache-entry.js";
|
import { HtmlUserCacheEntry } from "@/models/entities/html-user-cache-entry.js";
|
||||||
|
import { BiteRespository } from "./repositories/bite.js";
|
||||||
|
|
||||||
export const Announcements = db.getRepository(Announcement);
|
export const Announcements = db.getRepository(Announcement);
|
||||||
export const AnnouncementReads = db.getRepository(AnnouncementRead);
|
export const AnnouncementReads = db.getRepository(AnnouncementRead);
|
||||||
|
@ -138,3 +139,4 @@ export const OAuthApps = db.getRepository(OAuthApp);
|
||||||
export const OAuthTokens = db.getRepository(OAuthToken);
|
export const OAuthTokens = db.getRepository(OAuthToken);
|
||||||
export const HtmlUserCacheEntries = db.getRepository(HtmlUserCacheEntry);
|
export const HtmlUserCacheEntries = db.getRepository(HtmlUserCacheEntry);
|
||||||
export const HtmlNoteCacheEntries = db.getRepository(HtmlNoteCacheEntry);
|
export const HtmlNoteCacheEntries = db.getRepository(HtmlNoteCacheEntry);
|
||||||
|
export const Bites = BiteRespository;
|
||||||
|
|
71
packages/backend/src/models/repositories/bite.ts
Normal file
71
packages/backend/src/models/repositories/bite.ts
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
import { db } from "@/db/postgre.js";
|
||||||
|
import { Bite } from "../entities/bite.js";
|
||||||
|
import { Packed } from "@/misc/schema.js";
|
||||||
|
import { Bites, Users } from "../index.js";
|
||||||
|
import { User } from "../entities/user.js";
|
||||||
|
import { awaitAll } from "@/prelude/await-all.js";
|
||||||
|
import config from "@/config/index.js";
|
||||||
|
|
||||||
|
export const BiteRespository = db.getRepository(Bite).extend({
|
||||||
|
async pack(
|
||||||
|
src: Bite | Bite["id"],
|
||||||
|
me?: { id: User["id"] } | null | undefined,
|
||||||
|
): Promise<Packed<"Bite">> {
|
||||||
|
const bite =
|
||||||
|
typeof src === "object" ? src : await this.findOneByOrFail({ id: src });
|
||||||
|
return await awaitAll({
|
||||||
|
id: bite.id,
|
||||||
|
user: Users.pack(bite.user ?? bite.userId, me, { detail: false }),
|
||||||
|
targetType: bite.targetType,
|
||||||
|
target: this.packTarget(bite, me),
|
||||||
|
replied: bite.replied,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async packTarget(
|
||||||
|
bite: Bite,
|
||||||
|
me?: { id: User["id"] } | null | undefined,
|
||||||
|
): Promise<Packed<"UserLite"> | Packed<"Bite">> {
|
||||||
|
switch (bite.targetType) {
|
||||||
|
case "user":
|
||||||
|
return await Users.pack(bite.targetUser ?? bite.targetUserId!, me, {
|
||||||
|
detail: false,
|
||||||
|
});
|
||||||
|
case "bite":
|
||||||
|
return await this.pack(bite.targetBite ?? bite.targetBiteId!, me);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async targetUri(bite: Bite): Promise<string> {
|
||||||
|
switch (bite.targetType) {
|
||||||
|
case "user": {
|
||||||
|
bite.targetUser =
|
||||||
|
bite.targetUser ??
|
||||||
|
(await Users.findOneOrFail({ where: { id: bite.targetUserId! } }));
|
||||||
|
return (
|
||||||
|
bite.targetUser.uri || `${config.url}/users/${bite.targetUserId}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
case "bite": {
|
||||||
|
bite.targetBite =
|
||||||
|
bite.targetBite ??
|
||||||
|
(await Bites.findOneOrFail({ where: { id: bite.targetBiteId! } }));
|
||||||
|
return (
|
||||||
|
bite.targetBite.uri || `${config.url}/bites/${bite.targetBiteId}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async targetUserId(bite: Bite): Promise<User["id"]> {
|
||||||
|
switch (bite.targetType) {
|
||||||
|
case "user":
|
||||||
|
return bite.targetUserId!;
|
||||||
|
case "bite":
|
||||||
|
bite.targetBite =
|
||||||
|
bite.targetBite ??
|
||||||
|
(await Bites.findOneByOrFail({ id: bite.targetBiteId! }));
|
||||||
|
return bite.targetBite.userId;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
|
@ -14,6 +14,7 @@ import {
|
||||||
UserGroupInvitations,
|
UserGroupInvitations,
|
||||||
AccessTokens,
|
AccessTokens,
|
||||||
NoteReactions,
|
NoteReactions,
|
||||||
|
Bites,
|
||||||
} from "../index.js";
|
} from "../index.js";
|
||||||
|
|
||||||
export const NotificationRepository = db.getRepository(Notification).extend({
|
export const NotificationRepository = db.getRepository(Notification).extend({
|
||||||
|
@ -143,6 +144,11 @@ export const NotificationRepository = db.getRepository(Notification).extend({
|
||||||
icon: notification.customIcon || token?.iconUrl,
|
icon: notification.customIcon || token?.iconUrl,
|
||||||
}
|
}
|
||||||
: {}),
|
: {}),
|
||||||
|
...(notification.type === "bite"
|
||||||
|
? {
|
||||||
|
bite: notification.bite ?? await Bites.findOneBy({ id: notification.biteId! }),
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
31
packages/backend/src/models/schema/bite.ts
Normal file
31
packages/backend/src/models/schema/bite.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
export const packedBiteSchema = {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: "string",
|
||||||
|
format: "id",
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: "object",
|
||||||
|
ref: "UserLite",
|
||||||
|
},
|
||||||
|
targetType: {
|
||||||
|
type: "string",
|
||||||
|
enum: ["user", "bite"],
|
||||||
|
},
|
||||||
|
target: {
|
||||||
|
oneOf: [
|
||||||
|
{
|
||||||
|
type: "object",
|
||||||
|
ref: "UserLite",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "object",
|
||||||
|
ref: "Bite",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
|
@ -75,5 +75,11 @@ export const packedNotificationSchema = {
|
||||||
optional: true,
|
optional: true,
|
||||||
nullable: true,
|
nullable: true,
|
||||||
},
|
},
|
||||||
|
bite: {
|
||||||
|
type: "object",
|
||||||
|
ref: "Bite",
|
||||||
|
optional: true,
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -14,6 +14,7 @@ import { StatusError } from "@/misc/fetch.js";
|
||||||
import { shouldSkipInstance } from "@/misc/skipped-instances.js";
|
import { shouldSkipInstance } from "@/misc/skipped-instances.js";
|
||||||
import type { DeliverJobData } from "@/queue/types.js";
|
import type { DeliverJobData } from "@/queue/types.js";
|
||||||
import type Bull from "bull";
|
import type Bull from "bull";
|
||||||
|
import { patchText, shouldPatchText } from "@/remote/activitypub/renderer/note.js";
|
||||||
|
|
||||||
const logger = new Logger("deliver");
|
const logger = new Logger("deliver");
|
||||||
|
|
||||||
|
@ -30,10 +31,33 @@ export default async (job: Bull.Job<DeliverJobData>) => {
|
||||||
logger.debug(`delivering ${latest}`);
|
logger.debug(`delivering ${latest}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let i = undefined;
|
||||||
|
|
||||||
|
if (
|
||||||
|
["Create", "Update"].includes(job.data.content.type)
|
||||||
|
&& job.data.content.object.type === "Note"
|
||||||
|
) {
|
||||||
|
const obj = job.data.content.object;
|
||||||
|
const patchSrcContent = shouldPatchText(obj.source.content);
|
||||||
|
if (patchSrcContent) {
|
||||||
|
i = await registerOrFetchInstanceDoc(host);
|
||||||
|
if (shouldPatchText(obj.content))
|
||||||
|
obj.content = patchText(obj.content, i);
|
||||||
|
if (shouldPatchText(obj._misskey_content))
|
||||||
|
obj._misskey_content = patchText(obj._misskey_content, i);
|
||||||
|
if (patchSrcContent)
|
||||||
|
obj.source.content = patchText(obj.source.content, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await request(job.data.user, job.data.to, job.data.content);
|
await request(job.data.user, job.data.to, job.data.content);
|
||||||
|
|
||||||
// Update stats
|
(async () => {
|
||||||
registerOrFetchInstanceDoc(host).then((i) => {
|
if (i === undefined) {
|
||||||
|
i = await registerOrFetchInstanceDoc(host);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update stats
|
||||||
Instances.update(i.id, {
|
Instances.update(i.id, {
|
||||||
latestRequestSentAt: new Date(),
|
latestRequestSentAt: new Date(),
|
||||||
latestStatus: 200,
|
latestStatus: 200,
|
||||||
|
@ -46,7 +70,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
|
||||||
instanceChart.requestSent(i.host, true);
|
instanceChart.requestSent(i.host, true);
|
||||||
apRequestChart.deliverSucc();
|
apRequestChart.deliverSucc();
|
||||||
federationChart.deliverd(i.host, true);
|
federationChart.deliverd(i.host, true);
|
||||||
});
|
})();
|
||||||
|
|
||||||
return "Success";
|
return "Success";
|
||||||
} catch (res) {
|
} catch (res) {
|
||||||
|
|
|
@ -28,24 +28,24 @@ export async function hasSignature(req: IncomingMessage): Promise<string> {
|
||||||
return required ? "supplied" : "unneeded";
|
return required ? "supplied" : "unneeded";
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkFetch(req: IncomingMessage): Promise<number> {
|
export async function checkFetch(req: IncomingMessage): Promise<{ status: number; host?: string }> {
|
||||||
const meta = await fetchMeta();
|
const meta = await fetchMeta();
|
||||||
if (meta.secureMode || meta.privateMode) {
|
if (meta.secureMode || meta.privateMode) {
|
||||||
if (req.headers.host !== config.host) return 400;
|
if (req.headers.host !== config.host) return { status: 400 };
|
||||||
|
|
||||||
let signature;
|
let signature;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
signature = httpSignature.parseRequest(req, { headers: ["(request-target)", "host", "date"] });
|
signature = httpSignature.parseRequest(req, { headers: ["(request-target)", "host", "date"] });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return 401;
|
return { status: 401 };
|
||||||
}
|
}
|
||||||
|
|
||||||
const keyId = new URL(signature.keyId);
|
const keyId = new URL(signature.keyId);
|
||||||
const host = toPuny(keyId.hostname);
|
const host = toPuny(keyId.hostname);
|
||||||
|
|
||||||
if (await shouldBlockInstance(host, meta)) {
|
if (await shouldBlockInstance(host, meta)) {
|
||||||
return 403;
|
return { status: 403 };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
@ -54,13 +54,13 @@ export async function checkFetch(req: IncomingMessage): Promise<number> {
|
||||||
host !== config.domain &&
|
host !== config.domain &&
|
||||||
!meta.allowedHosts.includes(host)
|
!meta.allowedHosts.includes(host)
|
||||||
) {
|
) {
|
||||||
return 403;
|
return { status: 403 };
|
||||||
}
|
}
|
||||||
|
|
||||||
const keyIdLower = signature.keyId.toLowerCase();
|
const keyIdLower = signature.keyId.toLowerCase();
|
||||||
if (keyIdLower.startsWith("acct:")) {
|
if (keyIdLower.startsWith("acct:")) {
|
||||||
// Old keyId is no longer supported.
|
// Old keyId is no longer supported.
|
||||||
return 401;
|
return { status: 401 };
|
||||||
}
|
}
|
||||||
|
|
||||||
const dbResolver = new DbResolver();
|
const dbResolver = new DbResolver();
|
||||||
|
@ -77,23 +77,23 @@ export async function checkFetch(req: IncomingMessage): Promise<number> {
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// できなければ駄目
|
// できなければ駄目
|
||||||
return 403;
|
return { status: 403 };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// publicKey がなくても終了
|
// publicKey がなくても終了
|
||||||
if (authUser?.key == null) {
|
if (authUser?.key == null) {
|
||||||
return 403;
|
return { status: 403 };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cannot authenticate against local user
|
// Cannot authenticate against local user
|
||||||
if (authUser.user.uri === null || authUser.user.host === null) {
|
if (authUser.user.uri === null || authUser.user.host === null) {
|
||||||
return 400;
|
return { status: 400 };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if keyId hostname matches actor hostname
|
// Check if keyId hostname matches actor hostname
|
||||||
if (toPuny(new URL(authUser.user.uri).hostname) !== host) {
|
if (toPuny(new URL(authUser.user.uri).hostname) !== host) {
|
||||||
return 403;
|
return { status: 403 };
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTP-Signatureの検証
|
// HTTP-Signatureの検証
|
||||||
|
@ -107,7 +107,7 @@ export async function checkFetch(req: IncomingMessage): Promise<number> {
|
||||||
authUser.key = await dbResolver.refetchPublicKeyForApId(authUser.user);
|
authUser.key = await dbResolver.refetchPublicKeyForApId(authUser.user);
|
||||||
|
|
||||||
if (authUser.key == null) {
|
if (authUser.key == null) {
|
||||||
return 403;
|
return { status: 403 };
|
||||||
}
|
}
|
||||||
|
|
||||||
httpSignatureValidated = httpSignature.verifySignature(
|
httpSignatureValidated = httpSignature.verifySignature(
|
||||||
|
@ -117,12 +117,12 @@ export async function checkFetch(req: IncomingMessage): Promise<number> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!httpSignatureValidated) {
|
if (!httpSignatureValidated) {
|
||||||
return 403;
|
return { status: 403 };
|
||||||
}
|
}
|
||||||
|
|
||||||
return verifySignature(signature, authUser.key) ? 200 : 401;
|
return verifySignature(signature, authUser.key) ? 200 : 401;
|
||||||
}
|
}
|
||||||
return 200;
|
return { status: 200 };
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getSignatureUser(req: IncomingMessage): Promise<{
|
export async function getSignatureUser(req: IncomingMessage): Promise<{
|
||||||
|
|
79
packages/backend/src/remote/activitypub/kernel/bite.ts
Normal file
79
packages/backend/src/remote/activitypub/kernel/bite.ts
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
import { CacheableRemoteUser } from "@/models/entities/user.js";
|
||||||
|
import { IActivity, IBite } from "../type.js";
|
||||||
|
import Resolver from "../resolver.js";
|
||||||
|
import { fetchPerson } from "../models/person.js";
|
||||||
|
import config from "@/config/index.js";
|
||||||
|
import { genId } from "@/misc/gen-id.js";
|
||||||
|
import { createBite } from "@/services/create-bite.js";
|
||||||
|
import { Bite } from "@/models/entities/bite.js";
|
||||||
|
|
||||||
|
export default async (
|
||||||
|
actor: CacheableRemoteUser,
|
||||||
|
bite: IBite,
|
||||||
|
): Promise<string> => {
|
||||||
|
if (actor.uri !== bite.actor) {
|
||||||
|
return "skip: actor uri mismatch";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bite.id === null) {
|
||||||
|
return "skip: bite id not specified";
|
||||||
|
}
|
||||||
|
|
||||||
|
const resolver = new Resolver();
|
||||||
|
const biteActor = await fetchPerson(bite.actor, resolver);
|
||||||
|
if (biteActor === null) {
|
||||||
|
return "skip: biteActor is null";
|
||||||
|
}
|
||||||
|
if (!bite.target.startsWith(`${config.url}/`)) {
|
||||||
|
return "skip: target is not local";
|
||||||
|
}
|
||||||
|
|
||||||
|
const localId = genId();
|
||||||
|
const fields = {
|
||||||
|
id: localId,
|
||||||
|
userId: biteActor.id,
|
||||||
|
replied: false,
|
||||||
|
} as any;
|
||||||
|
|
||||||
|
const parts = bite.target.split("/");
|
||||||
|
const targetDbId = parts.pop();
|
||||||
|
const targetPathType = parts.pop();
|
||||||
|
|
||||||
|
let targetType: Bite["targetType"];
|
||||||
|
let targetId;
|
||||||
|
|
||||||
|
if (targetPathType === "users") {
|
||||||
|
targetType = "user";
|
||||||
|
targetId = targetDbId;
|
||||||
|
} else if (targetPathType === "bites") {
|
||||||
|
targetType = "bite";
|
||||||
|
targetId = targetDbId;
|
||||||
|
} else {
|
||||||
|
// fallback for unknown object types
|
||||||
|
targetType = "user";
|
||||||
|
if (bite.to !== undefined) {
|
||||||
|
const to = Array.isArray(bite.to) ? bite.to[0] : bite.to;
|
||||||
|
targetId = (to as string).split("/").pop();
|
||||||
|
} else {
|
||||||
|
const biteTarget = await resolver.resolve(bite.target);
|
||||||
|
const targetActor =
|
||||||
|
(biteTarget as IActivity).actor || biteTarget.attributedTo;
|
||||||
|
const targetActorId =
|
||||||
|
typeof targetActor === "string" ? targetActor : (targetActor as any).id;
|
||||||
|
if (!targetActorId.startsWith(`${config.url}/`)) {
|
||||||
|
return "skip: indirect target is not local";
|
||||||
|
}
|
||||||
|
targetId = targetActorId.split("/").pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await createBite(
|
||||||
|
biteActor,
|
||||||
|
targetType,
|
||||||
|
targetId,
|
||||||
|
bite.id!,
|
||||||
|
bite.published ? new Date(bite.published) : null,
|
||||||
|
);
|
||||||
|
|
||||||
|
return "ok";
|
||||||
|
};
|
|
@ -19,6 +19,7 @@ import {
|
||||||
isFlag,
|
isFlag,
|
||||||
isMove,
|
isMove,
|
||||||
getApId,
|
getApId,
|
||||||
|
isBite,
|
||||||
} from "../type.js";
|
} from "../type.js";
|
||||||
import { apLogger } from "../logger.js";
|
import { apLogger } from "../logger.js";
|
||||||
import Resolver from "../resolver.js";
|
import Resolver from "../resolver.js";
|
||||||
|
@ -37,6 +38,7 @@ import remove from "./remove/index.js";
|
||||||
import block from "./block/index.js";
|
import block from "./block/index.js";
|
||||||
import flag from "./flag/index.js";
|
import flag from "./flag/index.js";
|
||||||
import move from "./move/index.js";
|
import move from "./move/index.js";
|
||||||
|
import bite from "./bite.js";
|
||||||
import type { IObject } from "../type.js";
|
import type { IObject } from "../type.js";
|
||||||
import { extractDbHost } from "@/misc/convert-host.js";
|
import { extractDbHost } from "@/misc/convert-host.js";
|
||||||
import { shouldBlockInstance } from "@/misc/should-block-instance.js";
|
import { shouldBlockInstance } from "@/misc/should-block-instance.js";
|
||||||
|
@ -105,6 +107,8 @@ async function performOneActivity(
|
||||||
await flag(actor, activity);
|
await flag(actor, activity);
|
||||||
} else if (isMove(activity)) {
|
} else if (isMove(activity)) {
|
||||||
await move(actor, activity);
|
await move(actor, activity);
|
||||||
|
} else if (isBite(activity)) {
|
||||||
|
await bite(actor, activity);
|
||||||
} else {
|
} else {
|
||||||
apLogger.warn(`unrecognized activity type: ${(activity as any).type}`);
|
apLogger.warn(`unrecognized activity type: ${(activity as any).type}`);
|
||||||
}
|
}
|
||||||
|
|
|
@ -560,6 +560,8 @@ export const WellKnownContext = {
|
||||||
litepub: "http://litepub.social/ns#",
|
litepub: "http://litepub.social/ns#",
|
||||||
EmojiReact: "litepub:EmojiReact",
|
EmojiReact: "litepub:EmojiReact",
|
||||||
EmojiReaction: "litepub:EmojiReaction",
|
EmojiReaction: "litepub:EmojiReaction",
|
||||||
|
// mia
|
||||||
|
Bite: "https://ns.mia.jetzt/as#Bite",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
12
packages/backend/src/remote/activitypub/renderer/bite.ts
Normal file
12
packages/backend/src/remote/activitypub/renderer/bite.ts
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import config from "@/config/index.js";
|
||||||
|
import { Bites } from "@/models/index.js";
|
||||||
|
import { Bite } from "@/models/entities/bite.js";
|
||||||
|
|
||||||
|
export default async (bite: Bite) => ({
|
||||||
|
id: `${config.url}/bites/${bite.id}`,
|
||||||
|
type: "Bite",
|
||||||
|
actor: `${config.url}/users/${bite.userId}`,
|
||||||
|
target: await Bites.targetUri(bite),
|
||||||
|
published: bite.createdAt.toISOString(),
|
||||||
|
to: await Bites.targetUserId(bite),
|
||||||
|
});
|
|
@ -10,11 +10,14 @@ import renderEmoji from "./emoji.js";
|
||||||
import renderMention from "./mention.js";
|
import renderMention from "./mention.js";
|
||||||
import renderHashtag from "./hashtag.js";
|
import renderHashtag from "./hashtag.js";
|
||||||
import renderDocument from "./document.js";
|
import renderDocument from "./document.js";
|
||||||
|
import { Instances } from "@/models/index.js";
|
||||||
|
import { Instance } from "@/models/entities/instance.js";
|
||||||
|
|
||||||
export default async function renderNote(
|
export default async function renderNote(
|
||||||
note: Note,
|
note: Note,
|
||||||
dive = true,
|
dive = true,
|
||||||
isTalk = false,
|
isTalk = false,
|
||||||
|
clientHost: string | undefined = undefined,
|
||||||
): Promise<Record<string, unknown>> {
|
): Promise<Record<string, unknown>> {
|
||||||
const getPromisedFiles = async (ids: string[]) => {
|
const getPromisedFiles = async (ids: string[]) => {
|
||||||
if (!ids || ids.length === 0) return [];
|
if (!ids || ids.length === 0) return [];
|
||||||
|
@ -93,13 +96,17 @@ export default async function renderNote(
|
||||||
|
|
||||||
const files = await getPromisedFiles(note.fileIds);
|
const files = await getPromisedFiles(note.fileIds);
|
||||||
|
|
||||||
const text = note.text ?? "";
|
let text = note.text ?? "";
|
||||||
let poll: Poll | null = null;
|
let poll: Poll | null = null;
|
||||||
|
|
||||||
if (note.hasPoll) {
|
if (note.hasPoll) {
|
||||||
poll = await Polls.findOneBy({ noteId: note.id });
|
poll = await Polls.findOneBy({ noteId: note.id });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (clientHost && shouldPatchText(text)) {
|
||||||
|
text = patchText(text, await Instances.findOneBy({ host: clientHost }));
|
||||||
|
}
|
||||||
|
|
||||||
let apText = text;
|
let apText = text;
|
||||||
|
|
||||||
if (quote) {
|
if (quote) {
|
||||||
|
@ -186,3 +193,18 @@ export async function getEmojis(names: string[]): Promise<Emoji[]> {
|
||||||
|
|
||||||
return emojis.filter((emoji) => emoji != null) as Emoji[];
|
return emojis.filter((emoji) => emoji != null) as Emoji[];
|
||||||
}
|
}
|
||||||
|
export function shouldPatchText(text: string): boolean {
|
||||||
|
return text.match(/\$INSTANCE\$(?:host|softwareName|softwareVersion|name|description)\$/) !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function patchText(
|
||||||
|
text: string,
|
||||||
|
target: Instance
|
||||||
|
): string {
|
||||||
|
text = text.replaceAll("$INSTANCE$host$", target.host);
|
||||||
|
text = text.replaceAll("$INSTANCE$softwareName$", target.softwareName || "softwareName");
|
||||||
|
text = text.replaceAll("$INSTANCE$softwareVersion$", target.softwareVersion || "softwareVersion");
|
||||||
|
text = text.replaceAll("$INSTANCE$name$", target.name || "name");
|
||||||
|
text = text.replaceAll("$INSTANCE$description$", target.description || "description");
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import {
|
||||||
NoteReactions,
|
NoteReactions,
|
||||||
Polls,
|
Polls,
|
||||||
Users,
|
Users,
|
||||||
|
Bites,
|
||||||
} from "@/models/index.js";
|
} from "@/models/index.js";
|
||||||
import { parseUri } from "./db-resolver.js";
|
import { parseUri } from "./db-resolver.js";
|
||||||
import renderNote from "@/remote/activitypub/renderer/note.js";
|
import renderNote from "@/remote/activitypub/renderer/note.js";
|
||||||
|
@ -25,6 +26,7 @@ import renderFollow from "@/remote/activitypub/renderer/follow.js";
|
||||||
import { shouldBlockInstance } from "@/misc/should-block-instance.js";
|
import { shouldBlockInstance } from "@/misc/should-block-instance.js";
|
||||||
import { apLogger } from "@/remote/activitypub/logger.js";
|
import { apLogger } from "@/remote/activitypub/logger.js";
|
||||||
import { In, IsNull, Not } from "typeorm";
|
import { In, IsNull, Not } from "typeorm";
|
||||||
|
import renderBite from "@/remote/activitypub/renderer/bite.js";
|
||||||
|
|
||||||
export default class Resolver {
|
export default class Resolver {
|
||||||
private history: Set<string>;
|
private history: Set<string>;
|
||||||
|
@ -219,6 +221,10 @@ export default class Resolver {
|
||||||
throw new Error("resolveLocal: invalid follow URI");
|
throw new Error("resolveLocal: invalid follow URI");
|
||||||
}
|
}
|
||||||
return renderActivity(renderFollow(follower, followee, url));
|
return renderActivity(renderFollow(follower, followee, url));
|
||||||
|
case "bites":
|
||||||
|
return Bites.findOneByOrFail({ id: parsed.id }).then((bite) =>
|
||||||
|
renderActivity(renderBite(bite)),
|
||||||
|
);
|
||||||
default:
|
default:
|
||||||
throw new Error(`resolveLocal: type ${type} unhandled`);
|
throw new Error(`resolveLocal: type ${type} unhandled`);
|
||||||
}
|
}
|
||||||
|
|
|
@ -322,6 +322,12 @@ export interface IMove extends IActivity {
|
||||||
target: IObject | string;
|
target: IObject | string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IBite extends IActivity {
|
||||||
|
type: "Bite";
|
||||||
|
actor: string;
|
||||||
|
target: string;
|
||||||
|
}
|
||||||
|
|
||||||
export const isCreate = (object: IObject): object is ICreate =>
|
export const isCreate = (object: IObject): object is ICreate =>
|
||||||
getApType(object) === "Create";
|
getApType(object) === "Create";
|
||||||
export const isDelete = (object: IObject): object is IDelete =>
|
export const isDelete = (object: IObject): object is IDelete =>
|
||||||
|
@ -354,3 +360,5 @@ export const isFlag = (object: IObject): object is IFlag =>
|
||||||
getApType(object) === "Flag";
|
getApType(object) === "Flag";
|
||||||
export const isMove = (object: IObject): object is IMove =>
|
export const isMove = (object: IObject): object is IMove =>
|
||||||
getApType(object) === "Move";
|
getApType(object) === "Move";
|
||||||
|
export const isBite = (object: IObject): object is IBite =>
|
||||||
|
getApType(object) === "Bite";
|
||||||
|
|
|
@ -16,6 +16,7 @@ import {
|
||||||
Emojis,
|
Emojis,
|
||||||
NoteReactions,
|
NoteReactions,
|
||||||
FollowRequests,
|
FollowRequests,
|
||||||
|
Bites,
|
||||||
} from "@/models/index.js";
|
} from "@/models/index.js";
|
||||||
import type { ILocalUser, User } from "@/models/entities/user.js";
|
import type { ILocalUser, User } from "@/models/entities/user.js";
|
||||||
import { renderLike } from "@/remote/activitypub/renderer/like.js";
|
import { renderLike } from "@/remote/activitypub/renderer/like.js";
|
||||||
|
@ -35,6 +36,7 @@ import Outbox, { packActivity } from "./activitypub/outbox.js";
|
||||||
import { serverLogger } from "./index.js";
|
import { serverLogger } from "./index.js";
|
||||||
import config from "@/config/index.js";
|
import config from "@/config/index.js";
|
||||||
import Koa from "koa";
|
import Koa from "koa";
|
||||||
|
import renderBite from "@/remote/activitypub/renderer/bite.js";
|
||||||
|
|
||||||
// Init router
|
// Init router
|
||||||
const router = new Router();
|
const router = new Router();
|
||||||
|
@ -108,9 +110,9 @@ router.post("/users/:user/inbox", parseJsonBodyOrFail, inbox);
|
||||||
router.get("/notes/:note", async (ctx, next) => {
|
router.get("/notes/:note", async (ctx, next) => {
|
||||||
if (!isActivityPubReq(ctx)) return await next();
|
if (!isActivityPubReq(ctx)) return await next();
|
||||||
|
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status, host } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +168,7 @@ router.get("/notes/:note", async (ctx, next) => {
|
||||||
serverLogger.debug("Accepting: access criteria met");
|
serverLogger.debug("Accepting: access criteria met");
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = renderActivity(await renderNote(note, false));
|
ctx.body = renderActivity(await renderNote(note, false, false, host));
|
||||||
|
|
||||||
const meta = await fetchMeta();
|
const meta = await fetchMeta();
|
||||||
if (meta.secureMode || meta.privateMode) {
|
if (meta.secureMode || meta.privateMode) {
|
||||||
|
@ -179,9 +181,9 @@ router.get("/notes/:note", async (ctx, next) => {
|
||||||
|
|
||||||
// note activity
|
// note activity
|
||||||
router.get("/notes/:note/activity", async (ctx) => {
|
router.get("/notes/:note/activity", async (ctx) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status, host } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +199,7 @@ router.get("/notes/:note/activity", async (ctx) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = renderActivity(await packActivity(note));
|
ctx.body = renderActivity(await packActivity(note, host));
|
||||||
const meta = await fetchMeta();
|
const meta = await fetchMeta();
|
||||||
if (meta.secureMode || meta.privateMode) {
|
if (meta.secureMode || meta.privateMode) {
|
||||||
ctx.set("Cache-Control", "private, max-age=0, must-revalidate");
|
ctx.set("Cache-Control", "private, max-age=0, must-revalidate");
|
||||||
|
@ -231,9 +233,9 @@ router.get("/users/:user/publickey", async (ctx) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,10 +293,9 @@ router.get("/users/:user", async (ctx, next) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const userId = ctx.params.user;
|
const userId = ctx.params.user;
|
||||||
|
@ -317,9 +318,9 @@ router.get("/@:user", async (ctx, next) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,9 +341,9 @@ router.get("/actor", async (ctx, next) => {
|
||||||
|
|
||||||
// emoji
|
// emoji
|
||||||
router.get("/emojis/:emoji", async (ctx) => {
|
router.get("/emojis/:emoji", async (ctx) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,9 +369,9 @@ router.get("/emojis/:emoji", async (ctx) => {
|
||||||
|
|
||||||
// like
|
// like
|
||||||
router.get("/likes/:like", async (ctx) => {
|
router.get("/likes/:like", async (ctx) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,9 +403,9 @@ router.get("/likes/:like", async (ctx) => {
|
||||||
router.get(
|
router.get(
|
||||||
"/follows/:follower/:followee",
|
"/follows/:follower/:followee",
|
||||||
async (ctx: Router.RouterContext) => {
|
async (ctx: Router.RouterContext) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// This may be used before the follow is completed, so we do not
|
// This may be used before the follow is completed, so we do not
|
||||||
|
@ -439,9 +440,9 @@ router.get(
|
||||||
|
|
||||||
// follow request
|
// follow request
|
||||||
router.get("/follows/:followRequestId", async (ctx: Router.RouterContext) => {
|
router.get("/follows/:followRequestId", async (ctx: Router.RouterContext) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,4 +481,33 @@ router.get("/follows/:followRequestId", async (ctx: Router.RouterContext) => {
|
||||||
setResponseType(ctx);
|
setResponseType(ctx);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// bite
|
||||||
|
router.get("/bites/:biteId", async (ctx: Router.RouterContext) => {
|
||||||
|
const verify = await checkFetch(ctx.req);
|
||||||
|
if (verify !== 200) {
|
||||||
|
ctx.status = verify;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bite = await Bites.findOne({
|
||||||
|
where: { id: ctx.params.biteId },
|
||||||
|
relations: ["targetUser", "targetBite"],
|
||||||
|
});
|
||||||
|
|
||||||
|
if (bite === null) {
|
||||||
|
ctx.status = 404;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const meta = await fetchMeta();
|
||||||
|
if (meta.secureMode || meta.privateMode) {
|
||||||
|
ctx.set("Cache-Control", "private, max-age=0, must-revalidate");
|
||||||
|
} else {
|
||||||
|
ctx.set("Cache-Control", "public, max-age=180");
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.body = renderActivity(await renderBite(bite));
|
||||||
|
setResponseType(ctx);
|
||||||
|
});
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
|
@ -10,9 +10,9 @@ import { setResponseType } from "../activitypub.js";
|
||||||
import type Router from "@koa/router";
|
import type Router from "@koa/router";
|
||||||
|
|
||||||
export default async (ctx: Router.RouterContext) => {
|
export default async (ctx: Router.RouterContext) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,9 +14,9 @@ import type { FindOptionsWhere } from "typeorm";
|
||||||
import type Router from "@koa/router";
|
import type Router from "@koa/router";
|
||||||
|
|
||||||
export default async (ctx: Router.RouterContext) => {
|
export default async (ctx: Router.RouterContext) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,9 +14,9 @@ import type { FindOptionsWhere } from "typeorm";
|
||||||
import type Router from "@koa/router";
|
import type Router from "@koa/router";
|
||||||
|
|
||||||
export default async (ctx: Router.RouterContext) => {
|
export default async (ctx: Router.RouterContext) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,9 @@ import { setResponseType } from "../activitypub.js";
|
||||||
import type Router from "@koa/router";
|
import type Router from "@koa/router";
|
||||||
|
|
||||||
export default async (ctx: Router.RouterContext) => {
|
export default async (ctx: Router.RouterContext) => {
|
||||||
const verify = await checkFetch(ctx.req);
|
const { status, host } = await checkFetch(ctx.req);
|
||||||
if (verify !== 200) {
|
if (status !== 200) {
|
||||||
ctx.status = verify;
|
ctx.status = status;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ export default async (ctx: Router.RouterContext) => {
|
||||||
if (sinceId) notes.reverse();
|
if (sinceId) notes.reverse();
|
||||||
|
|
||||||
const activities = await Promise.all(
|
const activities = await Promise.all(
|
||||||
notes.map((note) => packActivity(note)),
|
notes.map((note) => packActivity(note, host)),
|
||||||
);
|
);
|
||||||
const rendered = renderOrderedCollectionPage(
|
const rendered = renderOrderedCollectionPage(
|
||||||
`${partOf}?${url.query({
|
`${partOf}?${url.query({
|
||||||
|
@ -129,7 +129,10 @@ export default async (ctx: Router.RouterContext) => {
|
||||||
* Pack Create<Note> or Announce Activity
|
* Pack Create<Note> or Announce Activity
|
||||||
* @param note Note
|
* @param note Note
|
||||||
*/
|
*/
|
||||||
export async function packActivity(note: Note): Promise<any> {
|
export async function packActivity(
|
||||||
|
note: Note,
|
||||||
|
clientHost: string | undefined = undefined
|
||||||
|
): Promise<any> {
|
||||||
if (
|
if (
|
||||||
note.renoteId &&
|
note.renoteId &&
|
||||||
note.text == null &&
|
note.text == null &&
|
||||||
|
@ -144,5 +147,5 @@ export async function packActivity(note: Note): Promise<any> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return renderCreate(await renderNote(note, false), note);
|
return renderCreate(await renderNote(note, false, false, clientHost), note);
|
||||||
}
|
}
|
||||||
|
|
|
@ -334,6 +334,8 @@ import * as ep___users_show from "./endpoints/users/show.js";
|
||||||
import * as ep___users_stats from "./endpoints/users/stats.js";
|
import * as ep___users_stats from "./endpoints/users/stats.js";
|
||||||
import * as ep___fetchRss from "./endpoints/fetch-rss.js";
|
import * as ep___fetchRss from "./endpoints/fetch-rss.js";
|
||||||
import * as ep___admin_driveCapOverride from "./endpoints/admin/drive-capacity-override.js";
|
import * as ep___admin_driveCapOverride from "./endpoints/admin/drive-capacity-override.js";
|
||||||
|
import * as ep___bites_create from "./endpoints/bites/create.js";
|
||||||
|
import * as ep___bites_show from "./endpoints/bites/show.js";
|
||||||
|
|
||||||
//Iceshrimp Move
|
//Iceshrimp Move
|
||||||
import * as ep___i_move from "./endpoints/i/move.js";
|
import * as ep___i_move from "./endpoints/i/move.js";
|
||||||
|
@ -682,6 +684,8 @@ const eps = [
|
||||||
["admin/drive-capacity-override", ep___admin_driveCapOverride],
|
["admin/drive-capacity-override", ep___admin_driveCapOverride],
|
||||||
["fetch-rss", ep___fetchRss],
|
["fetch-rss", ep___fetchRss],
|
||||||
["get-sounds", ep___sounds],
|
["get-sounds", ep___sounds],
|
||||||
|
["bites/create", ep___bites_create],
|
||||||
|
["bites/show", ep___bites_show],
|
||||||
];
|
];
|
||||||
|
|
||||||
export interface IEndpointMeta {
|
export interface IEndpointMeta {
|
||||||
|
|
37
packages/backend/src/server/api/endpoints/bites/create.ts
Normal file
37
packages/backend/src/server/api/endpoints/bites/create.ts
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import { Bites } from "@/models/index.js";
|
||||||
|
import define from "../../define.js";
|
||||||
|
import { createBite } from "@/services/create-bite.js";
|
||||||
|
import { MINUTE } from "@/const.js";
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
tags: ["bites"],
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
|
||||||
|
limit: {
|
||||||
|
duration: MINUTE,
|
||||||
|
max: 30,
|
||||||
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: "object",
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
ref: "Bite",
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const paramDef = {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
targetType: { type: "string", enum: ["user", "bite"] },
|
||||||
|
targetId: { type: "string", format: "misskey:id" },
|
||||||
|
},
|
||||||
|
required: ["targetType", "targetId"],
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export default define(meta, paramDef, async (ps, user) => {
|
||||||
|
const biteId = await createBite(user, ps.targetType, ps.targetId);
|
||||||
|
|
||||||
|
return await Bites.pack(biteId, user);
|
||||||
|
});
|
25
packages/backend/src/server/api/endpoints/bites/show.ts
Normal file
25
packages/backend/src/server/api/endpoints/bites/show.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { Bites } from "@/models/index.js";
|
||||||
|
import define from "../../define.js";
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
tags: ["bites"],
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: "object",
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
ref: "Bite",
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const paramDef = {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
biteId: { type: "string", format: "misskey:id" },
|
||||||
|
},
|
||||||
|
required: ["biteId"],
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export default define(meta, paramDef, async (ps, user) => {
|
||||||
|
return await Bites.pack(ps.biteId, user);
|
||||||
|
});
|
|
@ -7,8 +7,7 @@ import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ["federation"],
|
tags: ["federation"],
|
||||||
|
|
||||||
requireCredential: false,
|
requireCredential: true,
|
||||||
requireCredentialPrivateMode: true,
|
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: "array",
|
type: "array",
|
||||||
|
|
|
@ -97,10 +97,22 @@ const cache = new Cache<Awaited<ReturnType<typeof nodeinfo2>>>(
|
||||||
60 * 10,
|
60 * 10,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// tell sharkey instances that we're mastodon so it properly federates likes
|
||||||
|
const patch = (ctx, base) => {
|
||||||
|
// note: sharkey uses misskey as it's user-agent
|
||||||
|
if ((ctx.get("user-agent") ?? "").toLowerCase().indexOf("misskey") != -1) {
|
||||||
|
const copied = {...base};
|
||||||
|
copied.software = {...copied.software};
|
||||||
|
copied.software.name = 'mastodon';
|
||||||
|
return copied;
|
||||||
|
}
|
||||||
|
return base;
|
||||||
|
};
|
||||||
|
|
||||||
router.get(nodeinfo2_1path, async (ctx) => {
|
router.get(nodeinfo2_1path, async (ctx) => {
|
||||||
const base = await cache.fetch(null, () => nodeinfo2());
|
const base = await cache.fetch(null, () => nodeinfo2());
|
||||||
|
|
||||||
ctx.body = { version: "2.1", ...base };
|
ctx.body = { version: "2.1", ...patch(ctx, base) };
|
||||||
ctx.set("Cache-Control", "public, max-age=600");
|
ctx.set("Cache-Control", "public, max-age=600");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -110,7 +122,7 @@ router.get(nodeinfo2_0path, async (ctx) => {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
base.software.repository = undefined;
|
base.software.repository = undefined;
|
||||||
|
|
||||||
ctx.body = { version: "2.0", ...base };
|
ctx.body = { version: "2.0", ...patch(ctx, base) };
|
||||||
ctx.set("Cache-Control", "public, max-age=600");
|
ctx.set("Cache-Control", "public, max-age=600");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
74
packages/backend/src/services/create-bite.ts
Normal file
74
packages/backend/src/services/create-bite.ts
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
import { genId } from "@/misc/gen-id.js";
|
||||||
|
import { Bites, Users } from "@/models/index.js";
|
||||||
|
import { Bite } from "@/models/entities/bite.js";
|
||||||
|
import { User } from "@/models/entities/user.js";
|
||||||
|
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||||
|
import renderBite from "@/remote/activitypub/renderer/bite.js";
|
||||||
|
import { deliverToUser } from "@/remote/activitypub/deliver-manager.js";
|
||||||
|
import { createNotification } from "./create-notification.js";
|
||||||
|
|
||||||
|
export async function createBite(
|
||||||
|
sender: User,
|
||||||
|
targetType: Bite["targetType"],
|
||||||
|
targetId: string,
|
||||||
|
remoteUri: Bite["uri"] = null,
|
||||||
|
createdAt: Date | null = null,
|
||||||
|
): Promise<Bite["id"]> {
|
||||||
|
const id = genId();
|
||||||
|
|
||||||
|
const insert = {
|
||||||
|
id,
|
||||||
|
createdAt: createdAt ?? new Date(),
|
||||||
|
userId: sender.id,
|
||||||
|
targetType,
|
||||||
|
replied: false,
|
||||||
|
uri: remoteUri,
|
||||||
|
} as any;
|
||||||
|
|
||||||
|
switch (targetType) {
|
||||||
|
case "user":
|
||||||
|
insert.targetUserId = targetId;
|
||||||
|
break;
|
||||||
|
case "bite":
|
||||||
|
insert.targetBiteId = targetId;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
await Bites.insert(insert);
|
||||||
|
|
||||||
|
const bite = await Bites.findOneOrFail({
|
||||||
|
where: { id },
|
||||||
|
relations: ["targetUser", "targetBite"],
|
||||||
|
});
|
||||||
|
|
||||||
|
let deliverTarget: User;
|
||||||
|
|
||||||
|
switch (targetType) {
|
||||||
|
case "user":
|
||||||
|
deliverTarget = bite.targetUser!;
|
||||||
|
break;
|
||||||
|
case "bite":
|
||||||
|
await Bites.update({ id: bite.targetBiteId! }, { replied: true });
|
||||||
|
deliverTarget =
|
||||||
|
bite.targetBite!.user ??
|
||||||
|
(await Users.findOneByOrFail({ id: bite.targetBite!.userId }));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Users.isLocalUser(sender) && Users.isRemoteUser(deliverTarget)) {
|
||||||
|
await deliverToUser(
|
||||||
|
sender,
|
||||||
|
renderActivity(await renderBite(bite)),
|
||||||
|
deliverTarget,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Users.isLocalUser(deliverTarget)) {
|
||||||
|
await createNotification(deliverTarget.id, "bite", {
|
||||||
|
notifierId: sender.id,
|
||||||
|
biteId: bite.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
|
@ -25,7 +25,7 @@ export async function createNotification(
|
||||||
|
|
||||||
if (
|
if (
|
||||||
data.notifierId &&
|
data.notifierId &&
|
||||||
["mention", "reply", "renote", "quote", "reaction"].includes(type)
|
["mention", "reply", "renote", "quote", "reaction", "bite"].includes(type)
|
||||||
) {
|
) {
|
||||||
const notifier = await Users.findOneBy({ id: data.notifierId });
|
const notifier = await Users.findOneBy({ id: data.notifierId });
|
||||||
// suppress if the notifier does not exist or is silenced.
|
// suppress if the notifier does not exist or is silenced.
|
||||||
|
|
|
@ -35,7 +35,7 @@ export async function addPinned(
|
||||||
|
|
||||||
const pinings = await UserNotePinings.findBy({ userId: user.id });
|
const pinings = await UserNotePinings.findBy({ userId: user.id });
|
||||||
|
|
||||||
if (pinings.length >= 5) {
|
if (pinings.length >= config.pinLimit) {
|
||||||
throw new IdentifiableError(
|
throw new IdentifiableError(
|
||||||
"15a018eb-58e5-4da1-93be-330fcc5e4e1a",
|
"15a018eb-58e5-4da1-93be-330fcc5e4e1a",
|
||||||
"You can not pin notes any more.",
|
"You can not pin notes any more.",
|
||||||
|
|
|
@ -11,6 +11,7 @@ export const notificationTypes = [
|
||||||
"followRequestAccepted",
|
"followRequestAccepted",
|
||||||
"groupInvited",
|
"groupInvited",
|
||||||
"app",
|
"app",
|
||||||
|
"bite",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export const noteVisibilities = [
|
export const noteVisibilities = [
|
||||||
|
|
124
packages/client/src/components/MkBiteButton.vue
Normal file
124
packages/client/src/components/MkBiteButton.vue
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
<template>
|
||||||
|
<button class="kpoogebi _button bite-button" :class="{
|
||||||
|
full,
|
||||||
|
large,
|
||||||
|
wait,
|
||||||
|
active: hasBittenBack,
|
||||||
|
}" :disabled="wait" @click.stop="onClick" :aria-label="`bite ${user.name || user.username} back`">
|
||||||
|
<span>{{ i18n.ts.biteBack }}</span><i class="ph-tooth ph-bold ph-lg"></i>
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import type * as Misskey from "iceshrimp-js";
|
||||||
|
import * as os from "@/os";
|
||||||
|
import { i18n } from "@/i18n";
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
user: Misskey.entities.UserLite,
|
||||||
|
bite: Misskey.entities.Bite,
|
||||||
|
full: boolean,
|
||||||
|
large: boolean,
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
full: false,
|
||||||
|
large: false
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
let wait = $ref(false);
|
||||||
|
let hasBittenBack = $ref<boolean>(props.bite.replied);
|
||||||
|
|
||||||
|
async function onClick() {
|
||||||
|
wait = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await os.api("bites/create", {
|
||||||
|
targetType: "bite",
|
||||||
|
targetId: props.bite.id,
|
||||||
|
});
|
||||||
|
hasBittenBack = true;
|
||||||
|
} finally {
|
||||||
|
wait = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.bite-button {
|
||||||
|
position: relative;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: bold;
|
||||||
|
color: var(--accent);
|
||||||
|
border: solid 1px var(--accent);
|
||||||
|
padding: 0;
|
||||||
|
font-size: 16px;
|
||||||
|
width: 2em;
|
||||||
|
height: 2em;
|
||||||
|
border-radius: 100px;
|
||||||
|
background: var(--bg);
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
|
||||||
|
&.full {
|
||||||
|
padding: 0.2em 0.7em;
|
||||||
|
width: auto;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.large {
|
||||||
|
font-size: 16px;
|
||||||
|
height: 38px;
|
||||||
|
padding: 0 12px 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(.full) {
|
||||||
|
width: 31px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus-visible {
|
||||||
|
&:after {
|
||||||
|
content: "";
|
||||||
|
pointer-events: none;
|
||||||
|
position: absolute;
|
||||||
|
top: -5px;
|
||||||
|
right: -5px;
|
||||||
|
bottom: -5px;
|
||||||
|
left: -5px;
|
||||||
|
border: 2px solid var(--focus);
|
||||||
|
border-radius: 32px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
color: var(--fgOnAccent);
|
||||||
|
background: var(--accent);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--accentLighten);
|
||||||
|
border-color: var(--accentLighten);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: var(--accentDarken);
|
||||||
|
border-color: var(--accentDarken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.wait {
|
||||||
|
cursor: wait !important;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
>span {
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -222,6 +222,21 @@
|
||||||
:hideMenu="true"
|
:hideMenu="true"
|
||||||
/></div
|
/></div
|
||||||
></span>
|
></span>
|
||||||
|
<span
|
||||||
|
v-if="notification.type === 'bite'"
|
||||||
|
class="text"
|
||||||
|
style="opacity: 0.7">{{
|
||||||
|
notification.bite.targetType === 'user'
|
||||||
|
? i18n.ts.bitYou
|
||||||
|
: i18n.ts.bitYouBack
|
||||||
|
}}
|
||||||
|
<div v-if="full">
|
||||||
|
<MkBiteButton
|
||||||
|
:user="notification.user"
|
||||||
|
:bite="notification.bite"
|
||||||
|
:full="true"
|
||||||
|
/></div
|
||||||
|
></span>
|
||||||
<span
|
<span
|
||||||
v-if="notification.type === 'followRequestAccepted'"
|
v-if="notification.type === 'followRequestAccepted'"
|
||||||
class="text"
|
class="text"
|
||||||
|
@ -277,6 +292,7 @@ import { ref, onMounted, onUnmounted, watch } from "vue";
|
||||||
import * as misskey from "iceshrimp-js";
|
import * as misskey from "iceshrimp-js";
|
||||||
import XReactionIcon from "@/components/MkReactionIcon.vue";
|
import XReactionIcon from "@/components/MkReactionIcon.vue";
|
||||||
import MkFollowButton from "@/components/MkFollowButton.vue";
|
import MkFollowButton from "@/components/MkFollowButton.vue";
|
||||||
|
import MkBiteButton from "@/components/MkBiteButton.vue";
|
||||||
import XReactionTooltip from "@/components/MkReactionTooltip.vue";
|
import XReactionTooltip from "@/components/MkReactionTooltip.vue";
|
||||||
import { getNoteSummary } from "@/scripts/get-note-summary";
|
import { getNoteSummary } from "@/scripts/get-note-summary";
|
||||||
import { notePage } from "@/filters/note";
|
import { notePage } from "@/filters/note";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="instance.disableRegistration" style="margin-bottom: 1rem">
|
<div v-if="instance.disableRegistration" style="margin-bottom: 1rem">
|
||||||
<p>{{ i18n.ts.signupsDisabled }}</p>
|
<p>{{ i18n.ts.signupsDisabled }}</p>
|
||||||
<a href="https://iceshrimp.dev/join">
|
<a href="https://fedidb.org/software/iceshrimp">
|
||||||
<MkButton rounded gradate
|
<MkButton rounded gradate
|
||||||
>{{ i18n.ts.findOtherInstance }}
|
>{{ i18n.ts.findOtherInstance }}
|
||||||
</MkButton>
|
</MkButton>
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
@load="iconLoaded"
|
@load="iconLoaded"
|
||||||
@click="gravity"
|
@click="gravity"
|
||||||
/>
|
/>
|
||||||
<div class="misskey">Iceshrimp</div>
|
<div class="misskey">jormungandr-bite</div>
|
||||||
<div class="version">v{{ version }}</div>
|
<div class="version">v{{ version }}</div>
|
||||||
<span
|
<span
|
||||||
v-for="emoji in easterEggEmojis"
|
v-for="emoji in easterEggEmojis"
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
<FormSection>
|
<FormSection>
|
||||||
<div class="_formLinksGrid">
|
<div class="_formLinksGrid">
|
||||||
<FormLink
|
<FormLink
|
||||||
to="https://iceshrimp.dev/iceshrimp/iceshrimp"
|
to="https://iceshrimp.dev/limepotato/jormungandr-bite"
|
||||||
external
|
external
|
||||||
>
|
>
|
||||||
<template #icon
|
<template #icon
|
||||||
|
|
|
@ -32,12 +32,6 @@
|
||||||
i18n.ts.configure
|
i18n.ts.configure
|
||||||
}}</MkA></MkInfo
|
}}</MkA></MkInfo
|
||||||
>
|
>
|
||||||
<MkInfo v-if="noEmailServer" warn class="info"
|
|
||||||
>{{ i18n.ts.noEmailServerWarning }}
|
|
||||||
<MkA to="/admin/email-settings" class="_link">{{
|
|
||||||
i18n.ts.configure
|
|
||||||
}}</MkA></MkInfo
|
|
||||||
>
|
|
||||||
<MkInfo v-if="updateAvailable" warn class="info"
|
<MkInfo v-if="updateAvailable" warn class="info"
|
||||||
>{{ i18n.ts.updateAvailable }}
|
>{{ i18n.ts.updateAvailable }}
|
||||||
<a
|
<a
|
||||||
|
@ -113,7 +107,6 @@ let noBotProtection =
|
||||||
!instance.disableRegistration &&
|
!instance.disableRegistration &&
|
||||||
!instance.enableHcaptcha &&
|
!instance.enableHcaptcha &&
|
||||||
!instance.enableRecaptcha;
|
!instance.enableRecaptcha;
|
||||||
let noEmailServer = !instance.enableEmail;
|
|
||||||
let thereIsUnresolvedAbuseReport = $ref(false);
|
let thereIsUnresolvedAbuseReport = $ref(false);
|
||||||
let updateAvailable = $ref(false);
|
let updateAvailable = $ref(false);
|
||||||
let currentPage = $computed(() => router.currentRef.value.child);
|
let currentPage = $computed(() => router.currentRef.value.child);
|
||||||
|
|
|
@ -59,6 +59,13 @@ export function getUserMenu(user, router: Router = mainRouter) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function bite() {
|
||||||
|
await os.apiWithDialog("bites/create", {
|
||||||
|
targetType: "user",
|
||||||
|
targetId: user.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async function toggleMute() {
|
async function toggleMute() {
|
||||||
if (user.isMuted) {
|
if (user.isMuted) {
|
||||||
os.apiWithDialog("mute/delete", {
|
os.apiWithDialog("mute/delete", {
|
||||||
|
@ -310,6 +317,13 @@ export function getUserMenu(user, router: Router = mainRouter) {
|
||||||
action: inviteGroup,
|
action: inviteGroup,
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
|
meId !== user.id
|
||||||
|
? {
|
||||||
|
icon: "ph-tooth ph-bold ph-lg",
|
||||||
|
text: i18n.ts.bite,
|
||||||
|
action: bite,
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
null,
|
null,
|
||||||
{
|
{
|
||||||
icon: user.isRenoteMuted
|
icon: user.isRenoteMuted
|
||||||
|
|
|
@ -28,6 +28,20 @@ export const getBuiltinThemes = () =>
|
||||||
"l-light",
|
"l-light",
|
||||||
"l-nord",
|
"l-nord",
|
||||||
"l-gruvbox",
|
"l-gruvbox",
|
||||||
|
"l-catppuccin-latte-blue",
|
||||||
|
"l-catppuccin-latte-flamingo",
|
||||||
|
"l-catppuccin-latte-green",
|
||||||
|
"l-catppuccin-latte-lavender",
|
||||||
|
"l-catppuccin-latte-maroon",
|
||||||
|
"l-catppuccin-latte-mauve",
|
||||||
|
"l-catppuccin-latte-peach",
|
||||||
|
"l-catppuccin-latte-pink",
|
||||||
|
"l-catppuccin-latte-red",
|
||||||
|
"l-catppuccin-latte-rosewater",
|
||||||
|
"l-catppuccin-latte-sapphire",
|
||||||
|
"l-catppuccin-latte-sky",
|
||||||
|
"l-catppuccin-latte-teal",
|
||||||
|
"l-catppuccin-latte-yellow",
|
||||||
"l-coffee",
|
"l-coffee",
|
||||||
"l-apricot",
|
"l-apricot",
|
||||||
"l-rainy",
|
"l-rainy",
|
||||||
|
@ -42,8 +56,48 @@ export const getBuiltinThemes = () =>
|
||||||
"d-dark",
|
"d-dark",
|
||||||
"d-nord",
|
"d-nord",
|
||||||
"d-gruvbox",
|
"d-gruvbox",
|
||||||
"d-catppuccin-frappe",
|
"d-catppuccin-frappe-blue",
|
||||||
"d-catppuccin-mocha",
|
"d-catppuccin-frappe-flamingo",
|
||||||
|
"d-catppuccin-frappe-green",
|
||||||
|
"d-catppuccin-frappe-lavender",
|
||||||
|
"d-catppuccin-frappe-maroon",
|
||||||
|
"d-catppuccin-frappe-mauve",
|
||||||
|
"d-catppuccin-frappe-peach",
|
||||||
|
"d-catppuccin-frappe-pink",
|
||||||
|
"d-catppuccin-frappe-red",
|
||||||
|
"d-catppuccin-frappe-rosewater",
|
||||||
|
"d-catppuccin-frappe-sapphire",
|
||||||
|
"d-catppuccin-frappe-sky",
|
||||||
|
"d-catppuccin-frappe-teal",
|
||||||
|
"d-catppuccin-frappe-yellow",
|
||||||
|
"d-catppuccin-mocha-blue",
|
||||||
|
"d-catppuccin-mocha-flamingo",
|
||||||
|
"d-catppuccin-mocha-green",
|
||||||
|
"d-catppuccin-mocha-lavender",
|
||||||
|
"d-catppuccin-mocha-maroon",
|
||||||
|
"d-catppuccin-mocha-mauve",
|
||||||
|
"d-catppuccin-mocha-peach",
|
||||||
|
"d-catppuccin-mocha-pink",
|
||||||
|
"d-catppuccin-mocha-red",
|
||||||
|
"d-catppuccin-mocha-rosewater",
|
||||||
|
"d-catppuccin-mocha-sapphire",
|
||||||
|
"d-catppuccin-mocha-sky",
|
||||||
|
"d-catppuccin-mocha-teal",
|
||||||
|
"d-catppuccin-mocha-yellow",
|
||||||
|
"d-catppuccin-macchiato-blue",
|
||||||
|
"d-catppuccin-macchiato-flamingo",
|
||||||
|
"d-catppuccin-macchiato-green",
|
||||||
|
"d-catppuccin-macchiato-lavender",
|
||||||
|
"d-catppuccin-macchiato-maroon",
|
||||||
|
"d-catppuccin-macchiato-mauve",
|
||||||
|
"d-catppuccin-macchiato-peach",
|
||||||
|
"d-catppuccin-macchiato-pink",
|
||||||
|
"d-catppuccin-macchiato-red",
|
||||||
|
"d-catppuccin-macchiato-rosewater",
|
||||||
|
"d-catppuccin-macchiato-sapphire",
|
||||||
|
"d-catppuccin-macchiato-sky",
|
||||||
|
"d-catppuccin-macchiato-teal",
|
||||||
|
"d-catppuccin-macchiato-yellow",
|
||||||
"d-persimmon",
|
"d-persimmon",
|
||||||
"d-astro",
|
"d-astro",
|
||||||
"d-future",
|
"d-future",
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '4ccfbe22-290d-4620-97f1-f8fe2accec89',base: 'dark',name: 'Catppuccin frappe blue',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#8caaee',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'ffcd3328-5c57-4ca3-9dac-4580cbf7742f',base: 'dark',name: 'Catppuccin frappe flamingo',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#eebebe',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '491fc957-6f96-4389-9e8e-c2b681a70a74',base: 'dark',name: 'Catppuccin frappe green',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#a6d189',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '2832ab96-5455-42eb-9ef2-db5ab2789acb',base: 'dark',name: 'Catppuccin frappe lavender',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#babbf1',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '397a5a63-e1c4-4716-8342-d527f94bde66',base: 'dark',name: 'Catppuccin frappe maroon',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#ea999c',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '21710e04-252c-4e9b-bed1-eab88a698e37',base: 'dark',name: 'Catppuccin frappe mauve',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#ca9ee6',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '862b065b-d682-439c-bfeb-c934edf12e10',base: 'dark',name: 'Catppuccin frappe peach',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#ef9f76',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'a2b4c735-2238-425d-89b0-36d1c774c21d',base: 'dark',name: 'Catppuccin frappe pink',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#f4b8e4',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
1
packages/client/src/themes/d-catppuccin-frappe-red.json5
Normal file
1
packages/client/src/themes/d-catppuccin-frappe-red.json5
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{id: '96e32447-3080-4929-81f7-5a7ee9d30e40',base: 'dark',name: 'Catppuccin frappe red',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#e78284',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '8ca43f5a-f154-4a26-9417-f087c095ddb0',base: 'dark',name: 'Catppuccin frappe rosewater',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#f2d5cf',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'fc3b8b09-7f73-40cd-84f0-7438e3b06188',base: 'dark',name: 'Catppuccin frappe sapphire',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#85c1dc',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
1
packages/client/src/themes/d-catppuccin-frappe-sky.json5
Normal file
1
packages/client/src/themes/d-catppuccin-frappe-sky.json5
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{id: '7930bd84-3d9f-4603-8ab2-8a6f3849aef7',base: 'dark',name: 'Catppuccin frappe sky',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#99d1db',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '556d5cbd-3fc6-47d8-b8f2-33d012ccca47',base: 'dark',name: 'Catppuccin frappe teal',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#81c8be',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '1f75a8cf-cace-4974-956a-7186b9d08566',base: 'dark',name: 'Catppuccin frappe yellow',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#232634',fg: '#c6d0f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#51576d',cwFg: '#b5bfe2',link: '#8caaee',warn: '#ef9f76',badge: '#8caaee',error: '#e78284',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#e5c890',header: ':alpha<0.7<@panel',infoBg: '#414559',infoFg: '#a5adce',renote: '#8caaee',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#85c1dc',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6d189',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#626880',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6d189',codeString: '#ef9f76',fgOnAccent: '#303446',infoWarnBg: '#414559',infoWarnFg: '#b5bfe2',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#737994',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -1,88 +0,0 @@
|
||||||
{
|
|
||||||
id: 'ffcd3328-5c57-4ca3-9dac-4580cbf7742f',
|
|
||||||
base: 'dark',
|
|
||||||
name: 'Catppuccin frappe',
|
|
||||||
props: {
|
|
||||||
interactiveElementHovered: 'rgba(255, 255, 255, 0.05)',
|
|
||||||
messagingIsNotMe: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
postFormButtonHoverBg: 'rgba(255, 255, 255, 0.05)',
|
|
||||||
accentLightenLess: ':lighten<5<@accent',
|
|
||||||
accentDarkenLess: ':darken<5<@accent',
|
|
||||||
bg: '#232634',
|
|
||||||
fg: '#c6d0f5',
|
|
||||||
calendarInfoMeterBg: 'rgba(0, 0, 0, 0.3)',
|
|
||||||
dividerHovered: 'rgba(255, 255, 255, 0.15)',
|
|
||||||
navBgTransparent: ':alpha<0.5<@navBg',
|
|
||||||
panelFade: ':alpha<0<@panel',
|
|
||||||
panelTransparent: ':alpha<0.7<@panel',
|
|
||||||
cwBg: '#51576d',
|
|
||||||
cwFg: '#b5bfe2',
|
|
||||||
link: '#8caaee',
|
|
||||||
warn: '#ef9f76',
|
|
||||||
badge: '#8caaee',
|
|
||||||
error: '#e78284',
|
|
||||||
focus: ':alpha<0.3<@accent',
|
|
||||||
navBg: '@panel',
|
|
||||||
navFg: '@fg',
|
|
||||||
panel: ':lighten<3<@bg',
|
|
||||||
popup: ':lighten<3<@panel',
|
|
||||||
accent: '#eebebe',
|
|
||||||
header: ':alpha<0.7<@panel',
|
|
||||||
infoBg: '#414559',
|
|
||||||
infoFg: '#a5adce',
|
|
||||||
renote: '#8caaee',
|
|
||||||
shadow: 'rgba(0, 0, 0, 0.3)',
|
|
||||||
divider: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
hashtag: '#85c1dc',
|
|
||||||
mention: '@accent',
|
|
||||||
modalBg: 'rgba(0, 0, 0, 0.5)',
|
|
||||||
success: '#a6d189',
|
|
||||||
buttonBg: 'rgba(255, 255, 255, 0.05)',
|
|
||||||
switchBg: 'rgba(255, 255, 255, 0.15)',
|
|
||||||
acrylicBg: ':alpha<0.5<@bg',
|
|
||||||
cwHoverBg: '#626880',
|
|
||||||
indicator: '@accent',
|
|
||||||
mentionMe: '@mention',
|
|
||||||
messageBg: '@bg',
|
|
||||||
navActive: '@accent',
|
|
||||||
accentedBg: ':alpha<0.15<@accent',
|
|
||||||
codeNumber: '#a6d189',
|
|
||||||
codeString: '#ef9f76',
|
|
||||||
fgOnAccent: '#303446',
|
|
||||||
infoWarnBg: '#414559',
|
|
||||||
infoWarnFg: '#b5bfe2',
|
|
||||||
navHoverFg: ':lighten<17<@fg',
|
|
||||||
swutchOnBg: '@accentedBg',
|
|
||||||
swutchOnFg: '@accent',
|
|
||||||
codeBoolean: '@accent',
|
|
||||||
dateLabelFg: '@fg',
|
|
||||||
deckDivider: '#737994',
|
|
||||||
inputBorder: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
panelBorder: 'solid 1px var(--divider)',
|
|
||||||
swutchOffBg: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
swutchOffFg: '@fg',
|
|
||||||
accentDarken: ':darken<10<@accent',
|
|
||||||
acrylicPanel: ':alpha<0.5<@panel',
|
|
||||||
navIndicator: '@indicator',
|
|
||||||
windowHeader: ':alpha<0.85<@panel',
|
|
||||||
accentLighten: ':lighten<10<@accent',
|
|
||||||
buttonHoverBg: 'rgba(255, 255, 255, 0.1)',
|
|
||||||
driveFolderBg: ':alpha<0.3<@accent',
|
|
||||||
fgHighlighted: ':lighten<3<@fg',
|
|
||||||
fgTransparent: ':alpha<0.5<@fg',
|
|
||||||
panelHeaderBg: ':lighten<3<@panel',
|
|
||||||
panelHeaderFg: '@fg',
|
|
||||||
buttonGradateA: '@accent',
|
|
||||||
buttonGradateB: ':hue<20<@accent',
|
|
||||||
htmlThemeColor: '@bg',
|
|
||||||
panelHighlight: ':lighten<3<@panel',
|
|
||||||
listItemHoverBg: 'rgba(255, 255, 255, 0.03)',
|
|
||||||
scrollbarHandle: 'rgba(255, 255, 255, 0.2)',
|
|
||||||
inputBorderHover: 'rgba(255, 255, 255, 0.2)',
|
|
||||||
wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',
|
|
||||||
fgTransparentWeak: ':alpha<0.75<@fg',
|
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
|
|
||||||
},
|
|
||||||
author: 'somebody ¯_(ツ)_/¯',
|
|
||||||
}
|
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'b008cd09-7ed5-4b88-adcc-c5a6c27406a6',base: 'dark',name: 'Catppuccin macchiato blue',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#8aadf4',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '6365da57-9c82-4a11-b064-d2b72c1e4962',base: 'dark',name: 'Catppuccin macchiato flamingo',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#f0c6c6',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '9c1ad601-df61-4135-8598-a5bfbd8560b6',base: 'dark',name: 'Catppuccin macchiato green',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#a6da95',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'c42a0fb1-6142-4c97-93c6-8c26bc9c2fd1',base: 'dark',name: 'Catppuccin macchiato lavender',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#b7bdf8',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '500474c0-6f84-42bc-befd-48a6bb475ab3',base: 'dark',name: 'Catppuccin macchiato maroon',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#ee99a0',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '0dec6f16-afd8-486e-80dd-cb6dc4545305',base: 'dark',name: 'Catppuccin macchiato mauve',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#c6a0f6',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '4987d5af-9e73-4356-a317-a55046c8eeeb',base: 'dark',name: 'Catppuccin macchiato peach',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#f5a97f',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '415902ef-0e56-4797-b9af-78716d7aa98d',base: 'dark',name: 'Catppuccin macchiato pink',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#f5bde6',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'da38ecbe-d6b9-4397-8697-a9fb136d4686',base: 'dark',name: 'Catppuccin macchiato red',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#ed8796',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'e3af403a-f2f9-4de0-b55e-e12afdab62fb',base: 'dark',name: 'Catppuccin macchiato rosewater',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#f4dbd6',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'c92a9970-2a68-403c-9d4e-af8537f8fdca',base: 'dark',name: 'Catppuccin macchiato sapphire',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#7dc4e4',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '85d9bbcf-02fc-4c1c-9dcd-2069b3335c50',base: 'dark',name: 'Catppuccin macchiato sky',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#91d7e3',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'edf87ab0-a47b-4dfe-8092-8d39c72d4a84',base: 'dark',name: 'Catppuccin macchiato teal',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#8bd5ca',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '179b5cce-97e7-46fc-b2dd-d62ee3e6037a',base: 'dark',name: 'Catppuccin macchiato yellow',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#181926',fg: '#cad3f5',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#494d64',cwFg: '#b8c0e0',link: '#8aadf4',warn: '#f5a97f',badge: '#8aadf4',error: '#ed8796',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#eed49f',header: ':alpha<0.7<@panel',infoBg: '#363a4f',infoFg: '#a5adcb',renote: '#8aadf4',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#7dc4e4',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6da95',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#5b6078',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6da95',codeString: '#f5a97f',fgOnAccent: '#24273a',infoWarnBg: '#363a4f',infoWarnFg: '#b8c0e0',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6e738d',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
1
packages/client/src/themes/d-catppuccin-mocha-blue.json5
Normal file
1
packages/client/src/themes/d-catppuccin-mocha-blue.json5
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{id: 'f39f6217-a594-4dbd-9b0e-b001a0da383b',base: 'dark',name: 'Catppuccin mocha blue',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#11111b',fg: '#cdd6f4',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#45475a',cwFg: '#bac2de',link: '#89b4fa',warn: '#fab387',badge: '#89b4fa',error: '#f38ba8',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#89b4fa',header: ':alpha<0.7<@panel',infoBg: '#313244',infoFg: '#a6adc8',renote: '#89b4fa',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#74c7ec',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6e3a1',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#585b70',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6e3a1',codeString: '#fab387',fgOnAccent: '#1e1e2e',infoWarnBg: '#313244',infoWarnFg: '#bac2de',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6c7086',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'd413f41f-a489-48be-9e20-3532ffbb4363',base: 'dark',name: 'Catppuccin mocha flamingo',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#11111b',fg: '#cdd6f4',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#45475a',cwFg: '#bac2de',link: '#89b4fa',warn: '#fab387',badge: '#89b4fa',error: '#f38ba8',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#f2cdcd',header: ':alpha<0.7<@panel',infoBg: '#313244',infoFg: '#a6adc8',renote: '#89b4fa',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#74c7ec',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6e3a1',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#585b70',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6e3a1',codeString: '#fab387',fgOnAccent: '#1e1e2e',infoWarnBg: '#313244',infoWarnFg: '#bac2de',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6c7086',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '11bb1ab5-b7b9-4060-b0fe-5083e767e87d',base: 'dark',name: 'Catppuccin mocha green',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#11111b',fg: '#cdd6f4',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#45475a',cwFg: '#bac2de',link: '#89b4fa',warn: '#fab387',badge: '#89b4fa',error: '#f38ba8',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#a6e3a1',header: ':alpha<0.7<@panel',infoBg: '#313244',infoFg: '#a6adc8',renote: '#89b4fa',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#74c7ec',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6e3a1',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#585b70',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6e3a1',codeString: '#fab387',fgOnAccent: '#1e1e2e',infoWarnBg: '#313244',infoWarnFg: '#bac2de',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6c7086',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'f69c50ff-837c-48f5-803b-c94efaea433f',base: 'dark',name: 'Catppuccin mocha lavender',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#11111b',fg: '#cdd6f4',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#45475a',cwFg: '#bac2de',link: '#89b4fa',warn: '#fab387',badge: '#89b4fa',error: '#f38ba8',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#b4befe',header: ':alpha<0.7<@panel',infoBg: '#313244',infoFg: '#a6adc8',renote: '#89b4fa',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#74c7ec',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6e3a1',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#585b70',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6e3a1',codeString: '#fab387',fgOnAccent: '#1e1e2e',infoWarnBg: '#313244',infoWarnFg: '#bac2de',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6c7086',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '105a5ad5-3fb0-4db2-a7ea-b90cd21cd338',base: 'dark',name: 'Catppuccin mocha maroon',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#11111b',fg: '#cdd6f4',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#45475a',cwFg: '#bac2de',link: '#89b4fa',warn: '#fab387',badge: '#89b4fa',error: '#f38ba8',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#eba0ac',header: ':alpha<0.7<@panel',infoBg: '#313244',infoFg: '#a6adc8',renote: '#89b4fa',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#74c7ec',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6e3a1',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#585b70',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6e3a1',codeString: '#fab387',fgOnAccent: '#1e1e2e',infoWarnBg: '#313244',infoWarnFg: '#bac2de',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6c7086',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: 'a05d4ae9-d3ae-4973-8796-e4fa4a2187e3',base: 'dark',name: 'Catppuccin mocha mauve',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#11111b',fg: '#cdd6f4',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#45475a',cwFg: '#bac2de',link: '#89b4fa',warn: '#fab387',badge: '#89b4fa',error: '#f38ba8',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#cba6f7',header: ':alpha<0.7<@panel',infoBg: '#313244',infoFg: '#a6adc8',renote: '#89b4fa',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#74c7ec',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6e3a1',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#585b70',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6e3a1',codeString: '#fab387',fgOnAccent: '#1e1e2e',infoWarnBg: '#313244',infoWarnFg: '#bac2de',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6c7086',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
|
@ -0,0 +1 @@
|
||||||
|
{id: '27eb675d-ec95-4834-88a7-defa3742860a',base: 'dark',name: 'Catppuccin mocha peach',props: {X2: ':darken<2<@panel',X3: 'rgba(255, 255, 255, 0.05)',X4: 'rgba(255, 255, 255, 0.1)',X5: 'rgba(255, 255, 255, 0.05)',X6: 'rgba(255, 255, 255, 0.15)',X7: 'rgba(255, 255, 255, 0.05)',X8: ':lighten<5<@accent',X9: ':darken<5<@accent',bg: '#11111b',fg: '#cdd6f4',X10: ':alpha<0.4<@accent',X11: 'rgba(0, 0, 0, 0.3)',X12: 'rgba(255, 255, 255, 0.1)',X13: 'rgba(255, 255, 255, 0.15)',X14: ':alpha<0.5<@navBg',X15: ':alpha<0<@panel',X16: ':alpha<0.7<@panel',X17: ':alpha<0.8<@bg',cwBg: '#45475a',cwFg: '#bac2de',link: '#89b4fa',warn: '#fab387',badge: '#89b4fa',error: '#f38ba8',focus: ':alpha<0.3<@accent',navBg: '@panel',navFg: '@fg',panel: ':lighten<3<@bg',popup: ':lighten<3<@panel',accent: '#fab387',header: ':alpha<0.7<@panel',infoBg: '#313244',infoFg: '#a6adc8',renote: '#89b4fa',shadow: 'rgba(0, 0, 0, 0.3)',divider: 'rgba(255, 255, 255, 0.1)',hashtag: '#74c7ec',mention: '@accent',modalBg: 'rgba(0, 0, 0, 0.5)',success: '#a6e3a1',buttonBg: 'rgba(255, 255, 255, 0.05)',switchBg: 'rgba(255, 255, 255, 0.15)',acrylicBg: ':alpha<0.5<@bg',cwHoverBg: '#585b70',indicator: '@accent',mentionMe: '@mention',messageBg: '@bg',navActive: '@accent',accentedBg: ':alpha<0.15<@accent',codeNumber: '#a6e3a1',codeString: '#fab387',fgOnAccent: '#1e1e2e',infoWarnBg: '#313244',infoWarnFg: '#bac2de',navHoverFg: ':lighten<17<@fg',switchOnBg: '@accentedBg',switchOnFg: '@accent',codeBoolean: '@accent',dateLabelFg: '@fg',deckDivider: '#6c7086',inputBorder: 'rgba(255, 255, 255, 0.1)',panelBorder: 'solid 1px var(--divider)',switchOffBg: 'rgba(255, 255, 255, 0.1)',switchOffFg: '@fg',accentDarken: ':darken<10<@accent',acrylicPanel: ':alpha<0.5<@panel',navIndicator: '@indicator',windowHeader: ':alpha<0.85<@panel',accentLighten: ':lighten<10<@accent',buttonHoverBg: 'rgba(255, 255, 255, 0.1)',driveFolderBg: ':alpha<0.3<@accent',fgHighlighted: ':lighten<3<@fg',fgTransparent: ':alpha<0.5<@fg',panelHeaderBg: ':lighten<3<@panel',panelHeaderFg: '@fg',buttonGradateA: '@accent',buttonGradateB: ':hue<20<@accent',htmlThemeColor: '@bg',panelHighlight: ':lighten<3<@panel',listItemHoverBg: 'rgba(255, 255, 255, 0.03)',scrollbarHandle: 'rgba(255, 255, 255, 0.2)',inputBorderHover: 'rgba(255, 255, 255, 0.2)',wallpaperOverlay: 'rgba(0, 0, 0, 0.5)',fgTransparentWeak: ':alpha<0.75<@fg',panelHeaderDivider: 'rgba(0, 0, 0, 0)',scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',},author: 'somebody ¯\_(ツ)_/¯',}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue