diff --git a/.config/BetterDiscord/plugins/ChannelTabs_new_302085663057248267.config.json b/.config/BetterDiscord/plugins/ChannelTabs_new_302085663057248267.config.json index 2358f1db..91b76a96 100644 --- a/.config/BetterDiscord/plugins/ChannelTabs_new_302085663057248267.config.json +++ b/.config/BetterDiscord/plugins/ChannelTabs_new_302085663057248267.config.json @@ -2,16 +2,16 @@ "settings": { "tabs": [ { - "name": "#arte-picasso", - "url": "/channels/674984102860161025/1007802241035538452", + "name": "#general", + "url": "/channels/674984102860161025/674985827121758208", "selected": true, "currentStatus": "none", "iconUrl": "https://cdn.discordapp.com/icons/674984102860161025/a4c5c84a118b923dfe68dccd886d1d87.webp?size=40", - "channelId": "1007802241035538452" + "channelId": "674985827121758208" }, { "name": "#feedback-and-suggestions", - "url": "/channels/959006368784850994/1027703875291062373/threads/1027810621359656970", + "url": "/channels/959006368784850994/1027703875291062373", "selected": false, "currentStatus": "none", "iconUrl": "https://cdn.discordapp.com/icons/959006368784850994/ffd2d5ef008ed1d63fb3145840b1a6db.webp?size=40", @@ -26,12 +26,11 @@ "channelId": "635625917623828520" }, { - "name": "@Sergio Laín", - "url": "/channels/@me/1107960185529581679", + "name": "Friends", + "url": "/channels/@me", "selected": false, - "currentStatus": "offline", - "iconUrl": "https://cdn.discordapp.com/avatars/1087642197685452850/b61c2b287c9f9e3e31a5a9741884a33d.webp?size=40", - "channelId": "1107960185529581679" + "currentStatus": "none", + "iconUrl": "https://cdn.discordapp.com/embed/avatars/0.png" } ], "favs": [], diff --git a/.config/VSCodium/User/globalStorage/state.vscdb b/.config/VSCodium/User/globalStorage/state.vscdb index 158688c3..3eb653d8 100644 Binary files a/.config/VSCodium/User/globalStorage/state.vscdb and b/.config/VSCodium/User/globalStorage/state.vscdb differ diff --git a/.config/VSCodium/User/globalStorage/state.vscdb.backup b/.config/VSCodium/User/globalStorage/state.vscdb.backup index c2d0f99e..2720a6b4 100644 Binary files a/.config/VSCodium/User/globalStorage/state.vscdb.backup and b/.config/VSCodium/User/globalStorage/state.vscdb.backup differ diff --git a/.config/VSCodium/User/globalStorage/storage.json b/.config/VSCodium/User/globalStorage/storage.json index ed1f7e8e..ad36bd98 100644 --- a/.config/VSCodium/User/globalStorage/storage.json +++ b/.config/VSCodium/User/globalStorage/storage.json @@ -48,12 +48,23 @@ "id": "openRecentFolder", "uri": { "$mid": 1, - "external": "file:///home/matt/.config/kitty", - "path": "/home/matt/.config/kitty", + "external": "file:///home/matt/.config/nvim", + "path": "/home/matt/.config/nvim", "scheme": "file" }, "enabled": true, - "label": "~/.config/kitty" + "label": "~/.config/nvim" + }, + { + "id": "openRecentFolder", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/nvim/lua", + "path": "/home/matt/.config/nvim/lua", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/nvim/lua" }, { "id": "openRecentFolder", @@ -66,6 +77,61 @@ "enabled": true, "label": "~/.config" }, + { + "id": "openRecentFolder", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/eDEX-UI/themes", + "path": "/home/matt/.config/eDEX-UI/themes", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/eDEX-UI/themes" + }, + { + "id": "openRecentFolder", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/fish", + "path": "/home/matt/.config/fish", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/fish" + }, + { + "id": "openRecentFolder", + "uri": { + "$mid": 1, + "external": "file:///docs/Musica", + "path": "/docs/Musica", + "scheme": "file" + }, + "enabled": true, + "label": "/docs/Musica" + }, + { + "id": "openRecentFolder", + "uri": { + "$mid": 1, + "external": "file:///docs/Documentos/Repos", + "path": "/docs/Documentos/Repos", + "scheme": "file" + }, + "enabled": true, + "label": "/docs/Documentos/Repos" + }, + { + "id": "openRecentFolder", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/kitty", + "path": "/home/matt/.config/kitty", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/kitty" + }, { "id": "openRecentFolder", "uri": { @@ -88,72 +154,6 @@ "enabled": true, "label": "~/.oh-my-zsh/themes" }, - { - "id": "openRecentFolder", - "uri": { - "$mid": 1, - "external": "file:///home/matt/.config/lazygit", - "path": "/home/matt/.config/lazygit", - "scheme": "file" - }, - "enabled": true, - "label": "~/.config/lazygit" - }, - { - "id": "openRecentFolder", - "uri": { - "$mid": 1, - "external": "file:///home/matt/.librewolf/jj4t427t.default-release/chrome", - "path": "/home/matt/.librewolf/jj4t427t.default-release/chrome", - "scheme": "file" - }, - "enabled": true, - "label": "~/.librewolf/jj4t427t.default-release/chrome" - }, - { - "id": "openRecentFolder", - "uri": { - "$mid": 1, - "external": "file:///usr/share/sddm/themes/sugar-candy", - "path": "/usr/share/sddm/themes/sugar-candy", - "scheme": "file" - }, - "enabled": true, - "label": "/usr/share/sddm/themes/sugar-candy" - }, - { - "id": "openRecentFolder", - "uri": { - "$mid": 1, - "external": "file:///home/matt/Repos/Personal/StartPage", - "path": "/home/matt/Repos/Personal/StartPage", - "scheme": "file" - }, - "enabled": true, - "label": "~/Repos/Personal/StartPage" - }, - { - "id": "openRecentFolder", - "uri": { - "$mid": 1, - "external": "file:///home/matt/.config/BetterDiscord/plugins", - "path": "/home/matt/.config/BetterDiscord/plugins", - "scheme": "file" - }, - "enabled": true, - "label": "~/.config/BetterDiscord/plugins" - }, - { - "id": "openRecentFolder", - "uri": { - "$mid": 1, - "external": "file:///home/matt/.config/pipewire", - "path": "/home/matt/.config/pipewire", - "scheme": "file" - }, - "enabled": true, - "label": "~/.config/pipewire" - }, { "id": "vscode.menubar.separator" }, @@ -161,12 +161,12 @@ "id": "openRecentFile", "uri": { "$mid": 1, - "external": "file:///home/matt/.config/fish/functions/fish_prompt.fish", - "path": "/home/matt/.config/fish/functions/fish_prompt.fish", + "external": "file:///home/matt/.config/eDEX-UI/settings.json", + "path": "/home/matt/.config/eDEX-UI/settings.json", "scheme": "file" }, "enabled": true, - "label": "~/.config/fish/functions/fish_prompt.fish" + "label": "~/.config/eDEX-UI/settings.json" }, { "id": "openRecentFile", @@ -179,6 +179,50 @@ "enabled": true, "label": "~/.zshrc" }, + { + "id": "openRecentFile", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/starship.toml", + "path": "/home/matt/.config/starship.toml", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/starship.toml" + }, + { + "id": "openRecentFile", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/fish/aliases.fish", + "path": "/home/matt/.config/fish/aliases.fish", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/fish/aliases.fish" + }, + { + "id": "openRecentFile", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/xplr/init.lua", + "path": "/home/matt/.config/xplr/init.lua", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/xplr/init.lua" + }, + { + "id": "openRecentFile", + "uri": { + "$mid": 1, + "external": "file:///home/matt/.config/fish/config.fish", + "path": "/home/matt/.config/fish/config.fish", + "scheme": "file" + }, + "enabled": true, + "label": "~/.config/fish/config.fish" + }, { "id": "openRecentFile", "uri": { @@ -223,50 +267,6 @@ "enabled": true, "label": "~/Descargas/Documentos/Personal/svr27-i448u.csv" }, - { - "id": "openRecentFile", - "uri": { - "$mid": 1, - "external": "file:///home/matt/Descargas/Documentos/Personal/contacts.csv", - "path": "/home/matt/Descargas/Documentos/Personal/contacts.csv", - "scheme": "file" - }, - "enabled": true, - "label": "~/Descargas/Documentos/Personal/contacts.csv" - }, - { - "id": "openRecentFile", - "uri": { - "$mid": 1, - "external": "file:///home/matt/Descargas/Documentos/Personal/contacts.vcf", - "path": "/home/matt/Descargas/Documentos/Personal/contacts.vcf", - "scheme": "file" - }, - "enabled": true, - "label": "~/Descargas/Documentos/Personal/contacts.vcf" - }, - { - "id": "openRecentFile", - "uri": { - "$mid": 1, - "external": "file:///home/matt/.config/kitty/kitty.conf", - "path": "/home/matt/.config/kitty/kitty.conf", - "scheme": "file" - }, - "enabled": true, - "label": "~/.config/kitty/kitty.conf" - }, - { - "id": "openRecentFile", - "uri": { - "$mid": 1, - "external": "file:///docs/Documentos/Repos/Non-Personal/Community%20Dotfiles/.zshrc", - "path": "/docs/Documentos/Repos/Non-Personal/Community Dotfiles/.zshrc", - "scheme": "file" - }, - "enabled": true, - "label": "/docs/Documentos/Repos/Non-Personal/Community Dotfiles/.zshrc" - }, { "id": "vscode.menubar.separator" }, @@ -312,8 +312,7 @@ }, { "id": "saveAll", - "label": "Save A&&ll", - "enabled": false + "label": "Save A&&ll" }, { "id": "vscode.menubar.separator" @@ -325,7 +324,7 @@ "items": [ { "id": "workbench.profiles.actions.exportProfile", - "label": "Export Profile (Default)..." + "label": "Export Profile (Lua)..." }, { "id": "workbench.profiles.actions.importProfile", @@ -348,7 +347,7 @@ "items": [ { "id": "submenuitem.Profiles", - "label": "Profiles (Default)", + "label": "Profiles (Lua)", "submenu": { "items": [ { @@ -365,8 +364,7 @@ }, { "id": "workbench.profiles.actions.profileEntry.__default__profile__", - "label": "Default", - "checked": true + "label": "Default" }, { "id": "workbench.profiles.actions.profileEntry.-7191cca2", @@ -378,7 +376,8 @@ }, { "id": "workbench.profiles.actions.profileEntry.-1645caa6", - "label": "Lua" + "label": "Lua", + "checked": true }, { "id": "workbench.profiles.actions.profileEntry.-1f364037", @@ -395,6 +394,10 @@ { "id": "vscode.menubar.separator" }, + { + "id": "workbench.profiles.actions.renameCurrentProfile", + "label": "Rename..." + }, { "id": "workbench.profiles.actions.showProfileContents", "label": "Show Contents..." @@ -666,13 +669,11 @@ }, { "id": "workbench.action.toggleZenMode", - "label": "Zen Mode", - "checked": true + "label": "Zen Mode" }, { "id": "workbench.action.toggleCenteredLayout", - "label": "&&Centered Layout", - "checked": true + "label": "&&Centered Layout" }, { "id": "vscode.menubar.separator" @@ -683,7 +684,8 @@ }, { "id": "workbench.action.toggleSidebarVisibility", - "label": "&&Primary Side Bar" + "label": "&&Primary Side Bar", + "checked": true }, { "id": "workbench.action.toggleAuxiliaryBar", @@ -760,7 +762,8 @@ }, { "id": "editor.action.toggleMinimap", - "label": "&&Minimap" + "label": "&&Minimap", + "checked": true }, { "id": "breadcrumbs.toggle", @@ -891,6 +894,10 @@ "id": "workbench.view.extensions", "label": "E&&xtensions" }, + { + "id": "workbench.view.extension.test", + "label": "T&&esting" + }, { "id": "vscode.menubar.separator" }, @@ -1804,22 +1811,22 @@ "sideBarSide": "left", "editorPartMinWidth": 220, "titleBarHeight": 0, - "activityBarWidth": 0, - "sideBarWidth": 0, + "activityBarWidth": 48, + "sideBarWidth": 295, "statusBarHeight": 0, "windowBorder": false } }, "windowsState": { "lastActiveWindow": { - "folder": "file:///home/matt/.config/kitty", - "backupPath": "/home/matt/.config/VSCodium/Backups/f862d78a22ff70d122e141cd428aace5", + "folder": "file:///home/matt/.config/nvim", + "backupPath": "/home/matt/.config/VSCodium/Backups/0cb1dd62df9d1360fc2678a48f592495", "uiState": { "mode": 1, - "x": 1234, - "y": 1109, - "width": 1191, - "height": 934 + "x": 21, + "y": 78, + "width": 2404, + "height": 933 } }, "openedWindows": [] @@ -1834,7 +1841,7 @@ "folderUri": "file:///home/matt/.config/awesome" }, { - "folderUri": "file:///home/matt/.config/kitty" + "folderUri": "file:///home/matt/.config/nvim" } ], "emptyWindows": [] @@ -1893,8 +1900,14 @@ "file:///home/matt/.config/lazygit": "__default__profile__", "file:///home/matt/.oh-my-zsh/themes": "__default__profile__", "file:///home/matt/.oh-my-zsh": "__default__profile__", - "file:///home/matt/.config": "__default__profile__", - "file:///home/matt/.config/kitty": "__default__profile__" + "file:///home/matt/.config/kitty": "__default__profile__", + "file:///docs/Documentos/Repos": "-1645caa6", + "file:///docs/Musica": "-1645caa6", + "file:///home/matt/.config/fish": "__default__profile__", + "file:///home/matt/.config/eDEX-UI/themes": "__default__profile__", + "file:///home/matt/.config": "-1645caa6", + "file:///home/matt/.config/nvim/lua": "-1645caa6", + "file:///home/matt/.config/nvim": "-1645caa6" }, "emptyWindows": {} }, diff --git a/.config/VSCodium/User/profiles/-1645caa6/extensions.json b/.config/VSCodium/User/profiles/-1645caa6/extensions.json index d6b93d51..42b00399 100644 --- a/.config/VSCodium/User/profiles/-1645caa6/extensions.json +++ b/.config/VSCodium/User/profiles/-1645caa6/extensions.json @@ -1 +1 @@ -[{"identifier":{"id":"brandonkirbyson.vscode-animations","uuid":"7d7c0d21-6653-4c11-9310-75b7180bbf81"},"version":"1.0.12","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/brandonkirbyson.vscode-animations-1.0.12","scheme":"file"},"relativeLocation":"brandonkirbyson.vscode-animations-1.0.12","metadata":{"id":"7d7c0d21-6653-4c11-9310-75b7180bbf81","publisherId":"55df104d-985f-438b-b4c6-3a5c30f35183","publisherDisplayName":"Brandon Kirbyson","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349824}},{"identifier":{"id":"visualstudioexptteam.intellicode-api-usage-examples","uuid":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3"},"version":"0.2.7","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.intellicode-api-usage-examples-0.2.7","scheme":"file"},"relativeLocation":"visualstudioexptteam.intellicode-api-usage-examples-0.2.7","metadata":{"id":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349950}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode","uuid":"876e8f93-74d0-4f4f-91b7-34a09f19f444"},"version":"1.2.30","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-1.2.30","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-1.2.30","metadata":{"id":"876e8f93-74d0-4f4f-91b7-34a09f19f444","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349954}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode-completions","uuid":"b8febe71-368d-482e-96f5-6f53d03e640b"},"version":"1.0.22","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-completions-1.0.22","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-completions-1.0.22","metadata":{"id":"b8febe71-368d-482e-96f5-6f53d03e640b","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349969}},{"identifier":{"id":"eamodio.gitlens","uuid":"4de763bd-505d-4978-9575-2b7696ecf94e"},"version":"14.1.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eamodio.gitlens-14.1.0","scheme":"file"},"relativeLocation":"eamodio.gitlens-14.1.0","metadata":{"id":"4de763bd-505d-4978-9575-2b7696ecf94e","publisherId":"678d198b-9b2e-49d3-96ff-6d801c9575df","publisherDisplayName":"GitKraken","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350020}},{"identifier":{"id":"bierner.color-info","uuid":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9"},"version":"0.7.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.color-info-0.7.2","scheme":"file"},"relativeLocation":"bierner.color-info-0.7.2","metadata":{"id":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349787}},{"identifier":{"id":"bierner.markdown-preview-github-styles","uuid":"5cbdf58a-694a-4aba-af08-61d00842eb03"},"version":"2.0.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.markdown-preview-github-styles-2.0.2","scheme":"file"},"relativeLocation":"bierner.markdown-preview-github-styles-2.0.2","metadata":{"id":"5cbdf58a-694a-4aba-af08-61d00842eb03","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349791}},{"identifier":{"id":"albert.tabout","uuid":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e"},"version":"0.2.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/albert.tabout-0.2.2","scheme":"file"},"relativeLocation":"albert.tabout-0.2.2","metadata":{"id":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e","publisherId":"f7f9797b-4ad7-43fc-8863-63698264f6f7","publisherDisplayName":"Albert Romkes","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349804}},{"identifier":{"id":"redhat.vscode-yaml","uuid":"2061917f-f76a-458a-8da9-f162de22b97e"},"version":"1.13.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-yaml-1.13.0","scheme":"file"},"relativeLocation":"redhat.vscode-yaml-1.13.0","metadata":{"id":"2061917f-f76a-458a-8da9-f162de22b97e","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349901}},{"identifier":{"id":"vscodevim.vim","uuid":"d96e79c6-8b25-4be3-8545-0e0ecefcae03"},"version":"1.25.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/vscodevim.vim-1.25.2","scheme":"file"},"relativeLocation":"vscodevim.vim-1.25.2","metadata":{"id":"d96e79c6-8b25-4be3-8545-0e0ecefcae03","publisherId":"5d63889b-1b67-4b1f-8350-4f1dce041a26","publisherDisplayName":"vscodevim","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349911}},{"identifier":{"id":"pkief.material-icon-theme","uuid":"5db78037-f674-459f-a236-db622c427c5b"},"version":"4.28.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-icon-theme-4.28.0","scheme":"file"},"relativeLocation":"pkief.material-icon-theme-4.28.0","metadata":{"id":"5db78037-f674-459f-a236-db622c427c5b","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349940}},{"identifier":{"id":"jrebocho.vscode-random","uuid":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f"},"version":"1.11.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/jrebocho.vscode-random-1.11.0","scheme":"file"},"relativeLocation":"jrebocho.vscode-random-1.11.0","metadata":{"id":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f","publisherId":"4081ae01-a71e-4225-9b06-9dd59fe64e59","publisherDisplayName":"Jorge Rebocho","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349915}},{"identifier":{"id":"nonoroazoro.syncing","uuid":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f"},"version":"3.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/nonoroazoro.syncing-3.3.4","scheme":"file"},"relativeLocation":"nonoroazoro.syncing-3.3.4","metadata":{"id":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f","publisherId":"f6d9d666-6595-44fa-89fc-36a0c3e0c1fa","publisherDisplayName":"nonoroazoro","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349930}},{"identifier":{"id":"emilast.logfilehighlighter","uuid":"e8b488af-fccf-4adf-b60c-fc7455bea107"},"version":"2.16.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/emilast.logfilehighlighter-2.16.0","scheme":"file"},"relativeLocation":"emilast.logfilehighlighter-2.16.0","metadata":{"id":"e8b488af-fccf-4adf-b60c-fc7455bea107","publisherId":"4534c4fe-f5e7-4c04-943b-3a6dad3e61dc","publisherDisplayName":"Emil Åström","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349905}},{"identifier":{"id":"streetsidesoftware.code-spell-checker","uuid":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7"},"version":"2.20.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-2.20.5","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-2.20.5","metadata":{"id":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350017}},{"identifier":{"id":"wakatime.vscode-wakatime","uuid":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3"},"version":"24.2.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/wakatime.vscode-wakatime-24.2.0","scheme":"file"},"relativeLocation":"wakatime.vscode-wakatime-24.2.0","metadata":{"id":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3","publisherId":"27977793-9e84-451b-8977-744ce63f3d70","publisherDisplayName":"WakaTime","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349980}},{"identifier":{"id":"be5invis.vscode-custom-css","uuid":"1b160753-ae5e-42bb-82ad-d115ce5c10f4"},"version":"7.2.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/be5invis.vscode-custom-css-7.2.1","scheme":"file"},"relativeLocation":"be5invis.vscode-custom-css-7.2.1","metadata":{"id":"1b160753-ae5e-42bb-82ad-d115ce5c10f4","publisherId":"8c148d69-cbc6-480b-bd8b-a42715926324","publisherDisplayName":"be5invis","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349820}},{"identifier":{"id":"yutengjing.vscode-colorize-plus","uuid":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7"},"version":"0.12.13","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yutengjing.vscode-colorize-plus-0.12.13","scheme":"file"},"relativeLocation":"yutengjing.vscode-colorize-plus-0.12.13","metadata":{"id":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7","publisherId":"05f2f040-a2c0-4aae-a680-d6b707520bdd","publisherDisplayName":"YuTengjing","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349984}},{"identifier":{"id":"leonardssh.vscord","uuid":"20675c06-f272-4cc8-8611-83ebb5583c5a"},"version":"5.1.12","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/leonardssh.vscord-5.1.12","scheme":"file"},"relativeLocation":"leonardssh.vscord-5.1.12","metadata":{"id":"20675c06-f272-4cc8-8611-83ebb5583c5a","publisherId":"2c34273e-24b8-499a-b859-8e27e48decc5","publisherDisplayName":"leonardssh","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350002}},{"identifier":{"id":"alefragnani.project-manager","uuid":"1b747f06-3789-4ebd-ac99-f1fe430c3347"},"version":"12.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.project-manager-12.7.0","scheme":"file"},"relativeLocation":"alefragnani.project-manager-12.7.0","metadata":{"id":"1b747f06-3789-4ebd-ac99-f1fe430c3347","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349809}},{"identifier":{"id":"ms-vscode.remote-explorer","uuid":"11858313-52cc-4e57-b3e4-d7b65281e34b"},"version":"0.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode.remote-explorer-0.4.1","scheme":"file"},"relativeLocation":"ms-vscode.remote-explorer-0.4.1","metadata":{"id":"11858313-52cc-4e57-b3e4-d7b65281e34b","publisherId":"5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349870}},{"identifier":{"id":"streetsidesoftware.code-spell-checker-spanish","uuid":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb"},"version":"2.1.9","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-spanish-2.1.9","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-spanish-2.1.9","metadata":{"id":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349959}},{"identifier":{"id":"chrmarti.regex","uuid":"7ed7bccd-f358-4c6f-88c0-1296185abaa1"},"version":"0.4.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/chrmarti.regex-0.4.0","scheme":"file"},"relativeLocation":"chrmarti.regex-0.4.0","metadata":{"id":"7ed7bccd-f358-4c6f-88c0-1296185abaa1","publisherId":"6c6b26a3-e134-4d03-ad02-7e48f7c9f342","publisherDisplayName":"Christof Marti","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349844}},{"identifier":{"id":"catppuccin.catppuccin-vsc","uuid":"69264e4d-cd3b-468a-8f2b-e69673c7d864"},"version":"2.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/catppuccin.catppuccin-vsc-2.7.0","scheme":"file"},"relativeLocation":"catppuccin.catppuccin-vsc-2.7.0","metadata":{"id":"69264e4d-cd3b-468a-8f2b-e69673c7d864","publisherId":"e7d2ed61-53e0-4dd4-afbe-f536c3bb4316","publisherDisplayName":"Catppuccin","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349830}},{"identifier":{"id":"davidanson.vscode-markdownlint","uuid":"daf8b44d-8aae-4da2-80c5-1f770219f643"},"version":"0.51.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/davidanson.vscode-markdownlint-0.51.0","scheme":"file"},"relativeLocation":"davidanson.vscode-markdownlint-0.51.0","metadata":{"id":"daf8b44d-8aae-4da2-80c5-1f770219f643","publisherId":"2e4d1cda-6ef0-4e42-a352-ab540afe8ff0","publisherDisplayName":"David Anson","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349839}},{"identifier":{"id":"ms-vscode-remote.remote-ssh-edit","uuid":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c"},"version":"0.86.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-edit-0.86.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-edit-0.86.0","metadata":{"id":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349860}},{"identifier":{"id":"codezombiech.gitignore","uuid":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29"},"version":"0.9.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codezombiech.gitignore-0.9.0","scheme":"file"},"relativeLocation":"codezombiech.gitignore-0.9.0","metadata":{"id":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29","publisherId":"930310c4-ca8b-4e80-9d19-2b1507b2af61","publisherDisplayName":"CodeZombie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349855}},{"identifier":{"id":"ms-vscode-remote.remote-ssh","uuid":"607fd052-be03-4363-b657-2bd62b83d28a"},"version":"0.102.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-0.102.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-0.102.0","metadata":{"id":"607fd052-be03-4363-b657-2bd62b83d28a","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349850}},{"identifier":{"id":"ibm.output-colorizer","uuid":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f"},"version":"0.1.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ibm.output-colorizer-0.1.2","scheme":"file"},"relativeLocation":"ibm.output-colorizer-0.1.2","metadata":{"id":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f","publisherId":"8f186bac-3651-4797-9216-ba30633f600b","publisherDisplayName":"IBM","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349866}},{"identifier":{"id":"mhutchie.git-graph","uuid":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7"},"version":"1.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mhutchie.git-graph-1.30.0","scheme":"file"},"relativeLocation":"mhutchie.git-graph-1.30.0","metadata":{"id":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7","publisherId":"996496dc-099f-469d-b89c-0d7713179365","publisherDisplayName":"mhutchie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349880}},{"identifier":{"id":"kisstkondoros.vscode-gutter-preview","uuid":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5"},"version":"0.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/kisstkondoros.vscode-gutter-preview-0.30.0","scheme":"file"},"relativeLocation":"kisstkondoros.vscode-gutter-preview-0.30.0","metadata":{"id":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5","publisherId":"87e3e2a4-ac17-425a-a4b6-698bc44254fe","publisherDisplayName":"Kiss Tamás","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349890}},{"identifier":{"id":"codeium.codeium","uuid":"acab4f40-b6db-42ec-bcd1-01802cbdd988"},"version":"1.2.51","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codeium.codeium-1.2.51","scheme":"file"},"relativeLocation":"codeium.codeium-1.2.51","metadata":{"id":"acab4f40-b6db-42ec-bcd1-01802cbdd988","publisherId":"082b0525-4adf-4bcc-b60f-afa86c60860d","publisherDisplayName":"Codeium","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349835}},{"identifier":{"id":"mechatroner.rainbow-csv","uuid":"3792588c-3d35-442d-91ea-fe6a755e8155"},"version":"3.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mechatroner.rainbow-csv-3.7.0","scheme":"file"},"relativeLocation":"mechatroner.rainbow-csv-3.7.0","metadata":{"id":"3792588c-3d35-442d-91ea-fe6a755e8155","publisherId":"0d5438b6-325a-4f88-aa28-6192aa2cf2a6","publisherDisplayName":"mechatroner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349886}},{"identifier":{"id":"pkief.material-product-icons","uuid":"f797dacd-4e80-4f33-8b63-d665c0956013"},"version":"1.5.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-product-icons-1.5.0","scheme":"file"},"relativeLocation":"pkief.material-product-icons-1.5.0","metadata":{"id":"f797dacd-4e80-4f33-8b63-d665c0956013","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349921}},{"identifier":{"id":"xuangeaha.just-enough-git","uuid":"2928fca8-125f-40c0-8b28-336febf471d9"},"version":"2023.4.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/xuangeaha.just-enough-git-2023.4.5","scheme":"file"},"relativeLocation":"xuangeaha.just-enough-git-2023.4.5","metadata":{"id":"2928fca8-125f-40c0-8b28-336febf471d9","publisherId":"658fea95-cfc2-48f9-a1ba-240a82577028","publisherDisplayName":"XuangeAha","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349925}},{"identifier":{"id":"philsinatra.nested-comments","uuid":"03b96169-4c19-4c9e-ada8-d5d208ebe80e"},"version":"4.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/philsinatra.nested-comments-4.0.1","scheme":"file"},"relativeLocation":"philsinatra.nested-comments-4.0.1","metadata":{"id":"03b96169-4c19-4c9e-ada8-d5d208ebe80e","publisherId":"ee1ae119-5f58-4c1e-9274-290a7ad1d55f","publisherDisplayName":"Phil Sinatra","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349936}},{"identifier":{"id":"rafamel.subtle-brackets","uuid":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8"},"version":"3.0.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/rafamel.subtle-brackets-3.0.0","scheme":"file"},"relativeLocation":"rafamel.subtle-brackets-3.0.0","metadata":{"id":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8","publisherId":"7658adf6-ca84-42d4-8958-da3f6861451a","publisherDisplayName":"Rafa Mel","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349945}},{"identifier":{"id":"ms-azuretools.vscode-docker","uuid":"0479fc1c-3d67-49f9-b087-fb9069afe48f"},"version":"1.25.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-azuretools.vscode-docker-1.25.2","scheme":"file"},"relativeLocation":"ms-azuretools.vscode-docker-1.25.2","metadata":{"id":"0479fc1c-3d67-49f9-b087-fb9069afe48f","publisherId":"52b787f2-79a9-4f32-99b4-393afe3005d3","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350011}},{"identifier":{"id":"pucelle.vscode-css-navigation","uuid":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb"},"version":"1.13.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pucelle.vscode-css-navigation-1.13.3","scheme":"file"},"relativeLocation":"pucelle.vscode-css-navigation-1.13.3","metadata":{"id":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb","publisherId":"7650fded-a9d9-4383-a346-4136ebe47608","publisherDisplayName":"pucelle","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349974}},{"identifier":{"id":"yzhang.markdown-all-in-one","uuid":"98790d67-10fa-497c-9113-f6c7489207b2"},"version":"3.5.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yzhang.markdown-all-in-one-3.5.1","scheme":"file"},"relativeLocation":"yzhang.markdown-all-in-one-3.5.1","metadata":{"id":"98790d67-10fa-497c-9113-f6c7489207b2","publisherId":"36c8b41c-6ef6-4bf5-a5b7-65bef29b606f","publisherDisplayName":"Yu Zhang","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349995}},{"identifier":{"id":"exodiusstudios.comment-anchors","uuid":"5cf10212-681f-48c7-b66f-bcce5dc44a64"},"version":"1.10.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/exodiusstudios.comment-anchors-1.10.3","scheme":"file"},"relativeLocation":"exodiusstudios.comment-anchors-1.10.3","metadata":{"id":"5cf10212-681f-48c7-b66f-bcce5dc44a64","publisherId":"9069d21e-e9c6-4063-8f3a-026d317bb8f4","publisherDisplayName":"Starlane Studios","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350006}},{"identifier":{"id":"alefragnani.bookmarks","uuid":"b689fcc8-d494-4dbf-a228-2c694a578afc"},"version":"13.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.bookmarks-13.4.1","scheme":"file"},"relativeLocation":"alefragnani.bookmarks-13.4.1","metadata":{"id":"b689fcc8-d494-4dbf-a228-2c694a578afc","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349815}},{"identifier":{"id":"yandeu.five-server","uuid":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5"},"version":"0.2.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yandeu.five-server-0.2.3","scheme":"file"},"relativeLocation":"yandeu.five-server-0.2.3","metadata":{"id":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5","publisherId":"a342b7ab-2d58-4313-9c2d-f506bb2aa10c","publisherDisplayName":"Yannick","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349991}},{"identifier":{"id":"eugenejeon.codesnap-plus-fix","uuid":"b6406d8e-9c12-4078-8150-ca498169cf08"},"version":"1.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eugenejeon.codesnap-plus-fix-1.0.1","scheme":"file"},"relativeLocation":"eugenejeon.codesnap-plus-fix-1.0.1","metadata":{"id":"b6406d8e-9c12-4078-8150-ca498169cf08","publisherId":"b5f3798b-9da6-48b5-b246-c158aad3debc","publisherDisplayName":"Eugene Jeon","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349876}},{"identifier":{"id":"aic.docify","uuid":"aa33eae5-0c47-4b2a-a1e3-b95553fea360"},"version":"1.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/aic.docify-1.3.4","scheme":"file"},"relativeLocation":"aic.docify-1.3.4","metadata":{"id":"aa33eae5-0c47-4b2a-a1e3-b95553fea360","publisherId":"0832ad01-00f9-475b-adc0-143baef69236","publisherDisplayName":"AIC","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349798}},{"identifier":{"id":"redhat.vscode-xml","uuid":"6703768d-d42f-474e-9f6e-5f288d53f6e8"},"version":"0.26.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-xml-0.26.1-linux-x64","scheme":"file"},"relativeLocation":"redhat.vscode-xml-0.26.1-linux-x64","metadata":{"id":"6703768d-d42f-474e-9f6e-5f288d53f6e8","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"linux-x64","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349895}},{"identifier":{"id":"ms-vscode.test-adapter-converter","uuid":"47210ec2-0324-4cbb-9523-9dff02a5f9ec"},"version":"0.1.8","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode.test-adapter-converter-0.1.8","scheme":"file"},"relativeLocation":"ms-vscode.test-adapter-converter-0.1.8","metadata":{"id":"47210ec2-0324-4cbb-9523-9dff02a5f9ec","publisherId":"5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321370558,"preRelease":false}},{"identifier":{"id":"hbenl.vscode-test-explorer","uuid":"ff96f1b4-a4b8-45ef-8ecf-c232c0cb75c8"},"version":"2.21.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/hbenl.vscode-test-explorer-2.21.1","scheme":"file"},"relativeLocation":"hbenl.vscode-test-explorer-2.21.1","metadata":{"id":"ff96f1b4-a4b8-45ef-8ecf-c232c0cb75c8","publisherId":"3356f11a-6798-4f03-a93f-3d929b7fca7c","publisherDisplayName":"Holger Benl","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321370606,"preRelease":false}},{"identifier":{"id":"actboy168.lua-debug","uuid":"e5c7d4c8-9eac-4eb8-95fa-ba6865456277"},"version":"1.61.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/actboy168.lua-debug-1.61.0-linux-x64","scheme":"file"},"relativeLocation":"actboy168.lua-debug-1.61.0-linux-x64","metadata":{"id":"e5c7d4c8-9eac-4eb8-95fa-ba6865456277","publisherId":"77f6b700-85ff-429b-aa2d-8b82afbcf8db","publisherDisplayName":"actboy168","targetPlatform":"linux-x64","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321389644,"preRelease":false}},{"identifier":{"id":"lej.vscode-lua-test-adapter","uuid":"88b31f11-b18d-44f3-98de-993395fa1c34"},"version":"1.0.6","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/lej.vscode-lua-test-adapter-1.0.6","scheme":"file"},"relativeLocation":"lej.vscode-lua-test-adapter-1.0.6","metadata":{"id":"88b31f11-b18d-44f3-98de-993395fa1c34","publisherId":"bb5c77de-69f3-45cb-bfdd-d4758967fa8e","publisherDisplayName":"Linus Sunde","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321390581,"preRelease":false}},{"identifier":{"id":"yinfei.luahelper","uuid":"d3707c86-e17d-4f81-ae03-bbfae896128b"},"version":"0.2.22","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yinfei.luahelper-0.2.22","scheme":"file"},"relativeLocation":"yinfei.luahelper-0.2.22","metadata":{"id":"d3707c86-e17d-4f81-ae03-bbfae896128b","publisherId":"96e46664-7420-4d07-b29f-fc6074815ac5","publisherDisplayName":"Tencent","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321397721,"preRelease":false}},{"identifier":{"id":"sumneko.lua","uuid":"3a15b5a7-be12-47e3-8445-88ee3eabc8b2"},"version":"3.6.23","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/sumneko.lua-3.6.23-linux-x64","scheme":"file"},"relativeLocation":"sumneko.lua-3.6.23-linux-x64","metadata":{"id":"3a15b5a7-be12-47e3-8445-88ee3eabc8b2","publisherId":"fb626675-24cf-4881-8c13-b465f29bec2f","publisherDisplayName":"sumneko","targetPlatform":"linux-x64","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321404050,"preRelease":false}},{"identifier":{"id":"usernamehw.errorlens","uuid":"9d8c32ab-354c-4daf-a9bf-20b633734435"},"version":"3.12.0","location":{"$mid":1,"fsPath":"/home/matt/.vscode-oss/extensions/usernamehw.errorlens-3.12.0","path":"/home/matt/.vscode-oss/extensions/usernamehw.errorlens-3.12.0","scheme":"file"},"relativeLocation":"usernamehw.errorlens-3.12.0","metadata":{"id":"9d8c32ab-354c-4daf-a9bf-20b633734435","publisherId":"151820df-5dc5-4c97-8751-eb84643203fa","publisherDisplayName":"Alexander","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689321434053,"preRelease":false}}] \ No newline at end of file +[{"identifier":{"id":"brandonkirbyson.vscode-animations","uuid":"7d7c0d21-6653-4c11-9310-75b7180bbf81"},"version":"1.0.12","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/brandonkirbyson.vscode-animations-1.0.12","scheme":"file"},"relativeLocation":"brandonkirbyson.vscode-animations-1.0.12","metadata":{"id":"7d7c0d21-6653-4c11-9310-75b7180bbf81","publisherId":"55df104d-985f-438b-b4c6-3a5c30f35183","publisherDisplayName":"Brandon Kirbyson","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349824}},{"identifier":{"id":"visualstudioexptteam.intellicode-api-usage-examples","uuid":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3"},"version":"0.2.7","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.intellicode-api-usage-examples-0.2.7","scheme":"file"},"relativeLocation":"visualstudioexptteam.intellicode-api-usage-examples-0.2.7","metadata":{"id":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349950}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode","uuid":"876e8f93-74d0-4f4f-91b7-34a09f19f444"},"version":"1.2.30","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-1.2.30","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-1.2.30","metadata":{"id":"876e8f93-74d0-4f4f-91b7-34a09f19f444","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349954}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode-completions","uuid":"b8febe71-368d-482e-96f5-6f53d03e640b"},"version":"1.0.22","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-completions-1.0.22","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-completions-1.0.22","metadata":{"id":"b8febe71-368d-482e-96f5-6f53d03e640b","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349969}},{"identifier":{"id":"eamodio.gitlens","uuid":"4de763bd-505d-4978-9575-2b7696ecf94e"},"version":"14.1.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eamodio.gitlens-14.1.0","scheme":"file"},"relativeLocation":"eamodio.gitlens-14.1.0","metadata":{"id":"4de763bd-505d-4978-9575-2b7696ecf94e","publisherId":"678d198b-9b2e-49d3-96ff-6d801c9575df","publisherDisplayName":"GitKraken","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350020}},{"identifier":{"id":"bierner.color-info","uuid":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9"},"version":"0.7.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.color-info-0.7.2","scheme":"file"},"relativeLocation":"bierner.color-info-0.7.2","metadata":{"id":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349787}},{"identifier":{"id":"bierner.markdown-preview-github-styles","uuid":"5cbdf58a-694a-4aba-af08-61d00842eb03"},"version":"2.0.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.markdown-preview-github-styles-2.0.2","scheme":"file"},"relativeLocation":"bierner.markdown-preview-github-styles-2.0.2","metadata":{"id":"5cbdf58a-694a-4aba-af08-61d00842eb03","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349791}},{"identifier":{"id":"albert.tabout","uuid":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e"},"version":"0.2.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/albert.tabout-0.2.2","scheme":"file"},"relativeLocation":"albert.tabout-0.2.2","metadata":{"id":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e","publisherId":"f7f9797b-4ad7-43fc-8863-63698264f6f7","publisherDisplayName":"Albert Romkes","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349804}},{"identifier":{"id":"redhat.vscode-yaml","uuid":"2061917f-f76a-458a-8da9-f162de22b97e"},"version":"1.13.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-yaml-1.13.0","scheme":"file"},"relativeLocation":"redhat.vscode-yaml-1.13.0","metadata":{"id":"2061917f-f76a-458a-8da9-f162de22b97e","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349901}},{"identifier":{"id":"vscodevim.vim","uuid":"d96e79c6-8b25-4be3-8545-0e0ecefcae03"},"version":"1.25.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/vscodevim.vim-1.25.2","scheme":"file"},"relativeLocation":"vscodevim.vim-1.25.2","metadata":{"id":"d96e79c6-8b25-4be3-8545-0e0ecefcae03","publisherId":"5d63889b-1b67-4b1f-8350-4f1dce041a26","publisherDisplayName":"vscodevim","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349911}},{"identifier":{"id":"jrebocho.vscode-random","uuid":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f"},"version":"1.11.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/jrebocho.vscode-random-1.11.0","scheme":"file"},"relativeLocation":"jrebocho.vscode-random-1.11.0","metadata":{"id":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f","publisherId":"4081ae01-a71e-4225-9b06-9dd59fe64e59","publisherDisplayName":"Jorge Rebocho","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349915}},{"identifier":{"id":"nonoroazoro.syncing","uuid":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f"},"version":"3.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/nonoroazoro.syncing-3.3.4","scheme":"file"},"relativeLocation":"nonoroazoro.syncing-3.3.4","metadata":{"id":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f","publisherId":"f6d9d666-6595-44fa-89fc-36a0c3e0c1fa","publisherDisplayName":"nonoroazoro","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349930}},{"identifier":{"id":"emilast.logfilehighlighter","uuid":"e8b488af-fccf-4adf-b60c-fc7455bea107"},"version":"2.16.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/emilast.logfilehighlighter-2.16.0","scheme":"file"},"relativeLocation":"emilast.logfilehighlighter-2.16.0","metadata":{"id":"e8b488af-fccf-4adf-b60c-fc7455bea107","publisherId":"4534c4fe-f5e7-4c04-943b-3a6dad3e61dc","publisherDisplayName":"Emil Åström","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349905}},{"identifier":{"id":"streetsidesoftware.code-spell-checker","uuid":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7"},"version":"2.20.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-2.20.5","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-2.20.5","metadata":{"id":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350017}},{"identifier":{"id":"wakatime.vscode-wakatime","uuid":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3"},"version":"24.2.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/wakatime.vscode-wakatime-24.2.0","scheme":"file"},"relativeLocation":"wakatime.vscode-wakatime-24.2.0","metadata":{"id":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3","publisherId":"27977793-9e84-451b-8977-744ce63f3d70","publisherDisplayName":"WakaTime","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349980}},{"identifier":{"id":"be5invis.vscode-custom-css","uuid":"1b160753-ae5e-42bb-82ad-d115ce5c10f4"},"version":"7.2.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/be5invis.vscode-custom-css-7.2.1","scheme":"file"},"relativeLocation":"be5invis.vscode-custom-css-7.2.1","metadata":{"id":"1b160753-ae5e-42bb-82ad-d115ce5c10f4","publisherId":"8c148d69-cbc6-480b-bd8b-a42715926324","publisherDisplayName":"be5invis","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349820}},{"identifier":{"id":"yutengjing.vscode-colorize-plus","uuid":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7"},"version":"0.12.13","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yutengjing.vscode-colorize-plus-0.12.13","scheme":"file"},"relativeLocation":"yutengjing.vscode-colorize-plus-0.12.13","metadata":{"id":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7","publisherId":"05f2f040-a2c0-4aae-a680-d6b707520bdd","publisherDisplayName":"YuTengjing","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349984}},{"identifier":{"id":"alefragnani.project-manager","uuid":"1b747f06-3789-4ebd-ac99-f1fe430c3347"},"version":"12.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.project-manager-12.7.0","scheme":"file"},"relativeLocation":"alefragnani.project-manager-12.7.0","metadata":{"id":"1b747f06-3789-4ebd-ac99-f1fe430c3347","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349809}},{"identifier":{"id":"ms-vscode.remote-explorer","uuid":"11858313-52cc-4e57-b3e4-d7b65281e34b"},"version":"0.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode.remote-explorer-0.4.1","scheme":"file"},"relativeLocation":"ms-vscode.remote-explorer-0.4.1","metadata":{"id":"11858313-52cc-4e57-b3e4-d7b65281e34b","publisherId":"5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349870}},{"identifier":{"id":"streetsidesoftware.code-spell-checker-spanish","uuid":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb"},"version":"2.1.9","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-spanish-2.1.9","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-spanish-2.1.9","metadata":{"id":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349959}},{"identifier":{"id":"chrmarti.regex","uuid":"7ed7bccd-f358-4c6f-88c0-1296185abaa1"},"version":"0.4.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/chrmarti.regex-0.4.0","scheme":"file"},"relativeLocation":"chrmarti.regex-0.4.0","metadata":{"id":"7ed7bccd-f358-4c6f-88c0-1296185abaa1","publisherId":"6c6b26a3-e134-4d03-ad02-7e48f7c9f342","publisherDisplayName":"Christof Marti","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349844}},{"identifier":{"id":"catppuccin.catppuccin-vsc","uuid":"69264e4d-cd3b-468a-8f2b-e69673c7d864"},"version":"2.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/catppuccin.catppuccin-vsc-2.7.0","scheme":"file"},"relativeLocation":"catppuccin.catppuccin-vsc-2.7.0","metadata":{"id":"69264e4d-cd3b-468a-8f2b-e69673c7d864","publisherId":"e7d2ed61-53e0-4dd4-afbe-f536c3bb4316","publisherDisplayName":"Catppuccin","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349830}},{"identifier":{"id":"davidanson.vscode-markdownlint","uuid":"daf8b44d-8aae-4da2-80c5-1f770219f643"},"version":"0.51.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/davidanson.vscode-markdownlint-0.51.0","scheme":"file"},"relativeLocation":"davidanson.vscode-markdownlint-0.51.0","metadata":{"id":"daf8b44d-8aae-4da2-80c5-1f770219f643","publisherId":"2e4d1cda-6ef0-4e42-a352-ab540afe8ff0","publisherDisplayName":"David Anson","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349839}},{"identifier":{"id":"ms-vscode-remote.remote-ssh-edit","uuid":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c"},"version":"0.86.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-edit-0.86.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-edit-0.86.0","metadata":{"id":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349860}},{"identifier":{"id":"codezombiech.gitignore","uuid":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29"},"version":"0.9.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codezombiech.gitignore-0.9.0","scheme":"file"},"relativeLocation":"codezombiech.gitignore-0.9.0","metadata":{"id":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29","publisherId":"930310c4-ca8b-4e80-9d19-2b1507b2af61","publisherDisplayName":"CodeZombie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349855}},{"identifier":{"id":"ms-vscode-remote.remote-ssh","uuid":"607fd052-be03-4363-b657-2bd62b83d28a"},"version":"0.102.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-0.102.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-0.102.0","metadata":{"id":"607fd052-be03-4363-b657-2bd62b83d28a","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349850}},{"identifier":{"id":"ibm.output-colorizer","uuid":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f"},"version":"0.1.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ibm.output-colorizer-0.1.2","scheme":"file"},"relativeLocation":"ibm.output-colorizer-0.1.2","metadata":{"id":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f","publisherId":"8f186bac-3651-4797-9216-ba30633f600b","publisherDisplayName":"IBM","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349866}},{"identifier":{"id":"mhutchie.git-graph","uuid":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7"},"version":"1.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mhutchie.git-graph-1.30.0","scheme":"file"},"relativeLocation":"mhutchie.git-graph-1.30.0","metadata":{"id":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7","publisherId":"996496dc-099f-469d-b89c-0d7713179365","publisherDisplayName":"mhutchie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349880}},{"identifier":{"id":"kisstkondoros.vscode-gutter-preview","uuid":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5"},"version":"0.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/kisstkondoros.vscode-gutter-preview-0.30.0","scheme":"file"},"relativeLocation":"kisstkondoros.vscode-gutter-preview-0.30.0","metadata":{"id":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5","publisherId":"87e3e2a4-ac17-425a-a4b6-698bc44254fe","publisherDisplayName":"Kiss Tamás","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349890}},{"identifier":{"id":"codeium.codeium","uuid":"acab4f40-b6db-42ec-bcd1-01802cbdd988"},"version":"1.2.51","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codeium.codeium-1.2.51","scheme":"file"},"relativeLocation":"codeium.codeium-1.2.51","metadata":{"id":"acab4f40-b6db-42ec-bcd1-01802cbdd988","publisherId":"082b0525-4adf-4bcc-b60f-afa86c60860d","publisherDisplayName":"Codeium","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349835}},{"identifier":{"id":"mechatroner.rainbow-csv","uuid":"3792588c-3d35-442d-91ea-fe6a755e8155"},"version":"3.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mechatroner.rainbow-csv-3.7.0","scheme":"file"},"relativeLocation":"mechatroner.rainbow-csv-3.7.0","metadata":{"id":"3792588c-3d35-442d-91ea-fe6a755e8155","publisherId":"0d5438b6-325a-4f88-aa28-6192aa2cf2a6","publisherDisplayName":"mechatroner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349886}},{"identifier":{"id":"pkief.material-product-icons","uuid":"f797dacd-4e80-4f33-8b63-d665c0956013"},"version":"1.5.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-product-icons-1.5.0","scheme":"file"},"relativeLocation":"pkief.material-product-icons-1.5.0","metadata":{"id":"f797dacd-4e80-4f33-8b63-d665c0956013","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349921}},{"identifier":{"id":"xuangeaha.just-enough-git","uuid":"2928fca8-125f-40c0-8b28-336febf471d9"},"version":"2023.4.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/xuangeaha.just-enough-git-2023.4.5","scheme":"file"},"relativeLocation":"xuangeaha.just-enough-git-2023.4.5","metadata":{"id":"2928fca8-125f-40c0-8b28-336febf471d9","publisherId":"658fea95-cfc2-48f9-a1ba-240a82577028","publisherDisplayName":"XuangeAha","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349925}},{"identifier":{"id":"philsinatra.nested-comments","uuid":"03b96169-4c19-4c9e-ada8-d5d208ebe80e"},"version":"4.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/philsinatra.nested-comments-4.0.1","scheme":"file"},"relativeLocation":"philsinatra.nested-comments-4.0.1","metadata":{"id":"03b96169-4c19-4c9e-ada8-d5d208ebe80e","publisherId":"ee1ae119-5f58-4c1e-9274-290a7ad1d55f","publisherDisplayName":"Phil Sinatra","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349936}},{"identifier":{"id":"rafamel.subtle-brackets","uuid":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8"},"version":"3.0.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/rafamel.subtle-brackets-3.0.0","scheme":"file"},"relativeLocation":"rafamel.subtle-brackets-3.0.0","metadata":{"id":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8","publisherId":"7658adf6-ca84-42d4-8958-da3f6861451a","publisherDisplayName":"Rafa Mel","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349945}},{"identifier":{"id":"pucelle.vscode-css-navigation","uuid":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb"},"version":"1.13.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pucelle.vscode-css-navigation-1.13.3","scheme":"file"},"relativeLocation":"pucelle.vscode-css-navigation-1.13.3","metadata":{"id":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb","publisherId":"7650fded-a9d9-4383-a346-4136ebe47608","publisherDisplayName":"pucelle","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349974}},{"identifier":{"id":"yzhang.markdown-all-in-one","uuid":"98790d67-10fa-497c-9113-f6c7489207b2"},"version":"3.5.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yzhang.markdown-all-in-one-3.5.1","scheme":"file"},"relativeLocation":"yzhang.markdown-all-in-one-3.5.1","metadata":{"id":"98790d67-10fa-497c-9113-f6c7489207b2","publisherId":"36c8b41c-6ef6-4bf5-a5b7-65bef29b606f","publisherDisplayName":"Yu Zhang","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349995}},{"identifier":{"id":"exodiusstudios.comment-anchors","uuid":"5cf10212-681f-48c7-b66f-bcce5dc44a64"},"version":"1.10.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/exodiusstudios.comment-anchors-1.10.3","scheme":"file"},"relativeLocation":"exodiusstudios.comment-anchors-1.10.3","metadata":{"id":"5cf10212-681f-48c7-b66f-bcce5dc44a64","publisherId":"9069d21e-e9c6-4063-8f3a-026d317bb8f4","publisherDisplayName":"Starlane Studios","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321350006}},{"identifier":{"id":"alefragnani.bookmarks","uuid":"b689fcc8-d494-4dbf-a228-2c694a578afc"},"version":"13.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.bookmarks-13.4.1","scheme":"file"},"relativeLocation":"alefragnani.bookmarks-13.4.1","metadata":{"id":"b689fcc8-d494-4dbf-a228-2c694a578afc","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349815}},{"identifier":{"id":"yandeu.five-server","uuid":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5"},"version":"0.2.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yandeu.five-server-0.2.3","scheme":"file"},"relativeLocation":"yandeu.five-server-0.2.3","metadata":{"id":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5","publisherId":"a342b7ab-2d58-4313-9c2d-f506bb2aa10c","publisherDisplayName":"Yannick","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349991}},{"identifier":{"id":"eugenejeon.codesnap-plus-fix","uuid":"b6406d8e-9c12-4078-8150-ca498169cf08"},"version":"1.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eugenejeon.codesnap-plus-fix-1.0.1","scheme":"file"},"relativeLocation":"eugenejeon.codesnap-plus-fix-1.0.1","metadata":{"id":"b6406d8e-9c12-4078-8150-ca498169cf08","publisherId":"b5f3798b-9da6-48b5-b246-c158aad3debc","publisherDisplayName":"Eugene Jeon","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349876}},{"identifier":{"id":"aic.docify","uuid":"aa33eae5-0c47-4b2a-a1e3-b95553fea360"},"version":"1.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/aic.docify-1.3.4","scheme":"file"},"relativeLocation":"aic.docify-1.3.4","metadata":{"id":"aa33eae5-0c47-4b2a-a1e3-b95553fea360","publisherId":"0832ad01-00f9-475b-adc0-143baef69236","publisherDisplayName":"AIC","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349798}},{"identifier":{"id":"redhat.vscode-xml","uuid":"6703768d-d42f-474e-9f6e-5f288d53f6e8"},"version":"0.26.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-xml-0.26.1-linux-x64","scheme":"file"},"relativeLocation":"redhat.vscode-xml-0.26.1-linux-x64","metadata":{"id":"6703768d-d42f-474e-9f6e-5f288d53f6e8","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"linux-x64","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321349895}},{"identifier":{"id":"ms-vscode.test-adapter-converter","uuid":"47210ec2-0324-4cbb-9523-9dff02a5f9ec"},"version":"0.1.8","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode.test-adapter-converter-0.1.8","scheme":"file"},"relativeLocation":"ms-vscode.test-adapter-converter-0.1.8","metadata":{"id":"47210ec2-0324-4cbb-9523-9dff02a5f9ec","publisherId":"5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321370558,"preRelease":false}},{"identifier":{"id":"hbenl.vscode-test-explorer","uuid":"ff96f1b4-a4b8-45ef-8ecf-c232c0cb75c8"},"version":"2.21.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/hbenl.vscode-test-explorer-2.21.1","scheme":"file"},"relativeLocation":"hbenl.vscode-test-explorer-2.21.1","metadata":{"id":"ff96f1b4-a4b8-45ef-8ecf-c232c0cb75c8","publisherId":"3356f11a-6798-4f03-a93f-3d929b7fca7c","publisherDisplayName":"Holger Benl","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321370606,"preRelease":false}},{"identifier":{"id":"actboy168.lua-debug","uuid":"e5c7d4c8-9eac-4eb8-95fa-ba6865456277"},"version":"1.61.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/actboy168.lua-debug-1.61.0-linux-x64","scheme":"file"},"relativeLocation":"actboy168.lua-debug-1.61.0-linux-x64","metadata":{"id":"e5c7d4c8-9eac-4eb8-95fa-ba6865456277","publisherId":"77f6b700-85ff-429b-aa2d-8b82afbcf8db","publisherDisplayName":"actboy168","targetPlatform":"linux-x64","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321389644,"preRelease":false}},{"identifier":{"id":"lej.vscode-lua-test-adapter","uuid":"88b31f11-b18d-44f3-98de-993395fa1c34"},"version":"1.0.6","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/lej.vscode-lua-test-adapter-1.0.6","scheme":"file"},"relativeLocation":"lej.vscode-lua-test-adapter-1.0.6","metadata":{"id":"88b31f11-b18d-44f3-98de-993395fa1c34","publisherId":"bb5c77de-69f3-45cb-bfdd-d4758967fa8e","publisherDisplayName":"Linus Sunde","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321390581,"preRelease":false}},{"identifier":{"id":"yinfei.luahelper","uuid":"d3707c86-e17d-4f81-ae03-bbfae896128b"},"version":"0.2.22","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yinfei.luahelper-0.2.22","scheme":"file"},"relativeLocation":"yinfei.luahelper-0.2.22","metadata":{"id":"d3707c86-e17d-4f81-ae03-bbfae896128b","publisherId":"96e46664-7420-4d07-b29f-fc6074815ac5","publisherDisplayName":"Tencent","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321397721,"preRelease":false}},{"identifier":{"id":"sumneko.lua","uuid":"3a15b5a7-be12-47e3-8445-88ee3eabc8b2"},"version":"3.6.23","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/sumneko.lua-3.6.23-linux-x64","scheme":"file"},"relativeLocation":"sumneko.lua-3.6.23-linux-x64","metadata":{"id":"3a15b5a7-be12-47e3-8445-88ee3eabc8b2","publisherId":"fb626675-24cf-4881-8c13-b465f29bec2f","publisherDisplayName":"sumneko","targetPlatform":"linux-x64","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689321404050,"preRelease":false}},{"identifier":{"id":"usernamehw.errorlens","uuid":"9d8c32ab-354c-4daf-a9bf-20b633734435"},"version":"3.12.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/usernamehw.errorlens-3.12.0","scheme":"file"},"relativeLocation":"usernamehw.errorlens-3.12.0","metadata":{"id":"9d8c32ab-354c-4daf-a9bf-20b633734435","publisherId":"151820df-5dc5-4c97-8751-eb84643203fa","publisherDisplayName":"Alexander","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689321434053,"preRelease":false}},{"identifier":{"id":"leonardssh.vscord","uuid":"20675c06-f272-4cc8-8611-83ebb5583c5a"},"version":"5.1.14","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/leonardssh.vscord-5.1.14","scheme":"file"},"relativeLocation":"leonardssh.vscord-5.1.14","metadata":{"id":"20675c06-f272-4cc8-8611-83ebb5583c5a","publisherId":"2c34273e-24b8-499a-b859-8e27e48decc5","publisherDisplayName":"leonardssh","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689595150630,"preRelease":false}},{"identifier":{"id":"pkief.material-icon-theme","uuid":"5db78037-f674-459f-a236-db622c427c5b"},"version":"4.29.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-icon-theme-4.29.0","scheme":"file"},"relativeLocation":"pkief.material-icon-theme-4.29.0","metadata":{"id":"5db78037-f674-459f-a236-db622c427c5b","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689595150640,"preRelease":false}},{"identifier":{"id":"ms-azuretools.vscode-docker","uuid":"0479fc1c-3d67-49f9-b087-fb9069afe48f"},"version":"1.26.0","location":{"$mid":1,"fsPath":"/home/matt/.vscode-oss/extensions/ms-azuretools.vscode-docker-1.26.0","path":"/home/matt/.vscode-oss/extensions/ms-azuretools.vscode-docker-1.26.0","scheme":"file"},"relativeLocation":"ms-azuretools.vscode-docker-1.26.0","metadata":{"id":"0479fc1c-3d67-49f9-b087-fb9069afe48f","publisherId":"52b787f2-79a9-4f32-99b4-393afe3005d3","publisherDisplayName":"Microsoft","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689609657974,"preRelease":false}}] \ No newline at end of file diff --git a/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb b/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb index 126099af..2675006d 100644 Binary files a/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb and b/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb differ diff --git a/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb.backup b/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb.backup index 126099af..a4104d58 100644 Binary files a/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb.backup and b/.config/VSCodium/User/profiles/-1645caa6/globalStorage/state.vscdb.backup differ diff --git a/.config/VSCodium/User/profiles/-1645caa6/settings.json b/.config/VSCodium/User/profiles/-1645caa6/settings.json index 956c41bd..4200fa9f 100644 --- a/.config/VSCodium/User/profiles/-1645caa6/settings.json +++ b/.config/VSCodium/User/profiles/-1645caa6/settings.json @@ -134,7 +134,7 @@ "debug.allowBreakpointsEverywhere": true, "terminal.integrated.cursorBlinking": true, "terminal.integrated.cursorStyle": "line", - "terminal.integrated.defaultProfile.linux": "zsh", + "terminal.integrated.defaultProfile.linux": "fish", "terminal.integrated.fontFamily": "'JetBrains Mono Light', 'monospace', monospace", "terminal.integrated.gpuAcceleration": "on", "terminal.integrated.shellIntegration.suggestEnabled": true, @@ -246,8 +246,6 @@ "redhat.telemetry.enabled": false, "terminal.integrated.env.linux": {}, "cSpell.language": "en, es", - "workbench.editor.showTabs": false, - "editor.minimap.enabled": false, "[css]": { "editor.defaultFormatter": "stylelint.vscode-stylelint" }, @@ -255,5 +253,9 @@ "*": false }, "search.followSymlinks": false, - "workbench.statusBar.visible": false + "workbench.statusBar.visible": false, + "[lua]": { + "editor.defaultFormatter": "sumneko.lua" + }, + "workbench.editor.showTabs": false } \ No newline at end of file diff --git a/.config/VSCodium/User/settings.json b/.config/VSCodium/User/settings.json index a97f5f8e..bdf3e273 100644 --- a/.config/VSCodium/User/settings.json +++ b/.config/VSCodium/User/settings.json @@ -255,5 +255,4 @@ "search.followSymlinks": false, "workbench.editor.showTabs": false, "workbench.statusBar.visible": false, - "editor.minimap.enabled": false, } \ No newline at end of file diff --git a/.config/fish/completions/to.fish b/.config/fish/completions/to.fish deleted file mode 100644 index 2578f4b9..00000000 --- a/.config/fish/completions/to.fish +++ /dev/null @@ -1 +0,0 @@ -__to_update_bookmark_completions diff --git a/.config/fish/config.fish b/.config/fish/config.fish index cfdc69db..ea1a67e0 100644 --- a/.config/fish/config.fish +++ b/.config/fish/config.fish @@ -1,29 +1,8 @@ if status is-interactive # Commands to run in interactive sessions can go here - neofetch zoxide init fish | source + . ~/.config/fish/aliases.fish + neofetch end -alias code='vscodium' -alias ls='exa --long --header -a --icons' -alias tree='exa --long --header -a --icons --tree' -alias bruh='genact -s 4' -alias matrix='unimatrix' -alias q='exit' -alias install='sudo pacman -S ' -alias uninstall='sudo pacman -R ' -alias yinstall='yay -S ' -alias yuninstall='yay -R ' -alias update='sudo pacman -Syu' -alias yupdate='yay -Syu' -alias search='pacseek' -alias gpt='tgpt' -alias clock='tty-clock -sbc' -alias files='xplr' -alias sysproc='sysz' -alias cat='bat' -alias dots='yadm enter lazygit' -alias audiorestart='systemctl --user restart wireplumber pipewire pipewire-pulse' -alias info='tldr' -alias cd='z' -alias disks='duf' +starship init fish | source \ No newline at end of file diff --git a/.config/fish/fish_plugins b/.config/fish/fish_plugins index 69a7c1bc..0faa36d0 100644 --- a/.config/fish/fish_plugins +++ b/.config/fish/fish_plugins @@ -1,5 +1,4 @@ patrickf1/fzf.fish franciscolourenco/done acomagu/fish-async-prompt -matchai/spacefish joehillen/to-fish diff --git a/.config/fish/fish_variables b/.config/fish/fish_variables index fb134725..27913419 100644 --- a/.config/fish/fish_variables +++ b/.config/fish/fish_variables @@ -6,9 +6,8 @@ SETUVAR __fish_initialized:3400 SETUVAR _fisher_acomagu_2F_fish_2D_async_2D_prompt_files:\x7e/\x2econfig/fish/conf\x2ed/__async_prompt\x2efish SETUVAR _fisher_franciscolourenco_2F_done_files:\x7e/\x2econfig/fish/conf\x2ed/done\x2efish SETUVAR _fisher_joehillen_2F_to_2D_fish_files:\x7e/\x2econfig/fish/functions/to\x2efish\x1e\x7e/\x2econfig/fish/conf\x2ed/to\x2efish\x1e\x7e/\x2econfig/fish/completions/to\x2efish -SETUVAR _fisher_matchai_2F_spacefish_files:\x7e/\x2econfig/fish/functions/__sf_lib_section\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_aws\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_battery\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_char\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_conda\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_dir\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_docker\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_dotnet\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_elixir\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_exec_time\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_exit_code\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_git\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_git_branch\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_git_status\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_golang\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_haskell\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_host\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_jobs\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_julia\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_kubecontext\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_line_sep\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_node\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_package\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_php\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_pyenv\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_ruby\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_rust\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_time\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_user\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_venv\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_section_vi_mode\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_util_git_branch\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_util_human_time\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_util_set_default\x2efish\x1e\x7e/\x2econfig/fish/functions/__sf_util_truncate_dir\x2efish\x1e\x7e/\x2econfig/fish/functions/fish_mode_prompt\x2efish\x1e\x7e/\x2econfig/fish/functions/fish_prompt\x2efish\x1e\x7e/\x2econfig/fish/functions/fish_right_prompt\x2efish SETUVAR _fisher_patrickf1_2F_fzf_2E_fish_files:\x7e/\x2econfig/fish/functions/_fzf_configure_bindings_help\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_extract_var_info\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_preview_changed_file\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_preview_file\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_report_diff_type\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_report_file_type\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_directory\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_git_log\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_git_status\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_history\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_processes\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_variables\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_wrapper\x2efish\x1e\x7e/\x2econfig/fish/functions/fzf_configure_bindings\x2efish\x1e\x7e/\x2econfig/fish/conf\x2ed/fzf\x2efish\x1e\x7e/\x2econfig/fish/completions/fzf_configure_bindings\x2efish -SETUVAR _fisher_plugins:patrickf1/fzf\x2efish\x1efranciscolourenco/done\x1eacomagu/fish\x2dasync\x2dprompt\x1ematchai/spacefish\x1ejoehillen/to\x2dfish +SETUVAR _fisher_plugins:patrickf1/fzf\x2efish\x1efranciscolourenco/done\x1eacomagu/fish\x2dasync\x2dprompt\x1ejoehillen/to\x2dfish SETUVAR _fisher_upgraded_to_4_4:\x1d SETUVAR fish_color_autosuggestion:6e738d SETUVAR fish_color_cancel:ed8796 diff --git a/.config/fish/functions/__sf_lib_section.fish b/.config/fish/functions/__sf_lib_section.fish deleted file mode 100644 index 819b68ff..00000000 --- a/.config/fish/functions/__sf_lib_section.fish +++ /dev/null @@ -1,28 +0,0 @@ -function __sf_lib_section -a color prefix content suffix - # If there are only 2 args, they are $content and $prefix - if test (count $argv) -eq 2 - set content $argv[2] - set prefix - end - - if test "$sf_prompt_opened" = "true" -a "$SPACEFISH_PROMPT_PREFIXES_SHOW" = "true" - # Echo prefixes in bold white - set_color --bold - echo -e -n -s $prefix - set_color normal - end - - # Set the prompt as having been opened - set -g sf_prompt_opened true - - set_color --bold $color - echo -e -n $content - set_color normal - - if test "$SPACEFISH_PROMPT_SUFFIXES_SHOW" = "true" - # Echo suffixes in bold white - set_color --bold - echo -e -n -s $suffix - set_color normal - end -end diff --git a/.config/fish/functions/__sf_section_aws.fish b/.config/fish/functions/__sf_section_aws.fish deleted file mode 100644 index 70ba751c..00000000 --- a/.config/fish/functions/__sf_section_aws.fish +++ /dev/null @@ -1,48 +0,0 @@ -# -# Amazon Web Services (AWS) -# -# The AWS Command Line Interface (CLI) is a unified tool to manage AWS services. -# Link: https://aws.amazon.com/cli/ - -function __sf_section_aws -d "Display the selected aws profile" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_AWS_SHOW true - __sf_util_set_default SPACEFISH_AWS_PREFIX "using " - __sf_util_set_default SPACEFISH_AWS_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_AWS_SYMBOL "☁️ " - __sf_util_set_default SPACEFISH_AWS_COLOR ff8700 - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show the selected AWS-cli profile - [ $SPACEFISH_AWS_SHOW = false ]; and return - - # Ensure the aws command is available - type -q aws; or return - - set -l PROFILE_NAME - - # if aws-vault is in use, override profile with that - if test -n "$AWS_VAULT" - set PROFILE_NAME "$AWS_VAULT" - else - set PROFILE_NAME "$AWS_PROFILE" - end - - # Early return if there's no named profile, or it's set to default - if test -z "$PROFILE_NAME" \ - -o "$PROFILE_NAME" = "default" - return - end - - __sf_lib_section \ - $SPACEFISH_AWS_COLOR \ - $SPACEFISH_AWS_PREFIX \ - "$SPACEFISH_AWS_SYMBOL""$PROFILE_NAME" \ - $SPACEFISH_AWS_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_battery.fish b/.config/fish/functions/__sf_section_battery.fish deleted file mode 100644 index eb9b8667..00000000 --- a/.config/fish/functions/__sf_section_battery.fish +++ /dev/null @@ -1,114 +0,0 @@ -# -# Battery -# - -function __sf_section_battery -d "Displays battery symbol and charge" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - # ------------------------------------------------------------------------------ - # | SPACEFISH_BATTERY_SHOW | below threshold | above threshold | fully charged | - # |------------------------+-----------------+-----------------+---------------| - # | false | hidden | hidden | hidden | - # | always | shown | shown | shown | - # | true | shown | hidden | hidden | - # | charged | shown | hidden | shown | - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_BATTERY_SHOW true - __sf_util_set_default SPACEFISH_BATTERY_PREFIX "" - __sf_util_set_default SPACEFISH_BATTERY_SUFFIX " " - __sf_util_set_default SPACEFISH_BATTERY_SYMBOL_CHARGING ⇡ - __sf_util_set_default SPACEFISH_BATTERY_SYMBOL_DISCHARGING ⇣ - __sf_util_set_default SPACEFISH_BATTERY_SYMBOL_FULL • - __sf_util_set_default SPACEFISH_BATTERY_THRESHOLD 10 - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show section only if any of the following is true - # - SPACEFISH_BATTERY_SHOW = "always" - # - SPACEFISH_BATTERY_SHOW = "true" and - # - battery percentage is below the given limit (default: 10%) - # - SPACEFISH_BATTERY_SHOW = "charged" and - # - Battery is fully charged - - # Check that user wants to show battery levels - [ $SPACEFISH_BATTERY_SHOW = false ]; and return - - set -l battery_data - set -l battery_percent - set -l battery_status - set -l battery_color - set -l battery_symbol - - # Darwin and macOS machines - if type -q pmset - set battery_data (pmset -g batt | grep "InternalBattery") - - # Return if no internal battery - if test -z (echo $battery_data) - return - end - - set battery_percent (echo $battery_data | grep -oE "[0-9]{1,3}%") - # spaceship has echo $battery_data | awk -F '; *' 'NR==2 { print $2 }', but NR==2 did not return anything. - set battery_status (echo $battery_data | awk -F '; *' '{ print $2 }') - - # Linux machines - else if type -q upower - set -l battery (upower -e | grep battery | head -1) - - [ -z $battery ]; and return - - set -l IFS # Clear IFS to allow for multi-line variables - set battery_data (upower -i $battery) - set battery_percent (echo $battery_data | grep percentage | awk '{print $2}') - set battery_status (echo $battery_data | grep state | awk '{print $2}') - - # Windows machines. - else if type -q acpi - set -l battery_data (acpi -b 2>/dev/null | head -1) - - # Return if no battery - [ -z $battery_data ]; and return - - set battery_percent ( echo $battery_data | awk '{print $4}' ) - set battery_status ( echo $battery_data | awk '{print tolower($3)}' ) - else - return - end - - # Remove trailing % and symbols for comparison - set battery_percent (echo $battery_percent | string trim --chars=%[,;]) - - if test "$battery_percent" -eq 100 -o -n (echo (string match -r "(charged|full)" $battery_status)) - set battery_color green - else if test "$battery_percent" -lt "$SPACEFISH_BATTERY_THRESHOLD" - set battery_color red - else - set battery_color yellow - end - - # Battery indicator based on current status of battery - if test "$battery_status" = "charging" - set battery_symbol $SPACEFISH_BATTERY_SYMBOL_CHARGING - else if test -n (echo (string match -r "^[dD]ischarg.*" $battery_status)) - set battery_symbol $SPACEFISH_BATTERY_SYMBOL_DISCHARGING - else - set battery_symbol $SPACEFISH_BATTERY_SYMBOL_FULL - end - - if test "$SPACEFISH_BATTERY_SHOW" = "always" \ - -o "$battery_percent" -lt "$SPACEFISH_BATTERY_THRESHOLD" \ - -o "$SPACEFISH_BATTERY_SHOW" = "charged" \ - -a -n (echo (string match -r "(charged|full)" $battery_status)) - __sf_lib_section \ - $battery_color \ - $SPACEFISH_BATTERY_PREFIX \ - "$battery_symbol$battery_percent%" \ - $SPACEFISH_BATTERY_SUFFIX - end -end diff --git a/.config/fish/functions/__sf_section_char.fish b/.config/fish/functions/__sf_section_char.fish deleted file mode 100644 index 83abeacb..00000000 --- a/.config/fish/functions/__sf_section_char.fish +++ /dev/null @@ -1,35 +0,0 @@ -# -# Prompt character -# - -function __sf_section_char -d "Display the prompt character" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_CHAR_PREFIX "" - __sf_util_set_default SPACEFISH_CHAR_SUFFIX " " - __sf_util_set_default SPACEFISH_CHAR_SYMBOL ➜ - __sf_util_set_default SPACEFISH_CHAR_COLOR_SUCCESS green - __sf_util_set_default SPACEFISH_CHAR_COLOR_FAILURE red - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Color $SPACEFISH_CHAR_SYMBOL red if previous command failed and - # color it in green if the command succeeded. - set -l color - - if test $sf_exit_code -eq 0 - set color $SPACEFISH_CHAR_COLOR_SUCCESS - else - set color $SPACEFISH_CHAR_COLOR_FAILURE - end - - __sf_lib_section \ - $color \ - $SPACEFISH_CHAR_PREFIX \ - $SPACEFISH_CHAR_SYMBOL \ - $SPACEFISH_CHAR_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_conda.fish b/.config/fish/functions/__sf_section_conda.fish deleted file mode 100644 index c93e5896..00000000 --- a/.config/fish/functions/__sf_section_conda.fish +++ /dev/null @@ -1,36 +0,0 @@ -# -# Conda -# -# Current Conda version. - -function __sf_section_conda -d "Display current Conda version" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_CONDA_SHOW true - __sf_util_set_default SPACEFISH_CONDA_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_CONDA_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_CONDA_SYMBOL "🅒 " - __sf_util_set_default SPACEFISH_CONDA_COLOR blue - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_CONDA_SHOW = false ]; and return - - # Show Conda version only if conda is installed and CONDA_DEFAULT_ENV is set - if not type -q conda; \ - or test -z "$CONDA_DEFAULT_ENV"; - return - end - - set -l conda_version (conda -V | string split ' ')[2] - - __sf_lib_section \ - $SPACEFISH_CONDA_COLOR \ - $SPACEFISH_CONDA_PREFIX \ - "$SPACEFISH_CONDA_SYMBOL"v"$conda_version" \ - $SPACEFISH_CONDA_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_dir.fish b/.config/fish/functions/__sf_section_dir.fish deleted file mode 100644 index 5b4c77d3..00000000 --- a/.config/fish/functions/__sf_section_dir.fish +++ /dev/null @@ -1,54 +0,0 @@ -# -# Working directory -# - -function __sf_section_dir -d "Display the current truncated directory" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_DIR_SHOW true - __sf_util_set_default SPACEFISH_DIR_PREFIX "in " - __sf_util_set_default SPACEFISH_DIR_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_DIR_TRUNC 3 - __sf_util_set_default SPACEFISH_DIR_TRUNC_REPO true - __sf_util_set_default SPACEFISH_DIR_COLOR cyan - - # Write Permissions lock symbol - __sf_util_set_default SPACEFISH_DIR_LOCK_SHOW true - __sf_util_set_default SPACEFISH_DIR_LOCK_SYMBOL "" - __sf_util_set_default SPACEFISH_DIR_LOCK_COLOR red - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_DIR_SHOW = false ]; and return - - set -l dir - set -l tmp - set -l git_root (command git rev-parse --show-toplevel 2>/dev/null) - - if test "$SPACEFISH_DIR_TRUNC_REPO" = "true" -a -n "$git_root" - # Resolve to physical PWD instead of logical - set -l resolvedPWD (pwd -P 2>/dev/null; or pwd) - # Treat repo root as top level directory - set tmp (string replace $git_root (basename $git_root) $resolvedPWD) - else - set -l realhome ~ - set tmp (string replace -r '^'"$realhome"'($|/)' '~$1' $PWD) - end - - # Truncate the path to have a limited number of dirs - set dir (__sf_util_truncate_dir $tmp $SPACEFISH_DIR_TRUNC) - - if [ $SPACEFISH_DIR_LOCK_SHOW = true -a ! -w . ] - set DIR_LOCK_SYMBOL (set_color $SPACEFISH_DIR_LOCK_COLOR)" $SPACEFISH_DIR_LOCK_SYMBOL"(set_color --bold) - end - - __sf_lib_section \ - $SPACEFISH_DIR_COLOR \ - $SPACEFISH_DIR_PREFIX \ - $dir \ - "$DIR_LOCK_SYMBOL""$SPACEFISH_DIR_SUFFIX" -end diff --git a/.config/fish/functions/__sf_section_docker.fish b/.config/fish/functions/__sf_section_docker.fish deleted file mode 100644 index 6b32d4cc..00000000 --- a/.config/fish/functions/__sf_section_docker.fish +++ /dev/null @@ -1,52 +0,0 @@ -# -# Docker -# -# Current Docker version and Machine name. - -function __sf_section_docker -d "Display docker version and machine name" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_DOCKER_SHOW true - __sf_util_set_default SPACEFISH_DOCKER_PREFIX "is " - __sf_util_set_default SPACEFISH_DOCKER_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_DOCKER_SYMBOL "🐳 " - __sf_util_set_default SPACEFISH_DOCKER_COLOR cyan - __sf_util_set_default SPACEFISH_DOCKER_VERBOSE_VERSION false - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_DOCKER_SHOW = false ]; and return - - # Show Docker version only if docker is installed - type -q docker; or return - - # Show docker version only when pwd has Dockerfile, docker-compose.yml, .dockerenv in root or COMPOSE_FILE - if not test -f Dockerfile \ - -o -f docker-compose.yml \ - -o -f /.dockerenv \ - -o -f "$COMPOSE_FILE" - return - end - - set -l docker_version (docker version -f "{{.Server.Version}}" 2>/dev/null) - # if docker daemon isn't running you'll get an error like 'Bad response from Docker engine' - [ -z $docker_version ]; and return - - if test "$SPACEFISH_DOCKER_VERBOSE_VERSION" = "false" - set docker_version (string split - $docker_version)[1] - end - - if test -n "$DOCKER_MACHINE_NAME" - set docker_version $docker_version via $DOCKER_MACHINE_NAME - end - - __sf_lib_section \ - $SPACEFISH_DOCKER_COLOR \ - $SPACEFISH_DOCKER_PREFIX \ - "$SPACEFISH_DOCKER_SYMBOL"v"$docker_version" \ - $SPACEFISH_DOCKER_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_dotnet.fish b/.config/fish/functions/__sf_section_dotnet.fish deleted file mode 100644 index d46a79f1..00000000 --- a/.config/fish/functions/__sf_section_dotnet.fish +++ /dev/null @@ -1,50 +0,0 @@ -# -# .NET -# -# .NET Framework is a software framework developed by Microsoft. -# It includes a large class library and provides language interoperability -# across several programming languages. -# Link: https://www.microsoft.com/net - -function __sf_section_dotnet -d "Display the .NET SDK version" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_DOTNET_SHOW true - __sf_util_set_default SPACEFISH_DOTNET_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_DOTNET_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_DOTNET_SYMBOL ".NET " - __sf_util_set_default SPACEFISH_DOTNET_COLOR "af00d7" # 128 in the original version, but renders as blue in iTerm2? - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show current version of .NET SDK - [ $SPACEFISH_DOTNET_SHOW = false ]; and return - - # Ensure the dotnet command is available - type -q dotnet; or return - - if not test -f project.json \ - -o -f global.json \ - -o -f paket.dependencies \ - -o (count *.csproj) -gt 0 \ - -o (count *.fsproj) -gt 0 \ - -o (count *.xproj) -gt 0 \ - -o (count *.sln) -gt 0 - return - end - - # From the - # dotnet-cli automatically handles SDK pinning (specified in a global.json file) - # therefore, this already returns the expected version for the current directory - set -l dotnet_version (dotnet --version 2>/dev/null) - - __sf_lib_section \ - $SPACEFISH_DOTNET_COLOR \ - $SPACEFISH_DOTNET_PREFIX \ - "$SPACEFISH_DOTNET_SYMBOL""$dotnet_version" \ - $SPACEFISH_DOTNET_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_elixir.fish b/.config/fish/functions/__sf_section_elixir.fish deleted file mode 100644 index 13468b03..00000000 --- a/.config/fish/functions/__sf_section_elixir.fish +++ /dev/null @@ -1,57 +0,0 @@ -# -# Elixir -# -# A dynamic, reflective, object-oriented, general-purpose programming language. -# Link: https://www.elixir-lang.org/ - -function __sf_section_elixir -d "Show current version of Elixir" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_ELIXIR_SHOW true - __sf_util_set_default SPACEFISH_ELIXIR_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_ELIXIR_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_ELIXIR_SYMBOL "💧 " - __sf_util_set_default SPACEFISH_ELIXIR_DEFAULT_VERSION $SPACEFISH_ELIXIR_DEFAULT_VERSION - __sf_util_set_default SPACEFISH_ELIXIR_COLOR magenta - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Check if that user wants to show elixir version - [ $SPACEFISH_ELIXIR_SHOW = false ]; and return - - # Show versions only for Elixir-specific folders - if not test -f mix.exs \ - -o (count *.ex) -gt 0 \ - -o (count *.exs) -gt 0 - return - end - - set -l elixir_version - - if type -q kiex - set elixir_version $ELIXIR_VERSION - else if type -q exenv - set elixir_version (exenv version-name) - else if type -q elixir - set elixir_version (elixir -v 2>/dev/null | string match -r "Elixir.*" | string split " ")[2] - else - return - end - - [ -z "$elixir_version" -o "$elixir_version" = "system" ]; and return - - # Add 'v' before elixir version that starts with a number - if test -n (echo (string match -r "^[0-9].+\$" "$elixir_version")) - set elixir_version "v$elixir_version" - end - - __sf_lib_section \ - $SPACEFISH_ELIXIR_COLOR \ - $SPACEFISH_ELIXIR_PREFIX \ - "$SPACEFISH_ELIXIR_SYMBOL""$elixir_version" \ - $SPACEFISH_ELIXIR_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_exec_time.fish b/.config/fish/functions/__sf_section_exec_time.fish deleted file mode 100644 index 0961907f..00000000 --- a/.config/fish/functions/__sf_section_exec_time.fish +++ /dev/null @@ -1,33 +0,0 @@ -# -# Execution time -# - -function __sf_section_exec_time -d "Display the execution time of the last command" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_EXEC_TIME_SHOW true - __sf_util_set_default SPACEFISH_EXEC_TIME_PREFIX "took " - __sf_util_set_default SPACEFISH_EXEC_TIME_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_EXEC_TIME_COLOR yellow - __sf_util_set_default SPACEFISH_EXEC_TIME_ELAPSED 5 - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_EXEC_TIME_SHOW = false ]; and return - - # Allow for compatibility between fish 2.7 and 3.0 - set -l command_duration "$CMD_DURATION$cmd_duration" - - if test -n "$command_duration" -a "$command_duration" -gt (math "$SPACEFISH_EXEC_TIME_ELAPSED * 1000") - set -l human_command_duration (echo $command_duration | __sf_util_human_time) - __sf_lib_section \ - $SPACEFISH_EXEC_TIME_COLOR \ - $SPACEFISH_EXEC_TIME_PREFIX \ - $human_command_duration \ - $SPACEFISH_EXEC_TIME_SUFFIX - end -end diff --git a/.config/fish/functions/__sf_section_exit_code.fish b/.config/fish/functions/__sf_section_exit_code.fish deleted file mode 100644 index 7578d47f..00000000 --- a/.config/fish/functions/__sf_section_exit_code.fish +++ /dev/null @@ -1,26 +0,0 @@ -# Exit-code -# - -function __sf_section_exit_code -d "Shows the exit code from the previous command." - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_EXIT_CODE_SHOW false - __sf_util_set_default SPACEFISH_EXIT_CODE_PREFIX "" - __sf_util_set_default SPACEFISH_EXIT_CODE_SUFFIX " " - __sf_util_set_default SPACEFISH_EXIT_CODE_SYMBOL ✘ - __sf_util_set_default SPACEFISH_EXIT_CODE_COLOR red - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_EXIT_CODE_SHOW = false ]; or test $sf_exit_code -eq 0; and return - - __sf_lib_section \ - $SPACEFISH_EXIT_CODE_COLOR \ - $SPACEFISH_EXIT_CODE_PREFIX \ - "$SPACEFISH_EXIT_CODE_SYMBOL$sf_exit_code" \ - $SPACEFISH_EXIT_CODE_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_git.fish b/.config/fish/functions/__sf_section_git.fish deleted file mode 100644 index ea3c390e..00000000 --- a/.config/fish/functions/__sf_section_git.fish +++ /dev/null @@ -1,35 +0,0 @@ -# -# Git -# - -function __sf_section_git -d "Display the git branch and status" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_GIT_SHOW true - __sf_util_set_default SPACEFISH_GIT_PREFIX "on " - __sf_util_set_default SPACEFISH_GIT_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_GIT_SYMBOL " " - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show both git branch and git status: - # spacefish_git_branch - # spacefish_git_status - - [ $SPACEFISH_GIT_SHOW = false ]; and return - - set -l git_branch (__sf_section_git_branch) - set -l git_status (__sf_section_git_status) - - [ -z $git_branch ]; and return - - __sf_lib_section \ - fff \ - $SPACEFISH_GIT_PREFIX \ - "$git_branch$git_status" \ - $SPACEFISH_GIT_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_git_branch.fish b/.config/fish/functions/__sf_section_git_branch.fish deleted file mode 100644 index 7a2c54e4..00000000 --- a/.config/fish/functions/__sf_section_git_branch.fish +++ /dev/null @@ -1,28 +0,0 @@ -# -# Git branch -# - -function __sf_section_git_branch -d "Format the displayed branch name" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_GIT_BRANCH_SHOW true - __sf_util_set_default SPACEFISH_GIT_BRANCH_PREFIX $SPACEFISH_GIT_SYMBOL - __sf_util_set_default SPACEFISH_GIT_BRANCH_SUFFIX "" - __sf_util_set_default SPACEFISH_GIT_BRANCH_COLOR magenta - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_GIT_BRANCH_SHOW = false ]; and return - - set -l git_branch (__sf_util_git_branch) - - [ -z $git_branch ]; and return - - __sf_lib_section \ - $SPACEFISH_GIT_BRANCH_COLOR \ - $SPACEFISH_GIT_BRANCH_PREFIX$git_branch$SPACEFISH_GIT_BRANCH_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_git_status.fish b/.config/fish/functions/__sf_section_git_status.fish deleted file mode 100644 index 7316c491..00000000 --- a/.config/fish/functions/__sf_section_git_status.fish +++ /dev/null @@ -1,100 +0,0 @@ -# -# Git status -# - -function __sf_section_git_status -d "Display the current git status" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_GIT_STATUS_SHOW true - __sf_util_set_default SPACEFISH_GIT_STATUS_PREFIX " [" - __sf_util_set_default SPACEFISH_GIT_STATUS_SUFFIX ] - __sf_util_set_default SPACEFISH_GIT_STATUS_COLOR red - __sf_util_set_default SPACEFISH_GIT_STATUS_UNTRACKED \? - __sf_util_set_default SPACEFISH_GIT_STATUS_ADDED + - __sf_util_set_default SPACEFISH_GIT_STATUS_MODIFIED ! - __sf_util_set_default SPACEFISH_GIT_STATUS_RENAMED » - __sf_util_set_default SPACEFISH_GIT_STATUS_DELETED ✘ - __sf_util_set_default SPACEFISH_GIT_STATUS_STASHED \$ - __sf_util_set_default SPACEFISH_GIT_STATUS_UNMERGED = - __sf_util_set_default SPACEFISH_GIT_STATUS_AHEAD ⇡ - __sf_util_set_default SPACEFISH_GIT_STATUS_BEHIND ⇣ - __sf_util_set_default SPACEFISH_GIT_STATUS_DIVERGED ⇕ - __sf_util_set_default SPACEFISH_GIT_PROMPT_ORDER untracked added modified renamed deleted stashed unmerged diverged ahead behind - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_GIT_STATUS_SHOW = false ]; and return - - set -l git_status - set -l is_ahead - set -l is_behind - - set -l index (command git status --porcelain 2>/dev/null -b) - set -l trimmed_index (string split \n $index | string sub --start 1 --length 2) - - for i in $trimmed_index - if test (string match '\?\?' $i) - set git_status untracked $git_status - end - if test (string match '*A*' $i) - set git_status added $git_status - end - if test (string match '*M*' $i) - set git_status modified $git_status - end - if test (string match '*R*' $i) - set git_status renamed $git_status - end - if test (string match '*D*' $i) - set git_status deleted $git_status - end - if test (string match '*U*' $i) - set git_status unmerged $git_status - end - end - - # Check for stashes - if test -n (echo (command git rev-parse --verify refs/stash 2>/dev/null)) - set git_status stashed $git_status - end - - # Check whether the branch is ahead - if test (string match '*ahead*' $index) - set is_ahead true - end - - # Check whether the branch is behind - if test (string match '*behind*' $index) - set is_behind true - end - - # Check whether the branch has diverged - if test "$is_ahead" = "true" -a "$is_behind" = "true" - set git_status diverged $git_status - else if test "$is_ahead" = "true" - set git_status ahead $git_status - else if test "$is_behind" = "true" - set git_status behind $git_status - end - - set -l full_git_status - for i in $SPACEFISH_GIT_PROMPT_ORDER - set i (string upper $i) - set git_status (string upper $git_status) - if contains $i in $git_status - set -l status_symbol SPACEFISH_GIT_STATUS_$i - set full_git_status "$$status_symbol$full_git_status" - end - end - - # Check if git status - if test -n "$full_git_status" - __sf_lib_section \ - $SPACEFISH_GIT_STATUS_COLOR \ - "$SPACEFISH_GIT_STATUS_PREFIX$full_git_status$SPACEFISH_GIT_STATUS_SUFFIX" - end -end diff --git a/.config/fish/functions/__sf_section_golang.fish b/.config/fish/functions/__sf_section_golang.fish deleted file mode 100644 index 81211ee4..00000000 --- a/.config/fish/functions/__sf_section_golang.fish +++ /dev/null @@ -1,55 +0,0 @@ -# -# Go -# -# Go is an open source programming language that makes it easy -# to build efficient software. -# Link: https://golang.org/ - -function __sf_section_golang -d "Display the current go version if you're inside GOPATH" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_GOLANG_SHOW true - __sf_util_set_default SPACEFISH_GOLANG_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_GOLANG_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_GOLANG_SYMBOL "🐹 " - __sf_util_set_default SPACEFISH_GOLANG_COLOR cyan - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show the current version of Golang - [ $SPACEFISH_GOLANG_SHOW = false ]; and return - - # Ensure the go command is available - type -q go; or return - - if not test -f go.mod \ - -o -d Godeps \ - -o -f glide.yaml \ - -o (count *.go) -gt 0 \ - -o -f Gopkg.yml \ - -o -f Gopkg.lock \ - -o ([ (count $GOPATH) -gt 0 ]; and string match $GOPATH $PWD) - return - end - - set -l go_version (go version | string split ' ') - - # Go version is either the commit hash and date (devel +5efe9a8f11 Web Jan 9 07:21:16 2019 +0000) - # at the time of the build or a release tag (go1.11.4) - # https://github.com/matchai/spacefish/issues/137 - if test (string match 'devel*' $go_version[3]) - set go_version $go_version[3]":"(string sub -s 2 $go_version[4]) - else - set go_version "v"(string sub -s 3 $go_version[3]) - end - - __sf_lib_section \ - $SPACEFISH_GOLANG_COLOR \ - $SPACEFISH_GOLANG_PREFIX \ - "$SPACEFISH_GOLANG_SYMBOL""$go_version" \ - $SPACEFISH_GOLANG_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_haskell.fish b/.config/fish/functions/__sf_section_haskell.fish deleted file mode 100644 index e31dca91..00000000 --- a/.config/fish/functions/__sf_section_haskell.fish +++ /dev/null @@ -1,38 +0,0 @@ -# -# Haskell Stack -# -# An advanced, purely functional programming language. -# Link: https://www.haskell.org/ - -function __sf_section_haskell -d "Show current version of Haskell Tool Stack" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_HASKELL_SHOW true - __sf_util_set_default SPACEFISH_HASKELL_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_HASKELL_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_HASKELL_SYMBOL "λ " - __sf_util_set_default SPACEFISH_HASKELL_COLOR red - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show current version of Haskell Tool Stack. - [ $SPACEFISH_HASKELL_SHOW = false ]; and return - - # Ensure the stack command is available - type -q stack; or return - - # If there are stack files in current directory - [ -f ./stack.yaml ]; or return - - set -l haskell_version (stack ghc -- --numeric-version --no-install-ghc) - - __sf_lib_section \ - $SPACEFISH_HASKELL_COLOR \ - $SPACEFISH_HASKELL_PREFIX \ - "$SPACEFISH_HASKELL_SYMBOL"v"$haskell_version" \ - $SPACEFISH_HASKELL_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_host.fish b/.config/fish/functions/__sf_section_host.fish deleted file mode 100644 index bd0bdd84..00000000 --- a/.config/fish/functions/__sf_section_host.fish +++ /dev/null @@ -1,41 +0,0 @@ -# -# Hostname -# - - -# If there is an ssh connections, current machine name. -function __sf_section_host -d "Display the current hostname if connected over SSH" - - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_HOST_SHOW true - __sf_util_set_default SPACEFISH_HOST_PREFIX "at " - __sf_util_set_default SPACEFISH_HOST_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_HOST_COLOR blue - __sf_util_set_default SPACEFISH_HOST_COLOR_SSH green - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ "$SPACEFISH_HOST_SHOW" = false ]; and return - - if test "$SPACEFISH_HOST_SHOW" = "always"; or set -q SSH_CONNECTION; - - # Determination of what color should be used - set -l host_color - if set -q SSH_CONNECTION; - set host_color $SPACEFISH_HOST_COLOR_SSH - else - set host_color $SPACEFISH_HOST_COLOR - end - - __sf_lib_section \ - $host_color \ - $SPACEFISH_HOST_PREFIX \ - (hostname) \ - $SPACEFISH_HOST_SUFFIX - end -end diff --git a/.config/fish/functions/__sf_section_jobs.fish b/.config/fish/functions/__sf_section_jobs.fish deleted file mode 100644 index cfa91e2a..00000000 --- a/.config/fish/functions/__sf_section_jobs.fish +++ /dev/null @@ -1,43 +0,0 @@ -# Jobs -# - -function __sf_section_jobs -d "Show icon, if there's a working jobs in the background." - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_JOBS_SHOW true - __sf_util_set_default SPACEFISH_JOBS_PREFIX "" - __sf_util_set_default SPACEFISH_JOBS_SUFFIX " " - __sf_util_set_default SPACEFISH_JOBS_SYMBOL ✦ - __sf_util_set_default SPACEFISH_JOBS_COLOR blue - __sf_util_set_default SPACEFISH_JOBS_AMOUNT_PREFIX "" - __sf_util_set_default SPACEFISH_JOBS_AMOUNT_SUFFIX "" - __sf_util_set_default SPACEFISH_JOBS_AMOUNT_THRESHOLD 1 - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_JOBS_SHOW = false ]; and return - - set jobs_amount (jobs | wc -l | xargs) # Zsh had a much more complicated command. - - if test $jobs_amount -eq 0 - return - end - - if test $jobs_amount -le $SPACEFISH_JOBS_AMOUNT_THRESHOLD - set jobs_amount '' - set SPACEFISH_JOBS_AMOUNT_PREFIX '' - set SPACEFISH_JOBS_AMOUNT_SUFFIX '' - end - - set SPACEFISH_JOBS_SECTION "$SPACEFISH_JOBS_SYMBOL$SPACEFISH_JOBS_AMOUNT_PREFIX$jobs_amount$SPACEFISH_JOBS_AMOUNT_SUFFIX" - - __sf_lib_section \ - $SPACEFISH_JOBS_COLOR \ - $SPACEFISH_JOBS_PREFIX \ - $SPACEFISH_JOBS_SECTION \ - $SPACEFISH_JOBS_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_julia.fish b/.config/fish/functions/__sf_section_julia.fish deleted file mode 100644 index ab58ec56..00000000 --- a/.config/fish/functions/__sf_section_julia.fish +++ /dev/null @@ -1,36 +0,0 @@ -# -# Julia -# -# Current Julia version. - -function __sf_section_julia -d "Display julia version" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_JULIA_SHOW true - __sf_util_set_default SPACEFISH_JULIA_PREFIX "is " - __sf_util_set_default SPACEFISH_JULIA_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_JULIA_SYMBOL "ஃ " - __sf_util_set_default SPACEFISH_JULIA_COLOR green - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_JULIA_SHOW = false ]; and return - - # Show Julia version only if julia is installed - type -q julia; or return - - # Show julia version only when pwd has *.jl file(s) - [ (count *.jl) -gt 0 ]; or return - - set -l julia_version (julia --version | grep --color=never -oE '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]') - - __sf_lib_section \ - $SPACEFISH_JULIA_COLOR \ - $SPACEFISH_JULIA_PREFIX \ - "$SPACEFISH_JULIA_SYMBOL"v"$julia_version" \ - $SPACEFISH_JULIA_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_kubecontext.fish b/.config/fish/functions/__sf_section_kubecontext.fish deleted file mode 100644 index effb614c..00000000 --- a/.config/fish/functions/__sf_section_kubecontext.fish +++ /dev/null @@ -1,45 +0,0 @@ -# -# Kubernetes (kubectl) -# -# Kubernetes is an open-source system for deployment, scaling, -# and management of containerized applications. -# Link: https://kubernetes.io/ - -function __sf_section_kubecontext -d "Display the kubernetes context" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_KUBECONTEXT_SHOW true - __sf_util_set_default SPACEFISH_KUBECONTEXT_NAMESPACE_SHOW true - __sf_util_set_default SPACEFISH_KUBECONTEXT_PREFIX "at " - __sf_util_set_default SPACEFISH_KUBECONTEXT_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - # Additional space is added because ☸️ is wider than other symbols - # See: https://github.com/denysdovhan/spaceship-prompt/pull/432 - __sf_util_set_default SPACEFISH_KUBECONTEXT_SYMBOL "☸️ " - __sf_util_set_default SPACEFISH_KUBECONTEXT_COLOR cyan - - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show current kubecontext - [ $SPACEFISH_KUBECONTEXT_SHOW = false ]; and return - # Ensure the kubectl command is available - type -q kubectl; or return - - set -l kube_context (kubectl config current-context 2>/dev/null) - [ -z $kube_context ]; and return - - if test "$SPACEFISH_KUBECONTEXT_NAMESPACE_SHOW" = "true" -a "$kube_context" != "default" - set kube_namespace (kubectl config view --minify --output 'jsonpath={..namespace}' 2>/dev/null) - set kube_context "$kube_context ($kube_namespace)" - end - - __sf_lib_section \ - $SPACEFISH_KUBECONTEXT_COLOR \ - $SPACEFISH_KUBECONTEXT_PREFIX \ - "$SPACEFISH_KUBECONTEXT_SYMBOL""$kube_context" \ - $SPACEFISH_KUBECONTEXT_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_line_sep.fish b/.config/fish/functions/__sf_section_line_sep.fish deleted file mode 100644 index 854c340c..00000000 --- a/.config/fish/functions/__sf_section_line_sep.fish +++ /dev/null @@ -1,19 +0,0 @@ -# -# Line separator -# - -function __sf_section_line_sep -d "Separate the prompt into two lines" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_PROMPT_SEPARATE_LINE true - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - if test "$SPACEFISH_PROMPT_SEPARATE_LINE" = "true" - echo -e -n \n - end -end diff --git a/.config/fish/functions/__sf_section_node.fish b/.config/fish/functions/__sf_section_node.fish deleted file mode 100644 index 2e6ebc9e..00000000 --- a/.config/fish/functions/__sf_section_node.fish +++ /dev/null @@ -1,58 +0,0 @@ -# -# Node.js -# -# Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. -# Link: https://nodejs.org/ - -function __sf_section_node -d "Display the local node version" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_NODE_SHOW true - __sf_util_set_default SPACEFISH_NODE_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_NODE_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_NODE_SYMBOL "⬢ " - __sf_util_set_default SPACEFISH_NODE_DEFAULT_VERSION "" - __sf_util_set_default SPACEFISH_NODE_COLOR green - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show the current version of Node - [ $SPACEFISH_NODE_SHOW = false ]; and return - - # Show versions only for Node-specific folders - if not test -f ./package.json \ - -o -d ./node_modules \ - -o (count *.js) -gt 0 - return - end - - if type -q nvm - # Only recheck the node version if the nvm bin has changed - if test "$NVM_BIN" != "$sf_last_nvm_bin" -o -z "$sf_node_version" - set -g sf_node_version (nvm current 2>/dev/null) - set -g sf_last_nvm_bin $NVM_BIN - end - else if type -q nodenv - set -g sf_node_version (nodenv version-name 2>/dev/null) - else if type -q node - set -g sf_node_version (node -v 2>/dev/null) - else - return - end - - # Don't echo section if the system verison of node is being used - [ "$sf_node_version" = "system" -o "$sf_node_version" = "node" ]; and return - - # Don't echo section if the node version matches the default version - [ "$sf_node_version" = "$SPACEFISH_NODE_DEFAULT_VERSION" ]; and return - - __sf_lib_section \ - $SPACEFISH_NODE_COLOR \ - $SPACEFISH_NODE_PREFIX \ - "$SPACEFISH_NODE_SYMBOL$sf_node_version" \ - $SPACEFISH_NODE_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_package.fish b/.config/fish/functions/__sf_section_package.fish deleted file mode 100644 index b613b87a..00000000 --- a/.config/fish/functions/__sf_section_package.fish +++ /dev/null @@ -1,72 +0,0 @@ -# -# Package -# -# Current package version. -# These package managers supported: -# * NPM -# * Cargo - -function __sf_section_package -d "Display the local package version" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_PACKAGE_SHOW true - __sf_util_set_default SPACEFISH_PACKAGE_PREFIX "is " - __sf_util_set_default SPACEFISH_PACKAGE_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_PACKAGE_SYMBOL "📦 " - __sf_util_set_default SPACEFISH_PACKAGE_COLOR red - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_PACKAGE_SHOW = false ]; and return - - # Exit if there is no package.json or Cargo.toml - if not test -e ./package.json; and not test -e ./Cargo.toml - return - end - - set -l package_version - - # Check if package.json exists AND npm exists locally while supressing output to just exit code (-q) - if type -q npm; and test -f ./package.json - # Check if jq (json handler) exists locally. If yes, check in package.json version - if type -q jq - set package_version (jq -r '.version' package.json 2>/dev/null) - # Check if python exists locally, use json to check version in package.json - else if type -q python - set package_version (python -c "import json; print(json.load(open('package.json'))['version'])" 2>/dev/null) - # Check if node exists locally, use it to check version of package.json - else if type -q node - set package_version (node -p "require('./package.json').version" 2>/dev/null) - end - end - - # Check if Cargo.toml exists and cargo command exists - # and use cargo pkgid to figure out the package - if type -q cargo; and test -f ./Cargo.toml - # Handle missing field `version` in Cargo.toml. - # `cargo pkgid` needs Cargo.lock to exists too. If - # it doesn't, do not show package version - set -l pkgid (cargo pkgid 2>&1) - # Early return on error - echo $pkgid | grep -q "error:"; and return - - # Example input: abc#1.0.0. Example output: 1.0.1 - set package_version (string match -r '#(.*)' $pkgid)[2] - end - - if test -z "$package_version" - set package_version ⚠ - else - set package_version "v$package_version" - end - - __sf_lib_section \ - $SPACEFISH_PACKAGE_COLOR \ - $SPACEFISH_PACKAGE_PREFIX \ - "$SPACEFISH_PACKAGE_SYMBOL$package_version" \ - $SPACEFISH_PACKAGE_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_php.fish b/.config/fish/functions/__sf_section_php.fish deleted file mode 100644 index 448d70b0..00000000 --- a/.config/fish/functions/__sf_section_php.fish +++ /dev/null @@ -1,40 +0,0 @@ -# -# PHP -# -# PHP is a server-side scripting language designed primarily for web development. -# Link: http://www.php.net/ - -function __sf_section_php -d "Display the current php version" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_PHP_SHOW true - __sf_util_set_default SPACEFISH_PHP_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_PHP_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_PHP_SYMBOL "🐘 " - __sf_util_set_default SPACEFISH_PHP_COLOR blue - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show current version of PHP - [ $SPACEFISH_PHP_SHOW = false ]; and return - - # Ensure the php command is available - type -q php; or return - - if not test -f composer.json \ - -o (count *.php) -gt 0 - return - end - - set -l php_version (php -v | string match -r 'PHP\s*[0-9.]+' | string split ' ')[2] - - __sf_lib_section \ - $SPACEFISH_PHP_COLOR \ - $SPACEFISH_PHP_PREFIX \ - "$SPACEFISH_PHP_SYMBOL"v"$php_version" \ - $SPACEFISH_PHP_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_pyenv.fish b/.config/fish/functions/__sf_section_pyenv.fish deleted file mode 100644 index aeba4feb..00000000 --- a/.config/fish/functions/__sf_section_pyenv.fish +++ /dev/null @@ -1,41 +0,0 @@ -# pyenv -# - -function __sf_section_pyenv -d "Show current version of pyenv Python, including system." - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_PYENV_SHOW true - __sf_util_set_default SPACEFISH_PYENV_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_PYENV_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_PYENV_SYMBOL "🐍 " - __sf_util_set_default SPACEFISH_PYENV_COLOR yellow - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show pyenv python version - [ $SPACEFISH_PYENV_SHOW = false ]; and return - - # Ensure the pyenv command is available - type -q pyenv; or return - - # Show pyenv python version only for Python-specific folders - if not test -n "$PYENV_VERSION" \ - -o -f .python-version \ - -o -f requirements.txt \ - -o -f pyproject.toml \ - -o (count *.py) -gt 0 - return - end - - set -l pyenv_status (pyenv version-name 2>/dev/null) # This line needs explicit testing in an enviroment that has pyenv. - - __sf_lib_section \ - $SPACEFISH_PYENV_COLOR \ - $SPACEFISH_PYENV_PREFIX \ - "$SPACEFISH_PYENV_SYMBOL""$pyenv_status" \ - $SPACEFISH_PYENV_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_ruby.fish b/.config/fish/functions/__sf_section_ruby.fish deleted file mode 100644 index 9dbade61..00000000 --- a/.config/fish/functions/__sf_section_ruby.fish +++ /dev/null @@ -1,58 +0,0 @@ -# -# Ruby -# -# A dynamic, reflective, object-oriented, general-purpose programming language. -# Link: https://www.ruby-lang.org/ - -function __sf_section_ruby -d "Show current version of Ruby" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_RUBY_SHOW true - __sf_util_set_default SPACEFISH_RUBY_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_RUBY_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_RUBY_SYMBOL "💎 " - __sf_util_set_default SPACEFISH_RUBY_COLOR red - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Check if that user wants to show ruby version - [ $SPACEFISH_RUBY_SHOW = false ]; and return - - # Show versions only for Ruby-specific folders - if not test -f Gemfile \ - -o -f Rakefile \ - -o (count *.rb) -gt 0 - return - end - - set -l ruby_version - - if type -q rvm-prompt - set ruby_version (rvm-prompt i v g) - else if type -q rbenv - set ruby_version (rbenv version-name) - else if type -q chruby - set ruby_version $RUBY_AUTO_VERSION - else if type -q asdf - set ruby_version (asdf current ruby | awk '{print $1}') - else - return - end - - [ -z "$ruby_version" -o "$ruby_version" = "system" ]; and return - - # Add 'v' before ruby version that starts with a number - if test -n (echo (string match -r "^[0-9].+\$" "$ruby_version")) - set ruby_version "v$ruby_version" - end - - __sf_lib_section \ - $SPACEFISH_RUBY_COLOR \ - $SPACEFISH_RUBY_PREFIX \ - "$SPACEFISH_RUBY_SYMBOL""$ruby_version" \ - $SPACEFISH_RUBY_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_rust.fish b/.config/fish/functions/__sf_section_rust.fish deleted file mode 100644 index f60ff7a4..00000000 --- a/.config/fish/functions/__sf_section_rust.fish +++ /dev/null @@ -1,45 +0,0 @@ -# -# Rust -# -# Rust is a systems programming language sponsored by Mozilla Research. -# Link: https://www.rust-lang.org - -function __sf_section_rust -d "Display the current Rust version" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_RUST_SHOW true - __sf_util_set_default SPACEFISH_RUST_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_RUST_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_RUST_SYMBOL "𝗥 " - __sf_util_set_default SPACEFISH_RUST_COLOR red - __sf_util_set_default SPACEFISH_RUST_VERBOSE_VERSION false - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show current version of Rust - [ $SPACEFISH_RUST_SHOW = false ]; and return - - # Ensure the rustc command is available - type -q rustc; or return - - if not test -f Cargo.toml \ - -o (count *.rs) -gt 0 - return - end - - set -l rust_version (rustc --version | string split ' ')[2] - - if test $SPACEFISH_RUST_VERBOSE_VERSION = false - set rust_version (string split '-' $rust_version)[1] # Cut off -suffixes from version. "v1.30.0-beta" vs "v1.30.0" - end - - __sf_lib_section \ - $SPACEFISH_RUST_COLOR \ - $SPACEFISH_RUST_PREFIX \ - "$SPACEFISH_RUST_SYMBOL"v"$rust_version" \ - $SPACEFISH_RUST_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_time.fish b/.config/fish/functions/__sf_section_time.fish deleted file mode 100644 index b9779ff0..00000000 --- a/.config/fish/functions/__sf_section_time.fish +++ /dev/null @@ -1,43 +0,0 @@ -# -# Time -# - -function __sf_section_time -d "Display the current time!" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_TIME_SHOW false - __sf_util_set_default SPACEFISH_DATE_SHOW false - __sf_util_set_default SPACEFISH_TIME_PREFIX "at " - __sf_util_set_default SPACEFISH_TIME_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_TIME_FORMAT false - __sf_util_set_default SPACEFISH_TIME_12HR false - __sf_util_set_default SPACEFISH_TIME_COLOR "yellow" - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_TIME_SHOW = false ]; and return - - set -l time_str - - if test $SPACEFISH_DATE_SHOW = true - set time_str (date '+%Y-%m-%d')" " - end - - if not test $SPACEFISH_TIME_FORMAT = false - set time_str "$time_str"(date '+'$SPACEFISH_TIME_FORMAT) - else if test $SPACEFISH_TIME_12HR = true - set time_str "$time_str"(date '+%I:%M:%S') # Fish doesn't seem to have date/time formatting. - else - set time_str "$time_str"(date '+%H:%M:%S') - end - - __sf_lib_section \ - $SPACEFISH_TIME_COLOR \ - $SPACEFISH_TIME_PREFIX \ - $time_str \ - $SPACEFISH_TIME_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_user.fish b/.config/fish/functions/__sf_section_user.fish deleted file mode 100644 index b481995f..00000000 --- a/.config/fish/functions/__sf_section_user.fish +++ /dev/null @@ -1,49 +0,0 @@ -# -# Username -# - -function __sf_section_user -d "Display the username" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - # -------------------------------------------------------------------------- - # | SPACEFISH_USER_SHOW | show username on local | show username on remote | - # |---------------------+------------------------+-------------------------| - # | false | never | never | - # | always | always | always | - # | true | if needed | always | - # | needed | if needed | if needed | - # -------------------------------------------------------------------------- - - __sf_util_set_default SPACEFISH_USER_SHOW true - __sf_util_set_default SPACEFISH_USER_PREFIX "with " - __sf_util_set_default SPACEFISH_USER_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_USER_COLOR yellow - __sf_util_set_default SPACEFISH_USER_COLOR_ROOT red - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_USER_SHOW = false ]; and return - - if test "$SPACEFISH_USER_SHOW" = "always" \ - -o "$LOGNAME" != "$USER" \ - -o "$UID" = "0" \ - -o \( "$SPACEFISH_USER_SHOW" = "true" -a -n "$SSH_CONNECTION" \) - - set -l user_color - if test "$USER" = "root" - set user_color $SPACEFISH_USER_COLOR_ROOT - else - set user_color $SPACEFISH_USER_COLOR - end - - __sf_lib_section \ - $user_color \ - $SPACEFISH_USER_PREFIX \ - $USER \ - $SPACEFISH_USER_SUFFIX - end -end diff --git a/.config/fish/functions/__sf_section_venv.fish b/.config/fish/functions/__sf_section_venv.fish deleted file mode 100644 index 204fa898..00000000 --- a/.config/fish/functions/__sf_section_venv.fish +++ /dev/null @@ -1,36 +0,0 @@ -# virtualenv -# - -function __sf_section_venv -d "Show current virtual Python environment" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_VENV_SHOW true - __sf_util_set_default SPACEFISH_VENV_PREFIX $SPACEFISH_PROMPT_DEFAULT_PREFIX - __sf_util_set_default SPACEFISH_VENV_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_VENV_SYMBOL "·" - __sf_util_set_default SPACEFISH_VENV_GENERIC_NAMES virtualenv venv .venv - __sf_util_set_default SPACEFISH_VENV_COLOR blue - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - # Show venv python version - test $SPACEFISH_VENV_SHOW = false; and return - - # Check if the current directory running via Virtualenv - test -n "$VIRTUAL_ENV"; or return - - set -l venv (basename $VIRTUAL_ENV) - if contains $venv $SPACEFISH_VENV_GENERIC_NAMES - set venv (basename (dirname $VIRTUAL_ENV)) - end - - __sf_lib_section \ - $SPACEFISH_VENV_COLOR \ - $SPACEFISH_VENV_PREFIX \ - "$SPACEFISH_VENV_SYMBOL""$venv" \ - $SPACEFISH_VENV_SUFFIX -end diff --git a/.config/fish/functions/__sf_section_vi_mode.fish b/.config/fish/functions/__sf_section_vi_mode.fish deleted file mode 100644 index a22292ac..00000000 --- a/.config/fish/functions/__sf_section_vi_mode.fish +++ /dev/null @@ -1,51 +0,0 @@ -# -# Vi Mode -# - -function __sf_section_vi_mode -d "Display vi mode status" - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_VI_MODE_SHOW true - __sf_util_set_default SPACEFISH_VI_MODE_PREFIX " " - __sf_util_set_default SPACEFISH_VI_MODE_SUFFIX $SPACEFISH_PROMPT_DEFAULT_SUFFIX - __sf_util_set_default SPACEFISH_VI_MODE_INSERT [I] - __sf_util_set_default SPACEFISH_VI_MODE_NORMAL [N] - __sf_util_set_default SPACEFISH_VI_MODE_VISUAL [V] - __sf_util_set_default SPACEFISH_VI_MODE_REPLACE_ONE [R] - __sf_util_set_default SPACEFISH_VI_MODE_COLOR white - - # ------------------------------------------------------------------------------ - # Section - # ------------------------------------------------------------------------------ - - [ $SPACEFISH_VI_MODE_SHOW = false ]; and return - - # Ensure fish_vi_key_bindings or fish_hybrid_key_bindings are used - # Here we are trying to be compatible with default fish_mode_prompt implementation, - # wich handle both "fish_vi_key_bindings" and "fish_hybrid_key_bindings" - [ "$fish_key_bindings" = "fish_vi_key_bindings" ]; or [ "$fish_key_bindings" = "fish_hybrid_key_bindings" ]; or return - - # Use `set -l` to define local variables to avoid populating - # the global namespace - set -l vi_mode_symbol - - # Check current mode and set vi_mode_symbol based on it - switch $fish_bind_mode - case default - set vi_mode_symbol $SPACEFISH_VI_MODE_NORMAL - case insert - set vi_mode_symbol $SPACEFISH_VI_MODE_INSERT - case replace_one - set vi_mode_symbol $SPACEFISH_VI_MODE_REPLACE_ONE - case visual - set vi_mode_symbol $SPACEFISH_VI_MODE_VISUAL - end - - __sf_lib_section \ - $SPACEFISH_VI_MODE_COLOR \ - $SPACEFISH_VI_MODE_PREFIX \ - $vi_mode_symbol \ - $SPACEFISH_VI_MODE_SUFFIX -end diff --git a/.config/fish/functions/__sf_util_git_branch.fish b/.config/fish/functions/__sf_util_git_branch.fish deleted file mode 100644 index 8be99f61..00000000 --- a/.config/fish/functions/__sf_util_git_branch.fish +++ /dev/null @@ -1,7 +0,0 @@ -# -# Git branch -# - -function __sf_util_git_branch -d "Display the current branch name" - echo (command git rev-parse --abbrev-ref HEAD 2>/dev/null) -end diff --git a/.config/fish/functions/__sf_util_human_time.fish b/.config/fish/functions/__sf_util_human_time.fish deleted file mode 100644 index ce804749..00000000 --- a/.config/fish/functions/__sf_util_human_time.fish +++ /dev/null @@ -1,23 +0,0 @@ -# -# Human time -# - -function __sf_util_human_time -d "Humanize a time interval for display" - command awk ' - function hmTime(time, stamp) { - split("h:m:s:ms", units, ":") - for (i = 2; i >= -1; i--) { - if (t = int( i < 0 ? time % 1000 : time / (60 ^ i * 1000) % 60 )) { - stamp = stamp t units[sqrt((i - 2) ^ 2) + 1] " " - } - } - if (stamp ~ /^ *$/) { - return "0ms" - } - return substr(stamp, 1, length(stamp) - 1) - } - { - print hmTime($0) - } - ' -end diff --git a/.config/fish/functions/__sf_util_set_default.fish b/.config/fish/functions/__sf_util_set_default.fish deleted file mode 100644 index 63b0e88b..00000000 --- a/.config/fish/functions/__sf_util_set_default.fish +++ /dev/null @@ -1,10 +0,0 @@ -# -# Set default -# - -function __sf_util_set_default -a var -d "Set the default value for a global variable" - if not set -q $var - # Multiple arguments will become a list - set -g $var $argv[2..-1] - end -end diff --git a/.config/fish/functions/__sf_util_truncate_dir.fish b/.config/fish/functions/__sf_util_truncate_dir.fish deleted file mode 100644 index ce88c92d..00000000 --- a/.config/fish/functions/__sf_util_truncate_dir.fish +++ /dev/null @@ -1,17 +0,0 @@ -# -# Truncate directory -# - -function __sf_util_truncate_dir -a path truncate_to -d "Truncate a directory path" - if test "$truncate_to" -eq 0 - echo $path - else - set -l folders (string split / $path) - - if test (count $folders) -le "$truncate_to" - echo $path - else - echo (string join / $folders[(math 0 - $truncate_to)..-1]) - end - end -end diff --git a/.config/fish/functions/fish_mode_prompt.fish b/.config/fish/functions/fish_mode_prompt.fish deleted file mode 100644 index 8e389a47..00000000 --- a/.config/fish/functions/fish_mode_prompt.fish +++ /dev/null @@ -1,4 +0,0 @@ -function fish_mode_prompt - # Overriden by Spacefish fishshell theme - # To see vi mode in prompt add 'vi_mode' to SPACEFISH_PROMPT_ORDER -end diff --git a/.config/fish/functions/fish_prompt.fish b/.config/fish/functions/fish_prompt.fish deleted file mode 100644 index 0dc6726f..00000000 --- a/.config/fish/functions/fish_prompt.fish +++ /dev/null @@ -1,33 +0,0 @@ -function fish_prompt - # Store the exit code of the last command - set -g sf_exit_code $status - set -g SPACEFISH_VERSION 2.7.0 - - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_PROMPT_ADD_NEWLINE true - __sf_util_set_default SPACEFISH_PROMPT_FIRST_PREFIX_SHOW false - __sf_util_set_default SPACEFISH_PROMPT_PREFIXES_SHOW true - __sf_util_set_default SPACEFISH_PROMPT_SUFFIXES_SHOW true - __sf_util_set_default SPACEFISH_PROMPT_DEFAULT_PREFIX "via " - __sf_util_set_default SPACEFISH_PROMPT_DEFAULT_SUFFIX " " - __sf_util_set_default SPACEFISH_PROMPT_ORDER time user dir host git package node ruby golang php rust haskell julia elixir docker aws venv conda pyenv dotnet kubecontext exec_time line_sep battery vi_mode jobs exit_code char - - # ------------------------------------------------------------------------------ - # Sections - # ------------------------------------------------------------------------------ - - # Keep track of whether the prompt has already been opened - set -g sf_prompt_opened $SPACEFISH_PROMPT_FIRST_PREFIX_SHOW - - if test "$SPACEFISH_PROMPT_ADD_NEWLINE" = "true" - echo - end - - for i in $SPACEFISH_PROMPT_ORDER - eval __sf_section_$i - end - set_color normal -end diff --git a/.config/fish/functions/fish_prompt.fish.bak b/.config/fish/functions/fish_prompt.fish.bak deleted file mode 100644 index d58bf640..00000000 --- a/.config/fish/functions/fish_prompt.fish.bak +++ /dev/null @@ -1,30 +0,0 @@ -function fish_prompt --description 'Write out the prompt' - set -l last_status $status - set -l normal (set_color normal) - set -l status_color (set_color brgreen) - set -l cwd_color (set_color $fish_color_cwd) - set -l vcs_color (set_color brpurple) - set -l prompt_status "" - - # Since we display the prompt on a new line allow the directory names to be longer. - set -q fish_prompt_pwd_dir_length - or set -lx fish_prompt_pwd_dir_length 0 - - # Color the prompt differently when we're root - set -l suffix '❯' - if functions -q fish_is_root_user; and fish_is_root_user - if set -q fish_color_cwd_root - set cwd_color (set_color $fish_color_cwd_root) - end - set suffix '#' - end - - # Color the prompt in red on error - if test $last_status -ne 0 - set status_color (set_color $fish_color_error) - set prompt_status $status_color "[" $last_status "]" $normal - end - - echo -s (prompt_login) ' ' $cwd_color (prompt_pwd) $vcs_color (fish_vcs_prompt) $normal ' ' $prompt_status - echo -n -s $status_color $suffix ' ' $normal -end diff --git a/.config/fish/functions/fish_right_prompt.fish b/.config/fish/functions/fish_right_prompt.fish deleted file mode 100644 index e9ab4922..00000000 --- a/.config/fish/functions/fish_right_prompt.fish +++ /dev/null @@ -1,19 +0,0 @@ -function fish_right_prompt - - # ------------------------------------------------------------------------------ - # Configuration - # ------------------------------------------------------------------------------ - - __sf_util_set_default SPACEFISH_RPROMPT_ORDER "" - - # ------------------------------------------------------------------------------ - # Sections - # ------------------------------------------------------------------------------ - - [ -n "$SPACEFISH_RPROMPT_ORDER" ]; or return - - for i in $SPACEFISH_RPROMPT_ORDER - eval __sf_section_$i - end - set_color normal -end diff --git a/.config/spicetify/CustomApps/marketplace/README.md b/.config/spicetify/CustomApps/marketplace/README.md new file mode 100644 index 00000000..5926cc1c --- /dev/null +++ b/.config/spicetify/CustomApps/marketplace/README.md @@ -0,0 +1,35 @@ +# Spicetify Marketplace + +

+ + + + + + + + + + + + +

+ +Customize your Spotify client directly from within [Spicetify](https://github.com/spicetify/spicetify-cli)! + +Marketplace allows you to **browse, download, and install** extensions, themes, and CSS snippets with ease. You can also browse custom apps, but will need to do some manual installation to get them working. + +Made with [Spicetify Creator](https://github.com/spicetify/spicetify-creator) + +Head to the [wiki](https://github.com/spicetify/spicetify-marketplace/wiki) to get started! + +--- + +## Links +- [Overview](https://github.com/spicetify/spicetify-marketplace/wiki) +- [Installation](https://github.com/spicetify/spicetify-marketplace/wiki/Installation) +- [Publishing to Marketplace](https://github.com/spicetify/spicetify-marketplace/wiki/Publishing-to-Marketplace) +- [Contributions](https://github.com/spicetify/spicetify-marketplace/wiki/Contributions) +- [Development](https://github.com/spicetify/spicetify-marketplace/wiki/Development) +- [Translating/Localizing Marketplace](https://github.com/spicetify/spicetify-marketplace/wiki/Localizing-Marketplace) + diff --git a/.config/spicetify/CustomApps/marketplace/extension.js b/.config/spicetify/CustomApps/marketplace/extension.js new file mode 100644 index 00000000..b4a3d7e9 --- /dev/null +++ b/.config/spicetify/CustomApps/marketplace/extension.js @@ -0,0 +1,3 @@ +"use strict";var marketplace=(()=>{var f=Object.create,i=Object.defineProperty,r=Object.defineProperties,u=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyDescriptors,l=Object.getOwnPropertyNames,a=Object.getOwnPropertySymbols,s=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable,c=(e,t,r)=>t in e?i(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,d=(e,t)=>{for(var r in t=t||{})h.call(t,r)&&c(e,r,t[r]);if(a)for(var r of a(t))o.call(t,r)&&c(e,r,t[r]);return e},p=(e,t)=>r(e,n(t));e={"node_modules/chroma-js/chroma.js"(e,t){var r;r=function(){for(var e=function(e,t,r){return void 0===r&&(r=1),e<(t=void 0===t?0:t)?t:r>16,t>>8&255,255&t,1];if(e.match(tt))return 4===(e=5!==e.length&&9!==e.length?e:e.substr(1)).length&&(e=(e=e.split(""))[0]+e[0]+e[1]+e[1]+e[2]+e[2]+e[3]+e[3]),[(t=parseInt(e,16))>>24&255,t>>16&255,t>>8&255,Math.round((255&t)/255*100)/100];throw new Error("unknown hex color: "+e)}function xe(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r,n,a,o=(e=lt(e,"hsi"))[0],c=e[1],f=e[2];return isNaN(o)&&(o=0),isNaN(c)&&(c=0),360b.t1?e*e*e:b.t2*(e-b.t0)}function Ce(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=(e=Rt(e,"lab"))[0],n=e[1],a=e[2],r=(r+16)/116,n=isNaN(n)?r:r+n/500,a=isNaN(a)?r:r-a/200;return r=b.Yn*Ee(r),n=b.Xn*Ee(n),a=b.Zn*Ee(a),[je(3.2404542*n-1.5371385*r-.4985314*a),je(-.969266*n+1.8760108*r+.041556*a),je(.0556434*n-.2040259*r+1.0572252*a),3>16,e>>8&255,255&e,1];throw new Error("unknown num color: "+e)}function qe(e){var t,r,n=(e=e/100)<66?(t=255,r=e<6?0:-155.25485562709179-.44596950469579133*(r=e-2)+104.49216199393888*w(r),e<20?0:.8274096064007395*(n=e-10)-254.76935184120902+115.67994401066147*w(n)):(t=351.97690566805693+.114206453784165*(t=e-55)-40.25366309332127*w(t),r=325.4494125711974+.07943456536662342*(r=e-50)-28.0852963507957*w(r),255);return[t,r,n,1]}function Ue(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=(a=Sr(e,"rgb"))[0],n=a[1],a=a[2],r=[$r(r/255),$r(n/255),$r(a/255)],o=_r(.4122214708*(n=r[0])+.5363325363*(a=r[1])+.0514459929*(r=r[2])),c=_r(.2119034982*n+.6806995451*a+.1073969566*r),n=_r(.0883024619*n+.2817188376*a+.6299787005*r);return[.2104542553*o+.793617785*c-.0040720468*n,1.9779984951*o-2.428592205*c+.4505937099*n,.0259040371*o+.7827717662*c-.808675766*n]}var u=i,Fe=c,l=o,De=e.type,Ge=B,We=z,Be=(Fe.prototype.css=function(e){return Ge(this._rgb,e)},u.css=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(Fe,[null].concat(e,["css"])))},l.format.css=We,l.autodetect.push({p:5,test:function(e){for(var t=[],r=arguments.length-1;0p.t3?Ct(e,1/3):e/p.t2+p.t0},b=l,Rt=e.unpack,At=Math.pow,It=e.unpack,qt=e.type,u=i,Ut=c,g=o,Ft=Oe,Dt=(Ut.prototype.lab=function(){return Ft(this._rgb)},u.lab=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(Ut,[null].concat(e,["lab"])))},g.format.lab=Ce,g.autodetect.push({p:2,test:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];if(e=It(e,"lab"),"array"===qt(e)&&3===e.length)return"lab"}}),e.unpack),Gt=e.RAD2DEG,Wt=Math.sqrt,Bt=Math.atan2,Tt=Math.round,zt=e.unpack,Yt=Oe,Ht=Le,Jt=e.unpack,Xt=e.DEG2RAD,Vt=Math.sin,Zt=Math.cos,Kt=e.unpack,Qt=Pe,er=Ce,tr=e.unpack,rr=Re,nr=e.unpack,ar=e.type,u=i,m=c,or=o,cr=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=zt(e,"rgb"),n=r[0],a=r[1],r=r[2],n=Yt(n,a,r),a=n[0],r=n[1],n=n[2];return Ht(a,r,n)},g=(m.prototype.lch=function(){return cr(this._rgb)},m.prototype.hcl=function(){return cr(this._rgb).reverse()},u.lch=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(m,[null].concat(e,["lch"])))},u.hcl=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(m,[null].concat(e,["hcl"])))},or.format.lch=Re,or.format.hcl=Ae,["lch","hcl"].forEach(function(r){return or.autodetect.push({p:2,test:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];if(e=nr(e,r),"array"===ar(e)&&3===e.length)return r}})}),{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflower:"#6495ed",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",laserlemon:"#ffff54",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrod:"#fafad2",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",maroon2:"#7f0000",maroon3:"#b03060",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",purple2:"#7f007f",purple3:"#a020f0",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}),u=c,v=o,fr=e.type,y=g,ir=Ne,ur=_e,lr=(u.prototype.name=function(){for(var e=ur(this._rgb,"rgb"),t=0,r=Object.keys(y);t=a/n?c=f:o=f}return kr(f)},Sr=(k.prototype.temp=k.prototype.kelvin=k.prototype.temperature=function(){return Mr(this._rgb)},u.temp=u.kelvin=u.temperature=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(k,[null].concat(e,["temp"])))},v.format.temp=v.format.kelvin=v.format.temperature=qe,e.unpack),_r=Math.cbrt,Nr=Math.pow,xr=Math.sign;function $r(e){var t=Math.abs(e);return t<.04045?e/12.92:(xr(e)||1)*Nr((t+.055)/1.055,2.4)}function Or(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=(e=jr(e,"lab"))[0],n=e[1],a=e[2],o=M(r+.3963377774*n+.2158037573*a,3),c=M(r-.1055613458*n-.0638541728*a,3),r=M(r-.0894841775*n-1.291485548*a,3);return[255*Cr(4.0767416621*o-3.3077115913*c+.2309699292*r),255*Cr(-1.2684380046*o+2.6097574011*c-.3413193965*r),255*Cr(-.0041960863*o-.7034186147*c+1.707614701*r),3=p[r];)r++;return r-1},M=function(e){return e},S=function(e){return e};return r(u),s.classes=function(e){var t;return null!=e?("array"===j(e)?h=[(p=e)[0],e[e.length-1]]:(t=O.analyze(h),p=0===e?[t.min,t.max]:O.limits(t,"e",e)),s):p},s.domain=function(r){if(!arguments.length)return h;g=r[0],m=r[r.length-1],i=[];var e=b.length;if(r.length===e&&g!==m)for(var t=0,n=Array.from(r);t=c[t+1];)t++;var r=(e-c[t])/(c[t+1]-c[t]);return o[t]+r*(o[t+1]-o[t])}))}return h=[g,m],s},s.mode=function(e){return arguments.length?(c=e,n(),s):c},s.range=function(e,t){return r(e),s},s.out=function(e){return a=e,s},s.spread=function(e){return arguments.length?(t=e,s):t},s.correctLightness=function(e){return n(),M=(e=null==e?!0:e)?function(e){for(var t=l(0,!0).lab()[0],r=l(1,!0).lab()[0],n=r 0");var i=Math.LOG10E*Jn(n),I=Math.LOG10E*Jn(a);c.push(n);for(var u=1;u.9999999)i[3]=1;return new Nn(xn(i))}for(var h,d=e.shift(),p=d.get(o),b=[],g=0,m=0,v=0;v{r=null!=e?f(s(e)):{};var n=!t&&e&&e.__esModule?r:i(r,"default",{value:e,enumerable:!0}),a=e,o=void 0,c=void 0;if(a&&"object"==typeof a||"function"==typeof a)for(let e of l(a))h.call(n,e)||e===o||i(n,e,{get:()=>a[e],enumerable:!(c=u(a,e))||c.enumerable});return n})(function(){return t||(0,e[l(e)[0]])((t={exports:{}}).exports,t),t.exports}()),x=(t,e)=>{t=localStorage.getItem(t);if(!t)return e;try{return JSON.parse(t)}catch(e){return t}},I=e=>{if(3===e.length)e=e.split("").map(e=>e+e).join("");else{if(6!=e.length)throw"Only 3- or 6-digit hex colours are allowed.";if(e.match(/[^0-9a-f]/i))throw"Only hex colours are allowed."}e=e.match(/.{1,2}/g);if(e&&3===e.length)return[parseInt(e[0],16),parseInt(e[1],16),parseInt(e[2],16)];throw"Could not parse hex colour."},$=(e,t)=>{let r=[];return e&&0({name:e.name,url:W(e.url)})):r.push({name:t,url:"https://github.com/"+t}),r},q=(...e)=>{console.debug("Resetting Marketplace");const t=[];0===e.length&&Object.keys(localStorage).forEach(e=>{e.startsWith("marketplace:")&&t.push(e)}),e.forEach(e=>{"extensions"===e?(t.push(...x(g,[])),t.push(g)):"snippets"===e?(t.push(...x(m,[])),t.push(m)):"theme"===e&&(t.push(...x(v,[])),t.push(v),t.push(y))}),t.forEach(e=>{localStorage.removeItem(e),console.debug("Removed "+e)}),console.debug("Marketplace has been reset"),location.reload()},U=()=>{const t={};return Object.keys(localStorage).forEach(e=>{e.startsWith("marketplace:")&&(t[e]=localStorage.getItem(e))}),t},O=r=>{var e=document.querySelector("style.marketplaceCSS.marketplaceScheme");if(e&&e.remove(),r){e=document.createElement("style");e.classList.add("marketplaceCSS"),e.classList.add("marketplaceScheme");let t=":root {";Object.keys(r).forEach(e=>{t=(t+=`--spice-${e}: #${r[e]};`)+`--spice-rgb-${e}: ${I(r[e])};`}),t+="}",e.innerHTML=t,document.body.appendChild(e)}},F=async e=>{let t=x(M);return t=t.replace(/([A-Z])/g,"_$1").toUpperCase(),(await Spicetify.colorExtractor(e))[t].substring(1)},D=async(e,t)=>{var r=x(k).replace(/([A-Z])/g,"-$1").toLowerCase();return(await fetch(`https://www.thecolorapi.com/scheme?hex=${e}&mode=${r}&count=`+t).then(e=>e.json())).colors.map(e=>e.hex.value.substring(1))};var G=s=>{Spicetify.Player.addEventListener("songchange",async()=>{await L(1e3);let t=null==(a=null==(a=null==(a=Spicetify.Player.data)?void 0:a.track)?void 0:a.metadata)?void 0:a.image_xlarge_url;if(t=null==t?await new Promise(t=>{setInterval(()=>{var e=null==(e=null==(e=null==(e=Spicetify.Player.data)?void 0:e.track)?void 0:e.metadata)?void 0:e.image_xlarge_url;e&&t(e)},50)}):t){var r,n,a=new Set(Object.values(s)).size,o=await F(t),c=await D(o,a);let e=new Map;for([r,n]of Object.entries(s))e.has(n)?e.get(n).push(r):e.set(n,[r]);var f,o=new Map([...e.entries()].sort((e,t)=>{e=(0,N.default)(e[0]),t=(0,N.default)(t[0]);return e.get("lab.l")-t.get("lab.l")})),i={};for([,f]of(e=o).entries()){var u=c.shift();if(u)for(const l of f)i[l]=u}O(i)}})},j=e=>{e=new URL(e);return e.host,"raw.githubusercontent.com"===e.host},E=e=>{var t,e=e.match(new RegExp("https:\\/\\/raw\\.githubusercontent\\.com\\/(?[^/]+)\\/(?[^/]+)\\/(?[^/]+)\\/(?.+$)"));return{user:e?null==(t=e.groups)?void 0:t.user:null,repo:e?null==(t=e.groups)?void 0:t.repo:null,branch:e?null==(t=e.groups)?void 0:t.branch:null,filePath:e?null==(t=e.groups)?void 0:t.filePath:null}};function C(r,n){r&&r.forEach(e=>{n=n||r.user+"-"+r.repo;var t=window.sessionStorage.getItem(n),t=t?JSON.parse(t):[];t.push(e),window.sessionStorage.setItem(n,JSON.stringify(t))})}function L(t){return new Promise(e=>setTimeout(e,t))}var W=e=>{var t=decodeURI(e).trim().toLowerCase();return t.startsWith("javascript:")||t.startsWith("data:")||t.startsWith("vbscript:")?"about:blank":e},P=e=>{e&&(e=e.split("/").pop())&&-1===Spicetify.Config.extensions.indexOf(e)&&Spicetify.Config.extensions.push(e)};async function R(e,t,r){var n=window.sessionStorage.getItem(e+"-"+t),a=window.sessionStorage.getItem("noManifests");if(n)return JSON.parse(n);const o=`https://raw.githubusercontent.com/${e}/${t}/${r}/manifest.json`;return null!=a&&a.includes(o)?null:((n=await fetch(o).then(e=>e.json()).catch(()=>C([o],"noManifests")))&&window.sessionStorage.setItem(e+"-"+t,JSON.stringify(n)),n)}async function A(e,t){var r=await async function(e,t=1){const r=window.sessionStorage.getItem("marketplace:blacklist");let n="https://api.github.com/search/repositories?per_page="+_;return"extension"===e?n+="&q="+encodeURIComponent("topic:spicetify-extensions"):"theme"===e&&(n+="&q="+encodeURIComponent("topic:spicetify-themes")),t&&(n+="&page="+t),(e=await fetch(n).then(e=>e.json()).catch(()=>[])).items||Spicetify.showNotification("Too Many Requests, Cool Down.",!0),t=p(d({},e),{page_count:e.items.length,items:e.items.filter(e=>!(null!=r&&r.includes(e.html_url)))})}(e,t),n=(!async function(e,t){for(const n of e.items){var r="theme"===t?await async function(t,n,a){try{let e;var r=t.match(new RegExp("https:\\/\\/api\\.github\\.com\\/repos\\/(?.+)\\/(?.+)\\/contents"));if(!r||!r.groups)return null;const{user:o,repo:c}=r.groups;return e=await R(o,c,n),(e=Array.isArray(e)?e:[e]).reduce((e,t)=>{var r=t.branch||n,r={manifest:t,title:t.name,subtitle:t.description,authors:$(t.authors,o),user:o,repo:c,branch:r,imageURL:t.preview&&t.preview.startsWith("http")?t.preview:`https://raw.githubusercontent.com/${o}/${c}/${r}/`+t.preview,readmeURL:t.readme&&t.readme.startsWith("http")?t.readme:`https://raw.githubusercontent.com/${o}/${c}/${r}/`+t.readme,stars:a,tags:t.tags,cssURL:t.usercss.startsWith("http")?t.usercss:`https://raw.githubusercontent.com/${o}/${c}/${r}/`+t.usercss,schemesURL:t.schemes?t.schemes.startsWith("http")?t.schemes:`https://raw.githubusercontent.com/${o}/${c}/${r}/`+t.schemes:null,include:t.include};return null!=t&&t.name&&null!=t&&t.usercss&&null!=t&&t.description&&e.push(r),e},[])}catch(e){return null}}(n.contents_url,n.default_branch,n.stargazers_count):await async function(t,n,a,o=!1){try{let e;var r=t.match(new RegExp("https:\\/\\/api\\.github\\.com\\/repos\\/(?.+)\\/(?.+)\\/contents"));if(!r||!r.groups)return null;const{user:c,repo:f}=r.groups;return e=await R(c,f,n),(e=Array.isArray(e)?e:[e]).reduce((e,t)=>{var r=t.branch||n,r={manifest:t,title:t.name,subtitle:t.description,authors:$(t.authors,c),user:c,repo:f,branch:r,imageURL:t.preview&&t.preview.startsWith("http")?t.preview:`https://raw.githubusercontent.com/${c}/${f}/${r}/`+t.preview,extensionURL:t.main.startsWith("http")?t.main:`https://raw.githubusercontent.com/${c}/${f}/${r}/`+t.main,readmeURL:t.readme&&t.readme.startsWith("http")?t.readme:`https://raw.githubusercontent.com/${c}/${f}/${r}/`+t.readme,stars:a,tags:t.tags};return t&&t.name&&t.description&&t.main&&(o&&localStorage.getItem(`marketplace:installed:${c}/${f}/`+t.main)||e.push(r)),e},[])}catch(e){return null}}(n.contents_url,n.default_branch,n.stargazers_count);r&&(C(r),await L(5e3))}}(r,e),_*(t-1)+r.page_count),a=(console.debug({pageOfRepos:r}),r.total_count-n);if(console.debug(`Parsed ${n}/${r.total_count} ${e}s`),0{for(;null==Spicetify||!Spicetify.LocalStorage||null==Spicetify||!Spicetify.showNotification;)await new Promise(e=>setTimeout(e,100));var e=document.createElement("script");e.innerHTML="const global = globalThis;",document.body.appendChild(e),console.log("Initializing Spicetify Marketplace v"+b),window.Marketplace={reset:q,export:U,version:b};var e=async t=>{t=x(t);if(t){if(console.debug("Initializing theme: ",t),t.schemes){var e=t.schemes[t.activeScheme];if(O(e),Spicetify.Config.color_scheme=t.activeScheme,"true"===localStorage.getItem(w))G(e);else if("true"===localStorage.getItem(S)){var r=t.schemes;let e=0;const f=Object.keys(r).length;setInterval(()=>{e%=f,O(Object.values(r)[e]),e++},6e4)}}else console.warn("No schemes found for theme");e=document.querySelector("link.marketplaceCSS"),e=(e&&e.remove(),await(async e=>{if(!e.cssURL)throw new Error("No CSS URL provided");var e=j(e.cssURL)?`https://cdn.jsdelivr.net/gh/${e.user}/${e.repo}@${e.branch}/`+e.manifest.usercss:e.cssURL,t=e.replace("/user.css","/assets/");console.debug("Parsing CSS: ",e);let r=await fetch(e+"?time="+Date.now()).then(e=>e.text());for(const o of r.matchAll(new RegExp(`url\\(['|"](?.+?)['|"]\\)`,"gm"))||[]){var n,a=null==(a=null==o?void 0:o.groups)?void 0:a.path;!a||a.startsWith("http")||a.startsWith("data")||(n=t+a.replace(/\.\//g,""),r=r.replace(a,n))}return r})(t));try{var n,a,o=document.querySelector("link[href='user.css']"),c=(o&&o.remove(),document.querySelector("style.marketplaceCSS.marketplaceUserCSS"));c&&c.remove(),e?((n=document.createElement("style")).classList.add("marketplaceCSS"),n.classList.add("marketplaceUserCSS"),n.innerHTML=e,document.body.appendChild(n)):((a=document.createElement("link")).setAttribute("rel","stylesheet"),a.setAttribute("href","user.css"),a.classList.add("userCSS"),document.body.appendChild(a))}catch(e){console.warn(e)}Spicetify.Config.current_theme=null==(o=t.manifest)?void 0:o.name,t.include&&t.include.length&&t.include.forEach(e=>{var t,r,n,a,o=document.createElement("script");let c=e;j(e)&&({user:t,repo:r,branch:n,filePath:a}=E(e),c=`https://cdn.jsdelivr.net/gh/${t}/${r}@${n}/`+a),o.src=c+"?time="+Date.now(),o.classList.add("marketplaceScript"),document.body.appendChild(o),P(e)})}else console.debug("No theme manifest found")},t=(console.log("Loaded Marketplace extension"),Spicetify.Config.local_theme=Spicetify.Config.current_theme,Spicetify.Config.local_color_scheme=Spicetify.Config.color_scheme,localStorage.getItem(y));t&&e(t);e=x(m,[]).map(e=>x(e));t=e,(e=document.querySelector("style.marketplaceSnippets"))&&e.remove(),e=document.createElement("style"),t=t.reduce((e,t)=>e=(e+=`/* ${t.title} - ${t.description} */ +`)+t.code+` +`,""),e.innerHTML=t,e.classList.add("marketplaceSnippets"),document.body.appendChild(e),x(g,[]).forEach(e=>{if((e=x(e))&&e.extensionURL){console.debug("Initializing extension: ",e);var t=document.createElement("script");if(t.defer=!0,t.src=e.extensionURL,j(t.src)){var{user:r,repo:n,branch:a,filePath:o}=E(e.extensionURL);if(!(r&&n&&a&&o))return;t.src=`https://cdn.jsdelivr.net/gh/${r}/${n}@${a}/`+o}t.src=t.src+"?time="+Date.now(),document.body.appendChild(t),P(null==(r=e.manifest)?void 0:r.main)}})})(),async function(){console.debug("Preloading extensions and themes..."),window.sessionStorage.clear();var e=await(await fetch("https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/resources/blacklist.json").then(e=>e.json()).catch(()=>({}))).repos;window.sessionStorage.setItem("marketplace:blacklist",JSON.stringify(e)),await Promise.all([A("extension",1),A("theme",1)])}()})(); \ No newline at end of file diff --git a/.config/spicetify/CustomApps/marketplace/index.js b/.config/spicetify/CustomApps/marketplace/index.js new file mode 100644 index 00000000..0ae1f02c --- /dev/null +++ b/.config/spicetify/CustomApps/marketplace/index.js @@ -0,0 +1,11 @@ +var marketplace=(()=>{var T,_=Object.create,j=Object.defineProperty,M=Object.defineProperties,D=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyDescriptors,F=Object.getOwnPropertyNames,B=Object.getOwnPropertySymbols,U=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable,K=(e,t,r)=>t in e?j(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,l=(e,t)=>{for(var r in t=t||{})G.call(t,r)&&K(e,r,t[r]);if(B)for(var r of B(t))z.call(t,r)&&K(e,r,t[r]);return e},J=(e,t)=>M(e,$(t)),e=(e,t)=>function(){return t||(0,e[F(e)[0]])((t={exports:{}}).exports,t),t.exports},W=(t,r,n,a)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let e of F(r))G.call(t,e)||e===n||j(t,e,{get:()=>r[e],enumerable:!(a=D(r,e))||a.enumerable});return t},t=(e,t,r)=>(r=null!=e?_(U(e)):{},W(!t&&e&&e.__esModule?r:j(r,"default",{value:e,enumerable:!0}),e)),b=e({"external-global-plugin:react"(e,t){t.exports=Spicetify.React}}),X=e({"node_modules/void-elements/index.js"(e,t){t.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}}}),Y=e({"node_modules/semver/internal/constants.js"(e,t){var r=Number.MAX_SAFE_INTEGER||9007199254740991;t.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:16,MAX_SAFE_INTEGER:r,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:"2.0.0",FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}}}),Q=e({"node_modules/semver/internal/debug.js"(e,t){var r="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...e)=>console.error("SEMVER",...e):()=>{};t.exports=r}}),Z=e({"node_modules/semver/internal/re.js"(e,t){var r=Y()["MAX_SAFE_COMPONENT_LENGTH"],a=Q(),o=(e=t.exports={}).re=[],i=e.src=[],s=e.t={},l=0,t=(e,t,r)=>{var n=l++;a(e,n,t),s[e]=n,i[n]=t,o[n]=new RegExp(t,r?"g":void 0)};t("NUMERICIDENTIFIER","0|[1-9]\\d*"),t("NUMERICIDENTIFIERLOOSE","[0-9]+"),t("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*"),t("MAINVERSION",`(${i[s.NUMERICIDENTIFIER]})\\.(${i[s.NUMERICIDENTIFIER]})\\.(${i[s.NUMERICIDENTIFIER]})`),t("MAINVERSIONLOOSE",`(${i[s.NUMERICIDENTIFIERLOOSE]})\\.(${i[s.NUMERICIDENTIFIERLOOSE]})\\.(${i[s.NUMERICIDENTIFIERLOOSE]})`),t("PRERELEASEIDENTIFIER",`(?:${i[s.NUMERICIDENTIFIER]}|${i[s.NONNUMERICIDENTIFIER]})`),t("PRERELEASEIDENTIFIERLOOSE",`(?:${i[s.NUMERICIDENTIFIERLOOSE]}|${i[s.NONNUMERICIDENTIFIER]})`),t("PRERELEASE",`(?:-(${i[s.PRERELEASEIDENTIFIER]}(?:\\.${i[s.PRERELEASEIDENTIFIER]})*))`),t("PRERELEASELOOSE",`(?:-?(${i[s.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${i[s.PRERELEASEIDENTIFIERLOOSE]})*))`),t("BUILDIDENTIFIER","[0-9A-Za-z-]+"),t("BUILD",`(?:\\+(${i[s.BUILDIDENTIFIER]}(?:\\.${i[s.BUILDIDENTIFIER]})*))`),t("FULLPLAIN",`v?${i[s.MAINVERSION]}${i[s.PRERELEASE]}?${i[s.BUILD]}?`),t("FULL",`^${i[s.FULLPLAIN]}$`),t("LOOSEPLAIN",`[v=\\s]*${i[s.MAINVERSIONLOOSE]}${i[s.PRERELEASELOOSE]}?${i[s.BUILD]}?`),t("LOOSE",`^${i[s.LOOSEPLAIN]}$`),t("GTLT","((?:<|>)?=?)"),t("XRANGEIDENTIFIERLOOSE",i[s.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*"),t("XRANGEIDENTIFIER",i[s.NUMERICIDENTIFIER]+"|x|X|\\*"),t("XRANGEPLAIN",`[v=\\s]*(${i[s.XRANGEIDENTIFIER]})(?:\\.(${i[s.XRANGEIDENTIFIER]})(?:\\.(${i[s.XRANGEIDENTIFIER]})(?:${i[s.PRERELEASE]})?${i[s.BUILD]}?)?)?`),t("XRANGEPLAINLOOSE",`[v=\\s]*(${i[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[s.XRANGEIDENTIFIERLOOSE]})(?:${i[s.PRERELEASELOOSE]})?${i[s.BUILD]}?)?)?`),t("XRANGE",`^${i[s.GTLT]}\\s*${i[s.XRANGEPLAIN]}$`),t("XRANGELOOSE",`^${i[s.GTLT]}\\s*${i[s.XRANGEPLAINLOOSE]}$`),t("COERCE",`(^|[^\\d])(\\d{1,${r}})(?:\\.(\\d{1,${r}}))?(?:\\.(\\d{1,${r}}))?(?:$|[^\\d])`),t("COERCERTL",i[s.COERCE],!0),t("LONETILDE","(?:~>?)"),t("TILDETRIM",`(\\s*)${i[s.LONETILDE]}\\s+`,!0),e.tildeTrimReplace="$1~",t("TILDE",`^${i[s.LONETILDE]}${i[s.XRANGEPLAIN]}$`),t("TILDELOOSE",`^${i[s.LONETILDE]}${i[s.XRANGEPLAINLOOSE]}$`),t("LONECARET","(?:\\^)"),t("CARETTRIM",`(\\s*)${i[s.LONECARET]}\\s+`,!0),e.caretTrimReplace="$1^",t("CARET",`^${i[s.LONECARET]}${i[s.XRANGEPLAIN]}$`),t("CARETLOOSE",`^${i[s.LONECARET]}${i[s.XRANGEPLAINLOOSE]}$`),t("COMPARATORLOOSE",`^${i[s.GTLT]}\\s*(${i[s.LOOSEPLAIN]})$|^$`),t("COMPARATOR",`^${i[s.GTLT]}\\s*(${i[s.FULLPLAIN]})$|^$`),t("COMPARATORTRIM",`(\\s*)${i[s.GTLT]}\\s*(${i[s.LOOSEPLAIN]}|${i[s.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace="$1$2$3",t("HYPHENRANGE",`^\\s*(${i[s.XRANGEPLAIN]})\\s+-\\s+(${i[s.XRANGEPLAIN]})\\s*$`),t("HYPHENRANGELOOSE",`^\\s*(${i[s.XRANGEPLAINLOOSE]})\\s+-\\s+(${i[s.XRANGEPLAINLOOSE]})\\s*$`),t("STAR","(<|>)?=?\\s*\\*"),t("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),t("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}}),ee=e({"node_modules/semver/internal/parse-options.js"(e,t){var r=Object.freeze({loose:!0}),n=Object.freeze({});t.exports=e=>e?"object"!=typeof e?r:e:n}}),te=e({"node_modules/semver/internal/identifiers.js"(e,t){var a=/^[0-9]+$/,r=(e,t)=>{var r=a.test(e),n=a.test(t);return r&&n&&(e=+e,t=+t),e===t?0:r&&!n||(!n||r)&&er(t,e)}}}),H=e({"node_modules/semver/classes/semver.js"(e,t){var a=Q(),{MAX_LENGTH:r,MAX_SAFE_INTEGER:n}=Y(),{re:o,t:i}=Z(),s=ee(),l=te()["compareIdentifiers"],c=class{constructor(e,t){if(t=s(t),e instanceof c){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if("string"!=typeof e)throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>r)throw new TypeError(`version is longer than ${r} characters`);a("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;t=e.trim().match(t.loose?o[i.LOOSE]:o[i.FULL]);if(!t)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+t[1],this.minor=+t[2],this.patch=+t[3],this.major>n||this.major<0)throw new TypeError("Invalid major version");if(this.minor>n||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>n||this.patch<0)throw new TypeError("Invalid patch version");t[4]?this.prerelease=t[4].split(".").map(e=>{if(/^[0-9]+$/.test(e)){var t=+e;if(0<=t&&t{if(e instanceof n)return e;try{return new n(e,t)}catch(e){if(r)throw e;return null}}}}),ne=e({"node_modules/semver/functions/valid.js"(e,t){var r=re();t.exports=(e,t)=>{e=r(e,t);return e?e.version:null}}}),ae=e({"node_modules/semver/functions/clean.js"(e,t){var r=re();t.exports=(e,t)=>{e=r(e.trim().replace(/^[=v]+/,""),t);return e?e.version:null}}}),oe=e({"node_modules/semver/functions/inc.js"(e,t){var o=H();t.exports=(e,t,r,n,a)=>{"string"==typeof r&&(a=n,n=r,r=void 0);try{return new o(e instanceof o?e.version:e,r).inc(t,n,a).version}catch(e){return null}}}}),ie=e({"node_modules/semver/functions/diff.js"(e,t){var o=re();t.exports=(e,t)=>{var r,n,e=o(e,null,!0),t=o(t,null,!0),a=e.compare(t);return 0===a?null:(r=(a=0new r(e,t).major}}),le=e({"node_modules/semver/functions/minor.js"(e,t){var r=H();t.exports=(e,t)=>new r(e,t).minor}}),ce=e({"node_modules/semver/functions/patch.js"(e,t){var r=H();t.exports=(e,t)=>new r(e,t).patch}}),ue=e({"node_modules/semver/functions/prerelease.js"(e,t){var r=re();t.exports=(e,t)=>{e=r(e,t);return e&&e.prerelease.length?e.prerelease:null}}}),V=e({"node_modules/semver/functions/compare.js"(e,t){var n=H();t.exports=(e,t,r)=>new n(e,r).compare(new n(t,r))}}),pe=e({"node_modules/semver/functions/rcompare.js"(e,t){var n=V();t.exports=(e,t,r)=>n(t,e,r)}}),de=e({"node_modules/semver/functions/compare-loose.js"(e,t){var r=V();t.exports=(e,t)=>r(e,t,!0)}}),he=e({"node_modules/semver/functions/compare-build.js"(e,t){var n=H();t.exports=(e,t,r)=>{e=new n(e,r),t=new n(t,r);return e.compare(t)||e.compareBuild(t)}}}),fe=e({"node_modules/semver/functions/sort.js"(e,t){var n=he();t.exports=(e,r)=>e.sort((e,t)=>n(e,t,r))}}),me=e({"node_modules/semver/functions/rsort.js"(e,t){var n=he();t.exports=(e,r)=>e.sort((e,t)=>n(t,e,r))}}),ge=e({"node_modules/semver/functions/gt.js"(e,t){var n=V();t.exports=(e,t,r)=>0n(e,t,r)<0}}),be=e({"node_modules/semver/functions/eq.js"(e,t){var n=V();t.exports=(e,t,r)=>0===n(e,t,r)}}),ye=e({"node_modules/semver/functions/neq.js"(e,t){var n=V();t.exports=(e,t,r)=>0!==n(e,t,r)}}),Ee=e({"node_modules/semver/functions/gte.js"(e,t){var n=V();t.exports=(e,t,r)=>0<=n(e,t,r)}}),we=e({"node_modules/semver/functions/lte.js"(e,t){var n=V();t.exports=(e,t,r)=>n(e,t,r)<=0}}),Se=e({"node_modules/semver/functions/cmp.js"(e,t){var a=be(),o=ye(),i=ge(),s=Ee(),l=ve(),c=we();t.exports=(e,t,r,n)=>{switch(t){case"===":return(e="object"==typeof e?e.version:e)===(r="object"==typeof r?r.version:r);case"!==":return(e="object"==typeof e?e.version:e)!==(r="object"==typeof r?r.version:r);case"":case"=":case"==":return a(e,r,n);case"!=":return o(e,r,n);case">":return i(e,r,n);case">=":return s(e,r,n);case"<":return l(e,r,n);case"<=":return c(e,r,n);default:throw new TypeError("Invalid operator: "+t)}}}}),ke=e({"node_modules/semver/functions/coerce.js"(e,t){var a=H(),o=re(),{re:i,t:s}=Z();t.exports=(e,t)=>{if(e instanceof a)return e;if("string"!=typeof(e="number"==typeof e?String(e):e))return null;let r=null;if((t=t||{}).rtl){for(var n;(n=i[s.COERCERTL].exec(e))&&(!r||r.index+r[0].length!==e.length);)r&&n.index+n[0].length===r.index+r[0].length||(r=n),i[s.COERCERTL].lastIndex=n.index+n[1].length+n[2].length;i[s.COERCERTL].lastIndex=-1}else r=e.match(i[s.COERCE]);return null===r?null:o(`${r[2]}.${r[3]||"0"}.`+(r[4]||"0"),t)}}}),Oe=e({"node_modules/yallist/iterator.js"(e,t){"use strict";t.exports=function(e){e.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}}}),Ce=e({"node_modules/yallist/yallist.js"(e,t){"use strict";function o(e){var t=this;if((t=t instanceof o?t:new o).tail=null,t.head=null,t.length=0,e&&"function"==typeof e.forEach)e.forEach(function(e){t.push(e)});else if(0this.length&&(t=this.length);for(var n=0,a=this.head;null!==a&&nthis.length&&(t=this.length);for(var n=this.length,a=this.tail;null!==a&&tthis.length?this.length-1:e)<0&&(e=this.length+e);for(var n=0,a=this.head;null!==a&&n1,f=(e,t,r)=>{t=e[h].get(t);if(t){var n=t.value;if(m(e,n)){if(v(e,t),!e[o])return}else r&&(e[a]&&(t.value.now=Date.now()),e[d].unshiftNode(t));return n.value}},m=(e,t)=>{var r;return!(!t||!t.maxAge&&!e[c])&&(r=Date.now()-t.now,t.maxAge?r>t.maxAge:e[c]&&r>e[c])},g=t=>{if(t[s]>t[i])for(let e=t[d].tail;t[s]>t[i]&&null!==e;){var r=e.prev;v(t,e),e=r}},v=(e,t)=>{var r;t&&(r=t.value,e[u]&&e[u](r.key,r.value),e[s]-=r.length,e[h].delete(r.key),e[d].removeNode(t))},b=class{constructor(e,t,r,n,a){this.key=e,this.value=t,this.length=r,this.now=n,this.maxAge=a||0}},y=(e,t,r,n)=>{let a=r.value;m(e,a)&&(v(e,r),e[o]||(a=void 0)),a&&t.call(n,a.value,a.key,e)};t.exports=class{constructor(e){if((e=(e="number"==typeof e?{max:e}:e)||{}).max&&("number"!=typeof e.max||e.max<0))throw new TypeError("max must be a non-negative number");this[i]=e.max||1/0;var t=e.length||n;if(this[l]="function"!=typeof t?n:t,this[o]=e.stale||!1,e.maxAge&&"number"!=typeof e.maxAge)throw new TypeError("maxAge must be a number");this[c]=e.maxAge||0,this[u]=e.dispose,this[p]=e.noDisposeOnSet||!1,this[a]=e.updateAgeOnGet||!1,this.reset()}set max(e){if("number"!=typeof e||e<0)throw new TypeError("max must be a non-negative number");this[i]=e||1/0,g(this)}get max(){return this[i]}set allowStale(e){this[o]=!!e}get allowStale(){return this[o]}set maxAge(e){if("number"!=typeof e)throw new TypeError("maxAge must be a non-negative number");this[c]=e,g(this)}get maxAge(){return this[c]}set lengthCalculator(e){(e="function"!=typeof e?n:e)!==this[l]&&(this[l]=e,this[s]=0,this[d].forEach(e=>{e.length=this[l](e.value,e.key),this[s]+=e.length})),g(this)}get lengthCalculator(){return this[l]}get length(){return this[s]}get itemCount(){return this[d].length}rforEach(t,r){r=r||this;for(let e=this[d].tail;null!==e;){var n=e.prev;y(this,t,e,r),e=n}}forEach(t,r){r=r||this;for(let e=this[d].head;null!==e;){var n=e.next;y(this,t,e,r),e=n}}keys(){return this[d].toArray().map(e=>e.key)}values(){return this[d].toArray().map(e=>e.value)}reset(){this[u]&&this[d]&&this[d].length&&this[d].forEach(e=>this[u](e.key,e.value)),this[h]=new Map,this[d]=new r,this[s]=0}dump(){return this[d].map(e=>!m(this,e)&&{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[d]}set(e,t,r){if((r=r||this[c])&&"number"!=typeof r)throw new TypeError("maxAge must be a number");var n,a=r?Date.now():0,o=this[l](t,e);return this[h].has(e)?o>this[i]?(v(this,this[h].get(e)),!1):(n=this[h].get(e).value,this[u]&&!this[p]&&this[u](e,n.value),n.now=a,n.maxAge=r,n.value=t,this[s]+=o-n.length,n.length=o,this.get(e),g(this),!0):(n=new b(e,t,o,a,r)).length>this[i]?(this[u]&&this[u](e,t),!1):(this[s]+=n.length,this[d].unshift(n),this[h].set(e,this[d].head),g(this),!0)}has(e){return!!this[h].has(e)&&(e=this[h].get(e).value,!m(this,e))}get(e){return f(this,e,!0)}peek(e){return f(this,e,!1)}pop(){var e=this[d].tail;return e?(v(this,e),e.value):null}del(e){v(this,this[h].get(e))}load(t){this.reset();var r=Date.now();for(let e=t.length-1;0<=e;e--){var n=t[e],a=n.e||0;0===a?this.set(n.k,n.v):0<(a=a-r)&&this.set(n.k,n.v,a)}}prune(){this[h].forEach((e,t)=>f(this,t,!1))}}}}),q=e({"node_modules/semver/classes/range.js"(e,t){var n=class{constructor(e,t){if(t=a(t),e instanceof n)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new n(e.raw,t);if(e instanceof l)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split("||").map(e=>this.parseRange(e.trim())).filter(e=>e.length),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);if(1!v(e[0])),0===this.set.length)this.set=[t];else if(1e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();var t=((this.options.includePrerelease&&m)|(this.options.loose&&g))+":"+e,r=s.get(t);if(r)return r;var r=this.options.loose,n=r?d[h.HYPHENRANGELOOSE]:d[h.HYPHENRANGE];e=e.replace(n,I(this.options.includePrerelease)),p("hyphen replace",e),e=e.replace(d[h.COMPARATORTRIM],c),p("comparator trim",e);let a=(e=(e=(e=e.replace(d[h.TILDETRIM],u)).replace(d[h.CARETTRIM],f)).split(/\s+/).join(" ")).split(" ").map(e=>b(e,this.options)).join(" ").split(/\s+/).map(e=>x(e,this.options));r&&(a=a.filter(e=>(p("loose invalid filter",e,this.options),!!e.match(d[h.COMPARATORLOOSE])))),p("range list",a);var o=new Map;for(const i of a.map(e=>new l(e,this.options))){if(v(i))return[i];o.set(i.value,i)}1i(t,r)&&e.set.some(e=>i(e,r)&&t.every(t=>e.every(e=>t.intersects(e,r)))));throw new TypeError("a Range is required")}test(t){if(t){if("string"==typeof t)try{t=new r(t,this.options)}catch(e){return!1}for(let e=0;e"<0.0.0-0"===e.value,o=e=>""===e.value,i=(e,t)=>{let r=!0;var n=e.slice();let a=n.pop();for(;r&&n.length;)r=n.every(e=>a.intersects(e,t)),a=n.pop();return r},b=(e,t)=>(p("comp",e,t),e=S(e,t),p("caret",e),e=E(e,t),p("tildes",e),e=O(e,t),p("xrange",e),e=N(e,t),p("stars",e),e),y=e=>!e||"x"===e.toLowerCase()||"*"===e,E=(e,t)=>e.trim().split(/\s+/).map(e=>w(e,t)).join(" "),w=(i,e)=>{e=e.loose?d[h.TILDELOOSE]:d[h.TILDE];return i.replace(e,(e,t,r,n,a)=>{p("tilde",i,e,t,r,n,a);let o;return o=y(t)?"":y(r)?`>=${t}.0.0 <${+t+1}.0.0-0`:y(n)?`>=${t}.${r}.0 <${t}.${+r+1}.0-0`:a?(p("replaceTilde pr",a),`>=${t}.${r}.${n}-${a} <${t}.${+r+1}.0-0`):`>=${t}.${r}.${n} <${t}.${+r+1}.0-0`,p("tilde return",o),o})},S=(e,t)=>e.trim().split(/\s+/).map(e=>k(e,t)).join(" "),k=(i,e)=>{p("caret",i,e);var t=e.loose?d[h.CARETLOOSE]:d[h.CARET];const s=e.includePrerelease?"-0":"";return i.replace(t,(e,t,r,n,a)=>{p("caret",i,e,t,r,n,a);let o;return o=y(t)?"":y(r)?`>=${t}.0.0${s} <${+t+1}.0.0-0`:y(n)?"0"===t?`>=${t}.${r}.0${s} <${t}.${+r+1}.0-0`:`>=${t}.${r}.0${s} <${+t+1}.0.0-0`:a?(p("replaceCaret pr",a),"0"===t?"0"===r?`>=${t}.${r}.${n}-${a} <${t}.${r}.${+n+1}-0`:`>=${t}.${r}.${n}-${a} <${t}.${+r+1}.0-0`:`>=${t}.${r}.${n}-${a} <${+t+1}.0.0-0`):(p("no pr"),"0"===t?"0"===r?`>=${t}.${r}.${n}${s} <${t}.${r}.${+n+1}-0`:`>=${t}.${r}.${n}${s} <${t}.${+r+1}.0-0`:`>=${t}.${r}.${n} <${+t+1}.0.0-0`),p("caret return",o),o})},O=(e,t)=>(p("replaceXRanges",e,t),e.split(/\s+/).map(e=>C(e,t)).join(" ")),C=(c,u)=>{c=c.trim();var e=u.loose?d[h.XRANGELOOSE]:d[h.XRANGE];return c.replace(e,(e,t,r,n,a,o)=>{p("xRange",c,e,t,r,n,a,o);var i=y(r),s=i||y(n),l=s||y(a);return"="===t&&l&&(t=""),o=u.includePrerelease?"-0":"",i?e=">"===t||"<"===t?"<0.0.0-0":"*":t&&l?(s&&(n=0),a=0,">"===t?(t=">=",a=s?(r=+r+1,n=0):(n=+n+1,0)):"<="===t&&(t="<",s?r=+r+1:n=+n+1),e=t+r+`.${n}.`+a+(o="<"===t?"-0":o)):s?e=`>=${r}.0.0${o} <${+r+1}.0.0-0`:l&&(e=`>=${r}.${n}.0${o} <${r}.${+n+1}.0-0`),p("xRange return",e),e})},N=(e,t)=>(p("replaceStars",e,t),e.trim().replace(d[h.STAR],"")),x=(e,t)=>(p("replaceGTE0",e,t),e.trim().replace(d[t.includePrerelease?h.GTE0PRE:h.GTE0],"")),I=h=>(e,t,r,n,a,o,i,s,l,c,u,p,d)=>((t=y(r)?"":y(n)?`>=${r}.0.0`+(h?"-0":""):y(a)?`>=${r}.${n}.0`+(h?"-0":""):o?">="+t:">="+t+(h?"-0":""))+" "+(s=y(l)?"":y(c)?`<${+l+1}.0.0-0`:y(u)?`<${l}.${+c+1}.0-0`:p?`<=${l}.${c}.${u}-`+p:h?`<${l}.${c}.${+u+1}-0`:"<="+s)).trim(),L=(t,r,e)=>{for(let e=0;e")||!e.operator.startsWith(">"))&&!(this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||s(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||s(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">")));throw new TypeError("a Comparator is required")}},a=(t.exports=n,ee()),{re:o,t:i}=Z(),s=Se(),l=Q(),c=H(),u=q()}}),Ie=e({"node_modules/semver/functions/satisfies.js"(e,t){var n=q();t.exports=(e,t,r)=>{try{t=new n(t,r)}catch(e){return!1}return t.test(e)}}}),Le=e({"node_modules/semver/ranges/to-comparators.js"(e,t){var r=q();t.exports=(e,t)=>new r(e,t).set.map(e=>e.map(e=>e.value).join(" ").trim().split(" "))}}),Re=e({"node_modules/semver/ranges/max-satisfying.js"(e,t){var i=H(),s=q();t.exports=(e,t,r)=>{let n=null,a=null,o=null;try{o=new s(t,r)}catch(e){return null}return e.forEach(e=>{!o.test(e)||n&&-1!==a.compare(e)||(n=e,a=new i(n,r))}),n}}}),Pe=e({"node_modules/semver/ranges/min-satisfying.js"(e,t){var i=H(),s=q();t.exports=(e,t,r)=>{let n=null,a=null,o=null;try{o=new s(t,r)}catch(e){return null}return e.forEach(e=>{!o.test(e)||n&&1!==a.compare(e)||(n=e,a=new i(n,r))}),n}}}),Ae=e({"node_modules/semver/ranges/min-version.js"(e,t){var o=H(),r=q(),i=ge();t.exports=(t,e)=>{t=new r(t,e);let n=new o("0.0.0");if(t.test(n))return n;if(n=new o("0.0.0-0"),t.test(n))return n;n=null;for(let e=0;e{var t=new o(e.semver.version);switch(e.operator){case">":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":r&&!i(t,r)||(r=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}}),!r||n&&!i(n,r)||(n=r)}return n&&t.test(n)?n:null}}}),Te=e({"node_modules/semver/ranges/valid.js"(e,t){var r=q();t.exports=(e,t)=>{try{return new r(e,t).range||"*"}catch(e){return null}}}}),_e=e({"node_modules/semver/ranges/outside.js"(e,t){var r=H(),d=xe(),h=d["ANY"],f=q(),m=Ie(),g=ge(),v=ve(),b=we(),y=Ee();t.exports=(n,a,e,o)=>{n=new r(n,o),a=new f(a,o);let i,s,l,c,u;switch(e){case">":i=g,s=b,l=v,c=">",u=">=";break;case"<":i=v,s=y,l=g,c="<",u="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(m(n,a,o))return!1;for(let e=0;e{e.semver===h&&(e=new d(">=0.0.0")),t=t||e,r=r||e,i(e.semver,t.semver,o)?t=e:l(e.semver,r.semver,o)&&(r=e)}),t.operator===c||t.operator===u)return!1;if((!r.operator||r.operator===c)&&s(n,r.semver))return!1;if(r.operator===u&&l(n,r.semver))return!1}return!0}}}),je=e({"node_modules/semver/ranges/gtr.js"(e,t){var n=_e();t.exports=(e,t,r)=>n(e,t,">",r)}}),Me=e({"node_modules/semver/ranges/ltr.js"(e,t){var n=_e();t.exports=(e,t,r)=>n(e,t,"<",r)}}),De=e({"node_modules/semver/ranges/intersects.js"(e,t){var n=q();t.exports=(e,t,r)=>(e=new n(e,r),t=new n(t,r),e.intersects(t,r))}}),$e=e({"node_modules/semver/ranges/simplify.js"(e,t){var h=Ie(),f=V();t.exports=(e,t,r)=>{var n=[];let a=null,o=null;var i=e.sort((e,t)=>f(e,t,r));for(const d of i){var s=h(d,t,r);a=s?(o=d,a||d):(o&&n.push([a,o]),o=null)}a&&n.push([a,null]);var l,c,u=[];for([l,c]of n)l===c?u.push(l):c||l!==i[0]?c?l===i[0]?u.push("<="+c):u.push(l+" - "+c):u.push(">="+l):u.push("*");var e=u.join(" || "),p="string"==typeof t.raw?t.raw:String(t);return e.length=0.0.0-0")],w=[new r(">=0.0.0")],S=(e,t,r)=>{return!e||!(0<(r=y(e.semver,t.semver,r)))&&(r<0||">"===t.operator&&">="===e.operator)?t:e},k=(e,t,r)=>{return!e||!((r=y(e.semver,t.semver,r))<0)&&(0{if(t!==r){t=new s(t,n),r=new s(r,n);let e=!1;e:for(const o of t.set){for(const i of r.set){var a=((s,l,c)=>{if(s!==l){if(1===s.length&&s[0].semver===v){if(1===l.length&&l[0].semver===v)return!0;s=c.includePrerelease?E:w}if(1===l.length&&l[0].semver===v){if(c.includePrerelease)return!0;l=w}var u=new Set,p,d;let e,t;for(const h of s)">"===h.operator||">="===h.operator?e=S(e,h,c):"<"===h.operator||"<="===h.operator?t=k(t,h,c):u.add(h.semver);if(1="!==e.operator||"<="!==t.operator))return null}for(const f of u){if(e&&!b(f,String(e),c))return null;if(t&&!b(f,String(t),c))return null;for(const m of l)if(!b(f,String(m),c))return!1;return!0}let n,a,o=!(!t||c.includePrerelease||!t.semver.prerelease.length)&&t.semver,i=!(!e||c.includePrerelease||!e.semver.prerelease.length)&&e.semver;o&&1===o.prerelease.length&&"<"===t.operator&&0===o.prerelease[0]&&(o=!1);for(const g of l){if(a=a||">"===g.operator||">="===g.operator,n=n||"<"===g.operator||"<="===g.operator,e)if(i&&g.semver.prerelease&&g.semver.prerelease.length&&g.semver.major===i.major&&g.semver.minor===i.minor&&g.semver.patch===i.patch&&(i=!1),">"===g.operator||">="===g.operator){if((p=S(e,g,c))===g&&p!==e)return!1}else if(">="===e.operator&&!b(e.semver,String(g),c))return!1;if(t)if(o&&g.semver.prerelease&&g.semver.prerelease.length&&g.semver.major===o.major&&g.semver.minor===o.minor&&g.semver.patch===o.patch&&(o=!1),"<"===g.operator||"<="===g.operator){if((d=k(t,g,c))===g&&d!==t)return!1}else if("<="===t.operator&&!b(t.semver,String(g),c))return!1;if(!g.operator&&(t||e)&&0!==r)return!1}if(e&&n&&!t&&0!==r)return!1;if(t&&a&&!e&&0!==r)return!1;if(i||o)return!1}return true})(o,i,n);if(e=e||null!==a,a)continue e}if(e)return!1}}return!0}}}),Be=e({"node_modules/semver/index.js"(M,e){var t=Z(),r=Y(),n=H(),a=te(),o=re(),i=ne(),s=ae(),l=oe(),c=ie(),u=se(),p=le(),d=ce(),h=ue(),f=V(),m=pe(),g=de(),v=he(),b=fe(),y=me(),E=ge(),w=ve(),S=be(),k=ye(),O=Ee(),C=we(),N=Se(),x=ke(),I=xe(),L=q(),R=Ie(),P=Le(),A=Re(),T=Pe(),_=Ae(),j=Te(),D=_e(),$=je(),F=Me(),B=De(),U=$e(),G=Fe();e.exports={parse:o,valid:i,clean:s,inc:l,diff:c,major:u,minor:p,patch:d,prerelease:h,compare:f,rcompare:m,compareLoose:g,compareBuild:v,sort:b,rsort:y,gt:E,lt:w,eq:S,neq:k,gte:O,lte:C,cmp:N,coerce:x,Comparator:I,Range:L,satisfies:R,toComparators:P,maxSatisfying:A,minSatisfying:T,minVersion:_,validRange:j,outside:D,gtr:$,ltr:F,intersects:B,simplifyRange:U,subset:G,SemVer:n,re:t.re,src:t.src,tokens:t.t,SEMVER_SPEC_VERSION:r.SEMVER_SPEC_VERSION,RELEASE_TYPES:r.RELEASE_TYPES,compareIdentifiers:a.compareIdentifiers,rcompareIdentifiers:a.rcompareIdentifiers}}}),r=e({"node_modules/chroma-js/chroma.js"(e,t){var r;r=function(){"use strict";for(var e=function(e,t,r){return void 0===r&&(r=1),e<(t=void 0===t?0:t)?t:r>16,t>>8&255,255&t,1];if(e.match(tt))return 4===(e=5!==e.length&&9!==e.length?e:e.substr(1)).length&&(e=(e=e.split(""))[0]+e[0]+e[1]+e[1]+e[2]+e[2]+e[3]+e[3]),[(t=parseInt(e,16))>>24&255,t>>16&255,t>>8&255,Math.round((255&t)/255*100)/100];throw new Error("unknown hex color: "+e)}function Ne(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r,n,a,o=(e=ut(e,"hsi"))[0],i=e[1],s=e[2];return isNaN(o)&&(o=0),isNaN(i)&&(i=0),360m.t1?e*e*e:m.t2*(e-m.t0)}function Pe(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=(e=_t(e,"lab"))[0],n=e[1],a=e[2],r=(r+16)/116,n=isNaN(n)?r:r+n/500,a=isNaN(a)?r:r-a/200;return r=m.Yn*Re(r),n=m.Xn*Re(n),a=m.Zn*Re(a),[Le(3.2404542*n-1.5371385*r-.4985314*a),Le(-.969266*n+1.8760108*r+.041556*a),Le(.0556434*n-.2040259*r+1.0572252*a),3>16,e>>8&255,255&e,1];throw new Error("unknown num color: "+e)}function De(e){var t,r,n=(e=e/100)<66?(t=255,r=e<6?0:-155.25485562709179-.44596950469579133*(r=e-2)+104.49216199393888*E(r),e<20?0:.8274096064007395*(n=e-10)-254.76935184120902+115.67994401066147*E(n)):(t=351.97690566805693+.114206453784165*(t=e-55)-40.25366309332127*E(t),r=325.4494125711974+.07943456536662342*(r=e-50)-28.0852963507957*E(r),255);return[t,r,n,1]}function $e(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=(a=kr(e,"rgb"))[0],n=a[1],a=a[2],r=[xr(r/255),xr(n/255),xr(a/255)],o=Or(.4122214708*(n=r[0])+.5363325363*(a=r[1])+.0514459929*(r=r[2])),i=Or(.2119034982*n+.6806995451*a+.1073969566*r),n=Or(.0883024619*n+.2817188376*a+.6299787005*r);return[.2104542553*o+.793617785*i-.0040720468*n,1.9779984951*o-2.428592205*i+.4505937099*n,.0259040371*o+.7827717662*i-.808675766*n]}var c=l,Fe=i,u=o,Be=e.type,Ue=H,Ge=q,He=(Fe.prototype.css=function(e){return Ue(this._rgb,e)},c.css=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(Fe,[null].concat(e,["css"])))},u.format.css=Ge,u.autodetect.push({p:5,test:function(e){for(var t=[],r=arguments.length-1;0f.t3?Pt(e,1/3):e/f.t2+f.t0},m=u,_t=e.unpack,jt=Math.pow,Mt=e.unpack,Dt=e.type,c=l,$t=i,g=o,Ft=Ie,Bt=($t.prototype.lab=function(){return Ft(this._rgb)},c.lab=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply($t,[null].concat(e,["lab"])))},g.format.lab=Pe,g.autodetect.push({p:2,test:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];if(e=Mt(e,"lab"),"array"===Dt(e)&&3===e.length)return"lab"}}),e.unpack),Ut=e.RAD2DEG,Gt=Math.sqrt,Ht=Math.atan2,Vt=Math.round,qt=e.unpack,zt=Ie,Kt=Ae,Jt=e.unpack,Wt=e.DEG2RAD,Xt=Math.sin,Yt=Math.cos,Qt=e.unpack,Zt=Te,er=Pe,tr=e.unpack,rr=_e,nr=e.unpack,ar=e.type,c=l,v=i,or=o,ir=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=qt(e,"rgb"),n=r[0],a=r[1],r=r[2],n=zt(n,a,r),a=n[0],r=n[1],n=n[2];return Kt(a,r,n)},g=(v.prototype.lch=function(){return ir(this._rgb)},v.prototype.hcl=function(){return ir(this._rgb).reverse()},c.lch=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(v,[null].concat(e,["lch"])))},c.hcl=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(v,[null].concat(e,["hcl"])))},or.format.lch=_e,or.format.hcl=je,["lch","hcl"].forEach(function(r){return or.autodetect.push({p:2,test:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];if(e=nr(e,r),"array"===ar(e)&&3===e.length)return r}})}),{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflower:"#6495ed",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",laserlemon:"#ffff54",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrod:"#fafad2",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",maroon2:"#7f0000",maroon3:"#b03060",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",purple2:"#7f007f",purple3:"#a020f0",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}),c=i,b=o,sr=e.type,y=g,lr=Ce,cr=Oe,ur=(c.prototype.name=function(){for(var e=cr(this._rgb,"rgb"),t=0,r=Object.keys(y);t=a/n?i=s:o=s}return wr(s)},kr=(w.prototype.temp=w.prototype.kelvin=w.prototype.temperature=function(){return Sr(this._rgb)},c.temp=c.kelvin=c.temperature=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return new(Function.prototype.bind.apply(w,[null].concat(e,["temp"])))},b.format.temp=b.format.kelvin=b.format.temperature=De,e.unpack),Or=Math.cbrt,Cr=Math.pow,Nr=Math.sign;function xr(e){var t=Math.abs(e);return t<.04045?e/12.92:(Nr(e)||1)*Cr((t+.055)/1.055,2.4)}function Ir(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var r=(e=Lr(e,"lab"))[0],n=e[1],a=e[2],o=S(r+.3963377774*n+.2158037573*a,3),i=S(r-.1055613458*n-.0638541728*a,3),r=S(r-.0894841775*n-1.291485548*a,3);return[255*Pr(4.0767416621*o-3.3077115913*i+.2309699292*r),255*Pr(-1.2684380046*o+2.6097574011*i-.3413193965*r),255*Pr(-.0041960863*o-.7034186147*i+1.707614701*r),3=f[r];)r++;return r-1},S=function(e){return e},k=function(e){return e};return r(c),p.classes=function(e){var t;return null!=e?("array"===L(e)?d=[(f=e)[0],e[e.length-1]]:(t=I.analyze(d),f=0===e?[t.min,t.max]:I.limits(t,"e",e)),p):f},p.domain=function(r){if(!arguments.length)return d;g=r[0],v=r[r.length-1],l=[];var e=m.length;if(r.length===e&&g!==v)for(var t=0,n=Array.from(r);t=i[t+1];)t++;var r=(e-i[t])/(i[t+1]-i[t]);return o[t]+r*(o[t+1]-o[t])}))}return d=[g,v],p},p.mode=function(e){return arguments.length?(i=e,n(),p):i},p.range=function(e,t){return r(e),p},p.out=function(e){return a=e,p},p.spread=function(e){return arguments.length?(t=e,p):t},p.correctLightness=function(e){return n(),S=(e=null==e?!0:e)?function(e){for(var t=u(0,!0).lab()[0],r=u(1,!0).lab()[0],n=r 0");var l=Math.LOG10E*Jn(n),M=Math.LOG10E*Jn(a);i.push(n);for(var c=1;c.9999999)l[3]=1;return new Cn(Nn(l))}for(var d,h=e.shift(),f=h.get(o),m=[],g=0,v=0,b=0;b"}}:{children:o})),O.createElement("textarea",{ref:function(e){return t._input=e},style:S(S(S({},x.editor),x.textarea),a),className:C+(s?" ".concat(s):""),id:i,value:r,onChange:this._handleChange,onKeyDown:this._handleKeyDown,onClick:v,onKeyUp:E,onFocus:b,onBlur:y,disabled:c,form:u,maxLength:p,minLength:d,name:h,placeholder:f,readOnly:m,required:g,autoFocus:l,autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"data-gramm":!1}),O.createElement("style",{dangerouslySetInnerHTML:{__html:N}}))},s.defaultProps={tabSize:2,insertSpaces:!0,ignoreTabKey:!1,padding:0},s);function s(){var m=null!==t&&t.apply(this,arguments)||this;return m.state={capture:!0},m._recordCurrentState=function(){var e,t,r=m._input;r&&(e=r.value,t=r.selectionStart,r=r.selectionEnd,m._recordChange({value:e,selectionStart:t,selectionEnd:r}))},m._getLines=function(e,t){return e.substring(0,t).split("\n")},m._recordChange=function(e,t){void 0===t&&(t=!1);var r=m._history,n=r.stack,r=r.offset,r=(n.length&&-1=i.reach);b+=v.value.length,v=v.next){var y=v.value;if(r.length>t.length)return;if(!(y instanceof P)){var E,w=1;if(f){if(!(E=A(g,b,t,h))||E.index>=t.length)break;var S=E.index,k=E.index+E[0].length,O=b;for(O+=v.value.length;O<=S;)v=v.next,O+=v.value.length;if(O-=v.value.length,b=O,v.value instanceof P)continue;for(var C=v;C!==r.tail&&(Oi.reach&&(i.reach=y),v.prev),x=(x&&(L=T(r,L,x),b+=x.length),_(r,L,w),new P(s,d?R.tokenize(N,d):N,m,N));v=T(r,L,x),I&&T(r,v,I),1i.reach&&(i.reach=N.reach)}}}}}(e,a,t,a.head,0),a),i=[],s=o.head.next;s!==o.tail;)i.push(s.value),s=s.next;return i},hooks:{all:{},add:function(e,t){var r=R.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=R.hooks.all[e];if(r&&r.length)for(var n,a=0;n=r[a++];)n(t)}},Token:P},l.Prism=R,P.stringify=function t(e,r){if("string"==typeof e)return e;var n;if(Array.isArray(e))return n="",e.forEach(function(e){n+=t(e,r)}),n;var a,o={type:e.type,content:t(e.content,r),tag:"span",classes:["token",e.type],attributes:{},language:r},e=e.alias,i=(e&&(Array.isArray(e)?Array.prototype.push.apply(o.classes,e):o.classes.push(e)),R.hooks.run("wrap",o),"");for(a in o.attributes)i+=" "+a+'="'+(o.attributes[a]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+i+">"+o.content+""},l.document?((a=R.util.currentScript())&&(R.filename=a.src,a.hasAttribute("data-manual"))&&(R.manual=!0),R.manual||("loading"===(o=document.readyState)||"interactive"===o&&a&&a.defer?document.addEventListener("DOMContentLoaded",i):window.requestAnimationFrame?window.requestAnimationFrame(i):window.setTimeout(i,16))):l.addEventListener&&!R.disableWorkerMessageHandler&&l.addEventListener("message",function(e){var e=JSON.parse(e.data),t=e.language,r=e.code,e=e.immediateClose;l.postMessage(R.highlight(r,R.languages[t],t)),e&&l.close()},!1),R);function P(e,t,r,n){this.type=e,this.content=t,this.alias=r,this.length=0|(n||"").length}function A(e,t,r,n){e.lastIndex=t;t=e.exec(r);return t&&n&&t[1]&&(e=t[1].length,t.index+=e,t[0]=t[0].slice(e)),t}function c(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function T(e,t,r){var n=t.next,r={value:r,prev:t,next:n};return t.next=r,n.prev=r,e.length++,r}function _(e,t,r){for(var n=t.next,a=0;aconsole.error("SEMVER",...e):()=>{};t.exports=r}}),ze=e({"node_modules/spcr-whats-new/node_modules/semver/internal/constants.js"(e,t){var r=Number.MAX_SAFE_INTEGER||9007199254740991;t.exports={SEMVER_SPEC_VERSION:"2.0.0",MAX_LENGTH:256,MAX_SAFE_INTEGER:r,MAX_SAFE_COMPONENT_LENGTH:16}}}),Ke=e({"node_modules/spcr-whats-new/node_modules/semver/internal/re.js"(e,t){var r=ze()["MAX_SAFE_COMPONENT_LENGTH"],a=qe(),o=(e=t.exports={}).re=[],i=e.src=[],s=e.t={},l=0,t=(e,t,r)=>{var n=l++;a(e,n,t),s[e]=n,i[n]=t,o[n]=new RegExp(t,r?"g":void 0)};t("NUMERICIDENTIFIER","0|[1-9]\\d*"),t("NUMERICIDENTIFIERLOOSE","[0-9]+"),t("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*"),t("MAINVERSION",`(${i[s.NUMERICIDENTIFIER]})\\.(${i[s.NUMERICIDENTIFIER]})\\.(${i[s.NUMERICIDENTIFIER]})`),t("MAINVERSIONLOOSE",`(${i[s.NUMERICIDENTIFIERLOOSE]})\\.(${i[s.NUMERICIDENTIFIERLOOSE]})\\.(${i[s.NUMERICIDENTIFIERLOOSE]})`),t("PRERELEASEIDENTIFIER",`(?:${i[s.NUMERICIDENTIFIER]}|${i[s.NONNUMERICIDENTIFIER]})`),t("PRERELEASEIDENTIFIERLOOSE",`(?:${i[s.NUMERICIDENTIFIERLOOSE]}|${i[s.NONNUMERICIDENTIFIER]})`),t("PRERELEASE",`(?:-(${i[s.PRERELEASEIDENTIFIER]}(?:\\.${i[s.PRERELEASEIDENTIFIER]})*))`),t("PRERELEASELOOSE",`(?:-?(${i[s.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${i[s.PRERELEASEIDENTIFIERLOOSE]})*))`),t("BUILDIDENTIFIER","[0-9A-Za-z-]+"),t("BUILD",`(?:\\+(${i[s.BUILDIDENTIFIER]}(?:\\.${i[s.BUILDIDENTIFIER]})*))`),t("FULLPLAIN",`v?${i[s.MAINVERSION]}${i[s.PRERELEASE]}?${i[s.BUILD]}?`),t("FULL",`^${i[s.FULLPLAIN]}$`),t("LOOSEPLAIN",`[v=\\s]*${i[s.MAINVERSIONLOOSE]}${i[s.PRERELEASELOOSE]}?${i[s.BUILD]}?`),t("LOOSE",`^${i[s.LOOSEPLAIN]}$`),t("GTLT","((?:<|>)?=?)"),t("XRANGEIDENTIFIERLOOSE",i[s.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*"),t("XRANGEIDENTIFIER",i[s.NUMERICIDENTIFIER]+"|x|X|\\*"),t("XRANGEPLAIN",`[v=\\s]*(${i[s.XRANGEIDENTIFIER]})(?:\\.(${i[s.XRANGEIDENTIFIER]})(?:\\.(${i[s.XRANGEIDENTIFIER]})(?:${i[s.PRERELEASE]})?${i[s.BUILD]}?)?)?`),t("XRANGEPLAINLOOSE",`[v=\\s]*(${i[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${i[s.XRANGEIDENTIFIERLOOSE]})(?:${i[s.PRERELEASELOOSE]})?${i[s.BUILD]}?)?)?`),t("XRANGE",`^${i[s.GTLT]}\\s*${i[s.XRANGEPLAIN]}$`),t("XRANGELOOSE",`^${i[s.GTLT]}\\s*${i[s.XRANGEPLAINLOOSE]}$`),t("COERCE",`(^|[^\\d])(\\d{1,${r}})(?:\\.(\\d{1,${r}}))?(?:\\.(\\d{1,${r}}))?(?:$|[^\\d])`),t("COERCERTL",i[s.COERCE],!0),t("LONETILDE","(?:~>?)"),t("TILDETRIM",`(\\s*)${i[s.LONETILDE]}\\s+`,!0),e.tildeTrimReplace="$1~",t("TILDE",`^${i[s.LONETILDE]}${i[s.XRANGEPLAIN]}$`),t("TILDELOOSE",`^${i[s.LONETILDE]}${i[s.XRANGEPLAINLOOSE]}$`),t("LONECARET","(?:\\^)"),t("CARETTRIM",`(\\s*)${i[s.LONECARET]}\\s+`,!0),e.caretTrimReplace="$1^",t("CARET",`^${i[s.LONECARET]}${i[s.XRANGEPLAIN]}$`),t("CARETLOOSE",`^${i[s.LONECARET]}${i[s.XRANGEPLAINLOOSE]}$`),t("COMPARATORLOOSE",`^${i[s.GTLT]}\\s*(${i[s.LOOSEPLAIN]})$|^$`),t("COMPARATOR",`^${i[s.GTLT]}\\s*(${i[s.FULLPLAIN]})$|^$`),t("COMPARATORTRIM",`(\\s*)${i[s.GTLT]}\\s*(${i[s.LOOSEPLAIN]}|${i[s.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace="$1$2$3",t("HYPHENRANGE",`^\\s*(${i[s.XRANGEPLAIN]})\\s+-\\s+(${i[s.XRANGEPLAIN]})\\s*$`),t("HYPHENRANGELOOSE",`^\\s*(${i[s.XRANGEPLAINLOOSE]})\\s+-\\s+(${i[s.XRANGEPLAINLOOSE]})\\s*$`),t("STAR","(<|>)?=?\\s*\\*"),t("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),t("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}}),Je=e({"node_modules/spcr-whats-new/node_modules/semver/internal/parse-options.js"(e,t){var r=["includePrerelease","loose","rtl"];t.exports=t=>t?"object"!=typeof t?{loose:!0}:r.filter(e=>t[e]).reduce((e,t)=>(e[t]=!0,e),{}):{}}}),We=e({"node_modules/spcr-whats-new/node_modules/semver/internal/identifiers.js"(e,t){var a=/^[0-9]+$/,r=(e,t)=>{var r=a.test(e),n=a.test(t);return r&&n&&(e=+e,t=+t),e===t?0:r&&!n||(!n||r)&&er(t,e)}}}),Xe=e({"node_modules/spcr-whats-new/node_modules/semver/classes/semver.js"(e,t){var a=qe(),{MAX_LENGTH:r,MAX_SAFE_INTEGER:n}=ze(),{re:o,t:i}=Ke(),s=Je(),l=We()["compareIdentifiers"],c=class{constructor(e,t){if(t=s(t),e instanceof c){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>r)throw new TypeError(`version is longer than ${r} characters`);a("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;t=e.trim().match(t.loose?o[i.LOOSE]:o[i.FULL]);if(!t)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+t[1],this.minor=+t[2],this.patch=+t[3],this.major>n||this.major<0)throw new TypeError("Invalid major version");if(this.minor>n||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>n||this.patch<0)throw new TypeError("Invalid patch version");t[4]?this.prerelease=t[4].split(".").map(e=>{if(/^[0-9]+$/.test(e)){var t=+e;if(0<=t&&tnew n(e,r).compare(new n(t,r))}}),Qe=e({"node_modules/spcr-whats-new/node_modules/semver/functions/gt.js"(e,t){var n=Ye();t.exports=(e,t,r)=>0function(){return Qa.default.createElement(Ya,null)}};for(T in tt)j(et,T,{get:tt[T],enumerable:!0});var rt=t(b());function R(e){return(R="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function nt(e){e=function(e,t){if("object"!==R(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0===r)return("string"===t?String:Number)(e);if("object"!==R(r=r.call(e,t||"default")))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}(e,"string");return"symbol"===R(e)?e:String(e)}function at(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r":">",'"':""","'":"'","/":"/"};function Ct(e){return"string"==typeof e?e.replace(/[&<>"'\/]/g,function(e){return Ot[e]}):e}var Nt="undefined"!=typeof window&&window.navigator&&void 0===window.navigator.userAgentData&&window.navigator.userAgent&&-1i+s;)s++,c=o[l=a.slice(i,i+s).join(n)];if(void 0===c)return;if(null===c)return null;if(t.endsWith(l)){if("string"==typeof c)return c;if(l&&"string"==typeof c[l])return c[l]}var u=a.slice(i+s).join(n);return u?It(c,u,n):void 0}o=o[a[i]]}return o}}function Lt(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function Rt(t){for(var e=1;e=p.maxReplaces)break}var r,n}),a}},{key:"nest",value:function(e,t){var r,n=this,a=2=this.maxParallelReads)this.waitingReads.push({lng:n,ns:a,fcName:o,tried:s,wait:l,callback:c});else{this.readingCalls++;function t(e,t){var r;i.readingCalls--,0",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"};function Lr(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function Rr(t){for(var e=1;e{t=localStorage.getItem(t);if(!t)return e;try{return JSON.parse(t)}catch(e){return t}},vn=e=>{const r={section:/^\s*\[\s*([^\]]*)\s*\]\s*$/,param:/^\s*([^=]+?)\s*=\s*(.*?)\s*$/,comment:/^\s*;.*$/},n={};e=e.split(/[\r\n]+/);let a=null;return e.forEach(function(e){var t;r.comment.test(e)||(r.param.test(e)?e.includes("xrdb")?(delete n[null!=a?a:""],a=null):(t=e.match(r.param),a&&t&&(n[a][t[1]]=t[2].split(";")[0].trim())):r.section.test(e)?(t=e.match(r.section))&&(n[t[1]]={},a=t[1]):0==e.length&&(a=a&&null))}),n},bn=e=>{var t=document.querySelector("style.marketplaceSnippets"),t=(t&&t.remove(),document.createElement("style")),e=e.reduce((e,t)=>e=(e+=`/* ${t.title} - ${t.description} */ +`)+t.code+` +`,"");t.innerHTML=e,t.classList.add("marketplaceSnippets"),document.body.appendChild(t)},yn=(e,t)=>{let r=[];return e&&0({name:e.name,url:xn(e.url)})):r.push({name:t,url:"https://github.com/"+t}),r},En=e=>e?Object.keys(e).map(e=>({key:e,value:e})):[],wn=(...e)=>{console.debug("Resetting Marketplace");const t=[];0===e.length&&Object.keys(localStorage).forEach(e=>{e.startsWith("marketplace:")&&t.push(e)}),e.forEach(e=>{"extensions"===e?(t.push(...w(E.installedExtensions,[])),t.push(E.installedExtensions)):"snippets"===e?(t.push(...w(E.installedSnippets,[])),t.push(E.installedSnippets)):"theme"===e&&(t.push(...w(E.installedThemes,[])),t.push(E.installedThemes),t.push(E.themeInstalled))}),t.forEach(e=>{localStorage.removeItem(e),console.debug("Removed "+e)}),console.debug("Marketplace has been reset"),location.reload()},Sn=r=>{var e=document.querySelector("style.marketplaceCSS.marketplaceScheme");if(e&&e.remove(),r){e=document.createElement("style");e.classList.add("marketplaceCSS"),e.classList.add("marketplaceScheme");let t=":root {";Object.keys(r).forEach(e=>{t=(t+=`--spice-${e}: #${r[e]};`)+`--spice-rgb-${e}: ${(e=>{if(3===e.length)e=e.split("").map(e=>e+e).join("");else{if(6!=e.length)throw"Only 3- or 6-digit hex colours are allowed.";if(e.match(/[^0-9a-f]/i))throw"Only hex colours are allowed."}e=e.match(/.{1,2}/g);if(e&&3===e.length)return[parseInt(e[0],16),parseInt(e[1],16),parseInt(e[2],16)];throw"Could not parse hex colour."})(r[e])};`}),t+="}",e.innerHTML=t,document.body.appendChild(e)}},kn=e=>{try{var t,r,n=document.querySelector("link[href='user.css']"),a=(n&&n.remove(),document.querySelector("style.marketplaceCSS.marketplaceUserCSS"));a&&a.remove(),e?((t=document.createElement("style")).classList.add("marketplaceCSS"),t.classList.add("marketplaceUserCSS"),t.innerHTML=e,document.body.appendChild(t)):((r=document.createElement("link")).setAttribute("rel","stylesheet"),r.setAttribute("href","user.css"),r.classList.add("userCSS"),document.body.appendChild(r))}catch(e){console.warn(e)}},On=async e=>{if(!e.cssURL)throw new Error("No CSS URL provided");var e=(e=>{const t=new URL(e);return t.host,t.host==="raw.githubusercontent.com"})(e.cssURL)?`https://cdn.jsdelivr.net/gh/${e.user}/${e.repo}@${e.branch}/`+e.manifest.usercss:e.cssURL,t=e.replace("/user.css","/assets/");console.debug("Parsing CSS: ",e);let r=await fetch(e+"?time="+Date.now()).then(e=>e.text());for(const o of r.matchAll(new RegExp(`url\\(['|"](?.+?)['|"]\\)`,"gm"))||[]){var n,a=null==(a=null==o?void 0:o.groups)?void 0:a.path;!a||a.startsWith("http")||a.startsWith("data")||(n=t+a.replace(/\.\//g,""),r=r.replace(a,n))}return r};async function Cn(e,t,r){try{var n={text:e,context:t+"/"+r,mode:"gfm"},a=await fetch("https://api.github.com/markdown",{method:"POST",body:JSON.stringify(n)});if(a.ok)return await a.text();throw Spicetify.showNotification(`Error parsing markdown (HTTP ${a.status})`,!0)}catch(e){return null}}function Nn(e){var t,r="snippet"===e.type?"snippet:":`${e.item.user}/${e.item.repo}/`;let n;switch(e.type){case"snippet":n=e.item.title.replaceAll(" ","-");break;case"theme":n=(null==(t=e.item.manifest)?void 0:t.usercss)||"";break;case"extension":n=(null==(t=e.item.manifest)?void 0:t.main)||"";break;case"app":n=(null==(t=null==(t=e.item.manifest)?void 0:t.name)?void 0:t.replaceAll(" ","-"))||""}return"marketplace:installed:"+r+n}var xn=e=>{var t=decodeURI(e).trim().toLowerCase();return t.startsWith("javascript:")||t.startsWith("data:")||t.startsWith("vbscript:")?"about:blank":e},In=t(b()),v=t(b()),Ln=t(Ue()),Rn=t(Ge()),Pn=(Be=Prism,r=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,Be.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+r.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+r.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+r.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+r.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:r,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},Be.languages.css.atrule.inside.rest=Be.languages.css,(r=Be.languages.markup)&&(r.tag.addInlined("style","css"),r.tag.addAttribute("style","css")),t(b())),An="button-module__button___hf2qg_marketplace",Tn="button-module__circle___EZ88P_marketplace",S=e=>{var t=e.type||"round",r=[An];return"circle"===t&&r.push(Tn),e.classes&&r.push(...e.classes),Pn.default.createElement("button",{className:r.join(" "),onClick:e.onClick,"aria-label":e.label||"",disabled:e.disabled},e.children)},_n=n=>{var e,t="marketplace-customCSS-preview";const[a,r]=v.default.useState("ADD_SNIPPET"!==n.type&&(null==(e=n.content)?void 0:e.item.code)||""),[o,i]=v.default.useState("ADD_SNIPPET"!==n.type&&(null==(e=n.content)?void 0:e.item.title)||""),[s,l]=v.default.useState("ADD_SNIPPET"!==n.type&&(null==(e=n.content)?void 0:e.item.description)||""),[c,u]=v.default.useState("ADD_SNIPPET"!==n.type&&(null==(e=n.content)?void 0:e.item.imageURL)||""),p=()=>o.replace(/\n/g,"").replaceAll(" ","-");const d="marketplace:installed:snippet:"+p(),[h,f]=v.default.useState(!!w(d));let m;return v.default.createElement("div",{id:"marketplace-add-snippet-container"},v.default.createElement("div",{className:"marketplace-customCSS-input-container"},v.default.createElement("label",{htmlFor:"marketplace-custom-css"},g("snippets.customCSS")),v.default.createElement("div",{className:"marketplace-code-editor-wrapper marketplace-code-editor"},v.default.createElement(Ln.default,{value:a,onValueChange:e=>r(e),highlight:e=>(0,Rn.highlight)(e,Rn.languages.css),textareaId:"marketplace-custom-css",textareaClassName:"snippet-code-editor",readOnly:"VIEW_SNIPPET"===n.type,placeholder:g("snippets.customCSSPlaceholder"),style:{}}))),v.default.createElement("div",{className:"marketplace-customCSS-input-container"},v.default.createElement("label",{htmlFor:"marketplace-customCSS-name-submit"},g("snippets.snippetName")),v.default.createElement("input",{id:"marketplace-customCSS-name-submit",className:"marketplace-code-editor",value:o,onChange:e=>{"VIEW_SNIPPET"!==n.type&&i(e.target.value)},placeholder:g("snippets.snippetNamePlaceholder")})),v.default.createElement("div",{className:"marketplace-customCSS-input-container"},v.default.createElement("label",{htmlFor:"marketplace-customCSS-description-submit"},g("snippets.snippetDesc")),v.default.createElement("input",{id:"marketplace-customCSS-description-submit",className:"marketplace-code-editor",value:s,onChange:e=>{"VIEW_SNIPPET"!==n.type&&l(e.target.value)},placeholder:g("snippets.snippetDescPlaceholder")})),v.default.createElement("div",{className:"marketplace-customCSS-input-container"},v.default.createElement("label",{htmlFor:t},g("snippets.snippetPreview")," ","VIEW_SNIPPET"!==n.type&&`(${g("snippets.optional")})`),c&&v.default.createElement("label",{htmlFor:t,style:{textAlign:"center"}},v.default.createElement("img",{className:"marketplace-customCSS-image-preview",src:c,alt:"Preview"}))),"VIEW_SNIPPET"!==n.type&&v.default.createElement(v.default.Fragment,null,v.default.createElement(S,{onClick:()=>{m.click()}},c.length?g("snippets.changeImage"):g("snippets.addImage"),v.default.createElement("input",{id:t,type:"file",style:{display:"none"},ref:e=>m=e,onChange:async e=>{var t,r,n;if(null!=(t=e.target.files)&&t[0])try{n=null==(r=e.target.files)?void 0:r[0];var a=await new Promise((e,t)=>{const r=new FileReader;r.readAsDataURL(n),r.onload=()=>{e(r.result)},r.onerror=e=>{t(e)}});a&&u(a)}catch(e){console.error(e)}}})),v.default.createElement(S,{onClick:()=>{var e,t=p(),r=s.trim();h&&"EDIT_SNIPPET"!==n.type?Spicetify.showNotification("That name is already taken!",!0):(console.debug("Installing snippet: "+t),n.content&&n.content.item.title!==t&&(console.debug("Deleting outdated snippet: "+n.content.item.title),localStorage.removeItem("marketplace:installed:snippet:"+n.content.item.title),e=w(E.installedSnippets,[]).filter(e=>{return e!=="marketplace:installed:snippet:"+(null==(e=n.content)?void 0:e.item.title)}),localStorage.setItem(E.installedSnippets,JSON.stringify(e))),localStorage.setItem(d,JSON.stringify({title:t,code:a,description:r,imageURL:c,custom:!0})),-1===(e=w(E.installedSnippets,[])).indexOf(d)&&(e.push(d),localStorage.setItem(E.installedSnippets,JSON.stringify(e))),t=e.map(e=>w(e)),bn(t),Spicetify.PopupModal.hide(),"EDIT_SNIPPET"===n.type&&location.reload())},disabled:!p()||!a.replace(/\n/g,"\\n")},g("snippets.saveCSS"))),"VIEW_SNIPPET"===n.type&&v.default.createElement(S,{onClick:()=>{n.callback&&n.callback(),f(!h)}},h?g("remove"):g("install")))},jn=t(b()),Mn=()=>jn.default.createElement("div",{id:"marketplace-reload-container"},jn.default.createElement("p",null,g("reloadModal.description")),jn.default.createElement("div",{className:"marketplace-reload-modal__button-container"},jn.default.createElement(S,{onClick:()=>{Spicetify.PopupModal.hide(),location.reload()}},g("reloadModal.reloadNow")),jn.default.createElement(S,{onClick:()=>{Spicetify.PopupModal.hide()}},g("reloadModal.reloadLater")))),k=t(b()),O=t(b()),Dn=t(b()),$n="toggle-module__toggle-wrapper___ocE5z_marketplace",Fn="toggle-module__disabled___OYAYf_marketplace",Bn="toggle-module__toggle-input___ceLM4_marketplace",Un="toggle-module__toggle-indicator-wrapper___6Lcp0_marketplace",Gn="toggle-module__toggle-indicator___nCxwE_marketplace",Hn=e=>{var t="toggle:"+e.storageKey,r=[$n];return!1===e.clickable&&r.push(Fn),Dn.default.createElement("label",{className:r.join(" ")},Dn.default.createElement("input",{className:Bn,type:"checkbox",checked:e.enabled,"data-storage-key":e.storageKey,id:t,title:"Toggle for "+e.storageKey,onChange:e.onChange}),Dn.default.createElement("span",{className:Un},Dn.default.createElement("span",{className:Gn})))},Vn=t(b()),qn=t(Ve()),zn=t=>{var e=t.sortBoxOptions.map(e=>({value:e.key,label:e.value})),r=t.sortBoxOptions.find(t.sortBySelectedFn);return Vn.default.createElement("div",{className:"marketplace-sortBox"},Vn.default.createElement("div",{className:"marketplace-sortBox-header"},Vn.default.createElement("div",{className:"marketplace-sortBox-header-title"}),Vn.default.createElement(qn.default,{placeholder:"Select an option",options:e,value:null==r?void 0:r.key,onChange:e=>{t.onChange(e.value)}})))},Kn=t(b()),Jn=()=>Kn.default.createElement("svg",{role:"img",height:"16",width:"16",className:"Svg-sc-ytk21e-0 uPxdw nW1RKQOkzcJcX6aDCZB4",viewBox:"0 0 16 16"},Kn.default.createElement("path",{d:"M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM0 8a8 8 0 1116 0A8 8 0 010 8z"}),Kn.default.createElement("path",{d:"M7.25 12.026v-1.5h1.5v1.5h-1.5zm.884-7.096A1.125 1.125 0 007.06 6.39l-1.431.448a2.625 2.625 0 115.13-.784c0 .54-.156 1.015-.503 1.488-.3.408-.7.652-.973.818l-.112.068c-.185.116-.26.203-.302.283-.046.087-.097.245-.097.57h-1.5c0-.47.072-.898.274-1.277.206-.385.507-.645.827-.846l.147-.092c.285-.177.413-.257.526-.41.169-.23.213-.397.213-.602 0-.622-.503-1.125-1.125-1.125z"})),Wn=window.Spicetify,Xn=r=>{var e=r.type,t="dropdown"===e?"dropdown:"+r.storageKey:"toggle:"+r.storageKey,n=!!r.modalConfig.visual[r.storageKey];return void 0!==r.description&&null!==r.description||(r.description=""),"dropdown"===e&&r.options?O.default.createElement("div",{className:"setting-row"},O.default.createElement("label",{htmlFor:t,className:"col description"},r.name),O.default.createElement("div",{className:"col action"},O.default.createElement(zn,{sortBoxOptions:r.options.map(e=>({key:e,value:e})),onChange:e=>{return e=e,t=r.storageKey,r.modalConfig.visual[t]=e,localStorage.setItem("marketplace:"+t,String(e)),void r.updateConfig(r.modalConfig);var t},sortBySelectedFn:e=>e.key==r.modalConfig.visual[r.storageKey]}),O.default.createElement(Wn.ReactComponent.TooltipWrapper,{label:O.default.createElement(O.default.Fragment,null,r.description.split("\n").map(e=>O.default.createElement(O.default.Fragment,null,e,O.default.createElement("br",null)))),renderInline:!0,showDelay:10,placement:"top",labelClassName:"marketplace-settings-tooltip",disabled:!1},O.default.createElement("div",{className:"marketplace-tooltip-icon"},O.default.createElement(Jn,null))))):O.default.createElement("div",{className:"setting-row"},O.default.createElement("label",{htmlFor:t,className:"col description"},r.name),O.default.createElement("div",{className:"col action"},O.default.createElement(Hn,{name:r.name,storageKey:r.storageKey,enabled:n,onChange:e=>{var t=e.target.checked,e=e.target.dataset.storageKey;r.modalConfig.visual[e]=t,console.debug(`toggling ${e} to `+t),localStorage.setItem("marketplace:"+e,String(t)),r.updateConfig(r.modalConfig)}})))},Yn=t(b()),Qn=n=>{var e="toggle:"+n.name;const t=n.modalConfig.tabs.reduce((e,t,r)=>t.name===n.name?r:e,-1);var r=n.modalConfig.tabs[t]["enabled"];function a(e,t){var t=e+t,r=n.modalConfig.tabs[t];n.modalConfig.tabs[t]=n.modalConfig.tabs[e],n.modalConfig.tabs[e]=r,localStorage.setItem(E.tabs,JSON.stringify(n.modalConfig.tabs)),n.updateConfig(n.modalConfig)}return Yn.default.createElement("div",{className:"setting-row"},Yn.default.createElement("label",{htmlFor:e,className:"col description"},g("tabs."+n.name)),Yn.default.createElement("div",{className:"col action"},Yn.default.createElement("button",{title:"Move up",className:"arrow-btn",disabled:0===t,onClick:()=>a(t,-1)},Yn.default.createElement("svg",{height:"16",width:"16",viewBox:"0 0 16 16",fill:"currentColor",dangerouslySetInnerHTML:{__html:String(Spicetify.SVGIcons["chart-up"])}})),Yn.default.createElement("button",{title:"Move down",className:"arrow-btn",disabled:t===n.modalConfig.tabs.length-1,onClick:()=>a(t,1)},Yn.default.createElement("svg",{height:"16",width:"16",viewBox:"0 0 16 16",fill:"currentColor",dangerouslySetInnerHTML:{__html:String(Spicetify.SVGIcons["chart-down"])}})),Yn.default.createElement(Hn,{name:n.name,storageKey:"tab:"+n.name,clickable:"Extensions"!==n.name,enabled:r,onChange:e=>{n.modalConfig.tabs[t].enabled=e.target.checked,localStorage.setItem(E.tabs,JSON.stringify(n.modalConfig.tabs)),n.updateConfig(n.modalConfig)}})))},Zn=async()=>{const e=new MutationObserver(async()=>{var t;document.querySelector(".GenericModal[aria-label='Settings']")||(t=100,await new Promise(e=>setTimeout(e,t)),ca("BACKUP"),e.disconnect())});e.observe(document.body,{childList:!0,subtree:!0}),Spicetify.PopupModal.hide()},ea=({CONFIG:e,updateAppConfig:t})=>{const[r,n]=k.default.useState(l({},e)),[a,o]=k.default.useState(g("settings.versionBtn")),i=e=>{t(l({},e)),n(l({},e))};e=document.querySelector("body > generic-modal button.main-trackCreditsModal-closeBtn");const s=document.querySelector("body > generic-modal > div");e&&s&&(e.onclick=()=>location.reload(),e.setAttribute("style","cursor: pointer;"),s.onclick=e=>{e.target===s&&location.reload()});e=w(E.albumArtBasedColor)?k.default.createElement(k.default.Fragment,null,k.default.createElement(Xn,{name:g("settings.albumArtBasedColorsMode"),storageKey:"albumArtBasedColorsMode",modalConfig:r,updateConfig:i,type:"dropdown",options:["monochromeDark","monochromeLight","analogicComplement","analogic","triad","quad"],description:g("settings.almbumArtColorsModeToolTip")}),k.default.createElement(Xn,{name:g("settings.albumArtBasedColorsVibrancy"),storageKey:"albumArtBasedColorsVibrancy",modalConfig:r,updateConfig:i,type:"dropdown",options:["desaturated","lightVibrant","prominent","vibrant"],description:g("settings.albumArtBasedColorsVibrancyToolTip")})):null;return k.default.createElement("div",{id:"marketplace-config-container"},k.default.createElement("h2",null,g("settings.optionsHeading")),k.default.createElement(Xn,{name:g("settings.starCountLabel"),storageKey:"stars",modalConfig:r,updateConfig:i}),k.default.createElement(Xn,{name:g("settings.tagsLabel"),storageKey:"tags",modalConfig:r,updateConfig:i}),k.default.createElement(Xn,{name:g("settings.devToolsLabel"),storageKey:"themeDevTools",modalConfig:r,updateConfig:i}),k.default.createElement(Xn,{name:g("settings.hideInstalledLabel"),storageKey:"hideInstalled",modalConfig:r,updateConfig:i}),k.default.createElement(Xn,{name:g("settings.colourShiftLabel"),storageKey:"colorShift",modalConfig:r,updateConfig:i}),k.default.createElement(Xn,{name:g("settings.albumArtBasedColors"),storageKey:"albumArtBasedColors",modalConfig:r,updateConfig:i}),e,k.default.createElement("h2",null,g("settings.tabsHeading")),k.default.createElement("div",{className:"tabs-container"},r.tabs.map(({name:e},t)=>k.default.createElement(Qn,{key:t,name:e,modalConfig:r,updateConfig:i}))),k.default.createElement("h2",null,g("settings.resetHeading")),k.default.createElement("div",{className:"setting-row"},k.default.createElement("label",{className:"col description"},g("settings.resetDescription")),k.default.createElement("div",{className:"col action"},k.default.createElement(S,{onClick:wn},g("settings.resetBtn")))),k.default.createElement("h2",null,g("settings.backupHeading")),k.default.createElement("div",{className:"setting-row"},k.default.createElement("label",{className:"col description"},g("settings.backupLabel")),k.default.createElement("div",{className:"col action"},k.default.createElement(S,{onClick:Zn},g("settings.backupBtn")))),k.default.createElement("h2",null,g("settings.versionHeading")),k.default.createElement("div",{className:"setting-row"},k.default.createElement("label",{className:"col description"},g("grid.spicetifyMarketplace")," ",dn),k.default.createElement("div",{className:"col action"},k.default.createElement(S,{onClick:()=>{Spicetify.Platform.ClipboardAPI.copy(dn),o(g("settings.versionCopied")),setTimeout(()=>o(g("settings.versionBtn")),3e3)}},a))))},C=t(b()),ta=t(Ue()),ra=t(Ge()),na=(Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/},localStorage.getItem(E.themeInstalled)),aa=na?w(na):null,oa=()=>{const[r,t]=C.default.useState(aa?(e=>{let t="";for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r))if("object"==typeof e[r]){t+=`[${r}] +`;for(const n in e[r])Object.prototype.hasOwnProperty.call(e[r],n)&&(t+=`${n}=${e[r][n]} +`)}else t+=`${r}=${e[r]} +`;return t})(aa.schemes):g("devTools.noThemeInstalled"));return C.default.createElement("div",{id:"marketplace-theme-dev-tools-container",className:"marketplace-theme-dev-tools-container"},C.default.createElement("div",{className:"devtools-column"},C.default.createElement("label",{htmlFor:"color-ini-editor"},C.default.createElement("h2",{className:"devtools-heading"},g("devTools.colorIniEditor"))),C.default.createElement("div",{className:"marketplace-code-editor-wrapper marketplace-code-editor"},C.default.createElement(ta.default,{value:r,onValueChange:e=>t(e),highlight:e=>(0,ra.highlight)(e,ra.languages.ini),textareaId:"color-ini-editor",textareaClassName:"color-ini-editor",readOnly:!aa,placeholder:g("devTools.colorIniEditorPlaceholder"),style:{fontFamily:"monospace",resize:"none"}})),C.default.createElement(S,{onClick:()=>{var e=r;{var t;na?(t=vn(e),aa.schemes=t,localStorage.setItem(na,JSON.stringify(aa))):Spicetify.showNotification(g("devTools.noThemeManifest"),!0)}}},g("save"))),C.default.createElement("div",{className:"devtools-column"},C.default.createElement("h2",{className:"devtools-heading"},g("devTools.invalidCSS")),C.default.createElement("div",{className:"marketplace-code-editor-wrapper marketplace-code-editor"},function(){var e=null==(e=document.querySelector("body > style.marketplaceCSS.marketplaceUserCSS"))?void 0:e.innerHTML,t=new RegExp(".-?[_a-zA-Z]+[_a-zA-Z0-9-]*\\s*{","g");if(!e)return["Error: Class name list not found; please create an issue"];var r=[];for(const o of e.matchAll(t)){var n=o[0].replace(/{/g,"").trim(),a=n.split(" ");let t;for(let e=0;eC.default.createElement("div",{key:t,className:"invalid-css-text"},e)))))},N=t(b()),ia=t(Ue()),sa=t(Ge()),la=(Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json,()=>{const[e,t]=N.default.useState("");const r=t=>{if(t){let e;try{e=JSON.parse(t)}catch(e){return void Spicetify.showNotification(g("backupModal.invalidJSON"))}var r;r=e,console.debug("Importing Marketplace"),wn(),Object.keys(r).forEach(e=>{localStorage.setItem(e,r[e]),console.debug("Imported "+e)}),location.reload()}else Spicetify.showNotification(g("backupModal.noDataPasted"))};return N.default.createElement("div",{id:"marketplace-backup-container"},N.default.createElement("div",{className:"marketplace-backup-input-container"},N.default.createElement("label",{htmlFor:"marketplace-backup"},g("backupModal.inputLabel")),N.default.createElement("div",{className:"marketplace-code-editor-wrapper marketplace-code-editor"},N.default.createElement(ia.default,{value:e,onValueChange:e=>t(e),highlight:e=>(0,sa.highlight)(e,sa.languages.css),textareaId:"marketplace-import-text",textareaClassName:"import-textarea",readOnly:!1,className:"marketplace-code-editor-textarea",placeholder:g("backupModal.inputPlaceholder"),style:{}}))),N.default.createElement(N.default.Fragment,null,N.default.createElement(S,{classes:["marketplace-backup-button"],onClick:()=>{var e=(()=>{const t={};return Object.keys(localStorage).forEach(e=>{e.startsWith("marketplace:")&&(t[e]=localStorage.getItem(e))}),t})();Spicetify.Platform.ClipboardAPI.copy(JSON.stringify(e)),Spicetify.showNotification(g("backupModal.settingsCopied")),Spicetify.PopupModal.hide()}},g("backupModal.exportBtn")),N.default.createElement(S,{classes:["marketplace-backup-button"],onClick:()=>{r(e)}},g("backupModal.importBtn")),N.default.createElement(S,{classes:["marketplace-backup-button"],onClick:async()=>{var e=await(await(await window.showOpenFilePicker())[0].getFile()).text();r(e)}},g("backupModal.fileImportBtn"))))}),ca=(e,t,r,n,a)=>{e=((e,t,r,n,a)=>{switch(e){case"ADD_SNIPPET":return{title:g("snippets.addTitle"),content:In.default.createElement(_n,{type:e}),isLarge:!0};case"EDIT_SNIPPET":return{title:g("snippets.editTitle"),content:In.default.createElement(_n,{type:e,content:n}),isLarge:!0};case"VIEW_SNIPPET":return{title:g("snippets.viewTitle"),content:In.default.createElement(_n,{type:e,content:n,callback:a}),isLarge:!0};case"RELOAD":return{title:g("reloadModal.title"),content:In.default.createElement(Mn,null),isLarge:!1};case"SETTINGS":return{title:g("settings.title"),content:In.default.createElement(ea,{CONFIG:t,updateAppConfig:r}),isLarge:!0};case"THEME_DEV_TOOLS":return{title:g("devTools.title"),content:In.default.createElement(oa,null),isLarge:!0};case"BACKUP":return{title:g("backupModal.title"),content:In.default.createElement(la,null),isLarge:!0};default:return{title:"",content:In.default.createElement("div",null),isLarge:!1}}})(e,t,r,n,a),Spicetify.PopupModal.display(e)},ua=[{title:"Rounded 'Now Playing' Bar",description:"Adds rounded corners to the 'Now Playing' bar so it matches the rest of the User Interface.",code:":root{ --border-radius-1: 8px; } .Root__now-playing-bar, .Root__now-playing-bar footer { border-radius: var(--border-radius-1) !important; }",preview:"resources/assets/snippets/rounded-now-playing.png"},{title:"Rounded Images",description:"Adds rounded corners to the cover art, playlist covers, cards and other images",code:"/* Expanded Cover Art Image (+ position fix) */\n .main-navBar-navBar > :nth-child(3) {\n margin: 0 0 0 1px;\n border-radius: 6px;\n }\n \n /* Collapsed Cover Art Image */\n .cover-art-image,\n .artist-artistOverview-sideBlock > div > section > div:nth-child(3) > section:nth-child(2) > div > img,\n .view-homeShortcutsGrid-image {\n border-radius: 4px;\n }\n \n /*\n Playlist Header\n Search Category Card Image\n List Cards\n Local Files Card\n Placeholder Profile Card\n Artist Overview Side Block\n */\n .main-entityHeader-shadow,\n .x-categoryCard-image,\n .main-cardImage-image,\n .main-cardImage-imageWrapper,\n .main-entityHeader-imagePlaceholder > div,\n .artist-artistOverview-sideBlock > div > section {\n border-radius: 6px;\n }\n \n /* Circled Artist + Profile Cards (force) */\n .main-cardImage-circular,\n .main-entityHeader-imagePlaceholder,\n .main-entityHeader-circle {\n border-radius: 50% !important;\n }\n \n /* Track List Image */\n .main-trackList-rowImage {\n border-radius: 3px;\n }",preview:"resources/assets/snippets/rounded-images.png"},{title:"Fix 'Episodes' Icon",description:"Makes the 'Your Episodes' button icon monochromatic like the rest of the icons.",code:".main-yourEpisodesButton-yourEpisodesIcon { background: var(--spice-text); color: var(--spice-sidebar); }",preview:"resources/assets/snippets/fixed-episodes-icon.png"},{title:"Fix 'Liked' Icon",description:"Fix the colours of the Liked icon in sidebar",code:".main-likedSongsButton-likedSongsIcon {\n color: var(--spice-sidebar);\n background: var(--spice-text);\n}",preview:"resources/assets/snippets/fix-liked-icon.png"},{title:"Fix 'DJ' Icon",description:"Makes the DJ icon match themes better",code:".main-collectionLinkButton-icon > div { background: var(--spice-text); color: var(--spice-sidebar); }",preview:"resources/assets/snippets/fix-DJ-icon.png"},{title:"Hide Upgrade Button",description:"Makes the upgrade button hidden",code:".main-topBar-UpgradeButton {\n display: none !important;\n}",preview:"resources/assets/snippets/hide-upgrade-button.png"},{title:"Auto-hide Friends",description:"Collapse the friends activity sidebar on small screens",code:"[aria-label='Friend Activity'] {\n transition: width 0.3s;\n}\n@media screen and (max-width: 1200px) {\n [aria-label='Friend Activity'] {\n width: 0;\n }\n [aria-label='Friend Activity'] .LayoutResizer__resize-bar {\n display: none;\n }\n}",preview:"resources/assets/snippets/auto-hide-friends.png"},{title:"Smooth Reveal Playlist Gradient",description:"Reveals the playlist gradient header gradient with a fade in effect",code:".main-entityHeader-overlay,\n.main-actionBarBackground-background,\n.main-entityHeader-overlay,\n.main-entityHeader-backgroundColor {\n -webkit-transition: 3s;\n}",preview:"resources/assets/snippets/smooth-playlist-reveal-gradient.png"},{title:"Remove connect bar",description:"Remove connect bar that causes progress bar displacement when listening on different devices",code:".main-connectBar-connectBar {\n display: none !important;}",preview:"resources/assets/snippets/remove-connect-bar.png"},{title:"Fix main view width",description:"Makes main view fill up all available space",code:".contentSpacing {\n max-width: 100% !important;\n}",preview:"resources/assets/snippets/fix-main-view-width.png"},{title:"Left aligned heart icons",description:"Moves the heart icon to the left side of the track title in track views",code:".main-trackList-rowSectionStart {\n margin-left: 38px !important;\n}\n.main-addButton-button.main-trackList-rowHeartButton,\n.main-addButton-button.main-trackList-rowHeartButton {\n position: absolute !important;\n left: 48px !important;\n}",preview:"resources/assets/snippets/left-aligned-heart-icons.png"},{title:"Hover Panels",description:"Have your playlist, right sidebar, and controls bar be hoverable.",code:".Root__nav-bar {\n position: absolute;\n width: 35px;\n opacity: 0;\n bottom: 0;\n left: 0;\n top: 0;\n z-index: 12;\n transition: width 400ms, opacity 250ms ease-out;\n}\n.main-yourLibraryX-entryPoints{\n background: var(--spice-sidebar);\n}\n.Root__nav-bar:hover {\n width: 250px;\n opacity: 1;\n transition: width 250ms , opacity 400ms ease-in;\n}\n.LayoutResizer__resize-bar {\n cursor: none;\n}\n.Root__top-bar {\n opacity: 0;\n transition: visibility 5s, opacity 1s linear;\n}\n.Root__top-bar:hover {\n transition-delay: 0.5s;\n opacity: 1;\n transition: visibility 5s, opacity 0.5s linear;\n}\n.main-topBar-container {\n -webkit-padding-end: 32px;\n padding: 16px 85px;\n padding-inline-end: 32px;\n max-width: none;\n}\n.main-buddyFeed-container:hover {\n width: var(--panel-width) !important;\n opacity: 1 !important;\n transition: width 250ms , opacity 400ms ease-in;\n}\n.main-buddyFeed-container {\n position:absolute;\n right: -5px;\n top: 0;\n bottom: 84px;\n width: 50px !important;\n opacity: 0 !important;\n transition: width 400ms, opacity 250ms ease-out;\n}\n.main-trackList-trackListHeader{\ntop: 0px !important;\n}\n.main-yourLibraryX-navItem{\noverflow: hidden\n}\n.main-coverSlotCollapsed-navAltContainer{\noverflow: visible \n}\n.LayoutResizer__resize-bar{\n\tdisplay: none;\n}",preview:"resources/assets/snippets/hover-panels.png"},{title:"Fix progress bar displacement",description:"Fixes the progress bar displacement for a few themes. Better version of @CharlieS1103 Snippet",code:".main-connectBar-connectBar {\n overflow: visible !important;\n position: absolute !important;\n display: flex !important;\n align-items: unset !important;\n left: 80% !important;\n height: 20px !important;\n bottom: 1% !important;\n padding: 2px !important;\n background-color: transparent !important;\n color: var(--spice-text) !important;\n}\n.control-button::after {\n display: none !important;\n}",preview:"resources/assets/snippets/fix-progress-bar.png"},{title:"Fix playlist hover effect",description:"Fixes the hover effect on the playlist titles in some themes",code:".main-rootlist-rootlistItemOverlay {\n display: none;\n}",preview:"resources/assets/snippets/fix-playlist-hover.png"},{title:"Disable Homepage Recommendation",description:"Disable Homepage Recommendation charts",code:"section[data-testid='home-page'] .main-shelf-shelf:not([aria-label='Recently played'], [aria-label='Your playlists']) {\n\tdisplay: none !important;\n}",preview:"resources/assets/snippets/disable-recommendation.png"},{title:"Circular Album Art",description:"Makes the now playing album art be circular (like a vinyl)",code:".cover-art .cover-art-image {\n border-radius: 100% !important;\n}",preview:"resources/assets/snippets/circular-album-art.png"},{title:"Always show forward button",description:"The navigate forward button hides itself when the window width is smaller. This snipppet makes it so that it is always shown.",code:".main-topBar-historyButtons .main-topBar-forward {\n display: inline-flex !important;\n}",preview:"resources/assets/snippets/always-show-forward.png"},{title:"Right Side Cover Art",description:"Cover art on right side with animation",code:".main-nowPlayingWidget-nowPlaying > .ellipsis-one-line,\n.main-trackInfo-container {\n margin-left: 74px;\n}\n.main-coverSlotExpanded-container {\n position: fixed;\n top: calc(100% - 305px);\n left: calc(100% - 220px);\n width: 200px;\n height: 200px;\n visibility: hidden;\n transform-origin: center;\n animation: 1s coverExpandedIn;\n animation-fill-mode: forwards;\n}\n.Q4cc5RktWgz2H8_vDrIS {\n display: none;\n}\n.main-coverSlotCollapsed-container {\n position: fixed;\n top: -12px;\n left: 0px;\n width: 56px;\n height: 56px;\n visibility: visible;\n z-index: 1;\n}\n.cover-art .cover-art-image,\n.main-coverSlotCollapsed-container {\n transform-origin: center;\n transition-timing-function: ease-in;\n transition: width 0.5s 0.2s, height 0.5s 0.2s, top 0.3s, left 0.5s,\n box-shadow 0.5s;\n}\n.main-coverSlotCollapsed-container[aria-hidden='true'] {\n left: calc(100vw - 164px);\n top: -240px;\n width: 200px;\n height: 200px;\n visibility: hidden;\n animation: 1s coverExpandedOut;\n}\n.main-coverSlotCollapsed-container[aria-hidden='false'] {\n transition-timing-function: ease-out !important;\n transition: width 0.5s 0.2s, height 0.5s 0.2s, top 0.5s 0.1s, left 0.3s,\n box-shadow 0.5s !important;\n}\n.main-coverSlotCollapsed-container[aria-hidden='true']\n .cover-art\n .cover-art-image,\n.main-nowPlayingWidget-coverExpanded\n .main-coverSlotCollapsed-container\n .cover-art\n .cover-art-image {\n width: 200px;\n height: 200px;\n}\n.main-nowPlayingBar-left {\n z-index: 2;\n}\n.main-nowPlayingBar-center {\n z-index: 1;\n}\n.cover-art.shadow {\n box-shadow: 0 0 10px rgba(var(--spice-rgb-shadow), 1) !important;\n}\n@keyframes coverExpandedIn {\n 99% {\n visibility: hidden;\n }\n 100% {\n visibility: visible;\n }\n}\n@keyframes coverExpandedOut {\n 99% {\n visibility: visible;\n }\n 100% {\n visibility: hidden;\n }\n}",preview:"resources/assets/snippets/right-cover-art.png"},{title:"Better lyrics style",description:"Spotify lyrics are focused and beautified",code:".lyrics-lyrics-contentContainer .lyrics-lyricsContent-lyric.lyrics-lyricsContent-highlight { filter: blur(1.5px); padding: 15px; font-size: 110%; } .lyrics-lyrics-contentContainer .lyrics-lyricsContent-lyric.lyrics-lyricsContent-active { filter: none; padding: 20px; font-size: 130%; } .lyrics-lyrics-contentContainer .lyrics-lyricsContent-lyric { filter: blur(1.5px); padding: 15px; font-size: 110%; } .lyrics-lyrics-contentContainer .lyrics-lyricsContent-lyric.lyrics-lyricsContent-unsynced { filter: none; padding: 10px; font-size: 100%; }",preview:"resources/assets/snippets/better-lyrics-style.png"},{title:"Fix now playing icon color",description:"Fixes the now playing icon color",code:`.main-trackList-playingIcon { -webkit-mask-image: url("data:image/svg+xml,%3Csvg id='playing-icon' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 24'%3E%3Cdefs%3E%3Cstyle%3E %23playing-icon %7B fill: %2320BC54; %7D @keyframes play %7B 0%25 %7Btransform: scaleY(1);%7D 3.3%25 %7Btransform: scaleY(0.9583);%7D 6.6%25 %7Btransform: scaleY(0.9166);%7D 9.9%25 %7Btransform: scaleY(0.8333);%7D 13.3%25 %7Btransform: scaleY(0.7083);%7D 16.6%25 %7Btransform: scaleY(0.5416);%7D 19.9%25 %7Btransform: scaleY(0.4166);%7D 23.3%25 %7Btransform: scaleY(0.25);%7D 26.6%25 %7Btransform: scaleY(0.1666);%7D 29.9%25 %7Btransform: scaleY(0.125);%7D 33.3%25 %7Btransform: scaleY(0.125);%7D 36.6%25 %7Btransform: scaleY(0.1666);%7D 39.9%25 %7Btransform: scaleY(0.1666);%7D 43.3%25 %7Btransform: scaleY(0.2083);%7D 46.6%25 %7Btransform: scaleY(0.2916);%7D 49.9%25 %7Btransform: scaleY(0.375);%7D 53.3%25 %7Btransform: scaleY(0.5);%7D 56.6%25 %7Btransform: scaleY(0.5833);%7D 59.9%25 %7Btransform: scaleY(0.625);%7D 63.3%25 %7Btransform: scaleY(0.6666);%7D 66.6%25 %7Btransform: scaleY(0.6666);%7D 69.9%25 %7Btransform: scaleY(0.6666);%7D 73.3%25 %7Btransform: scaleY(0.6666);%7D 76.6%25 %7Btransform: scaleY(0.7083);%7D 79.9%25 %7Btransform: scaleY(0.75);%7D 83.3%25 %7Btransform: scaleY(0.8333);%7D 86.6%25 %7Btransform: scaleY(0.875);%7D 89.9%25 %7Btransform: scaleY(0.9166);%7D 93.3%25 %7Btransform: scaleY(0.9583);%7D 96.6%25 %7Btransform: scaleY(1);%7D %7D %23bar1 %7B transform-origin: bottom; animation: play 0.9s -0.51s infinite; %7D %23bar2 %7B transform-origin: bottom; animation: play 0.9s infinite; %7D %23bar3 %7B transform-origin: bottom; animation: play 0.9s -0.15s infinite; %7D %23bar4 %7B transform-origin: bottom; animation: play 0.9s -0.75s infinite; %7D %3C/style%3E%3C/defs%3E%3Ctitle%3Eplaying-icon%3C/title%3E%3Crect id='bar1' class='cls-1' width='4' height='24'/%3E%3Crect id='bar2' class='cls-1' x='6' width='4' height='24'/%3E%3Crect id='bar3' class='cls-1' x='12' width='4' height='24'/%3E%3Crect id='bar4' class='cls-1' x='18' width='4' height='24'/%3E%3C/svg%3E"); background: var(--spice-button); content-visibility: hidden; -webkit-mask-repeat: no-repeat; }`,preview:"resources/assets/snippets/fix-now-playing-icon.png"},{title:"Hide playing gif",description:"Hides the gif that shows the music playing",code:".main-trackList-playingIcon{display: none}",preview:"resources/assets/snippets/hide-playing-gif.png"},{title:"Pointers",description:"Clickable elements are now a pointer",code:"button, .show-followButton-button, .main-dropDown-dropDown, .x-toggle-wrapper, .main-playlistEditDetailsModal-closeBtn, .main-trackList-rowPlayPauseButton, .main-rootlist-rootlistItemLink:link, .main-rootlist-rootlistItemLink:visited, .x-sortBox-sortDropdown, .main-contextMenu-menuItemButton, .main-trackList-column, .main-moreButton-button, .x-downloadButton-button, .main-playButton-PlayButton, .main-coverSlotExpandedCollapseButton-chevron, .main-coverSlotCollapsed-chevron, .control-button:focus, .control-button:hover, .main-repeatButton-button, .main-skipForwardButton-button, .main-playPauseButton-button, .main-skipBackButton-button, .main-shuffleButton-button, .main-addButton-button, .progress-bar__slider, .playback-bar, .main-editImageButton-image, .X1lXSiVj0pzhQCUo_72A { cursor: pointer !important; }",preview:"resources/assets/snippets/pointer.png"},{title:"Remove Top gradient",description:"Removes gradient from home page and playlist page",code:".main-entityHeader-backgroundColor { display: none !important; } .main-actionBarBackground-background { display: none !important; } .main-home-homeHeader { display: none !important; }",preview:"resources/assets/snippets/remove-gradient.png"},{title:"Fix Liked Button",description:"Fixes Liked Button colors",code:'#_R_G *:not([fill="none"]) { fill: var(--spice-button) !important; } #_R_G *:not([stroke="none"]) { stroke: var(--spice-button); } .main-addButton-button[aria-checked="false"] { color: rgba(var(--spice-rgb-selected-row), 0.7); } .control-button-heart[aria-checked="true"], .main-addButton-button, .main-addButton-active:focus, .main-addButton-active:hover { color: var(--spice-button); }',preview:"resources/assets/snippets/fix-liked-button.png"},{title:"Hide Sidebar ScrollBar",description:"Hides Sidebar ScrollBar near playlist section",code:".os-scrollbar:nth-child(6) .os-scrollbar-handle { visibility: hidden; }",preview:"resources/assets/snippets/hide-sidebar-scrollbar.png"},{title:"Modern ScrollBar",description:"Thin rounded modern scrollbar",code:".os-theme-spotify.os-host-transition > .os-scrollbar-vertical > .os-scrollbar-track > .os-scrollbar-handle { border-radius: 4px; width: 6px; background-color: var(--spice-button-disabled); } .os-theme-spotify.os-host-transition > .os-scrollbar-vertical > .os-scrollbar-track { width: 6px; }",preview:"resources/assets/snippets/modern-scrollbar.png"},{title:"Remove liked and Episodes icon",description:"Removes the liked and episodes icon from the sidebar",code:'.main-collectionLinkButton-collectionLinkButton[href="/collection/tracks"], .main-collectionLinkButton-collectionLinkButton[href="/collection/episodes"] {display: none;}',preview:"resources/assets/snippets/remove-ep-likes.png"},{title:"Rotating Cover Art",description:"Adds circular mask to cover art and rotation",code:"@keyframes rotating { from { transform: rotate(0deg); } to { transform: rotate(360deg); }} .cover-art { animation: rotating 10s linear infinite; clip-path: circle(50% at 50% 50%);}",preview:"resources/assets/snippets/rotating-coverart.png"},{title:"Hide liked songs card",description:"Hides the sometimes unfitting liked Songs card in the Your Libary tab",code:".collection-collectionEntityHeroCard-likedSongs{ display: none; }",preview:"resources/assets/snippets/hide-likedSongs-card.png"},{title:"Fix playlist and folder position",description:"Replaces the playlists section in the left side bar to align with all the other category icons for the new UI. Screenshot includes 'Playlist icons' snippet",code:"div.playlist-item__img.folder, img.playlist-item__img { margin-right: 16px; } div.main-rootlist-rootlist { --left-sidebar-item-height: 32px; --left-sidebar-item-indentation-width: 10px; } div.GlueDropTarget.personal-library > * { height: 32px !important; }",preview:"resources/assets/snippets/fix-playlist-and-folder-position.png"},{title:"Remove recently played from homepage",description:"Removes the recently played shelf from the home page",code:"section.main-shelf-shelf[aria-label='Recently played'] { visibility: hidden; position: absolute; }",preview:"resources/assets/snippets/remove-recently-played.png"},{title:"Make custom app icons thicker",description:"Gives icons from the sticky list a thicker border",code:"#spicetify-sticky-list>li:nth-child(1n+1)>a>div.icon.collection-icon>svg:not(.lucide-crown) { stroke: currentcolor; stroke-width: 11px; } .collection-icon { color: unset; }",preview:"resources/assets/snippets/thicker-sticky-list-icons.png"},{title:"Pretty Lyrics",description:"Gets rid of the ugly background colour on the lyrics page and makes it consistent with themes. Works best with dark themes.",code:".lyrics-lyrics-background { display: none; } .lyrics-lyrics-contentWrapper>*:not(.lyrics-lyricsContent-active, .lyrics-lyricsContent-highlight, .lyrics-lyricsContent-provider, .lyrics-lyricsContent-description, .lyrics-lyricsContent-unsynced) { color: #FFFFFF4D !important; } .lyrics-lyrics-contentWrapper>*:not(.lyrics-lyricsContent-active, .lyrics-lyricsContent-highlight, .lyrics-lyricsContent-provider, .lyrics-lyricsContent-description, .lyrics-lyricsContent-unsynced):hover { color: #FFFFFF !important; } .lyrics-lyricsContent-highlight { color: #FFFFFF66; } .lyrics-lyricsContent-unsynced { color: #FFFFFF !important; } .lyrics-lyricsContent-unsynced:hover { color: #FFFFFF !important; } .lyrics-lyricsContent-provider, .lyrics-lyricsContent-description { color: #FFFFFFB6 !important; }",preview:"resources/assets/snippets/pretty-lyrics.png"},{title:"Oneko",description:"Adds Oneko onto your playback bar!",code:"[class^='playback-']:not(.volume-bar__slider-container > .playback-progressbar):before { content: ''; width: 32px; height: 32px; bottom: calc(100% - 7px); right: 10px; position: absolute; image-rendering: pixelated; background-image: url('https://raw.githubusercontent.com/adryd325/oneko.js/14bab15a755d0e35cd4ae19c931d96d306f99f42/oneko.gif'); animation: oneko 1s infinite; } @keyframes oneko { 0%, 50% { background-position: -64px 0; } 50.0001%, 100% { background-position: -64px -32px; } }",preview:"resources/assets/snippets/oneko.png"},{title:"Remove Popular sections from homepage",description:"Thanks Spotify, but I have a music taste",code:".main-shelf-shelf.Shelf:has(> div > div > .main-shelf-seeAll[href='/section/0JQ5DAuChZYPe9iDhh2mJz'], [href='/section/0JQ5DAnM3wGh0gz1MXnu4h'], [href='/section/0JQ5DAnM3wGh0gz1MXnu3B'],[href='/section/0JQ5DAnM3wGh0gz1MXnu3D']) { display: none !important; }",preview:"resources/assets/snippets/remove-popular.png"},{title:"Dark Lyrics",description:"Replaces the highly saturated lyrics backgrounds with a very subtle dark gradient",code:".lyrics-lyrics-background { background-image: linear-gradient(315deg,var(--lyrics-color-background),black); background-size: 500%; } .lyrics-lyricsContent-lyric.lyrics-lyricsContent-highlight { color: white; } .lyrics-lyricsContent-lyric { color: #424242; }",preview:"resources/assets/snippets/dark-lyrics.png"},{title:"Thicker Bars",description:"Makes the song progress and volume bar thicker",code:".x-progressBar-progressBarBg { height: 100% !important; } .x-progressBar-sliderArea { height: 100% !important; } .x-progressBar-fillColor { height: 100% !important; }",preview:"resources/assets/snippets/thicker-bars.png"}];async function pa(e,t=1,r=[]){let n=`https://api.github.com/search/repositories?q=${encodeURIComponent("topic:"+e)}&per_page=100`;t&&(n+="&page="+t);e=await fetch(n).then(e=>e.json()).catch(()=>[]);if(e.items)return J(l({},e),{page_count:e.items.length,items:e.items.filter(e=>!r.includes(e.html_url))});Spicetify.showNotification("Too Many Requests, Cool Down.",!0)}async function da(e,t,r){var n=window.sessionStorage.getItem(e+"-"+t),a=window.sessionStorage.getItem("noManifests");if(n)return JSON.parse(n);const o=`https://raw.githubusercontent.com/${e}/${t}/${r}/manifest.json`;return null!=a&&a.includes(o)?null:((n=await fetch(o).then(e=>e.json()).catch(()=>{var r,n;r=[o],n="noManifests",r&&r.forEach(e=>{n=n||r.user+"-"+r.repo;var t=window.sessionStorage.getItem(n),t=t?JSON.parse(t):[];t.push(e),window.sessionStorage.setItem(n,JSON.stringify(t))})}))&&window.sessionStorage.setItem(e+"-"+t,JSON.stringify(n)),n)}async function ha(t,n,a,o=!1){try{let e;var r=t.match(new RegExp("https:\\/\\/api\\.github\\.com\\/repos\\/(?.+)\\/(?.+)\\/contents"));if(!r||!r.groups)return null;const{user:i,repo:s}=r.groups;return e=await da(i,s,n),(e=Array.isArray(e)?e:[e]).reduce((e,t)=>{var r=t.branch||n,r={manifest:t,title:t.name,subtitle:t.description,authors:yn(t.authors,i),user:i,repo:s,branch:r,imageURL:t.preview&&t.preview.startsWith("http")?t.preview:`https://raw.githubusercontent.com/${i}/${s}/${r}/`+t.preview,extensionURL:t.main.startsWith("http")?t.main:`https://raw.githubusercontent.com/${i}/${s}/${r}/`+t.main,readmeURL:t.readme&&t.readme.startsWith("http")?t.readme:`https://raw.githubusercontent.com/${i}/${s}/${r}/`+t.readme,stars:a,tags:t.tags};return t&&t.name&&t.description&&t.main&&(o&&localStorage.getItem(`marketplace:installed:${i}/${s}/`+t.main)||e.push(r)),e},[])}catch(e){return null}}async function fa(t,n,a){try{let e;var r=t.match(new RegExp("https:\\/\\/api\\.github\\.com\\/repos\\/(?.+)\\/(?.+)\\/contents"));if(!r||!r.groups)return null;const{user:o,repo:i}=r.groups;return e=await da(o,i,n),(e=Array.isArray(e)?e:[e]).reduce((e,t)=>{var r=t.branch||n,r={manifest:t,title:t.name,subtitle:t.description,authors:yn(t.authors,o),user:o,repo:i,branch:r,imageURL:t.preview&&t.preview.startsWith("http")?t.preview:`https://raw.githubusercontent.com/${o}/${i}/${r}/`+t.preview,readmeURL:t.readme&&t.readme.startsWith("http")?t.readme:`https://raw.githubusercontent.com/${o}/${i}/${r}/`+t.readme,stars:a,tags:t.tags,cssURL:t.usercss.startsWith("http")?t.usercss:`https://raw.githubusercontent.com/${o}/${i}/${r}/`+t.usercss,schemesURL:t.schemes?t.schemes.startsWith("http")?t.schemes:`https://raw.githubusercontent.com/${o}/${i}/${r}/`+t.schemes:null,include:t.include};return null!=t&&t.name&&null!=t&&t.usercss&&null!=t&&t.description&&e.push(r),e},[])}catch(e){return null}}async function ma(t,n,a){try{let e;var r=t.match(new RegExp("https:\\/\\/api\\.github\\.com\\/repos\\/(?.+)\\/(?.+)\\/contents"));if(!r||!r.groups)return null;const{user:o,repo:i}=r.groups;return e=await da(o,i,n),(e=Array.isArray(e)?e:[e]).reduce((e,t)=>{var r=t.branch||n,r={manifest:t,title:t.name,subtitle:t.description,authors:yn(t.authors,o),user:o,repo:i,branch:r,imageURL:t.preview&&t.preview.startsWith("http")?t.preview:`https://raw.githubusercontent.com/${o}/${i}/${r}/`+t.preview,readmeURL:t.readme&&t.readme.startsWith("http")?t.readme:`https://raw.githubusercontent.com/${o}/${i}/${r}/`+t.readme,stars:a,tags:t.tags};return t&&t.name&&t.description&&e.push(r),e},[])}catch(e){return null}}var ga=async()=>{return(await fetch("https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/resources/blacklist.json").then(e=>e.json()).catch(()=>({}))).repos},va=async()=>{return ua.reduce((e,t)=>{t=l({},t);return t.preview&&(t.imageURL=t.preview.startsWith("http")?t.preview:"https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/"+t.preview,delete t.preview),e.push(t),e},[])},ba=t(b()),ya=class extends ba.default.Component{render(){return ba.default.createElement("div",{onClick:this.props.onClick},ba.default.createElement("p",{style:{fontSize:100,lineHeight:"65px"}},"»"),ba.default.createElement("span",{style:{fontSize:20}},"Load more"))}},Ea=t(b()),wa=()=>Ea.default.createElement("svg",{width:"100px",height:"100px",viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},Ea.default.createElement("circle",{cx:"50",cy:"50",r:"0",fill:"none",stroke:"currentColor",strokeWidth:"2"},Ea.default.createElement("animate",{attributeName:"r",repeatCount:"indefinite",dur:"1s",values:"0;40",keyTimes:"0;1",keySplines:"0 0.2 0.8 1",calcMode:"spline",begin:"0s"}),Ea.default.createElement("animate",{attributeName:"opacity",repeatCount:"indefinite",dur:"1s",values:"1;0",keyTimes:"0;1",keySplines:"0.2 0 0.8 1",calcMode:"spline",begin:"0s"})),Ea.default.createElement("circle",{cx:"50",cy:"50",r:"0",fill:"none",stroke:"currentColor",strokeWidth:"2"},Ea.default.createElement("animate",{attributeName:"r",repeatCount:"indefinite",dur:"1s",values:"0;40",keyTimes:"0;1",keySplines:"0 0.2 0.8 1",calcMode:"spline",begin:"-0.5s"}),Ea.default.createElement("animate",{attributeName:"opacity",repeatCount:"indefinite",dur:"1s",values:"1;0",keyTimes:"0;1",keySplines:"0.2 0 0.8 1",calcMode:"spline",begin:"-0.5s"}))),Sa=t(b()),ka=()=>Sa.default.createElement("svg",{role:"img",width:"16",height:"16",viewBox:"0 0 24 24","aria-hidden":"true",xmlns:"http://www.w3.org/2000/svg"},Sa.default.createElement("path",{d:"M24 13.616v-3.232c-1.651-.587-2.694-.752-3.219-2.019v-.001c-.527-1.271.1-2.134.847-3.707l-2.285-2.285c-1.561.742-2.433 1.375-3.707.847h-.001c-1.269-.526-1.435-1.576-2.019-3.219h-3.232c-.582 1.635-.749 2.692-2.019 3.219h-.001c-1.271.528-2.132-.098-3.707-.847l-2.285 2.285c.745 1.568 1.375 2.434.847 3.707-.527 1.271-1.584 1.438-3.219 2.02v3.232c1.632.58 2.692.749 3.219 2.019.53 1.282-.114 2.166-.847 3.707l2.285 2.286c1.562-.743 2.434-1.375 3.707-.847h.001c1.27.526 1.436 1.579 2.019 3.219h3.232c.582-1.636.75-2.69 2.027-3.222h.001c1.262-.524 2.12.101 3.698.851l2.285-2.286c-.744-1.563-1.375-2.433-.848-3.706.527-1.271 1.588-1.44 3.221-2.021zm-12 2.384c-2.209 0-4-1.791-4-4s1.791-4 4-4 4 1.791 4 4-1.791 4-4 4z",fill:"currentColor"})),Oa=t(b()),Ca=()=>Oa.default.createElement("svg",{className:"devtools-icon",version:"1.1",viewBox:"1 1 22 22",xmlSpace:"preserve",xmlns:"http://www.w3.org/2000/svg"},Oa.default.createElement("g",{className:"devtools-icon-internal",id:"grid_system"}),Oa.default.createElement("g",{id:"_icons"},Oa.default.createElement("path",{d:"M18,12v-0.9l0.7-5.7C18.8,4.5,18.6,3.7,18,3c-0.6-0.6-1.4-1-2.2-1H8.3C7.4,2,6.6,2.4,6,3C5.4,3.7,5.2,4.5,5.3,5.4L6,11.1 V12c0,1.6,1.3,2.9,2.8,3l-0.4,2.9c-0.1,1,0.2,2.1,0.8,2.9S11,22,12,22s2-0.5,2.7-1.2s1-1.8,0.8-2.9L15.2,15 C16.7,14.9,18,13.6,18,12z M7.5,4.3C7.7,4.1,8,4,8.3,4H13v2c0,0.6,0.4,1,1,1s1-0.4,1-1V4h0.7c0.3,0,0.6,0.1,0.8,0.3 c0.2,0.2,0.3,0.5,0.2,0.8L16.1,10H7.9L7.3,5.1C7.2,4.8,7.3,4.6,7.5,4.3z M13.2,19.4c-0.6,0.7-1.8,0.7-2.4,0 c-0.3-0.4-0.4-0.8-0.4-1.3l0.5-3.2h2.3l0.5,3.2C13.7,18.6,13.5,19.1,13.2,19.4z M15,13h-1h-4H9c-0.6,0-1-0.4-1-1h8 C16,12.6,15.6,13,15,13z"}))),x=t(b()),Na=t(Ve()),Be=class extends x.default.Component{constructor(e){super(e)}render(){var e=this.props["t"];return this.props.item.enabled?x.default.createElement("li",{className:"marketplace-tabBar-headerItem","data-tab":this.props.item.value,onClick:e=>{e.preventDefault(),this.props.switchTo(this.props.item)}},x.default.createElement("a",{"aria-current":"page",className:"marketplace-tabBar-headerItemLink "+(this.props.item.active?"marketplace-tabBar-active":""),draggable:"false",href:""},x.default.createElement("span",{className:"main-type-mestoBold"},e("tabs."+this.props.item.value)))):null}},xa=qr()(Be),Ia=x.default.memo(function({items:e,switchTo:t}){return x.default.createElement("li",{className:"marketplace-tabBar-headerItem"},x.default.createElement(Na.default,{className:"main-type-mestoBold",options:e,value:"More",placeholder:"More",onChange:t}))}),La=e=>{const t=document.querySelector(".Root__main-view .os-resize-observer-host");if(!t)return null;const[r,n]=(0,x.useState)(t.clientWidth),a=()=>n(t.clientWidth),o=()=>{var e=document.querySelector(".marketplace-tabBar"),t=document.querySelector(".main-topBar-topbarContentWrapper");e&&t?(e&&t&&"/marketplace"===Spicetify.Platform.History.location.pathname&&t.appendChild(e),Spicetify.Platform.History.listen(({pathname:e})=>{"/marketplace"!=e&&null!=(e=document.querySelector(".marketplace-tabBar"))&&e.remove()})):setTimeout(o,100)};return(0,x.useEffect)(()=>{const e=new ResizeObserver(a);return e.observe(t),()=>{e.disconnect()}}),(0,x.useEffect)(()=>{o()}),x.default.createElement(Ra,{windowSize:r,links:e.links,activeLink:e.activeLink,switchCallback:e.switchCallback})},Ra=x.default.memo(function({links:e,activeLink:r,switchCallback:t,windowSize:n=1/0}){const a=x.default.useRef(null),[o,i]=(0,x.useState)([]),[s,l]=(0,x.useState)(0),[c,u]=(0,x.useState)([]),p=e.map(({name:e,enabled:t})=>{return{label:e,value:e,active:e===r,enabled:t}});return(0,x.useEffect)(()=>{a.current&&l(a.current.clientWidth)},[n,null==(n=a.current)?void 0:n.clientWidth]),(0,x.useEffect)(()=>{var e;a.current&&(e=Array.from(a.current.children).map(e=>e.clientWidth),i(e))},[e]),(0,x.useEffect)(()=>{if(a.current)if(o.reduce((e,t)=>e+t,0)<=s)u([]);else{var e=Math.max(...o);const n=[];let r=e;o.forEach((e,t)=>{s>=r+e?r+=e:n.push(t)}),u(n)}},[s,o]),x.default.createElement("nav",{className:"marketplace-tabBar marketplace-tabBar-nav"},x.default.createElement("ul",{className:"marketplace-tabBar-header",ref:a},p.filter((e,t)=>!c.includes(t)).map(e=>x.default.createElement(xa,{key:e.value,item:e,switchTo:t})),c.length||0===o.length?x.default.createElement(Ia,{items:c.map(e=>p[e]).filter(e=>e),switchTo:t}):null))}),I=t(b()),Pa=t(b()),Aa=()=>Pa.default.createElement("svg",{role:"img",width:"16",height:"16",viewBox:"0 0 448 512","aria-hidden":"true",xmlns:"http://www.w3.org/2000/svg"},Pa.default.createElement("path",{d:"M53.21 467c1.562 24.84 23.02 45 47.9 45h245.8c24.88 0 46.33-20.16 47.9-45L416 128H32L53.21 467zM432 32H320l-11.58-23.16c-2.709-5.42-8.25-8.844-14.31-8.844H153.9c-6.061 0-11.6 3.424-14.31 8.844L128 32H16c-8.836 0-16 7.162-16 16V80c0 8.836 7.164 16 16 16h416c8.838 0 16-7.164 16-16V48C448 39.16 440.8 32 432 32z",fill:"currentColor"})),Ta=t(b()),_a=()=>Ta.default.createElement("svg",{role:"img",width:"16",height:"16",viewBox:"0 0 512 512","aria-hidden":"true",xmlns:"http://www.w3.org/2000/svg"},Ta.default.createElement("path",{d:"M480 352h-133.5l-45.25 45.25C289.2 409.3 273.1 416 256 416s-33.16-6.656-45.25-18.75L165.5 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM432 456c-13.2 0-24-10.8-24-24c0-13.2 10.8-24 24-24s24 10.8 24 24C456 445.2 445.2 456 432 456zM233.4 374.6C239.6 380.9 247.8 384 256 384s16.38-3.125 22.62-9.375l128-128c12.49-12.5 12.49-32.75 0-45.25c-12.5-12.5-32.76-12.5-45.25 0L288 274.8V32c0-17.67-14.33-32-32-32C238.3 0 224 14.33 224 32v242.8L150.6 201.4c-12.49-12.5-32.75-12.5-45.25 0c-12.49 12.5-12.49 32.75 0 45.25L233.4 374.6z",fill:"currentColor"})),ja=t(b()),Ma=()=>ja.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24"},ja.default.createElement("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z",fill:"currentColor"})),Da=t(b()),$a=e=>{return Da.default.createElement("div",{className:"marketplace-card__authors"},e.authors.map((e,t)=>Da.default.createElement("a",{title:e.name,className:"marketplace-card__author",href:e.url,draggable:"false",dir:"auto",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),key:t},e.name)))},Fa=t(b()),Ba=n=>{const[e,t]=Fa.default.useState(!1),a={[g("grid.externalJS")]:"external JS",[g("grid.dark")]:"dark",[g("grid.light")]:"light"};var r=e=>{return e.filter((e,t,r)=>r.indexOf(e)===t).reduce((e,t)=>{var r=a[t]||t;return!n.showTags&&t!==g("grid.externalJS")||e.push(Fa.default.createElement("li",{className:"marketplace-card__tag",draggable:!1,"data-tag":r},t)),e},[])},o=n.tags.slice(0,4),i=n.tags.slice(4);return Fa.default.createElement("div",{className:"marketplace-card__tags-container"},Fa.default.createElement("ul",{className:"marketplace-card__tags"},r(o),i.length&&e?r(i):null),i.length&&!e?Fa.default.createElement("button",{className:"marketplace-card__tags-more-btn",onClick:e=>{e.stopPropagation(),t(!0)}},"..."):null)},L=window.Spicetify,Ua=class extends I.default.Component{constructor(e){super(e),this.key=null,this.type=Ua,this.menuType=L.ReactComponent.Menu,this.localStorageKey=Nn(e),Object.assign(this,e),this.tags=e.item.tags||[],e.item.include&&this.tags.push(g("grid.externalJS")),this.state={installed:null!==localStorage.getItem(this.localStorageKey),stars:this.props.item.stars||0,tagsExpanded:!1,externalUrl:this.props.item.user&&this.props.item.repo?`https://github.com/${this.props.item.user}/`+this.props.item.repo:"",lastUpdated:this.props.item.user&&this.props.item.repo?this.props.item.lastUpdated:void 0}}isInstalled(){return null!==localStorage.getItem(this.localStorageKey)}async componentDidMount(){if("Installed"===this.props.CONFIG.activeTab&&"snippet"!==this.props.type){var e=`https://api.github.com/repos/${this.props.item.user}/`+this.props.item.repo,{stargazers_count:e,pushed_at:t}=await fetch(e).then(e=>e.json());if(this.state.stars!==e&&this.props.CONFIG.visual.stars&&console.debug("Stars updated to: "+e),this.state.lastUpdated!==t)switch(console.debug("New update pushed at: "+t),this.props.type){case"extension":this.installExtension();break;case"theme":this.installTheme(!0)}}}buttonClicked(){var e,t;"extension"===this.props.type?(this.isInstalled()?(console.debug("Extension already installed, removing"),this.removeExtension()):this.installExtension(),ca("RELOAD")):"theme"===this.props.type?(t=(t=localStorage.getItem(E.themeInstalled))?w(t,{}):{},this.isInstalled()?(console.debug("Theme already installed, removing"),this.removeTheme(this.localStorageKey)):(this.removeTheme(),this.installTheme()),(null!=(e=this.props.item.manifest)&&e.include||t.include)&&ca("RELOAD")):"app"===this.props.type?window.open(this.state.externalUrl,"_blank"):"snippet"===this.props.type?this.isInstalled()?(console.debug("Snippet already installed, removing"),this.removeSnippet()):this.installSnippet():console.error("Unknown card type")}installExtension(){var e,t,r,n,a,o,i,s,l,c,u;console.debug("Installing extension "+this.localStorageKey),this.props.item?({manifest:u,title:e,subtitle:t,authors:r,user:n,repo:a,branch:o,imageURL:i,extensionURL:s,readmeURL:l,lastUpdated:c}=this.props.item,localStorage.setItem(this.localStorageKey,JSON.stringify({manifest:u,type:this.props.type,title:e,subtitle:t,authors:r,user:n,repo:a,branch:o,imageURL:i,extensionURL:s,readmeURL:l,stars:this.state.stars,lastUpdated:c})),-1===(u=w(E.installedExtensions,[])).indexOf(this.localStorageKey)&&(u.push(this.localStorageKey),localStorage.setItem(E.installedExtensions,JSON.stringify(u))),console.debug("Installed"),this.setState({installed:!0})):L.showNotification("There was an error installing extension",!0)}removeExtension(){var e;localStorage.getItem(this.localStorageKey)&&(console.debug("Removing extension "+this.localStorageKey),localStorage.removeItem(this.localStorageKey),e=w(E.installedExtensions,[]).filter(e=>e!==this.localStorageKey),localStorage.setItem(E.installedExtensions,JSON.stringify(e)),console.debug("Removed"),this.setState({installed:!1}))}async installTheme(r=!1){var n=this.props["item"];if(n){console.debug("Installing theme "+this.localStorageKey);let e={},t=null;r?({schemes:r,activeScheme:a}=w(this.localStorageKey,{}),e=r,t=a):n.schemesURL&&(r=await(await fetch(n.schemesURL)).text(),e=vn(r));var a=t||Object.keys(e)[0]||null,{manifest:r,title:o,subtitle:i,authors:s,user:l,repo:c,branch:u,imageURL:p,extensionURL:d,readmeURL:h,cssURL:f,schemesURL:m,include:g,lastUpdated:v}=(console.debug(e,a),n),r=(localStorage.setItem(this.localStorageKey,JSON.stringify({manifest:r,type:this.props.type,title:o,subtitle:i,authors:s,user:l,repo:c,branch:u,imageURL:p,extensionURL:d,readmeURL:h,stars:this.state.stars,tags:this.tags,cssURL:f,schemesURL:m,include:g,schemes:e,activeScheme:a,lastUpdated:v})),w(E.installedThemes,[]));-1===r.indexOf(this.localStorageKey)&&(r.push(this.localStorageKey),localStorage.setItem(E.installedThemes,JSON.stringify(r)),localStorage.setItem(E.themeInstalled,this.localStorageKey)),console.debug("Installed"),n.include||(this.fetchAndInjectUserCSS(this.localStorageKey),this.props.updateActiveTheme(this.localStorageKey),this.props.updateColourSchemes(e,a),(i=null==(o=this.props.item.manifest)?void 0:o.name)&&(L.Config.current_theme=i),a&&(L.Config.color_scheme=a)),this.setState({installed:!0})}else L.showNotification("There was an error installing theme",!0)}removeTheme(t){var e=(t=t||localStorage.getItem(E.themeInstalled))&&localStorage.getItem(t);t&&e&&(console.debug("Removing theme "+t),localStorage.removeItem(t),localStorage.removeItem(E.themeInstalled),e=w(E.installedThemes,[]).filter(e=>e!==t),localStorage.setItem(E.installedThemes,JSON.stringify(e)),console.debug("Removed"),this.fetchAndInjectUserCSS(null),this.props.updateActiveTheme(null),this.props.updateColourSchemes(null,null),L.Config.current_theme=L.Config.local_theme,L.Config.color_scheme=L.Config.local_color_scheme,this.setState({installed:!1}))}installSnippet(){console.debug("Installing snippet "+this.localStorageKey),localStorage.setItem(this.localStorageKey,JSON.stringify({code:this.props.item.code,title:this.props.item.title,description:this.props.item.description,imageURL:this.props.item.imageURL}));var e=w(E.installedSnippets,[]),e=(-1===e.indexOf(this.localStorageKey)&&(e.push(this.localStorageKey),localStorage.setItem(E.installedSnippets,JSON.stringify(e))),e.map(e=>w(e)));bn(e),this.setState({installed:!0})}removeSnippet(){localStorage.removeItem(this.localStorageKey);var e=w(E.installedSnippets,[]).filter(e=>e!==this.localStorageKey),e=(localStorage.setItem(E.installedSnippets,JSON.stringify(e)),e.map(e=>w(e)));bn(e),this.setState({installed:!1})}async fetchAndInjectUserCSS(e){try{var t=e?await On(this.props.item):void 0;kn(t)}catch(e){console.warn(e)}}openReadme(){var e;null!=(e=this.props.item)&&e.manifest&&null!=(e=null==(e=this.props.item)?void 0:e.manifest)&&e.readme?L.Platform.History.push({pathname:mn+"/readme",state:{data:{title:this.props.item.title,user:this.props.item.user,repo:this.props.item.repo,branch:this.props.item.branch,readmeURL:this.props.item.readmeURL,type:this.props.type,install:this.buttonClicked.bind(this),isInstalled:this.isInstalled.bind(this)}}}):L.showNotification("No page was found",!0)}render(){var e,t,r=this.isInstalled();return"Installed"!==this.props.CONFIG.activeTab||r?(e=["main-card-card","marketplace-card--"+this.props.type],r&&e.push("marketplace-card--installed"),t=[],"snippet"!==this.props.type&&this.props.visual.stars&&t.push("★ "+this.state.stars),I.default.createElement("div",{className:e.join(" "),onClick:()=>{if("snippet"===this.props.type){var e=this.props.item.title.replace(/\n/g,"");if(null!=(e=w("marketplace:installed:snippet:"+e))&&e.custom)return ca("EDIT_SNIPPET",void 0,void 0,this.props);ca("VIEW_SNIPPET",void 0,void 0,this.props,this.buttonClicked.bind(this))}else this.openReadme()}},I.default.createElement("div",{className:"main-card-draggable",draggable:"true"},I.default.createElement("div",{className:"main-card-imageContainer"},I.default.createElement("div",{className:"main-cardImage-imageWrapper"},I.default.createElement("div",null,I.default.createElement("img",{alt:"","aria-hidden":"false",draggable:"false",loading:"lazy",src:this.props.item.imageURL,className:"main-image-image main-cardImage-image",onError:e=>{e.currentTarget.setAttribute("src","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII"),null!=(e=e.currentTarget.closest(".main-cardImage-imageWrapper"))&&e.classList.add("main-cardImage-imageWrapper--error")}})))),I.default.createElement("div",{className:"main-card-cardMetadata"},I.default.createElement("a",{draggable:"false",title:"snippet"===this.props.type?this.props.item.title:null==(e=this.props.item.manifest)?void 0:e.name,className:"main-cardHeader-link",dir:"auto",href:"snippet"!==this.props.type?this.state.externalUrl:"https://github.com/spicetify/spicetify-marketplace/blob/main/src/resources/snippets.ts",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation()},I.default.createElement("div",{className:"main-cardHeader-text main-type-balladBold"},this.props.item.title)),I.default.createElement("div",{className:"main-cardSubHeader-root main-type-mestoBold marketplace-cardSubHeader"},this.props.item.authors&&I.default.createElement($a,{authors:this.props.item.authors}),I.default.createElement("span",null,t.join(" ‒ "))),I.default.createElement("p",{className:"marketplace-card-desc"},"snippet"===this.props.type?this.props.item.description:null==(e=this.props.item.manifest)?void 0:e.description),this.props.item.lastUpdated&&I.default.createElement("p",{className:"marketplace-card-desc"},g("grid.lastUpdated",{val:new Date(this.props.item.lastUpdated),formatParams:{val:{year:"numeric",month:"long",day:"numeric"}}})),this.tags.length?I.default.createElement("div",{className:"marketplace-card__bottom-meta main-type-mestoBold"},I.default.createElement(Ba,{tags:this.tags,showTags:this.props.CONFIG.visual.tags})):null,r&&I.default.createElement("div",{className:"marketplace-card__bottom-meta main-type-mestoBold"},"✓ ",g("grid.installed")),I.default.createElement(L.ReactComponent.TooltipWrapper,{label:"app"===this.props.type?g("github"):g(r?"remove":"install"),renderInline:!0},I.default.createElement("div",{className:"main-card-PlayButtonContainer"},I.default.createElement(S,{classes:["marketplace-installButton"],type:"circle",label:"app"===this.props.type?g("github"):g(r?"remove":"install"),onClick:e=>{e.stopPropagation(),this.buttonClicked()}},"app"===this.props.type?I.default.createElement(Ma,null):r?I.default.createElement(Aa,null):I.default.createElement(_a,null)))))))):(console.debug("Card item not installed"),null)}},Ga=qr()(Ua),Ha=t(b()),Va=t(Qe()),qa=t(e());var za=async function(t,r,e){for(;!Spicetify?.PopupModal||!Spicetify?.LocalStorage;)await new Promise(e=>setTimeout(e,100));var n,t=`spcr-whats-new_${t}-version`,a=Spicetify.LocalStorage.get(t)??"";try{(0,Va.default)(r,a)&&(Spicetify.LocalStorage.set(t,r),n={...e,content:function(e){var t=document.createElement("div"),r=(t.setAttribute("id","whats-new-content-wrapper"),document.createElement("style"));return r.textContent=` + #whats-new-content-wrapper ul, #whats-new-content-wrapper ol { + list-style: inherit; + margin-left: 1em; + } + `,qa.default.render(e,t),t.appendChild(r),t}(e.content)},Spicetify.PopupModal.display(n))}catch(e){Spicetify.LocalStorage.set(t,r)}},Ka=async()=>{var e=await fetch(gn).then(e=>e.json()).then(e=>{e=e.message?null:e.body;return e&&Cn(e,"spicetify","spicetify-marketplace")}).catch(e=>(console.error(e),null));e&&za("marketplace",dn,{title:"✨ Marketplace v0.8.7",content:Ha.default.createElement("div",{dangerouslySetInnerHTML:{__html:e}}),isLarge:!0})},Ja=window.Spicetify,r=class extends f.default.Component{constructor(e){super(e),this.endOfList=!1,this.lastScroll=0,this.requestQueue=[],this.requestPage=0,this.cardList=[],Object.assign(this,e),this.updateAppConfig=e.updateAppConfig.bind(this),this.sortConfig={by:w(E.sortBy,"top")},this.state={version:dn,newUpdate:!1,searchValue:"",cards:[],tabs:e.CONFIG.tabs,rest:!0,endOfList:!1,schemes:e.CONFIG.theme.schemes,activeScheme:e.CONFIG.theme.activeScheme,activeThemeKey:e.CONFIG.theme.activeThemeKey}}getInstalledTheme(){var e=localStorage.getItem(E.themeInstalled);return(e=e&&localStorage.getItem(e))?JSON.parse(e):null}newRequest(e){this.cardList=[];var t=[];this.requestQueue.unshift(t),this.loadAmount(t,e)}appendCard(e,t,r){r===this.props.CONFIG.activeTab&&(r=f.default.createElement(Ga,{item:e,key:`${this.props.CONFIG.activeTab}:${e.user}:`+e.title,CONFIG:this.CONFIG,visual:this.props.CONFIG.visual,type:t,activeThemeKey:this.state.activeThemeKey,updateColourSchemes:this.updateColourSchemes.bind(this),updateActiveTheme:this.setActiveTheme.bind(this)}),this.cardList.push(r),this.setState({cards:this.cardList}))}updateSort(e){e&&(this.sortConfig.by=e,localStorage.setItem(E.sortBy,e)),this.requestPage=0,this.cardList=[],this.setState({cards:[],rest:!1,endOfList:!1}),this.endOfList=!1,this.newRequest(fn)}updateTabs(){this.setState({tabs:[...this.props.CONFIG.tabs]})}updatePostsVisual(){this.cardList=this.cardList.map((e,t)=>f.default.createElement(Ga,J(l({},e.props),{key:t.toString(),CONFIG:this.CONFIG}))),this.setState({cards:[...this.cardList]})}switchTo(e){this.CONFIG.activeTab=e.value,localStorage.setItem(E.activeTab,e.value),this.cardList=[],this.requestPage=0,this.setState({cards:[],rest:!1,endOfList:!1}),this.endOfList=!1,this.newRequest(fn)}async loadPage(t){const r=this.CONFIG.activeTab;switch(r){case"Extensions":var e=await pa("spicetify-extensions",this.requestPage,this.BLACKLIST);for(const u of e.items){var n=await ha(u.contents_url,u.default_branch,u.stargazers_count,this.CONFIG.visual.hideInstalled);if(1{Object.assign(e,{lastUpdated:u.pushed_at}),this.appendCard(e,"extension",r)})}var a=-1{e=w(e);if(1{Object.assign(e,{lastUpdated:d.pushed_at}),this.appendCard(e,"theme",r)})}e=-1{Object.assign(e,{lastUpdated:h.pushed_at}),this.appendCard(e,"app",r)})}o=-1this.appendCard(e,"snippet",r))}return this.setState({rest:!0,endOfList:!0}),this.endOfList=!0,0}async loadAmount(t,e=fn){for(this.setState({rest:!1}),e+=this.cardList.length,this.requestPage=await this.loadPage(t);this.requestPage&&-1!==this.requestPage&&this.cardList.lengthe!==t):(this.requestQueue.shift(),this.setState({rest:!0}))}loadMore(){this.state.rest&&!this.endOfList&&this.loadAmount(this.requestQueue[0],fn)}updateColourSchemes(e,t){console.debug("updateColourSchemes",e,t),this.CONFIG.theme.schemes=e,(this.CONFIG.theme.activeScheme=t)&&(Ja.Config.color_scheme=t),e&&t&&e[t]?Sn(this.CONFIG.theme.schemes[t]):Sn(null);var r=w(E.themeInstalled),n=w(r);n?(n.activeScheme=t,console.debug(n),localStorage.setItem(r,JSON.stringify(n))):console.debug("No installed theme data"),this.setState({schemes:e,activeScheme:t})}async componentDidMount(){fetch("https://api.github.com/repos/spicetify/spicetify-marketplace/releases").then(e=>e.json()).then(e=>{this.setState({version:e[0].name});try{this.setState({newUpdate:pn.default.gt(this.state.version,dn)})}catch(e){console.error(e)}},e=>{console.error("Failed to check for updates",e)}),Ka(),this.gridUpdateTabs=this.updateTabs.bind(this),this.gridUpdatePostsVisual=this.updatePostsVisual.bind(this);var e=document.querySelector(".os-viewport");this.checkScroll=this.isScrolledBottom.bind(this),e&&(e.addEventListener("scroll",this.checkScroll),this.cardList.length)?0=e.scrollHeight&&this.loadMore()}setActiveTheme(e){this.CONFIG.theme.activeThemeKey=e,this.setState({activeThemeKey:e})}getActiveScheme(){return this.state.activeScheme}render(){const r=this.props["t"];return f.default.createElement("section",{className:"contentSpacing"},f.default.createElement("div",{className:"marketplace-header"},f.default.createElement("div",{className:"marketplace-header__left"},f.default.createElement("h1",null,this.props.title),this.state.newUpdate?f.default.createElement("button",{type:"button",title:r("grid.newUpdate"),className:"marketplace-header-icon-button",id:"marketplace-update",onClick:()=>window.location.href="https://github.com/spicetify/spicetify-marketplace/releases/latest"},f.default.createElement(_a,null)," ",this.state.version):null),f.default.createElement("div",{className:"marketplace-header__right"},this.CONFIG.visual.themeDevTools?f.default.createElement(Ja.ReactComponent.TooltipWrapper,{label:r("devTools.title"),renderInline:!0,placement:"bottom"},f.default.createElement("button",{type:"button","aria-label":r("devTools.title"),className:"marketplace-header-icon-button",onClick:()=>ca("THEME_DEV_TOOLS")},f.default.createElement(Ca,null))):null,this.state.activeScheme?f.default.createElement(zn,{onChange:e=>this.updateColourSchemes(this.state.schemes,e),sortBoxOptions:En(this.state.schemes),sortBySelectedFn:e=>e.key===this.getActiveScheme()}):null,f.default.createElement("div",{className:"searchbar--bar__wrapper"},f.default.createElement("input",{className:"searchbar-bar",type:"text",placeholder:`${r("grid.search")} ${r("tabs."+this.CONFIG.activeTab)}...`,value:this.state.searchValue,onChange:e=>{this.setState({searchValue:e.target.value})}})),f.default.createElement(Ja.ReactComponent.TooltipWrapper,{label:r("settings.title"),renderInline:!0,placement:"bottom"},f.default.createElement("button",{type:"button","aria-label":r("settings.title"),className:"marketplace-header-icon-button",id:"marketplace-settings-button",onClick:()=>ca("SETTINGS",this.CONFIG,this.updateAppConfig)},f.default.createElement(ka,null))))),[{handle:"extension",name:"Extensions"},{handle:"theme",name:"Themes"},{handle:"snippet",name:"Snippets"},{handle:"app",name:"Apps"}].map(t=>{var e=this.cardList.filter(e=>e.props.type===t.handle).filter(e=>{const t=this.state.searchValue.trim().toLowerCase();var{title:e,user:r,authors:n}=e.props.item;return!t||e.toLowerCase().includes(t)||(null==r?void 0:r.toLowerCase().includes(t))||(null==n?void 0:n.some(e=>e.name.toLowerCase().includes(t)))}).map(e=>f.default.cloneElement(e,{activeThemeKey:this.state.activeThemeKey,key:e.key})).filter((t,e,r)=>r.findIndex(e=>e.key===t.key)===e);return e.length?f.default.createElement(f.default.Fragment,null,f.default.createElement("h2",{className:"marketplace-card-type-heading"},r("tabs."+t.name)),f.default.createElement("div",{className:"marketplace-grid main-gridContainer-gridContainer main-gridContainer-fixedWidth","data-tab":this.CONFIG.activeTab,"data-card-type":r("tabs."+t.name)},e)):null}),"Snippets"===this.CONFIG.activeTab?f.default.createElement(S,{classes:["marketplace-add-snippet-btn"],onClick:()=>ca("ADD_SNIPPET")},"+ ",r("grid.addCSS")):null,f.default.createElement("footer",{className:"marketplace-footer"},!this.state.endOfList&&(this.state.rest?f.default.createElement(ya,{onClick:this.loadMore.bind(this)}):f.default.createElement(wa,null))),f.default.createElement(La,{switchCallback:this.switchTo.bind(this),links:this.CONFIG.tabs,activeLink:this.CONFIG.activeTab}))}},Wa=qr()(r),A=t(b()),Ue=class extends A.default.Component{constructor(){super(...arguments),this.state={isInstalled:this.props.data.isInstalled(),html:`

${this.props.t("readmePage.loading")}

`},this.getReadmeHTML=async()=>fetch(this.props.data.readmeURL).then(e=>{if(e.ok)return e.text();throw Spicetify.showNotification(`${this.props.t("readmePage.errorLoading")} (HTTP ${e.status})`,!0)}).then(e=>Cn(e,this.props.data.user,this.props.data.repo)).then(e=>(e||Spicetify.Platform.History.goBack(),e)).catch(e=>(console.error(e),Spicetify.Platform.History.goBack(),null))}componentDidMount(){this.getReadmeHTML().then(e=>{null!=e&&this.setState({html:e})})}componentDidUpdate(){var e;const t=null==(e=document.querySelector("#marketplace-readme"))?void 0:e.closest("main");if(t){const r=setInterval(()=>{document.querySelector("#marketplace-readme")?(t.style.overflowY="visible",t.style.overflowY="auto"):(clearInterval(r),t.style.removeProperty("overflow-y"))},1e3)}document.querySelectorAll("#marketplace-readme img").forEach(e=>{e.addEventListener("error",e=>{var e=e.target,t=e.getAttribute("src"),t="/"===(null==t?void 0:t.charAt(0))?`https://raw.githubusercontent.com/${this.props.data.user}/${this.props.data.repo}/${this.props.data.branch}/`+(null==t?void 0:t.slice(1)):this.props.data.readmeURL.substring(0,this.props.data.readmeURL.lastIndexOf("/"))+"/"+t;e.setAttribute("src",t)},{once:!0})})}buttonContent(){return"app"===this.props.data.type?{icon:A.default.createElement(Ma,null),text:this.props.t("github")}:this.state.isInstalled?{icon:A.default.createElement(Aa,null),text:this.props.t("remove")}:{icon:A.default.createElement(_a,null),text:this.props.t("install")}}render(){return A.default.createElement("section",{className:"contentSpacing"},A.default.createElement("div",{className:"marketplace-header"},A.default.createElement("div",{className:"marketplace-header__left"},A.default.createElement("h1",null,this.props.title)),A.default.createElement("div",{className:"marketplace-header__right"},A.default.createElement(S,{classes:["marketplace-header__button"],onClick:e=>{e.preventDefault(),this.props.data.install(),this.setState({isInstalled:!this.state.isInstalled})},label:this.buttonContent().text},this.buttonContent().icon," ",this.buttonContent().text))),"

Loading...

"===this.state.html?A.default.createElement("footer",{className:"marketplace-footer"},A.default.createElement(wa,null)):A.default.createElement("div",{id:"marketplace-readme",className:"marketplace-readme__container",dangerouslySetInnerHTML:{__html:this.state.html}}))}},Xa=qr()(Ue),Ge=(h.use(X).use(zr).init({resources:{ca:{translation:{settings:{title:"Configuració",optionsHeading:"Opcions",starCountLabel:"Número d'estrelles",tagsLabel:"Etiquetes",devToolsLabel:"Eines per a desenvolupadors de temes",hideInstalledLabel:"Amagar instal·lats",colourShiftLabel:"Canviar colors cada minut",albumArtBasedColors:"Canviar colors a partir de la portada de l'àlbum",albumArtBasedColorsMode:"Mode esquema de colors (ColorApi)",albumArtBasedColorsVibrancy:"Colors agafats de la portada de l'àlbum",albumArtBasedColorsVibrancyToolTip:"Desaturat:El color més destacat però amb molta menys bror \n Vibrant Clar: El color més villantibrant amb la brillantor augmentada una mica \n Prominent: El color més destacat a la portada de l'Àlbum \n Vibrant: El color més vibrant a la portada de l'Àlbum",almbumArtColorsModeToolTip:"Monochrome Dark: Un esquema de colors basat en el color principal seleccionat, emprant diferentes tonalitats i barrejant tons grisos per crear l'esquema de colors, aquest és l'invers de Monochrome Light. \n Monochrome Light: Un esquema de colors basat en el color principal seleccionat, emprant diferentes tonalitats i barrejant tons grisos per crear l'esquema de colors. El colors del fins de Monochrome light seria el color de primer pla en Monochrome Dark i viceversa. \n Analògic: Un esquema de colors basat en el color principal seleccionat, emprant els colors adjacents en la roda de colors. \n Analògic Complementari: Un esquema de colors basat en el color principal seleccionat, emprant els colors adjacents en la roda de colors i el color complementari. \n Tríada: Un esquema de colors basat en el color principal seleccionat, emprant els colors de la roda de colors que estan separats de manera equidistant del color principal. \n Quad: Un esquema de colors basat en el color principal seleccionat, emprant els colors que es troben separats 90 graus entre si en la roda de colors.",tabsHeading:"Pestanyes",resetHeading:"Restablir",resetBtn:"$t(settings.resetHeading)",resetDescription:"Borrar totes les extensions, temes i preferències",backupHeading:"Fer una còpia/Reestablir des d'una còpia",backupLabel:"Fer una còpia o restablir totes les dades de Marketplace des d'una còpia. Això no inclou la configuració per els elements instal·lats amb Marketplace.",backupBtn:"Obrir",versionHeading:"Versió",versionBtn:"Copiar",versionCopied:"Copiat"},tabs:{Extensions:"Extensions",Themes:"Temes",Snippets:"Fragments",Apps:"Aplicacions",Installed:"Instal·lats"},snippets:{addTitle:"Afegir fragment",editTitle:"Editar fragment",viewTitle:"Veure fragment",customCSS:"CSS personalitzat",customCSSPlaceholder:"Crea el teu propi CSS aqui! Pots trobar-los a la pestanya d'instal·lats per administrar-los.",snippetName:"Nom del fragment de codi",snippetNamePlaceholder:"Afegeix un nom al teu codi personalitzat",snippetDesc:"Descripció del codi",snippetDescPlaceholder:"Crea una descripció per al teu codi personalitzat",snippetPreview:"Vista prèvia del fragment",optional:"Opcional",addImage:"Afegir imatge",changeImage:"Canviar imatge",saveCSS:"Guardar CSS"},reloadModal:{title:"Recarregar",description:"És necessari recarregar la finestra per completar aquesta operació.",reloadNow:"Fes-ho ara",reloadLater:"Després"},backupModal:{title:"$t(settings.backupHeading)",settingsCopied:"Configuració copiada al portapapers",noDataPasted:"No s'han enganxat dades",invalidJSON:"JSON invàlid",inputLabel:"Configuració de Marketplace",inputPlaceholder:"Còpia/enganxa la teva configuració aquí",exportBtn:"Exportar",importBtn:"Importar",fileImportBtn:"Importar des d'un arxiu"},devTools:{title:"Eines de desenvolupador de temes",noThemeInstalled:"Error: No hi ha cap tema de Marketplace instal·lat",noThemeManifest:"Error: No s'ha trobat el manifest",colorIniEditor:"Editor de Color.ini",colorIniEditorPlaceholder:"[nom-de-esquema-de-color]",invalidCSS:"CSS invàlid"},grid:{spicetifyMarketplace:"Marketplace de Spicetify",newUpdate:"Nova Actualització",addCSS:"Afegir CSS",search:"Buscar",installed:"Instal·lat",lastUpdated:"Última actualizació {{val, datetime}}",externalJS:"JS extern",dark:"fosc",light:"clar"},readmePage:{title:"$t(grid.spicetifyMarketplace) - Readme",loading:"Carregant...",errorLoading:"Error carregant el README"},github:"GitHub",install:"Instal·lar",remove:"Borrar",save:"Guardar",colour_one:"color",colour_other:"colors",favourite:"preferit"}},en:{translation:{settings:{title:"Settings",optionsHeading:"Options",starCountLabel:"Stars count",tagsLabel:"Tags",devToolsLabel:"Theme developer tools",hideInstalledLabel:"Hide installed when browsing",colourShiftLabel:"Shift colours every minute",albumArtBasedColors:"Change colours based on album art",albumArtBasedColorsMode:"Colour scheme (ColorApi) mode",albumArtBasedColorsVibrancy:"Colour grabbed from album art",albumArtBasedColorsVibrancyToolTip:"Desaturated: The colour that is the most prominent but with much less brightness \n Light Vibrant: The most Vibrant colour but with the brightness amped up a tad \n Prominent: The colour that pops the most in the album art \n Vibrant: The most vibrant colour in the album art",almbumArtColorsModeToolTip:"Monochrome Dark: A colour scheme based directly on the main colour selected, using different shades of the main colour and mixing in greys to create a colour scheme, this is the inverse of Monochrome Light. \n Monochrome Light: A colour scheme based directly on the main colour selected, using different shades of the main colour and mixing in greys to create a colour scheme. The background of monochrome light would be the foreground or text colour on Monochrome Dark and vice versa. \n Analogic: A colour scheme based on the main colour selected, using the colours adjacent to the main colour on the colour wheel. \n Analogic Complementary: A colour scheme based on the main colour selected, using the colours adjacent to the main colour on the colour wheel and the complementary colour. \n Triad: A colour scheme based on the main colour selected, using the colours on the colour wheel that are equidistant from the main colour. \n Quad: A colour scheme based on the main colour selected, using the colours on the colour wheel that are 90 degrees from the main colour.",tabsHeading:"Tabs",resetHeading:"Reset",resetBtn:"$t(settings.resetHeading)",resetDescription:"Uninstall all extensions and themes, and reset preferences",backupHeading:"Back up/Restore",backupLabel:"Back up or restore all Marketplace data. This does not include settings for anything installed via Marketplace.",backupBtn:"Open",versionHeading:"Version",versionBtn:"Copy",versionCopied:"Copied"},tabs:{Extensions:"Extensions",Themes:"Themes",Snippets:"Snippets",Apps:"Apps",Installed:"Installed"},snippets:{addTitle:"Add Snippet",editTitle:"Edit Snippet",viewTitle:"View Snippet",customCSS:"Custom CSS",customCSSPlaceholder:"Input your own custom CSS here! You can find them in the installed tab for management.",snippetName:"Snippet Name",snippetNamePlaceholder:"Enter a name for your custom snippet",snippetDesc:"Snippet Description",snippetDescPlaceholder:"Enter a description for your custom snippet",snippetPreview:"Snippet Preview",optional:"Optional",addImage:"Add image",changeImage:"Change image",saveCSS:"Save CSS"},reloadModal:{title:"Reload",description:"A page reload is required to complete this operation.",reloadNow:"Reload now",reloadLater:"Reload later"},backupModal:{title:"$t(settings.backupHeading)",settingsCopied:"Settings copied to clipboard",noDataPasted:"No data pasted",invalidJSON:"Invalid JSON",inputLabel:"Marketplace Settings",inputPlaceholder:"Copy/paste your settings here",exportBtn:"Export",importBtn:"Import",fileImportBtn:"Import from file"},devTools:{title:"Theme Dev Tools",noThemeInstalled:"Error: No marketplace theme installed",noThemeManifest:"Error: No theme manifest found",colorIniEditor:"Color.ini Editor",colorIniEditorPlaceholder:"[your-colour-scheme-name]",invalidCSS:"Invalid CSS"},grid:{spicetifyMarketplace:"Spicetify Marketplace",newUpdate:"New update",addCSS:"Add CSS",search:"Search",installed:"Installed",lastUpdated:"Last updated {{val, datetime}}",externalJS:"external JS",dark:"dark",light:"light"},readmePage:{title:"$t(grid.spicetifyMarketplace) - Readme",loading:"Loading...",errorLoading:"Error loading README"},github:"GitHub",install:"Install",remove:"Remove",save:"Save",colour_one:"colour",colour_other:"colours",favourite:"favourite"}},"en-US":{translation:{settings:{colourShiftLabel:"Shift colors every minute",albumArtBasedColors:"Change colors based on album art",albumArtBasedColorsMode:"Color scheme (ColorApi) mode",albumArtBasedColorsVibrancy:"Color grabbed from album art",albumArtBasedColorsVibrancyToolTip:"Desaturated: The color that is the most prominent but with much less brightness \n Light Vibrant: The most Vibrant color but with the brightness amped up a tad \n Prominent: The color that pops the most in the album art \n Vibrant: The most vibrant color in the album art",almbumArtColorsModeToolTip:"Monochrome Dark: A color scheme based directly on the main color selected, using different shades of the main color and mixing in greys to create a color scheme, this is the inverse of Monochrome Light. \n Monochrome Light: A color scheme based directly on the main color selected, using different shades of the main color and mixing in greys to create a color scheme. The background of monochrome light would be the foreground or text color on Monochrome Dark and vice versa. \n Analogic: A color scheme based on the main color selected, using the colors adjacent to the main color on the color wheel. \n Analogic Complementary: A color scheme based on the main color selected, using the colors adjacent to the main color on the color wheel and the complementary color. \n Triad: A color scheme based on the main color selected, using the colors on the color wheel that are equidistant from the main color. \n Quad: A color scheme based on the main color selected, using the colors on the color wheel that are 90 degrees from the main color."},devTools:{colorIniEditorPlaceholder:"[your-color-scheme-name]"},colour_one:"color",colour_other:"colors",favourite:"favorite"}},es:{translation:{settings:{title:"Ajustes",optionsHeading:"Opciones",starCountLabel:"Numero de estrellas",tagsLabel:"Etiquetas",devToolsLabel:"Herramientas para desarrolladores de temas",hideInstalledLabel:"Esconder instalado cuando buscando",colourShiftLabel:"Cambiar colores cada minuto",tabsHeading:"Pestañas",resetHeading:"Reestablecer",resetBtn:"$t(settings.resetHeading)",resetDescription:"Borrar todas estensiones and temas, y borrar preferencias",backupHeading:"Haz una copia/Reestablecer desde una copia",backupLabel:"Haz una copia o reestablece todos los datos de Marketplace desde una copia. Esto no incluye ajustes para las cosas instaladas con Marketplace.",backupBtn:"Abrir"},tabs:{Extensions:"Extensiónes",Themes:"Temas",Snippets:"Codigos",Apps:"Aplicaciones",Installed:"Instalados"},snippets:{addTitle:"Añadir Codigo",editTitle:"Editar Codigo",viewTitle:"Ver Codigo",customCSS:"Custom CSS",customCSSPlaceholder:"¡Crea tu propio CSS aqui! Puedes encontrarlos en la pestaña de instalados para administrarlos.",snippetName:"Nombre del codigo",snippetNamePlaceholder:"Asignale un nombre para tu codigo personalizado",snippetDesc:"Descripcion del codigo",snippetDescPlaceholder:"Crea una description para tu codigo personalizado",snippetPreview:"Codigo",optional:"Opcional",addImage:"Añadir imagen",changeImage:"Cambiar imagen",saveCSS:"Guardar CSS"},reloadModal:{title:"Recargar",description:"Una recarga de ventada es necesaria para completar esta operación.",reloadNow:"Recargar ahora",reloadLater:"Recargar después"},backupModal:{title:"$t(settings.backupHeading)",settingsCopied:"Ajustes copiados al portapapeles",noDataPasted:"No data pegado",invalidJSON:"JSON invalido",inputLabel:"Ajustes de Marketplace",inputPlaceholder:"Copia/pega tus ajustes aqui",exportBtn:"Exportar",importBtn:"Importar",fileImportBtn:"Importar desde un archivo"},devTools:{title:"Herramientas de desarrollador de temas",noThemeInstalled:"Error: No tema de marketplace instalado",noThemeManifest:"Error: No manifiesto de tema encontrado",colorIniEditor:"Editor de Color.ini",colorIniEditorPlaceholder:"[nombre-de-esquema-de-color]",invalidCSS:"CSS invalido"},grid:{spicetifyMarketplace:"Marketplace de Spicetify",newUpdate:"Nueva actualización",addCSS:"Añadir CSS",search:"Buscar",installed:"Instalado",lastUpdated:"Ultima actualización {{val, datetime}}",externalJS:"JS external",dark:"oscuro",light:"claro"},readmePage:{title:"$t(grid.spicetifyMarketplace) - Readme",loading:"Cargando...",errorLoading:"Error cargando README"},github:"GitHub",install:"Instalar",remove:"Borrar",save:"Guardar",colour_one:"color",colour_other:"colores",favourite:"favorito"}},fr:{translation:{settings:{title:"Réglages",optionsHeading:"Options",starCountLabel:"Nombres d’étoiles",tagsLabel:"Tags",devToolsLabel:"Outils pour les développeurs de thèmes",hideInstalledLabel:"Masquer ceux étant installés lors de la navigation",colourShiftLabel:"Changer de couleure chaque minutes",tabsHeading:"Onglets",resetHeading:"Réinitialiser",resetBtn:"$t(settings.resetHeading)",resetDescription:"Désinstaller toutes les extensions et tous les thèmes, ainsi que l’ensemble des réglages",backupHeading:"Sauvegarde/Restauration",backupLabel:"Sauvegarder ou restaurer toutes les données du Marché. Celà n'inclue pas les réglages pour quoi que ce soit installé depuis le Marché.",backupBtn:"Ouvrir"},tabs:{Extensions:"Extensions",Themes:"Thèmes",Snippets:"Bribes",Apps:"Applications",Installed:"Installé(s)"},snippets:{addTitle:"Ajouter Bribe",editTitle:"Éditer Bribe",viewTitle:"Voir Bribe",customCSS:"CSS personnalisé",customCSSPlaceholder:"Insérez votre propre CSS personnalisé ici! Vous pouvez les retrouver dans l’onglet Installé pour les gérrer.",snippetName:"Nom de la bribe",snippetNamePlaceholder:"Entrer un nom pour votre bribe personnalisée",snippetDesc:"Description de la bribe",snippetDescPlaceholder:"Entrez une description pour votre bribe personnalisée",snippetPreview:"Prévisualiser la bribe",optional:"Optionnel",addImage:"Ajouter une image",changeImage:"Changer l’image",saveCSS:"Enregistrer le CSS"},reloadModal:{title:"Recharger",description:"Un rechargement de la page est requis pour finaliser cette opération.",reloadNow:"Recharger maintenant",reloadLater:"Recharger plus tard"},backupModal:{title:"Sauvegarder/Restaurer",settingsCopied:"Réglages copiés dans le presse-papier",noDataPasted:"Aucune donnée collée",invalidJSON:"JSON invalide",inputLabel:"Réglages du Marché",inputPlaceholder:"Copier/coller vos réglages ici",exportBtn:"Exporter",importBtn:"Importer",fileImportBtn:"Importer depuis un fichier"},devTools:{title:"Outils de développeurs de thèmes",noThemeInstalled:"Erreur: Aucun thème du marché n’est installé",noThemeManifest:"Erreur: Aucun manifeste de thème trouvé",colorIniEditor:"Éditeur Color.ini",colorIniEditorPlaceholder:"[nom-de-votre-schéma-de-couleur]",invalidCSS:"CSS invalide"},grid:{spicetifyMarketplace:"Marché Spicetify",newUpdate:"Nouvelle mise à jour",addCSS:"Ajouter CSS",search:"Rechercher",installed:"Installé",lastUpdated:"Dernière mise à jour {{val, datetime}}",externalJS:"JS externe",dark:"sombre",light:"clair"},readmePage:{title:"$t(grid.spicetifyMarketplace) - Readme",loading:"Chargement…",errorLoading:"Erreur lors du chargement du README"},github:"GitHub",install:"Installer",remove:"Supprimer",save:"Enregistrer",colour_one:"couleure",colour_other:"couleures",favourite:"favoris"}},"zh-TW":{translation:{settings:{title:"設定",optionsHeading:"選項",starCountLabel:"收藏數",tagsLabel:"標籤",devToolsLabel:"主題開發者工具",hideInstalledLabel:"瀏覽時隱藏已安裝項目",colourShiftLabel:"每分鐘進行色調偏移",tabsHeading:"分頁",resetHeading:"重設",resetBtn:"$t(settings.resetHeading)",resetDescription:"解除安裝所有擴充套件和主題, 並重設偏好設定",backupHeading:"備份與還原",backupLabel:"備份或還原所有 Marketplace 中的資料(不包含從 Marketplace 安裝的擴充元件的設定)。",backupBtn:"開啟"},tabs:{Extensions:"擴充套件",Themes:"主題",Snippets:"微調片段",Apps:"功能模組",Installed:"已安裝項目"},snippets:{addTitle:"加入微調片段",editTitle:"編輯微調片段",viewTitle:"檢視微調片段",customCSS:"自訂 CSS",customCSSPlaceholder:"這裡可以輸入您的自訂 CSS!您可以在「已安裝項目」分頁中看到這些片段,進而進行管理。",snippetName:"微調片段名稱",snippetNamePlaceholder:"輸入自訂微調片段的名稱",snippetDesc:"微調片段描述",snippetDescPlaceholder:"輸入自訂微調片段的描述",snippetPreview:"微調片段預覽圖",optional:"非必須",addImage:"加入影像",changeImage:"更改影像",saveCSS:"儲存 CSS"},reloadModal:{title:"重新載入",description:"需要重新載入頁面,才能完成這個操作。",reloadNow:"立即重新載入",reloadLater:"稍後重新載入"},backupModal:{title:"$t(settings.backupHeading)",settingsCopied:"已將設定複製至剪貼簿",noDataPasted:"沒有貼上資料",invalidJSON:"JSON 無效",inputLabel:"Marketplace 設定",inputPlaceholder:"在此複製或貼上設定",exportBtn:"匯出",importBtn:"匯入",fileImportBtn:"從檔案匯入"},devTools:{title:"主題開發者工具",noThemeInstalled:"錯誤:沒有安裝 Marketplace 主題",noThemeManifest:"錯誤:找不到主題資訊清單",colorIniEditor:"Color.ini 編輯器",colorIniEditorPlaceholder:"[您的色彩配置名稱]",invalidCSS:"CSS 無效"},grid:{spicetifyMarketplace:"Spicetify Marketplace",newUpdate:"有更新",addCSS:"加入 CSS",search:"搜尋",installed:"已經安裝",lastUpdated:"上次更新於 {{val, datetime}}",externalJS:"有外部 JS",dark:"暗色",light:"亮色"},readmePage:{title:"$t(grid.spicetifyMarketplace) – 說明",loading:"正在載入……",errorLoading:"載入 README 時發生錯誤"},github:"GitHub",install:"安裝",remove:"移除",save:"儲存",colour_one:"色彩",colour_other:"色彩",favourite:"收藏"}},"zh-CN":{translation:{settings:{title:"设置",optionsHeading:"选项",starCountLabel:"收藏数",tagsLabel:"标签",devToolsLabel:"主題开发者工具",hideInstalledLabel:"浏览时隐藏已安装项目",colourShiftLabel:"每分钟进行色调偏移",tabsHeading:"分页",resetHeading:"重置",resetBtn:"$t(settings.resetHeading)",resetDescription:"卸载所有扩展插件和主题,并重置设置"},tabs:{Extensions:"扩展插件",Themes:"主题",Snippets:"微调片段",Apps:"功能模组",Installed:"已安裝项目"},snippets:{addTitle:"加入微调片段",editTitle:"编辑微调片段",viewTitle:"检视微调片段",customCSS:"自定义 CSS",customCSSPlaceholder:"这里可以输入您的自定义 CSS!您可以在「已安裝项目」标签页中看到这些片段,进而进行管理。",snippetName:"微调片段名称",snippetNamePlaceholder:"输入自定义微调片段的名称",snippetDesc:"微调片段描述",snippetDescPlaceholder:"输入自定义微调片段的描述",snippetPreview:"微调片段预览图",optional:"非必要",addImage:"加入影像",changeImage:"更改影像",saveCSS:"保存 CSS"},reloadModal:{title:"重新加载",description:"需要重新加载页面,才能完成这个操作。",reloadNow:"立即重新加载",reloadLater:"稍后重新加载"},devTools:{title:"主題开发者工具",noThemeInstalled:"错误:未安装商场主题",noThemeManifest:"错误:找不到主题内容清单",colorIniEditor:"Color.ini 编辑器",colorIniEditorPlaceholder:"[您的色彩配置名称]",invalidCSS:"CSS 无效"},grid:{spicetifyMarketplace:"Spicetify 商场",newUpdate:"有更新",addCSS:"加入 CSS",search:"搜索",installed:"已安装",lastUpdated:"上次更新于 {{val, datetime}}",externalJS:"有外部 JS",dark:"暗色模式",light:"亮色模式"},readmePage:{title:"$t(grid.spicetifyMarketplace) – 说明",loading:"正在加载……",errorLoading:"加载 README 时发生错误"},github:"GitHub",install:"安裝",remove:"移除",save:"保存",colour_one:"色彩",colour_other:"色彩",favourite:"收藏"}}},detection:{order:["navigator","htmlTag"]},fallbackLng:"en",interpolation:{escapeValue:!1}}),class extends rt.default.Component{constructor(e){super(e),this.state={count:0,CONFIG:{}},this.updateConfig=e=>{this.CONFIG=l({},e),console.debug("updated config",this.CONFIG),this.setState({CONFIG:l({},e)})};e=w(E.tabs,null);let t=[];try{if(t=JSON.parse(e),!Array.isArray(t))throw new Error("Could not parse marketplace tabs key");if(0===t.length)throw new Error("Empty marketplace tabs key");if(0!e).length)throw new Error("Falsey marketplace tabs key")}catch(e){t=hn,localStorage.setItem(E.tabs,JSON.stringify(t))}let r={},n=null;try{var a=w(E.themeInstalled,null);if(a){var o=w(a,null);if(!o)throw new Error("No installed theme data");r=o.schemes,n=o.activeScheme}else console.debug("No theme set as installed")}catch(e){console.error(e)}this.CONFIG={visual:{stars:JSON.parse(w("marketplace:stars",!0)),tags:JSON.parse(w("marketplace:tags",!0)),hideInstalled:JSON.parse(w("marketplace:hideInstalled",!1)),colorShift:JSON.parse(w("marketplace:colorShift",!1)),themeDevTools:JSON.parse(w("marketplace:themeDevTools",!1)),albumArtBasedColors:JSON.parse(w("marketplace:albumArtBasedColors",!1)),albumArtBasedColorsMode:w("marketplace:albumArtBasedColorsMode")||"monochrome-light",albumArtBasedColorsVibrancy:w("marketplace:albumArtBasedColorsVibrancy")||"PROMINENT",type:JSON.parse(w("marketplace:type",!1)),followers:JSON.parse(w("marketplace:followers",!1))},tabs:t,activeTab:w(E.activeTab,t[0]),theme:{activeThemeKey:w(E.themeInstalled,null),schemes:r,activeScheme:n}},this.CONFIG.activeTab&&this.CONFIG.tabs.filter(e=>e.name===this.CONFIG.activeTab).length||(this.CONFIG.activeTab=this.CONFIG.tabs[0].name)}render(){var e,{location:t,replace:r}=Spicetify.Platform.History;return t.pathname===mn+"/readme"?null!=(e=t.state)&&e.data?rt.default.createElement(Xa,{title:g("readmePage.title"),data:t.state.data}):(r(mn),null):rt.default.createElement(Wa,{title:g("grid.spicetifyMarketplace"),CONFIG:this.CONFIG,updateAppConfig:this.updateConfig})}}),Ya=qr()(Ge),Qa=t(b());return Ve=Ze,W(j({},"__esModule",{value:!0}),Ve)})();const render=()=>marketplace.default(); \ No newline at end of file diff --git a/.config/spicetify/CustomApps/marketplace/manifest.json b/.config/spicetify/CustomApps/marketplace/manifest.json new file mode 100644 index 00000000..13d9dbe8 --- /dev/null +++ b/.config/spicetify/CustomApps/marketplace/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "marketplace", + "icon": "\n", + "active-icon": "\n", + "subfiles": [], + "subfiles_extension": [ + "extension.js" + ] +} diff --git a/.config/spicetify/CustomApps/marketplace/style.css b/.config/spicetify/CustomApps/marketplace/style.css new file mode 100644 index 00000000..3c4b00e9 --- /dev/null +++ b/.config/spicetify/CustomApps/marketplace/style.css @@ -0,0 +1 @@ +@charset "UTF-8";.Root__fixed-top-bar~.Root__main-view .marketplace-header{padding-top:64px}.marketplace-header{-webkit-box-pack:justify;-webkit-box-align:center;align-content:space-between;align-items:center;color:var(--spice-text);display:flex;justify-content:space-between;margin:16px 0;position:sticky;flex-direction:row-reverse;z-index:1}.marketplace-header__left,.marketplace-header__right{display:flex}.marketplace-header__left>:is(div,button),.marketplace-header__right>:is(div,button){margin-left:8px}.marketplace-header__left{position:fixed;left:16px}@media (min-width:1024px){.marketplace-header__left{left:32px}}.marketplace-grid{--minimumColumnWidth:180px;--column-width:minmax(var(--minimumColumnWidth), 1fr);--column-count:auto-fill;--grid-gap:24px}.marketplace-sort-bar{align-items:center;display:flex}.marketplace-sort-container{position:relative;display:flex}.marketplace-tabBar-headerItem{-webkit-app-region:no-drag;display:inline-block;pointer-events:auto;vertical-align:middle}.marketplace-tabBar-active{background-color:var(--spice-tab-active);border-radius:4px}.marketplace-tabBar-headerItemLink{border-radius:4px;color:var(--spice-text);display:inline-block;margin:0 8px 0 0;padding:8px 16px;position:relative;text-decoration:none!important;cursor:pointer}.marketplace-tabBar-nav{-webkit-app-region:drag;pointer-events:none;width:100%}.marketplace-tabBar-headerItem .optionsMenu-dropBox{color:var(--spice-text);border:0;max-width:150px;height:42px;padding:0 30px 0 12px;background-color:initial;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}.marketplace-tabBar-headerItem .optionsMenu-dropBox svg{position:absolute;margin-left:8px}.marketplace-header-icon-button{border-radius:8px;color:var(--spice-text);display:inline-block;padding:10px 14px 6px;font-weight:700;position:relative;text-decoration:none!important;cursor:pointer;background-color:transparent;border:none;background-color:var(--spice-sidebar);transition-duration:.2s}.marketplace-header-icon-button:hover{background-color:var(--spice-button-disabled)}.searchbar--bar__wrapper{display:flex;flex-direction:column;align-items:flex-end;flex-grow:1}.searchbar-bar{border-style:solid;border-color:var(--spice-sidebar);background-color:var(--spice-sidebar)!important;border-radius:8px;padding:10px 12px;color:var(--spice-text)!important}option{background-color:var(--spice-button)}.marketplace-footer{margin:auto;text-align:center}.marketplace-add-snippet-btn{position:sticky!important;bottom:32px;left:100%}.arrow-closed,.arrow-open{border:solid rgba(var(--spice-rgb-text),.7);border-width:0 2px 2px 0;display:inline-block;padding:4px;position:absolute;right:10px}.arrow-closed{top:10px;transform:rotate(45deg);-webkit-transform:rotate(45deg)}.arrow-open{top:14px;transform:rotate(-135deg);-webkit-transform:rotate(-135deg)}.Dropdown-root{position:relative}.Dropdown-root.is-open .Dropdown-control{border-bottom-left-radius:0;border-bottom-right-radius:0}.Dropdown-root.is-open .Dropdown-control:hover .Dropdown-arrow{border-color:transparent transparent rgb(var(--spice-rgb-text))}.Dropdown-root.is-open .Dropdown-arrow{border-color:transparent transparent rgba(var(--spice-rgb-text),.7);border-width:0 5px 5px}.Dropdown-root.is-open .Dropdown-menu{border-top-left-radius:0;border-top-right-radius:0}.Dropdown-control{position:relative;overflow:hidden;background-color:var(--spice-sidebar);border:0;border-radius:8px;box-sizing:border-box;color:rgba(var(--spice-rgb-text),.7);cursor:default;outline:0;padding:8px 36px 8px 16px;transition:all .2s ease}.Dropdown-control:hover{color:rgb(var(--spice-rgb-text));background-color:var(--spice-button-disabled)}.Dropdown-control:hover .Dropdown-arrow{border-color:rgb(var(--spice-rgb-text)) transparent transparent}.Dropdown-arrow{border-color:rgba(var(--spice-rgb-text),.7) transparent transparent;border-style:solid;border-width:5px 5px 0;content:" ";display:block;height:0;margin-top:-ceil(2.5);position:absolute;right:16px;top:18px;width:0}.Dropdown-menu{background-color:var(--spice-sidebar);border:0;border-radius:8px;box-shadow:0 1px 0 rgba(0,0,0,.06);box-sizing:border-box;margin-top:-1px;max-height:200px;overflow-y:auto;position:absolute;top:100%;width:100%;z-index:1000;-webkit-overflow-scrolling:touch}.Dropdown-menu .Dropdown-group>.Dropdown-title{padding:8px 10px;color:#333;font-weight:700;text-transform:capitalize}.Dropdown-option{box-sizing:border-box;color:rgba(var(--spice-rgb-text),.7);cursor:pointer;display:block;padding:8px 10px}.Dropdown-option:last-child{border-bottom-right-radius:8px;border-bottom-left-radius:8px}.Dropdown-option.is-selected{background-color:rgba(var(--spice-rgb-text),.7);color:var(--spice-sidebar)}.Dropdown-option:hover{background-color:rgb(var(--spice-rgb-text));color:var(--spice-sidebar)}.Dropdown-noresults{box-sizing:border-box;color:#ccc;cursor:default;display:block;padding:8px 10px}.marketplace-card-type-heading{margin:1em 0 .5em;color:var(--spice-subtext);font-size:1.3em}.marketplace-grid .main-card-draggable{display:flex;flex-direction:column}.marketplace-grid .main-card-draggable .main-card-cardMetadata{flex-grow:1;display:flex;flex-direction:column}.marketplace-grid .main-card-draggable .main-card-cardMetadata .main-cardHeader-link:hover{text-decoration:underline}.marketplace-grid .main-card-draggable .main-card-cardMetadata .marketplace-card__author~.marketplace-card__author::before{content:", "}.marketplace-grid .main-card-draggable .main-card-cardMetadata ul.marketplace-card__tags{display:flex;flex-wrap:wrap;gap:8px}.marketplace-grid .main-card-draggable .main-card-cardMetadata li.marketplace-card__tag{background-color:var(--spice-tab-active);border-radius:4px;padding:0 9px 2px}.marketplace-grid .main-card-draggable .main-card-cardMetadata li.marketplace-card__tag[data-tag="external JS"]{background-color:#db3737;color:#fff}.marketplace-grid .main-card-draggable .main-card-cardMetadata li.marketplace-card__tag[data-tag=dark]{background-color:#000;color:#fff}.marketplace-grid .main-card-draggable .main-card-cardMetadata li.marketplace-card__tag[data-tag=light]{background-color:#fff;color:#333}.marketplace-grid .main-card-draggable .main-card-cardMetadata .marketplace-card__tags-more-btn{background-color:var(--spice-tab-active);border-radius:4px;padding:0 9px 2px;margin-top:8px;border:none}.marketplace-grid .main-card-draggable .main-card-cardMetadata .marketplace-card__tags-more-btn:focus,.marketplace-grid .main-card-draggable .main-card-cardMetadata .marketplace-card__tags-more-btn:hover{filter:brightness(1.4)}.marketplace-grid .main-card-draggable .main-card-cardMetadata .marketplace-card-desc{font:-webkit-small-control;margin:12px 0;display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:3}.marketplace-grid .main-card-draggable .main-card-cardMetadata .marketplace-card__bottom-meta{margin-top:auto;margin-bottom:0}.marketplace-grid .main-card-draggable .main-card-cardMetadata .marketplace-card__bottom-meta+.marketplace-card__bottom-meta{margin-top:8px}.marketplace-grid[data-tab=Installed]:empty::after{content:"No installed " attr(data-card-type);display:block}.main-cardImage-imageWrapper--error::before{content:"";display:block;position:absolute;overflow:hidden;top:0;left:0;bottom:0;right:0;height:100%;width:100%;background-color:var(--spice-subtext);filter:brightness(50%);-webkit-clip-path:path("M41.20833,21.5c-2.54758,0.00136 -4.90298,1.35492 -6.18685,3.55534l-12.54167,21.5c-0.64062,1.09578 -0.97875,2.34203 -0.97982,3.61133v86c0,7.83362 6.49972,14.33333 14.33333,14.33333h100.33333c7.83362,0 14.33333,-6.49972 14.33333,-14.33333v-86c-0.00107,-1.2693 -0.3392,-2.51555 -0.97982,-3.61133l-12.54167,-21.5c-1.28387,-2.20042 -3.63926,-3.55398 -6.18685,-3.55534zM45.32357,35.83333h81.35286l8.35645,14.33333h-98.06576zM35.83333,64.5h100.33333v71.66667h-100.33333zM64.5,78.83333v14.33333h43v-14.33333z");clip-path:path("M41.20833,21.5c-2.54758,0.00136 -4.90298,1.35492 -6.18685,3.55534l-12.54167,21.5c-0.64062,1.09578 -0.97875,2.34203 -0.97982,3.61133v86c0,7.83362 6.49972,14.33333 14.33333,14.33333h100.33333c7.83362,0 14.33333,-6.49972 14.33333,-14.33333v-86c-0.00107,-1.2693 -0.3392,-2.51555 -0.97982,-3.61133l-12.54167,-21.5c-1.28387,-2.20042 -3.63926,-3.55398 -6.18685,-3.55534zM45.32357,35.83333h81.35286l8.35645,14.33333h-98.06576zM35.83333,64.5h100.33333v71.66667h-100.33333zM64.5,78.83333v14.33333h43v-14.33333z");clip-rule:nonzero;transform:scale(.5)}.main-cardImage-imageWrapper--error{box-shadow:none}.main-card-card:hover .main-cardImage-imageWrapper--error::before{filter:brightness(100%)}.marketplace-cardSubHeader,.marketplace-card__bottom-meta{margin-top:4px;white-space:normal;color:var(--spice-subtext)}.marketplace-cardSubHeader{display:flex;flex-direction:column;gap:8px}.marketplace-card--installed{flex:0!important;-webkit-box-flex:0!important;border:1px solid var(--spice-button)}.marketplace-installButton{cursor:pointer;--size:40px}#marketplace-config-container .setting-row{display:flex;justify-content:space-between}#marketplace-config-container .setting-row .col{display:flex;padding:10px 0;align-items:center}#marketplace-config-container .setting-row .col.action{text-align:right}#marketplace-config-container .setting-row .col.action .marketplace-sortBox+.marketplace-tooltip-icon{-webkit-margin-start:8px;margin-inline-start:8px}.marketplace-tooltip-icon{position:relative;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.marketplace-tooltip-icon+[data-tippy-root]{text-align:start}button.arrow-btn{align-items:center;border:0;border-radius:50%;background-color:rgba(var(--spice-rgb-shadow),.7);color:var(--spice-text);cursor:pointer;display:flex;-webkit-margin-end:12px;margin-inline-end:12px;padding:8px}button.arrow-btn.small{width:24px;height:24px;padding:5px}button.arrow-btn.disabled,button.arrow-btn[disabled]{color:rgba(var(--spice-rgb-text),.3);cursor:not-allowed}#marketplace-add-snippet-container input,textarea{width:100%;margin-bottom:10px;padding:3px 5px;background-color:var(--spice-main);color:var(--spice-text);font-size:14px;border:1px solid var(--spice-button);border-radius:4px}.GenericModal[aria-label="Reload required"]{height:240px!important}.marketplace-reload-modal__button-container{display:flex;justify-content:center;padding-top:18px}.marketplace-reload-modal__button-container button{margin:18px;padding:8px 24px}#marketplace-add-snippet-container{display:flex;flex-direction:column;gap:16px}#marketplace-add-snippet-container #marketplace-custom-css:focus-visible{outline:0}.marketplace-customCSS-input-container{display:flex;flex-direction:column}img.marketplace-customCSS-image-preview{aspect-ratio:1;width:100%;height:auto;max-width:400px;-o-object-fit:cover;object-fit:cover;margin:0 auto}#marketplace-customCSS-submit{margin-left:auto}.spicetify-root-vars{--spice-shadow:#1f1525;--spice-text:#ffffff;--spice-sidebar:#0a0e14;--spice-button-disabled:#535353;--spice-main:#0a0e14;--spice-misc:#bfbfbf;--spice-selected-row:#909090;--spice-subtext:#f0f0f0;--spice-tab-active:#795b84;--spice-button:#6f3c89;--spice-notification:#6f3c89;--spice-player:#0a0e14;--spice-notification-error:#e22134;--spice-card:#6f3c89;--spice-button-active:#795b84}:root{--background-body:var(--spice-main);--background:var(--spice-main);--background-alt:var(--spice-shadow);--selection:#1c76c5;--text-main:var(--spice-subtext);--text-bright:var(--spice-text);--text-muted:#a9b1ba;--links:#41adff;--focus:#0096bfab;--border:#526980;--code:#ffbe85;--animation-duration:0.1s;--button-base:#0c151c;--button-hover:#040a0f;--scrollbar-thumb:var(--button-hover);--scrollbar-thumb-hover:rgb(0, 0, 0);--form-placeholder:#a9a9a9;--form-text:#fff;--variable:#d941e2;--highlight:#efdb43;--select-arrow:url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E")}#marketplace-readme{-webkit-user-select:text;-moz-user-select:text;user-select:text;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue","Segoe UI Emoji","Apple Color Emoji","Noto Color Emoji",sans-serif;line-height:1.4;max-width:800px;margin:20px auto;padding:0 10px;word-wrap:break-word;color:#dbdbdb;color:var(--text-main);background:#202b38;background:var(--background-body);text-rendering:optimizeLegibility}#marketplace-readme button{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}#marketplace-readme input{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}#marketplace-readme textarea{transition:background-color .1s linear,border-color .1s linear,color .1s linear,box-shadow .1s linear,transform .1s ease;transition:background-color var(--animation-duration) linear,border-color var(--animation-duration) linear,color var(--animation-duration) linear,box-shadow var(--animation-duration) linear,transform var(--animation-duration) ease}#marketplace-readme h1{font-size:2.2em;margin-top:0}#marketplace-readme h1,#marketplace-readme h2,#marketplace-readme h3,#marketplace-readme h4,#marketplace-readme h5,#marketplace-readme h6{margin-bottom:12px;margin-top:24px}#marketplace-readme h1{color:#fff;color:var(--text-bright)}#marketplace-readme h2{color:#fff;color:var(--text-bright)}#marketplace-readme h3{color:#fff;color:var(--text-bright)}#marketplace-readme h4{color:#fff;color:var(--text-bright)}#marketplace-readme h5{color:#fff;color:var(--text-bright)}#marketplace-readme h6{color:#fff;color:var(--text-bright)}#marketplace-readme strong{color:#fff;color:var(--text-bright)}#marketplace-readme b,#marketplace-readme h1,#marketplace-readme h2,#marketplace-readme h3,#marketplace-readme h4,#marketplace-readme h5,#marketplace-readme h6,#marketplace-readme strong,#marketplace-readme th{font-weight:600}#marketplace-readme q::before{content:none}#marketplace-readme q::after{content:none}#marketplace-readme blockquote{border-left:4px solid rgba(0,150,191,.6705882353);border-left:4px solid var(--focus);margin:1.5em 0;padding:.5em 1em;font-style:italic}#marketplace-readme q{border-left:4px solid rgba(0,150,191,.6705882353);border-left:4px solid var(--focus);margin:1.5em 0;padding:.5em 1em;font-style:italic}#marketplace-readme blockquote>footer{font-style:normal;border:0}#marketplace-readme blockquote cite{font-style:normal}#marketplace-readme address{font-style:normal}#marketplace-readme a[href^="mailto:"]::before{content:"\1f4e7 "}#marketplace-readme a[href^="tel:"]::before{content:"\1f4de "}#marketplace-readme a[href^="sms:"]::before{content:"\1f4ac "}#marketplace-readme mark{background-color:#efdb43;background-color:var(--highlight);border-radius:2px;padding:0 2px 0 2px;color:#000}#marketplace-readme a>code,#marketplace-readme a>strong{color:inherit}#marketplace-readme button,#marketplace-readme input[type=button],#marketplace-readme input[type=checkbox],#marketplace-readme input[type=radio],#marketplace-readme input[type=range],#marketplace-readme input[type=reset],#marketplace-readme input[type=submit],#marketplace-readme select{cursor:pointer}#marketplace-readme input,#marketplace-readme select{display:block}#marketplace-readme [type=checkbox],#marketplace-readme [type=radio]{display:initial}#marketplace-readme input{color:#fff;color:var(--form-text);background-color:#161f27;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:0}#marketplace-readme button{color:#fff;color:var(--form-text);background-color:#161f27;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:0}#marketplace-readme textarea{color:#fff;color:var(--form-text);background-color:#161f27;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:0}#marketplace-readme select{color:#fff;color:var(--form-text);background-color:#161f27;background-color:var(--background);font-family:inherit;font-size:inherit;margin-right:6px;margin-bottom:6px;padding:10px;border:none;border-radius:6px;outline:0}#marketplace-readme button{background-color:#0c151c;background-color:var(--button-base);padding-right:30px;padding-left:30px}#marketplace-readme input[type=submit]{background-color:#0c151c;background-color:var(--button-base);padding-right:30px;padding-left:30px}#marketplace-readme input[type=reset]{background-color:#0c151c;background-color:var(--button-base);padding-right:30px;padding-left:30px}#marketplace-readme input[type=button]{background-color:#0c151c;background-color:var(--button-base);padding-right:30px;padding-left:30px}#marketplace-readme button:hover{background:#040a0f;background:var(--button-hover)}#marketplace-readme input[type=submit]:hover{background:#040a0f;background:var(--button-hover)}#marketplace-readme input[type=reset]:hover{background:#040a0f;background:var(--button-hover)}#marketplace-readme input[type=button]:hover{background:#040a0f;background:var(--button-hover)}#marketplace-readme input[type=color]{min-height:2rem;padding:8px;cursor:pointer}#marketplace-readme input[type=checkbox],#marketplace-readme input[type=radio]{height:1em;width:1em}#marketplace-readme input[type=radio]{border-radius:100%}#marketplace-readme input{vertical-align:top}#marketplace-readme label{vertical-align:middle;margin-bottom:4px;display:inline-block}#marketplace-readme button,#marketplace-readme input:not([type=checkbox]):not([type=radio]),#marketplace-readme input[type=range],#marketplace-readme select,#marketplace-readme textarea{-webkit-appearance:none}#marketplace-readme textarea{display:block;margin-right:0;box-sizing:border-box;resize:vertical}#marketplace-readme textarea:not([cols]){width:100%}#marketplace-readme textarea:not([rows]){min-height:40px;height:140px}#marketplace-readme select{background:#161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50%/12px no-repeat;background:var(--background) var(--select-arrow) calc(100% - 12px) 50%/12px no-repeat;padding-right:35px}#marketplace-readme select::-ms-expand{display:none}#marketplace-readme select[multiple]{padding-right:10px;background-image:none;overflow-y:auto}#marketplace-readme input:focus{box-shadow:0 0 0 2px rgba(0,150,191,.6705882353);box-shadow:0 0 0 2px var(--focus)}#marketplace-readme select:focus{box-shadow:0 0 0 2px rgba(0,150,191,.6705882353);box-shadow:0 0 0 2px var(--focus)}#marketplace-readme button:focus{box-shadow:0 0 0 2px rgba(0,150,191,.6705882353);box-shadow:0 0 0 2px var(--focus)}#marketplace-readme textarea:focus{box-shadow:0 0 0 2px rgba(0,150,191,.6705882353);box-shadow:0 0 0 2px var(--focus)}#marketplace-readme button:active,#marketplace-readme input[type=button]:active,#marketplace-readme input[type=checkbox]:active,#marketplace-readme input[type=radio]:active,#marketplace-readme input[type=range]:active,#marketplace-readme input[type=reset]:active,#marketplace-readme input[type=submit]:active{transform:translateY(2px)}#marketplace-readme button:disabled,#marketplace-readme input:disabled,#marketplace-readme select:disabled,#marketplace-readme textarea:disabled{cursor:not-allowed;opacity:.5}#marketplace-readme ::-moz-placeholder{color:#a9a9a9;color:var(--form-placeholder)}#marketplace-readme ::placeholder{color:#a9a9a9;color:var(--form-placeholder)}#marketplace-readme fieldset{border:1px rgba(0,150,191,.6705882353) solid;border:1px var(--focus) solid;border-radius:6px;margin:0;margin-bottom:12px;padding:10px}#marketplace-readme legend{font-size:.9em;font-weight:600}#marketplace-readme input[type=range]{margin:10px 0;padding:10px 0;background:0 0}#marketplace-readme input[type=range]:focus{outline:0}#marketplace-readme input[type=range]::-webkit-slider-runnable-track{width:100%;height:9.5px;-webkit-transition:.2s;transition:.2s;background:#161f27;background:var(--background);border-radius:3px}#marketplace-readme input[type=range]::-webkit-slider-thumb{box-shadow:0 1px 1px #000,0 0 1px #0d0d0d;height:20px;width:20px;border-radius:50%;background:#526980;background:var(--border);-webkit-appearance:none;margin-top:-7px}#marketplace-readme input[type=range]:focus::-webkit-slider-runnable-track{background:#161f27;background:var(--background)}#marketplace-readme input[type=range]::-moz-range-track{width:100%;height:9.5px;-moz-transition:.2s;transition:.2s;background:#161f27;background:var(--background);border-radius:3px}#marketplace-readme input[type=range]::-moz-range-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;height:20px;width:20px;border-radius:50%;background:#526980;background:var(--border)}#marketplace-readme input[type=range]::-ms-track{width:100%;height:9.5px;background:0 0;border-color:transparent;border-width:16px 0;color:transparent}#marketplace-readme input[type=range]::-ms-fill-lower{background:#161f27;background:var(--background);border:.2px solid #010101;border-radius:3px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}#marketplace-readme input[type=range]::-ms-fill-upper{background:#161f27;background:var(--background);border:.2px solid #010101;border-radius:3px;box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}#marketplace-readme input[type=range]::-ms-thumb{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d;border:1px solid #000;height:20px;width:20px;border-radius:50%;background:#526980;background:var(--border)}#marketplace-readme input[type=range]:focus::-ms-fill-lower{background:#161f27;background:var(--background)}#marketplace-readme input[type=range]:focus::-ms-fill-upper{background:#161f27;background:var(--background)}#marketplace-readme a{text-decoration:none;color:#41adff;color:var(--links)}#marketplace-readme a:hover{text-decoration:underline}#marketplace-readme code{background:#161f27;background:var(--background);color:#ffbe85;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}#marketplace-readme samp{background:#161f27;background:var(--background);color:#ffbe85;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}#marketplace-readme time{background:#161f27;background:var(--background);color:#ffbe85;color:var(--code);padding:2.5px 5px;border-radius:6px;font-size:1em}#marketplace-readme pre>code{padding:10px;display:block;overflow-x:auto}#marketplace-readme var{color:#d941e2;color:var(--variable);font-style:normal;font-family:monospace}#marketplace-readme kbd{background:#161f27;background:var(--background);border:1px solid #526980;border:1px solid var(--border);border-radius:2px;color:#dbdbdb;color:var(--text-main);padding:2px 4px 2px 4px}#marketplace-readme img,#marketplace-readme video{max-width:100%;height:auto}#marketplace-readme hr{border:none;border-top:1px solid #526980;border-top:1px solid var(--border)}#marketplace-readme table{border-collapse:collapse;margin-bottom:10px;width:100%;table-layout:fixed}#marketplace-readme table caption{text-align:left}#marketplace-readme td,#marketplace-readme th{padding:6px;text-align:left;vertical-align:top;word-wrap:break-word}#marketplace-readme thead{border-bottom:1px solid #526980;border-bottom:1px solid var(--border)}#marketplace-readme tfoot{border-top:1px solid #526980;border-top:1px solid var(--border)}#marketplace-readme tbody tr:nth-child(2n){background-color:#161f27;background-color:var(--background)}#marketplace-readme tbody tr:nth-child(2n) button{background-color:#1a242f;background-color:var(--background-alt)}#marketplace-readme tbody tr:nth-child(2n) button:hover{background-color:#202b38;background-color:var(--background-body)}#marketplace-readme ::-webkit-scrollbar{height:10px;width:10px}#marketplace-readme ::-webkit-scrollbar-track{background:#161f27;background:var(--background);border-radius:6px}#marketplace-readme ::-webkit-scrollbar-thumb{background:#040a0f;background:var(--scrollbar-thumb);border-radius:6px}#marketplace-readme ::-webkit-scrollbar-thumb:hover{background:#000;background:var(--scrollbar-thumb-hover)}#marketplace-readme ::-moz-selection{background-color:#1c76c5;background-color:var(--selection);color:#fff;color:var(--text-bright)}#marketplace-readme ::selection{background-color:#1c76c5;background-color:var(--selection);color:#fff;color:var(--text-bright)}#marketplace-readme details{display:flex;flex-direction:column;align-items:flex-start;background-color:#1a242f;background-color:var(--background-alt);padding:10px 10px 0;margin:1em 0;border-radius:6px;overflow:hidden}#marketplace-readme details[open]{padding:10px}#marketplace-readme details>:last-child{margin-bottom:0}#marketplace-readme details[open] summary{margin-bottom:10px}#marketplace-readme summary{display:list-item;background-color:#161f27;background-color:var(--background);padding:10px;margin:-10px -10px 0;cursor:pointer;outline:0}#marketplace-readme summary:focus,#marketplace-readme summary:hover{text-decoration:underline}#marketplace-readme details>:not(summary){margin-top:0}#marketplace-readme summary::-webkit-details-marker{color:#dbdbdb;color:var(--text-main)}#marketplace-readme dialog{background-color:#1a242f;background-color:var(--background-alt);color:#dbdbdb;color:var(--text-main);border:none;border-radius:6px;border-color:#526980;border-color:var(--border);padding:10px 30px}#marketplace-readme dialog>header:first-child{background-color:#161f27;background-color:var(--background);border-radius:6px 6px 0 0;margin:-10px -30px 10px;padding:10px;text-align:center}#marketplace-readme dialog::backdrop{background:rgba(0,0,0,.6117647059);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}#marketplace-readme footer{border-top:1px solid #526980;border-top:1px solid var(--border);padding-top:10px;color:#a9b1ba;color:var(--text-muted)}#marketplace-readme body>footer{margin-top:40px}@media print{#marketplace-readme body,#marketplace-readme button,#marketplace-readme code,#marketplace-readme details,#marketplace-readme input,#marketplace-readme pre,#marketplace-readme summary,#marketplace-readme textarea{background-color:#fff}#marketplace-readme button,#marketplace-readme input,#marketplace-readme textarea{border:1px solid #000}#marketplace-readme body,#marketplace-readme button,#marketplace-readme code,#marketplace-readme footer,#marketplace-readme h1,#marketplace-readme h2,#marketplace-readme h3,#marketplace-readme h4,#marketplace-readme h5,#marketplace-readme h6,#marketplace-readme input,#marketplace-readme pre,#marketplace-readme strong,#marketplace-readme summary,#marketplace-readme textarea{color:#000}#marketplace-readme summary::marker{color:#000}#marketplace-readme summary::-webkit-details-marker{color:#000}#marketplace-readme tbody tr:nth-child(2n){background-color:#f2f2f2}#marketplace-readme a{color:#00f;text-decoration:underline}}#marketplace-readme code{border:1px solid var(--spice-button-disabled)}#marketplace-readme li,#marketplace-readme ul{list-style-position:inside}#marketplace-readme li li,#marketplace-readme ul li{margin-bottom:8px}#marketplace-readme ul{list-style-type:disc}#marketplace-readme ol{list-style-type:auto}#marketplace-readme code,#marketplace-readme p,#marketplace-readme pre{margin:8px 0}#marketplace-readme pre{overflow-x:auto}#marketplace-readme table{table-layout:auto}#marketplace-readme table td,#marketplace-readme table th{border:1px solid var(--spice-button-disabled)}.GenericModal{background-color:var(--spice-player)}code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.devtools-column{height:570px;width:50%;position:relative;background-color:var(--spice-sidebar);color:var(--spice-text);overflow:scroll;padding:1rem}.color-ini-editor{height:70%;width:100%;background-color:var(--spice-sidebar);color:var(--spice-text);overflow:scroll;padding:1rem;resize:none;font-family:monospace}.marketplace-theme-dev-tools-container{justify-content:flex-end;display:flex}.marketplace-theme-dev-tools-container .marketplace-code-editor-wrapper{height:400px;margin-bottom:16px;overflow:auto}.devtools-heading,.invalid-css-heading{font-size:1.5rem;font-weight:700;text-decoration:underline;margin-bottom:1rem}.invalid-css-text{margin-bottom:1.5rem;font-family:monospace;-webkit-user-select:text;-moz-user-select:text;user-select:text}.devtools-icon{width:18px;fill:var(--spice-button)}.marketplace-code-editor{width:100%;margin-bottom:10px;padding:3px 5px;background-color:var(--spice-main);color:var(--spice-text);font-size:14px;border:1px solid var(--spice-button);border-radius:4px}.marketplace-backup-button{padding:10px;margin:10px}.button-module__button___hf2qg_marketplace{box-sizing:border-box;font-family:var(--font-family, spotify-circular),Helvetica,Arial,sans-serif;-webkit-tap-highlight-color:transparent;font-size:1rem;line-height:1.5rem;font-weight:700;background-color:transparent;border:0;border-radius:500px;display:inline-block;position:relative;text-align:center;text-decoration:none;text-transform:none;touch-action:manipulation;transition-duration:33ms;transition-property:background-color,border-color,color,box-shadow,filter,transform;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;transform:translate3d(0,0,0);padding:0;min-inline-size:0px;align-self:center;position:relative;background-color:var(--spice-text);color:var(--spice-main);border-radius:500px;font-size:inherit;padding-block:12px;padding-inline:32px}@media screen and (min-width:768px){.button-module__button___hf2qg_marketplace{font-size:1rem;line-height:1.5rem;text-transform:none;letter-spacing:normal}}.button-module__button___hf2qg_marketplace:hover{transform:scale(1.04)}.button-module__button___hf2qg_marketplace:active{background-color:var(--spice-subtext);box-shadow:none;transform:scale(1)}.button-module__button___hf2qg_marketplace:disabled{opacity:.5;cursor:not-allowed}.button-module__circle___EZ88P_marketplace{padding-inline:16px;width:48px;height:48px}.button-module__circle___EZ88P_marketplace svg{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.toggle-module__toggle-wrapper___ocE5z_marketplace{display:inline-flex;position:relative;align-items:center;cursor:pointer}.toggle-module__disabled___OYAYf_marketplace{opacity:0;pointer-events:none}.toggle-module__toggle-input___ceLM4_marketplace{opacity:0;pointer-events:none;position:absolute}.toggle-module__toggle-input___ceLM4_marketplace:checked~.toggle-module__toggle-indicator-wrapper___6Lcp0_marketplace{background-color:var(--spice-text)}.toggle-module__toggle-input___ceLM4_marketplace:checked~.toggle-module__toggle-indicator-wrapper___6Lcp0_marketplace .toggle-module__toggle-indicator___nCxwE_marketplace{background-color:#fff;left:auto;right:2px;right:3px}.toggle-module__toggle-input___ceLM4_marketplace:hover~.toggle-module__toggle-indicator-wrapper___6Lcp0_marketplace{filter:brightness(1.3)}.toggle-module__toggle-input___ceLM4_marketplace:hover:checked~.toggle-module__toggle-indicator-wrapper___6Lcp0_marketplace{filter:brightness(1.15)}.toggle-module__toggle-input___ceLM4_marketplace:active:not([disabled])~.toggle-module__toggle-indicator-wrapper___6Lcp0_marketplace .toggle-module__toggle-indicator___nCxwE_marketplace{width:20px}.toggle-module__toggle-indicator-wrapper___6Lcp0_marketplace{background-color:#535353;border-radius:24px;height:24px;position:relative;width:42px}.toggle-module__toggle-indicator___nCxwE_marketplace{background:#fff;border-radius:inherit;height:20px;left:2px;position:absolute;top:2px;transition:background-color,left,right,width .1s ease;width:20px;height:18px;width:18px;top:3px;left:3px;background:var(--spice-shadow)!important} \ No newline at end of file diff --git a/.config/spicetify/CustomApps/stats/README.md b/.config/spicetify/CustomApps/stats/README.md new file mode 100644 index 00000000..5a8a85da --- /dev/null +++ b/.config/spicetify/CustomApps/stats/README.md @@ -0,0 +1,46 @@ +# Spicetify Stats + +### A custom app that shows you your top artists, tracks, genres and an analysis of your whole library. + +--- + +### Top Artists + +![preview](previews/top_artists.png) + +--- + +### Top Tracks + +![preview](previews/top_tracks.png) + +--- + +### Top Genres + +![preview](previews/top_genres.png) + +--- + +### Library Analysis + +![preview](previews/library_analysis.png) + +--- + +### Manual Installation + +Download the files in the [dist branch](https://github.com/harbassan/spicetify-stats/archive/refs/heads/dist.zip) and rename the folder to `stats`, and then place that folder into your `CustomApps` folder in the spicetify directory. + +Then run these commands to apply: + +```powershell +spicetify config custom_apps stats +spicetify apply +``` + +--- + +If you have any questions or issues regarding the app open an issue on this repo. Please specify your spicetify version and installation method if you do so. + +If you really like the app i'd be grateful if you liked the repo ❤️. diff --git a/.config/spicetify/CustomApps/stats/extension.js b/.config/spicetify/CustomApps/stats/extension.js new file mode 100644 index 00000000..423774e5 --- /dev/null +++ b/.config/spicetify/CustomApps/stats/extension.js @@ -0,0 +1,10 @@ +"use strict"; +var stats = (() => { + // src/extensions/extension.tsx + (async () => { + while (!(Spicetify == null ? void 0 : Spicetify.LocalStorage)) { + await new Promise((resolve) => setTimeout(resolve, 100)); + } + Spicetify.LocalStorage.set("stats:cache-info", JSON.stringify([0, 0, 0, 0])); + })(); +})(); diff --git a/.config/spicetify/CustomApps/stats/index.js b/.config/spicetify/CustomApps/stats/index.js new file mode 100644 index 00000000..6d08c517 --- /dev/null +++ b/.config/spicetify/CustomApps/stats/index.js @@ -0,0 +1,1483 @@ +var stats = (() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __defProps = Object.defineProperties; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropDescs = Object.getOwnPropertyDescriptors; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getOwnPropSymbols = Object.getOwnPropertySymbols; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __propIsEnum = Object.prototype.propertyIsEnumerable; + var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; + var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; + }; + var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); + var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + }; + var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod + )); + var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + + // external-global-plugin:react + var require_react = __commonJS({ + "external-global-plugin:react"(exports, module) { + module.exports = Spicetify.React; + } + }); + + // external-global-plugin:react-dom + var require_react_dom = __commonJS({ + "external-global-plugin:react-dom"(exports, module) { + module.exports = Spicetify.ReactDOM; + } + }); + + // node_modules/spicetify-creator/dist/temp/index.jsx + var temp_exports = {}; + __export(temp_exports, { + default: () => render + }); + + // src/app.tsx + var import_react15 = __toESM(require_react()); + + // node_modules/spcr-navigation-bar/useNavigationBar.tsx + var import_react3 = __toESM(require_react()); + + // node_modules/spcr-navigation-bar/navBar.tsx + var import_react2 = __toESM(require_react()); + var import_react_dom = __toESM(require_react_dom()); + + // node_modules/spcr-navigation-bar/optionsMenu.tsx + var import_react = __toESM(require_react()); + var OptionsMenuItemIcon = /* @__PURE__ */ import_react.default.createElement("svg", { + width: 16, + height: 16, + viewBox: "0 0 16 16", + fill: "currentColor" + }, /* @__PURE__ */ import_react.default.createElement("path", { + d: "M13.985 2.383L5.127 12.754 1.388 8.375l-.658.77 4.397 5.149 9.618-11.262z" + })); + var OptionsMenuItem = import_react.default.memo((props) => { + return /* @__PURE__ */ import_react.default.createElement(Spicetify.ReactComponent.MenuItem, { + onClick: props.onSelect, + icon: props.isSelected ? OptionsMenuItemIcon : null + }, props.value); + }); + var OptionsMenu = import_react.default.memo((props) => { + const menuRef = import_react.default.useRef(null); + const menu = /* @__PURE__ */ import_react.default.createElement(Spicetify.ReactComponent.Menu, null, props.options.map( + (option) => /* @__PURE__ */ import_react.default.createElement(OptionsMenuItem, { + value: option.link, + isSelected: option.isActive, + onSelect: () => { + props.onSelect(option.link); + menuRef.current?.click(); + } + }) + )); + return /* @__PURE__ */ import_react.default.createElement(Spicetify.ReactComponent.ContextMenu, { + menu, + trigger: "click", + action: "toggle", + renderInLine: true + }, /* @__PURE__ */ import_react.default.createElement("button", { + className: navBar_module_default.optionsMenuDropBox, + ref: menuRef + }, /* @__PURE__ */ import_react.default.createElement("span", { + className: props.bold ? "main-type-mestoBold" : "main-type-mesto" + }, props.options.find((o) => o.isActive)?.link || props.defaultValue), /* @__PURE__ */ import_react.default.createElement("svg", { + width: 16, + height: 16, + viewBox: "0 0 16 16", + fill: "currentColor" + }, /* @__PURE__ */ import_react.default.createElement("path", { + d: "M3 6l5 5.794L13 6z" + })))); + }); + var optionsMenu_default = OptionsMenu; + + // postcss-module:C:\Users\user\AppData\Local\Temp\tmp-2044-6PMFe7ksQ5aB\188af5b04821\navBar.module.css + var navBar_module_default = { "topBarHeaderItem": "navBar-module__topBarHeaderItem___v29bR_stats", "topBarHeaderItemLink": "navBar-module__topBarHeaderItemLink___VeyBY_stats", "topBarActive": "navBar-module__topBarActive___-qYPu_stats", "topBarNav": "navBar-module__topBarNav___1OtdR_stats", "optionsMenuDropBox": "navBar-module__optionsMenuDropBox___tD9mA_stats" }; + + // node_modules/spcr-navigation-bar/navBar.tsx + var NavbarItem2 = class { + constructor(link, isActive) { + this.link = link; + this.isActive = isActive; + } + }; + var NavbarItemComponent = (props) => { + return /* @__PURE__ */ import_react2.default.createElement("li", { + className: navBar_module_default.topBarHeaderItem, + onClick: (e) => { + e.preventDefault(); + props.switchTo(props.item.link); + } + }, /* @__PURE__ */ import_react2.default.createElement("a", { + className: `${navBar_module_default.topBarHeaderItemLink} queue-tabBar-headerItemLink ${props.item.isActive ? navBar_module_default.topBarActive + " queue-tabBar-active" : ""}`, + "aria-current": "page", + draggable: false, + href: "" + }, /* @__PURE__ */ import_react2.default.createElement("span", { + className: "main-type-mestoBold" + }, props.item.link))); + }; + var NavbarMore = import_react2.default.memo(({ items, switchTo }) => { + return /* @__PURE__ */ import_react2.default.createElement("li", { + className: `${navBar_module_default.topBarHeaderItem} ${items.find((item) => item.isActive) ? navBar_module_default.topBarActive : ""}` + }, /* @__PURE__ */ import_react2.default.createElement(optionsMenu_default, { + options: items, + onSelect: switchTo, + defaultValue: "More", + bold: true + })); + }); + var NavbarContent = (props) => { + const resizeHost = document.querySelector(".Root__main-view .os-resize-observer-host"); + const [windowSize, setWindowSize] = (0, import_react2.useState)(resizeHost.clientWidth); + const resizeHandler = () => setWindowSize(resizeHost.clientWidth); + (0, import_react2.useEffect)(() => { + const observer = new ResizeObserver(resizeHandler); + observer.observe(resizeHost); + return () => { + observer.disconnect(); + }; + }, [resizeHandler]); + return /* @__PURE__ */ import_react2.default.createElement(NavbarContext, null, /* @__PURE__ */ import_react2.default.createElement(Navbar, { + ...props, + windowSize + })); + }; + var NavbarContext = (props) => { + return import_react_dom.default.createPortal( + /* @__PURE__ */ import_react2.default.createElement("div", { + className: "main-topbar-topbarContent" + }, props.children), + document.querySelector(".main-topBar-topbarContentWrapper") + ); + }; + var Navbar = (props) => { + const navBarListRef = import_react2.default.useRef(null); + const [childrenSizes, setChildrenSizes] = (0, import_react2.useState)([]); + const [availableSpace, setAvailableSpace] = (0, import_react2.useState)(0); + const [outOfRangeItemIndexes, setOutOfRangeItemIndexes] = (0, import_react2.useState)([]); + let items = props.links.map((link) => new NavbarItem2(link, link === props.activeLink)); + (0, import_react2.useEffect)(() => { + if (!navBarListRef.current) + return; + const children = Array.from(navBarListRef.current.children); + const navBarItemSizes = children.map((child) => child.clientWidth); + setChildrenSizes(navBarItemSizes); + }, []); + (0, import_react2.useEffect)(() => { + if (!navBarListRef.current) + return; + setAvailableSpace(navBarListRef.current.clientWidth); + }, [props.windowSize]); + (0, import_react2.useEffect)(() => { + if (!navBarListRef.current) + return; + let totalSize = childrenSizes.reduce((a, b) => a + b, 0); + if (totalSize <= availableSpace) { + setOutOfRangeItemIndexes([]); + return; + } + const viewMoreButtonSize = Math.max(...childrenSizes); + const itemsToHide = []; + let stopWidth = viewMoreButtonSize; + childrenSizes.forEach((childWidth, i) => { + if (availableSpace >= stopWidth + childWidth) { + stopWidth += childWidth; + } else if (i !== items.length) { + itemsToHide.push(i); + } + }); + setOutOfRangeItemIndexes(itemsToHide); + }, [availableSpace, childrenSizes]); + return /* @__PURE__ */ import_react2.default.createElement("nav", { + className: navBar_module_default.topBarNav + }, /* @__PURE__ */ import_react2.default.createElement("ul", { + className: navBar_module_default.topBarHeader + " queue-tabBar-header", + ref: navBarListRef + }, items.filter((_, id) => !outOfRangeItemIndexes.includes(id)).map( + (item) => /* @__PURE__ */ import_react2.default.createElement(NavbarItemComponent, { + item, + switchTo: props.switchCallback + }) + ), outOfRangeItemIndexes.length ? /* @__PURE__ */ import_react2.default.createElement(NavbarMore, { + items: outOfRangeItemIndexes.map((i) => items[i]), + switchTo: props.switchCallback + }) : null)); + }; + var navBar_default = NavbarContent; + + // node_modules/spcr-navigation-bar/useNavigationBar.tsx + var useNavigationBar = (links) => { + const [activeLink, setActiveLink] = (0, import_react3.useState)(links[0]); + const navbar = /* @__PURE__ */ import_react3.default.createElement(navBar_default, { + links, + activeLink, + switchCallback: (link) => setActiveLink(link) + }); + return [navbar, activeLink, setActiveLink]; + }; + var useNavigationBar_default = useNavigationBar; + + // src/pages/top_artists.tsx + var import_react8 = __toESM(require_react()); + + // src/components/useDropdownMenu.tsx + var import_react5 = __toESM(require_react()); + + // src/components/dropdown.tsx + var import_react4 = __toESM(require_react()); + var activeStyle = { + backgroundColor: "rgba(var(--spice-rgb-selected-row),.1)" + }; + var Icon = (props) => { + return /* @__PURE__ */ import_react4.default.createElement(Spicetify.ReactComponent.IconComponent, __spreadProps(__spreadValues({}, props), { + className: "Svg-sc-ytk21e-0 Svg-img-16-icon", + "data-encore-id": "icon", + viewBox: "0 0 16 16", + height: "16", + width: "16" + }), /* @__PURE__ */ import_react4.default.createElement("path", { + d: "M15.53 2.47a.75.75 0 0 1 0 1.06L4.907 14.153.47 9.716a.75.75 0 0 1 1.06-1.06l3.377 3.376L14.47 2.47a.75.75 0 0 1 1.06 0z" + })); + }; + var MenuItem = ({ option, isActive, switchCallback }) => { + return /* @__PURE__ */ import_react4.default.createElement(Spicetify.ReactComponent.MenuItem, { + trigger: "click", + onClick: () => switchCallback(option), + "data-checked": isActive, + trailingIcon: isActive && /* @__PURE__ */ import_react4.default.createElement(Icon, null), + style: isActive ? activeStyle : void 0 + }, option); + }; + var DropdownMenu = ({ options, activeOption, switchCallback }) => { + const optionItems = options.map((option) => { + return /* @__PURE__ */ import_react4.default.createElement(MenuItem, { + option, + isActive: option === activeOption, + switchCallback + }); + }); + const MenuWrapper2 = (props) => { + return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(Spicetify.ReactComponent.Menu, __spreadValues({}, props), optionItems)); + }; + return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(Spicetify.ReactComponent.ContextMenu, { + menu: /* @__PURE__ */ import_react4.default.createElement(MenuWrapper2, null), + trigger: "click" + }, /* @__PURE__ */ import_react4.default.createElement("button", { + className: "x-sortBox-sortDropdown", + type: "button", + role: "combobox", + "aria-controls": "sortboxlist-29ad4489-2ff4-4a03-8c0c-ffc6f90c2fed", + "aria-expanded": "false" + }, /* @__PURE__ */ import_react4.default.createElement("span", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-mesto-type cvTLPmjt6T7M85EKcB8w", + "data-encore-id": "type" + }, activeOption), /* @__PURE__ */ import_react4.default.createElement("svg", { + role: "img", + height: "16", + width: "16", + "aria-hidden": "true", + className: "Svg-sc-ytk21e-0 Svg-img-16-icon SbDHY3fVADNJ4l9qOLQ2", + viewBox: "0 0 16 16", + "data-encore-id": "icon" + }, /* @__PURE__ */ import_react4.default.createElement("path", { + d: "m14 6-6 6-6-6h12z" + }))))); + }; + var dropdown_default = DropdownMenu; + + // src/components/useDropdownMenu.tsx + var useDropdownMenu = (options, displayOptions, storageVariable) => { + const initialOption = Spicetify.LocalStorage.get(`stats:${storageVariable}:active-option`); + const [activeOption, setActiveOption] = (0, import_react5.useState)(initialOption || options[0]); + const dropdown = /* @__PURE__ */ import_react5.default.createElement(dropdown_default, { + options: displayOptions, + activeOption: displayOptions[options.indexOf(activeOption)], + switchCallback: (option) => { + setActiveOption(options[displayOptions.indexOf(option)]); + Spicetify.LocalStorage.set(`stats:${storageVariable}:active-option`, options[displayOptions.indexOf(option)]); + } + }); + return [dropdown, activeOption, setActiveOption]; + }; + var useDropdownMenu_default = useDropdownMenu; + + // src/components/artist_card.tsx + var import_react6 = __toESM(require_react()); + var MenuWrapper = import_react6.default.memo((props) => /* @__PURE__ */ import_react6.default.createElement(Spicetify.ReactComponent.ArtistMenu, __spreadValues({}, props))); + var Card = ({ name, image, uri, subtext }) => { + const goToArtist = (uriString) => { + const uriObj = Spicetify.URI.fromString(uriString); + const url = uriObj.toURLPath(true); + Spicetify.Platform.History.push(url); + Spicetify.Platform.History.goForward(); + }; + return /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, /* @__PURE__ */ import_react6.default.createElement(Spicetify.ReactComponent.ContextMenu, { + menu: /* @__PURE__ */ import_react6.default.createElement(MenuWrapper, { + uri + }), + trigger: "right-click" + }, /* @__PURE__ */ import_react6.default.createElement("div", { + className: "main-card-card", + onClick: () => goToArtist(uri) + }, /* @__PURE__ */ import_react6.default.createElement("div", { + draggable: "true", + className: "main-card-draggable" + }, /* @__PURE__ */ import_react6.default.createElement("div", { + className: "main-card-imageContainer" + }, /* @__PURE__ */ import_react6.default.createElement("div", { + className: "main-cardImage-imageWrapper main-cardImage-circular" + }, /* @__PURE__ */ import_react6.default.createElement("div", { + className: "" + }, /* @__PURE__ */ import_react6.default.createElement("img", { + "aria-hidden": "false", + draggable: "false", + loading: "lazy", + src: image, + className: "main-image-image main-cardImage-image main-cardImage-circular main-image-loaded" + }))), /* @__PURE__ */ import_react6.default.createElement("div", { + className: "main-card-PlayButtonContainer" + }, /* @__PURE__ */ import_react6.default.createElement("div", { + className: "main-playButton-PlayButton" + }, /* @__PURE__ */ import_react6.default.createElement("button", { + "data-encore-id": "buttonPrimary", + className: "Button-sc-qlcn5g-0 Button-md-buttonPrimary-useBrowserDefaultFocusStyle" + }, /* @__PURE__ */ import_react6.default.createElement("span", { + className: "ButtonInner-sc-14ud5tc-0 ButtonInner-md-iconOnly encore-bright-accent-set" + }, /* @__PURE__ */ import_react6.default.createElement("span", { + "aria-hidden": "true", + className: "IconWrapper__Wrapper-sc-1hf1hjl-0 Wrapper-md-24-only" + }, /* @__PURE__ */ import_react6.default.createElement("svg", { + role: "img", + height: "24", + width: "24", + "aria-hidden": "true", + viewBox: "0 0 24 24", + "data-encore-id": "icon", + className: "Svg-sc-ytk21e-0 Svg-img-24-icon" + }, /* @__PURE__ */ import_react6.default.createElement("path", { + d: "m7.05 3.606 13.49 7.788a.7.7 0 0 1 0 1.212L7.05 20.394A.7.7 0 0 1 6 19.788V4.212a.7.7 0 0 1 1.05-.606z" + })))))))), /* @__PURE__ */ import_react6.default.createElement("div", { + className: "main-card-cardMetadata" + }, /* @__PURE__ */ import_react6.default.createElement("a", { + draggable: "false", + className: "main-cardHeader-link", + dir: "auto" + }, /* @__PURE__ */ import_react6.default.createElement("div", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-balladBold-textBase-4px-type main-cardHeader-text", + "data-encore-id": "type" + }, name)), /* @__PURE__ */ import_react6.default.createElement("div", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-mesto-textSubdued-type main-cardSubHeader-root", + "data-encore-id": "type" + }, /* @__PURE__ */ import_react6.default.createElement("span", null, subtext))), /* @__PURE__ */ import_react6.default.createElement("div", { + className: "main-card-cardLink" + }))))); + }; + var artist_card_default = import_react6.default.memo(Card); + + // src/components/refresh_button.tsx + var import_react7 = __toESM(require_react()); + var RefreshButton = ({ refreshCallback }) => { + return /* @__PURE__ */ import_react7.default.createElement("div", { + className: "x-filterBox-filterInputContainer stats-refreshButton", + role: "search", + "aria-expanded": "false" + }, /* @__PURE__ */ import_react7.default.createElement("button", { + className: "x-filterBox-expandButton", + "aria-hidden": "false", + "aria-label": "Search in playlists", + onClick: () => refreshCallback() + }, /* @__PURE__ */ import_react7.default.createElement("svg", { + role: "img", + height: "16", + width: "16", + "aria-hidden": "true", + className: "Svg-sc-ytk21e-0 Svg-img-16-icon x-filterBox-searchIcon", + viewBox: "0 0 16 16", + "data-encore-id": "icon" + }, /* @__PURE__ */ import_react7.default.createElement("path", { + d: "M0 4.75A3.75 3.75 0 0 1 3.75 1h8.5A3.75 3.75 0 0 1 16 4.75v5a3.75 3.75 0 0 1-3.75 3.75H9.81l1.018 1.018a.75.75 0 1 1-1.06 1.06L6.939 12.75l2.829-2.828a.75.75 0 1 1 1.06 1.06L9.811 12h2.439a2.25 2.25 0 0 0 2.25-2.25v-5a2.25 2.25 0 0 0-2.25-2.25h-8.5A2.25 2.25 0 0 0 1.5 4.75v5A2.25 2.25 0 0 0 3.75 12H5v1.5H3.75A3.75 3.75 0 0 1 0 9.75v-5z" + })))); + }; + var refresh_button_default = RefreshButton; + + // src/funcs.ts + var updatePageCache = (i, callback, activeOption, lib = false) => { + let cacheInfo = Spicetify.LocalStorage.get("stats:cache-info"); + if (!cacheInfo) + return; + let cacheInfoArray = JSON.parse(cacheInfo); + if (!cacheInfoArray[i]) { + if (!lib) { + ["short_term", "medium_term", "long_term"].filter((option) => option !== activeOption).forEach((option) => callback(option, true, false)); + } + callback(activeOption, true); + cacheInfoArray[i] = true; + Spicetify.LocalStorage.set("stats:cache-info", JSON.stringify(cacheInfoArray)); + } + }; + var apiRequest = async (name, url, timeout = 10) => { + let response; + try { + let timeStart = window.performance.now(); + response = await Spicetify.CosmosAsync.get(url); + console.log("stats -", name, "fetch time:", window.performance.now() - timeStart); + } catch (e) { + console.error("stats -", name, "request failed:", e); + console.log(url); + if (timeout > 0) + setTimeout(() => apiRequest(name, url, --timeout), 5e3); + } + return response; + }; + + // src/pages/top_artists.tsx + var ArtistsPage = () => { + const [topArtists, setTopArtists] = import_react8.default.useState([]); + const [dropdown, activeOption, setActiveOption] = useDropdownMenu_default( + ["short_term", "medium_term", "long_term"], + ["Past Month", "Past 6 Months", "All Time"], + `top-artists` + ); + const fetchTopArtists = async (time_range, force, set = true) => { + if (!force) { + let storedData = Spicetify.LocalStorage.get(`stats:top-artists:${time_range}`); + if (storedData) { + setTopArtists(JSON.parse(storedData)); + return; + } + } + const start = window.performance.now(); + const topArtists2 = await apiRequest("topArtists", `https://api.spotify.com/v1/me/top/artists?limit=50&offset=0&time_range=${time_range}`); + const topArtistsMinified = topArtists2.items.map((artist) => { + return { + id: artist.id, + name: artist.name, + image: artist.images[2] ? artist.images[2].url : artist.images[1] ? artist.images[1].url : "https://images.squarespace-cdn.com/content/v1/55fc0004e4b069a519961e2d/1442590746571-RPGKIXWGOO671REUNMCB/image-asset.gif", + uri: artist.uri + }; + }); + if (set) + setTopArtists(topArtistsMinified); + Spicetify.LocalStorage.set(`stats:top-artists:${time_range}`, JSON.stringify(topArtistsMinified)); + console.log("total artists fetch time:", window.performance.now() - start); + }; + import_react8.default.useEffect(() => { + updatePageCache(0, fetchTopArtists, activeOption); + }, []); + import_react8.default.useEffect(() => { + fetchTopArtists(activeOption); + }, [activeOption]); + const artistCards = import_react8.default.useMemo( + () => topArtists.map((artist, index) => /* @__PURE__ */ import_react8.default.createElement(artist_card_default, { + key: artist.id, + name: artist.name, + image: artist.image, + uri: artist.uri, + subtext: "Artist" + })), + [topArtists] + ); + return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement("section", { + className: "contentSpacing" + }, /* @__PURE__ */ import_react8.default.createElement("div", { + className: `collection-collection-header stats-header` + }, /* @__PURE__ */ import_react8.default.createElement("h1", { + "data-encore-id": "type", + className: "Type__TypeElement-sc-goli3j-0 TypeElement-canon-type" + }, "Top Artists"), /* @__PURE__ */ import_react8.default.createElement("div", { + className: "collection-searchBar-searchBar" + }, /* @__PURE__ */ import_react8.default.createElement(refresh_button_default, { + refreshCallback: () => { + fetchTopArtists(activeOption, true); + } + }), dropdown)), /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement("div", { + className: `main-gridContainer-gridContainer stats-grid` + }, artistCards)))); + }; + var top_artists_default = import_react8.default.memo(ArtistsPage); + + // src/pages/top_tracks.tsx + var import_react10 = __toESM(require_react()); + + // src/components/track_row.tsx + var import_react9 = __toESM(require_react()); + function formatDuration(durationMs) { + const totalSeconds = Math.floor(durationMs / 1e3); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes.toString().padStart(1, "0")}:${seconds.toString().padStart(2, "0")}`; + } + var ArtistLink = ({ name, uri, index, length }) => { + return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("a", { + draggable: "true", + dir: "auto", + href: uri, + tabIndex: -1 + }, name), index === length ? null : ", "); + }; + var ExplicitBadge = import_react9.default.memo(() => { + return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("span", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-ballad-textSubdued-type main-trackList-rowBadges", + "data-encore-id": "type" + }, /* @__PURE__ */ import_react9.default.createElement("span", { + "aria-label": "Explicit", + className: "main-tag-container", + title: "Explicit" + }, "E"))); + }); + var LikedIcon = ({ active, uri }) => { + const [liked, setLiked] = import_react9.default.useState(active); + let id = uri.split(":")[2]; + const toggleLike = () => { + if (liked) { + Spicetify.CosmosAsync.del("https://api.spotify.com/v1/me/tracks?ids=" + id); + Spicetify.showNotification("Removed from your Liked Songs"); + } else { + Spicetify.CosmosAsync.put("https://api.spotify.com/v1/me/tracks?ids=" + id); + Spicetify.showNotification("Added to your Liked Songs"); + } + setLiked(!liked); + }; + import_react9.default.useEffect(() => { + setLiked(active); + }, [active]); + return /* @__PURE__ */ import_react9.default.createElement("button", { + type: "button", + role: "switch", + "aria-checked": liked, + "aria-label": "Remove from Your Library", + onClick: toggleLike, + className: liked ? "main-addButton-button main-trackList-rowHeartButton main-addButton-active" : "main-addButton-button main-trackList-rowHeartButton", + tabIndex: -1 + }, /* @__PURE__ */ import_react9.default.createElement("svg", { + role: "img", + height: "16", + width: "16", + "aria-hidden": "true", + viewBox: "0 0 16 16", + "data-encore-id": "icon", + className: "Svg-sc-ytk21e-0 Svg-img-16-icon" + }, /* @__PURE__ */ import_react9.default.createElement("path", { + d: liked ? "M15.724 4.22A4.313 4.313 0 0 0 12.192.814a4.269 4.269 0 0 0-3.622 1.13.837.837 0 0 1-1.14 0 4.272 4.272 0 0 0-6.21 5.855l5.916 7.05a1.128 1.128 0 0 0 1.727 0l5.916-7.05a4.228 4.228 0 0 0 .945-3.577z" : "M1.69 2A4.582 4.582 0 0 1 8 2.023 4.583 4.583 0 0 1 11.88.817h.002a4.618 4.618 0 0 1 3.782 3.65v.003a4.543 4.543 0 0 1-1.011 3.84L9.35 14.629a1.765 1.765 0 0 1-2.093.464 1.762 1.762 0 0 1-.605-.463L1.348 8.309A4.582 4.582 0 0 1 1.689 2zm3.158.252A3.082 3.082 0 0 0 2.49 7.337l.005.005L7.8 13.664a.264.264 0 0 0 .311.069.262.262 0 0 0 .09-.069l5.312-6.33a3.043 3.043 0 0 0 .68-2.573 3.118 3.118 0 0 0-2.551-2.463 3.079 3.079 0 0 0-2.612.816l-.007.007a1.501 1.501 0 0 1-2.045 0l-.009-.008a3.082 3.082 0 0 0-2.121-.861z" + }))); + }; + var TrackRow = (props) => { + const ArtistLinks = props.artists.map((artist, index) => { + return /* @__PURE__ */ import_react9.default.createElement(ArtistLink, { + index, + length: props.artists.length - 1, + name: artist.name, + uri: artist.uri + }); + }); + return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("div", { + role: "row", + "aria-rowindex": 2, + "aria-selected": "false" + }, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "main-trackList-trackListRow main-trackList-trackListRowGrid", + draggable: "true", + role: "presentation" + }, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "main-trackList-rowSectionIndex", + role: "gridcell", + "aria-colindex": 1, + tabIndex: -1 + }, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "main-trackList-rowMarker" + }, /* @__PURE__ */ import_react9.default.createElement("span", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-ballad-type main-trackList-number", + "data-encore-id": "type" + }, props.index), /* @__PURE__ */ import_react9.default.createElement("button", { + className: "main-trackList-rowImagePlayButton", + "aria-label": "Play Odd Ways by MIKE, Wiki, The Alchemist", + tabIndex: -1, + onClick: () => Spicetify.Player.playUri(props.uri) + }, /* @__PURE__ */ import_react9.default.createElement("svg", { + role: "img", + height: "24", + width: "24", + "aria-hidden": "true", + className: "Svg-sc-ytk21e-0 Svg-img-24-icon main-trackList-rowPlayPauseIcon", + viewBox: "0 0 24 24", + "data-encore-id": "icon" + }, /* @__PURE__ */ import_react9.default.createElement("path", { + d: "m7.05 3.606 13.49 7.788a.7.7 0 0 1 0 1.212L7.05 20.394A.7.7 0 0 1 6 19.788V4.212a.7.7 0 0 1 1.05-.606z" + }))))), /* @__PURE__ */ import_react9.default.createElement("div", { + className: "main-trackList-rowSectionStart", + role: "gridcell", + "aria-colindex": 2, + tabIndex: -1 + }, /* @__PURE__ */ import_react9.default.createElement("img", { + "aria-hidden": "false", + draggable: "false", + loading: "eager", + src: props.image, + alt: "", + className: "main-image-image main-trackList-rowImage main-image-loaded", + width: "40", + height: "40" + }), /* @__PURE__ */ import_react9.default.createElement("div", { + className: "main-trackList-rowMainContent" + }, /* @__PURE__ */ import_react9.default.createElement("div", { + dir: "auto", + className: "Type__TypeElement-sc-goli3j-0 TypeElement-ballad-textBase-type main-trackList-rowTitle standalone-ellipsis-one-line", + "data-encore-id": "type" + }, props.name), props.explicit && /* @__PURE__ */ import_react9.default.createElement(ExplicitBadge, null), /* @__PURE__ */ import_react9.default.createElement("span", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-mesto-textSubdued-type main-trackList-rowSubTitle standalone-ellipsis-one-line", + "data-encore-id": "type" + }, ArtistLinks))), /* @__PURE__ */ import_react9.default.createElement("div", { + className: "main-trackList-rowSectionVariable", + role: "gridcell", + "aria-colindex": 3, + tabIndex: -1 + }, /* @__PURE__ */ import_react9.default.createElement("span", { + "data-encore-id": "type", + className: "Type__TypeElement-sc-goli3j-0 TypeElement-mesto-type" + }, /* @__PURE__ */ import_react9.default.createElement("a", { + draggable: "true", + className: "standalone-ellipsis-one-line", + dir: "auto", + href: props.album_uri, + tabIndex: -1 + }, props.album))), /* @__PURE__ */ import_react9.default.createElement("div", { + className: "main-trackList-rowSectionEnd", + role: "gridcell", + "aria-colindex": 5, + tabIndex: -1 + }, props.liked ? /* @__PURE__ */ import_react9.default.createElement(LikedIcon, { + active: props.liked, + uri: props.uri + }) : "", /* @__PURE__ */ import_react9.default.createElement("div", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-mesto-textSubdued-type main-trackList-rowDuration", + "data-encore-id": "type" + }, formatDuration(props.duration)), /* @__PURE__ */ import_react9.default.createElement("button", { + type: "button", + "aria-haspopup": "menu", + "aria-label": "More options for Odd Ways by MIKE, Wiki, The Alchemist", + className: "main-moreButton-button main-trackList-rowMoreButton", + tabIndex: -1 + }, /* @__PURE__ */ import_react9.default.createElement("svg", { + role: "img", + height: "16", + width: "16", + "aria-hidden": "true", + viewBox: "0 0 16 16", + "data-encore-id": "icon", + className: "Svg-sc-ytk21e-0 Svg-img-16-icon" + }, /* @__PURE__ */ import_react9.default.createElement("path", { + d: "M3 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm6.5 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zM16 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z" + }))))))); + }; + var track_row_default = import_react9.default.memo(TrackRow); + + // src/pages/top_tracks.tsx + var checkLiked = async (tracks) => { + return apiRequest("checkLiked", `https://api.spotify.com/v1/me/tracks/contains?ids=${tracks.join(",")}`); + }; + var TracksPage = () => { + const [topTracks, setTopTracks] = import_react10.default.useState([]); + const [dropdown, activeOption, setActiveOption] = useDropdownMenu_default( + ["short_term", "medium_term", "long_term"], + ["Past Month", "Past 6 Months", "All Time"], + "top-tracks" + ); + const fetchTopTracks = async (time_range, force, set = true) => { + if (!force) { + let storedData = Spicetify.LocalStorage.get(`stats:top-tracks:${time_range}`); + if (storedData) { + setTopTracks(JSON.parse(storedData)); + return; + } + } + const start = window.performance.now(); + if (!time_range) + return; + const { items: fetchedTracks } = await apiRequest("topTracks", `https://api.spotify.com/v1/me/top/tracks?limit=50&offset=0&time_range=${time_range}`); + const fetchedLikedArray = await checkLiked(fetchedTracks.map((track) => track.id)); + const topTracksMinified = fetchedTracks.map((track, index) => { + return { + liked: fetchedLikedArray[index], + name: track.name, + image: track.album.images[2] ? track.album.images[2].url : track.album.images[1] ? track.album.images[1].url : "https://images.squarespace-cdn.com/content/v1/55fc0004e4b069a519961e2d/1442590746571-RPGKIXWGOO671REUNMCB/image-asset.gif", + uri: track.uri, + artists: track.artists.map((artist) => ({ name: artist.name, uri: artist.uri })), + duration: track.duration_ms, + album: track.album.name, + album_uri: track.album.uri, + popularity: track.popularity, + explicit: track.explicit, + index: index + 1 + }; + }); + if (set) + setTopTracks(topTracksMinified); + Spicetify.LocalStorage.set(`stats:top-tracks:${time_range}`, JSON.stringify(topTracksMinified)); + console.log("total tracks fetch time:", window.performance.now() - start); + }; + import_react10.default.useEffect(() => { + updatePageCache(1, fetchTopTracks, activeOption); + }, []); + import_react10.default.useEffect(() => { + fetchTopTracks(activeOption); + }, [activeOption]); + if (!topTracks.length) + return /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null); + const createPlaylist = async () => { + const newPlaylist = await Spicetify.CosmosAsync.post("sp://core-playlist/v1/rootlist", { + operation: "create", + name: `Top Songs - ${activeOption}`, + playlist: true, + public: false, + uris: topTracks.map((track) => track.uri) + }); + }; + const trackRows = topTracks.map((track, index) => /* @__PURE__ */ import_react10.default.createElement(track_row_default, __spreadValues({ + index + }, track))); + return /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement("section", { + className: "contentSpacing" + }, /* @__PURE__ */ import_react10.default.createElement("div", { + className: `collection-collection-header stats-header` + }, /* @__PURE__ */ import_react10.default.createElement("div", { + className: "stats-trackPageTitle" + }, /* @__PURE__ */ import_react10.default.createElement("h1", { + "data-encore-id": "type", + className: "Type__TypeElement-sc-goli3j-0 TypeElement-canon-type" + }, "Top Tracks"), /* @__PURE__ */ import_react10.default.createElement("button", { + className: "stats-createPlaylistButton", + "data-encore-id": "buttonSecondary", + "aria-expanded": "false", + onClick: createPlaylist + }, "Turn Into Playlist")), /* @__PURE__ */ import_react10.default.createElement("div", { + className: "collection-searchBar-searchBar" + }, /* @__PURE__ */ import_react10.default.createElement(refresh_button_default, { + refreshCallback: () => { + fetchTopTracks(activeOption, true); + } + }), dropdown)), /* @__PURE__ */ import_react10.default.createElement("div", null, /* @__PURE__ */ import_react10.default.createElement("div", { + role: "grid", + "aria-rowcount": 50, + "aria-colcount": 4, + className: "main-trackList-trackList main-trackList-indexable", + tabIndex: 0 + }, /* @__PURE__ */ import_react10.default.createElement("div", { + className: "main-trackList-trackListHeader", + role: "presentation" + }, /* @__PURE__ */ import_react10.default.createElement("div", { + className: "main-trackList-trackListHeaderRow main-trackList-trackListRowGrid", + role: "row", + "aria-rowindex": 1 + }, /* @__PURE__ */ import_react10.default.createElement("div", { + className: "main-trackList-rowSectionIndex", + role: "columnheader", + "aria-colindex": 1, + "aria-sort": "none", + tabIndex: -1 + }, "#"), /* @__PURE__ */ import_react10.default.createElement("div", { + className: "main-trackList-rowSectionStart", + role: "columnheader", + "aria-colindex": 2, + "aria-sort": "none", + tabIndex: -1 + }, /* @__PURE__ */ import_react10.default.createElement("button", { + className: "main-trackList-column main-trackList-sortable", + tabIndex: -1 + }, /* @__PURE__ */ import_react10.default.createElement("span", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-mesto-type standalone-ellipsis-one-line", + "data-encore-id": "type" + }, "Title"))), /* @__PURE__ */ import_react10.default.createElement("div", { + className: "main-trackList-rowSectionVariable", + role: "columnheader", + "aria-colindex": 3, + "aria-sort": "none", + tabIndex: -1 + }, /* @__PURE__ */ import_react10.default.createElement("button", { + className: "main-trackList-column main-trackList-sortable", + tabIndex: -1 + }, /* @__PURE__ */ import_react10.default.createElement("span", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-mesto-type standalone-ellipsis-one-line", + "data-encore-id": "type" + }, "Album"))), /* @__PURE__ */ import_react10.default.createElement("div", { + className: "main-trackList-rowSectionEnd", + role: "columnheader", + "aria-colindex": 5, + "aria-sort": "none", + tabIndex: -1 + }, /* @__PURE__ */ import_react10.default.createElement("button", { + "aria-label": "Duration", + className: "main-trackList-column main-trackList-durationHeader main-trackList-sortable", + tabIndex: -1 + }, /* @__PURE__ */ import_react10.default.createElement("svg", { + role: "img", + height: "16", + width: "16", + "aria-hidden": "true", + viewBox: "0 0 16 16", + "data-encore-id": "icon", + className: "Svg-sc-ytk21e-0 Svg-img-16-icon" + }, /* @__PURE__ */ import_react10.default.createElement("path", { + d: "M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zM0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8z" + }), /* @__PURE__ */ import_react10.default.createElement("path", { + d: "M8 3.25a.75.75 0 0 1 .75.75v3.25H11a.75.75 0 0 1 0 1.5H7.25V4A.75.75 0 0 1 8 3.25z" + })))))), /* @__PURE__ */ import_react10.default.createElement("div", { + className: "main-rootlist-wrapper", + role: "presentation", + style: { height: 50 * 56 } + }, /* @__PURE__ */ import_react10.default.createElement("div", { + role: "presentation" + }, trackRows)))))); + }; + var top_tracks_default = import_react10.default.memo(TracksPage); + + // src/pages/top_genres.tsx + var import_react13 = __toESM(require_react()); + + // src/components/stat_card.tsx + var import_react11 = __toESM(require_react()); + var StatCard = (props) => { + return /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement("div", { + className: "main-card-card" + }, /* @__PURE__ */ import_react11.default.createElement("div", { + draggable: "true", + className: "main-card-draggable" + }, /* @__PURE__ */ import_react11.default.createElement("div", { + className: "stats-cardValue" + }, props.value), /* @__PURE__ */ import_react11.default.createElement("div", null, /* @__PURE__ */ import_react11.default.createElement("div", { + className: `Type__TypeElement-sc-goli3j-0 TypeElement-balladBold-textBase-4px-type main-cardHeader-text stats-cardText`, + "data-encore-id": "type" + }, props.stat))))); + }; + var stat_card_default = import_react11.default.memo(StatCard); + + // src/components/genres_card.tsx + var import_react12 = __toESM(require_react()); + var genreLine = (name, value, limit, total) => { + return /* @__PURE__ */ import_react12.default.createElement("div", { + className: "stats-genreRow" + }, /* @__PURE__ */ import_react12.default.createElement("div", { + className: "stats-genreRowFill", + style: { + width: `calc(${value / limit * 100}% + ${(limit - value) / (limit - 1) * 100}px)` + } + }, /* @__PURE__ */ import_react12.default.createElement("span", { + className: "stats-genreText" + }, name)), /* @__PURE__ */ import_react12.default.createElement("span", { + className: "stats-genreValue" + }, Math.round(value / total * 100) + "%")); + }; + var genreLines = (genres, total) => { + return genres.map(([genre, value]) => { + return genreLine(genre, value, genres[0][1], total); + }); + }; + var genresCard = ({ genres, total }) => { + const genresArray = genres.sort(([, a], [, b]) => b - a).slice(0, 10); + return /* @__PURE__ */ import_react12.default.createElement("div", { + className: `main-card-card stats-genreCard` + }, genreLines(genresArray, total)); + }; + var genres_card_default = import_react12.default.memo(genresCard); + + // src/pages/top_genres.tsx + var GenresPage = () => { + const [topGenres, setTopGenres] = import_react13.default.useState({ genres: [], features: {} }); + const [dropdown, activeOption, setActiveOption] = useDropdownMenu_default( + ["short_term", "medium_term", "long_term"], + ["Past Month", "Past 6 Months", "All Time"], + "top-genres" + ); + const fetchTopGenres = async (time_range, force, set = true) => { + if (!force) { + let storedData = Spicetify.LocalStorage.get(`stats:top-genres:${time_range}`); + if (storedData) { + setTopGenres(JSON.parse(storedData)); + return; + } + } + const start = window.performance.now(); + const [fetchedArtists, fetchedTracks] = await Promise.all([ + apiRequest("topArtists", `https://api.spotify.com/v1/me/top/artists?limit=50&offset=0&time_range=${time_range}`).then((res) => res.items), + apiRequest("topTracks", `https://api.spotify.com/v1/me/top/tracks?limit=50&offset=0&time_range=${time_range}`).then((res) => res.items) + ]); + const genres = fetchedArtists.reduce((acc, artist) => { + artist.genres.forEach((genre) => { + const index = acc.findIndex(([g]) => g === genre); + if (index !== -1) { + acc[index][1] += 1 * Math.abs(fetchedArtists.indexOf(artist) - 50); + } else { + acc.push([genre, 1 * Math.abs(fetchedArtists.indexOf(artist) - 50)]); + } + }); + return acc; + }, []); + let trackPopularity = 0; + let explicitness = 0; + const topTracks = fetchedTracks.map((track) => { + trackPopularity += track.popularity; + if (track.explicit) + explicitness++; + return track.id; + }); + const featureData = await fetchAudioFeatures2(topTracks); + const audioFeatures = featureData.audio_features.reduce( + (acc, track) => { + acc["danceability"] += track["danceability"]; + acc["energy"] += track["energy"]; + acc["valence"] += track["valence"]; + acc["speechiness"] += track["speechiness"]; + acc["acousticness"] += track["acousticness"]; + acc["instrumentalness"] += track["instrumentalness"]; + acc["liveness"] += track["liveness"]; + acc["tempo"] += track["tempo"]; + acc["loudness"] += track["loudness"]; + return acc; + }, + { + popularity: trackPopularity, + explicitness, + danceability: 0, + energy: 0, + valence: 0, + speechiness: 0, + acousticness: 0, + instrumentalness: 0, + liveness: 0, + tempo: 0, + loudness: 0 + } + ); + for (let key in audioFeatures) { + audioFeatures[key] = audioFeatures[key] / 50; + } + console.log("total genres fetch time:", window.performance.now() - start); + if (set) + setTopGenres({ genres, features: audioFeatures }); + Spicetify.LocalStorage.set(`stats:top-genres:${time_range}`, JSON.stringify({ genres, features: audioFeatures })); + }; + const fetchAudioFeatures2 = async (ids) => { + ids = ids.filter((id) => id.match(/^[a-zA-Z0-9]{22}$/)); + const data = apiRequest("audioFeatures", `https://api.spotify.com/v1/audio-features?ids=${ids.join(",")}`); + return data; + }; + import_react13.default.useEffect(() => { + updatePageCache(2, fetchTopGenres, activeOption); + }, []); + import_react13.default.useEffect(() => { + fetchTopGenres(activeOption); + }, [activeOption]); + if (!topGenres.genres.length) + return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null); + const parseVal = (key) => { + switch (key) { + case "tempo": + return Math.round(topGenres.features[key]) + "bpm"; + case "loudness": + return Math.round(topGenres.features[key]) + "dB"; + case "popularity": + return Math.round(topGenres.features[key]) + "%"; + default: + return Math.round(topGenres.features[key] * 100) + "%"; + } + }; + const statCards = []; + for (let key in topGenres.features) { + statCards.push(/* @__PURE__ */ import_react13.default.createElement(stat_card_default, { + stat: key[0].toUpperCase() + key.slice(1), + value: parseVal(key) + })); + } + return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, /* @__PURE__ */ import_react13.default.createElement("section", { + className: "contentSpacing" + }, /* @__PURE__ */ import_react13.default.createElement("div", { + className: `collection-collection-header stats-header` + }, /* @__PURE__ */ import_react13.default.createElement("h1", { + "data-encore-id": "type", + className: "Type__TypeElement-sc-goli3j-0 TypeElement-canon-type" + }, "Top Genres"), /* @__PURE__ */ import_react13.default.createElement("div", { + className: "collection-searchBar-searchBar" + }, /* @__PURE__ */ import_react13.default.createElement(refresh_button_default, { + refreshCallback: () => { + fetchTopGenres(activeOption, true); + } + }), dropdown)), /* @__PURE__ */ import_react13.default.createElement("div", { + className: "stats-page" + }, /* @__PURE__ */ import_react13.default.createElement("section", null, /* @__PURE__ */ import_react13.default.createElement(genres_card_default, { + genres: topGenres.genres, + total: 1275 + })), /* @__PURE__ */ import_react13.default.createElement("section", null, /* @__PURE__ */ import_react13.default.createElement("div", { + className: `main-gridContainer-gridContainer stats-grid` + }, statCards))))); + }; + var top_genres_default = import_react13.default.memo(GenresPage); + + // src/pages/library.tsx + var import_react14 = __toESM(require_react()); + var fetchAudioFeatures = async (ids) => { + const batchSize = 100; + const batches = []; + ids = ids.filter((id) => id.match(/^[a-zA-Z0-9]{22}$/)); + for (let i = 0; i < ids.length; i += batchSize) { + const batch = ids.slice(i, i + batchSize); + batches.push(batch); + } + const promises = batches.map((batch, index) => { + const url = `https://api.spotify.com/v1/audio-features?ids=${batch.join(",")}`; + return apiRequest("audioFeaturesBatch" + index, url); + }); + const responses = await Promise.all(promises); + const data = responses.reduce((acc, response) => { + return acc.concat(response.audio_features); + }, []); + return data; + }; + var LibraryPage = () => { + const [library, setLibrary] = import_react14.default.useState(null); + const [dropdown, activeOption, setActiveOption] = useDropdownMenu_default(["owned", "all"], ["My Playlists", "All Playlists"], "library"); + const fetchData = async (option, force, set = true) => { + if (!force) { + let storedData = Spicetify.LocalStorage.get(`stats:library:${option}`); + if (storedData) { + setLibrary(JSON.parse(storedData)); + return; + } + } + const start = window.performance.now(); + const rootlistItems = await apiRequest("rootlist", "sp://core-playlist/v1/rootlist"); + const flattenPlaylists = (items) => { + const playlists2 = []; + items.forEach((row) => { + if (row.type === "playlist") { + playlists2.push(row); + } else if (row.type === "folder") { + if (!row.rows) + return; + const folderPlaylists = flattenPlaylists(row.rows); + playlists2.push(...folderPlaylists); + } + }); + return playlists2; + }; + let playlists = flattenPlaylists(rootlistItems.rows); + playlists = playlists.sort((a, b) => a.ownedBySelf === b.ownedBySelf ? 0 : a.ownedBySelf ? -1 : 1); + const indexOfFirstNotOwned = playlists.findIndex((playlist) => !playlist.ownedBySelf); + let playlistUris = []; + let trackCount = 0; + let ownedTrackCount = 0; + playlists.forEach((playlist) => { + if (playlist.totalLength === 0) + return; + playlistUris.push(playlist.link); + trackCount += playlist.totalLength; + if (playlist.ownedBySelf) + ownedTrackCount += playlist.totalLength; + }, 0); + const playlistsMeta = await Promise.all( + playlistUris.map((uri) => { + return apiRequest("playlistsMetadata", `sp://core-playlist/v1/playlist/${uri}?responseFormat=protobufJson`); + }) + ); + let totalDuration = 0; + let trackUids = []; + let artists = {}; + let totalObscurity = 0; + let albums = []; + let explicitTracks = 0; + let ownedDuration = 0; + let ownedArtists = {}; + let ownedObscurity = 0; + let ownedAlbums = []; + let ownedExplicitTracks = 0; + for (let i = 0; i < playlistsMeta.length; i++) { + const playlist = playlistsMeta[i]; + if (i === indexOfFirstNotOwned) { + ownedDuration = totalDuration; + ownedArtists = Object.assign({}, artists); + ownedObscurity = totalObscurity; + ownedExplicitTracks = explicitTracks; + } + totalDuration += Number(playlist.duration); + playlist.item.forEach((item) => { + if (!item.trackMetadata) + return; + trackUids.push(item.trackMetadata.link.split(":")[2]); + if (item.trackMetadata.isExplicit) + explicitTracks++; + totalObscurity += item.trackMetadata.popularity; + const index = albums.findIndex(([g]) => g.link === item.trackMetadata.album.link); + if (index !== -1) { + albums[index][1] += 1; + if (i < indexOfFirstNotOwned) + ownedAlbums[index][1] += 1; + } else { + albums.push([item.trackMetadata.album, 1]); + if (i < indexOfFirstNotOwned) + ownedAlbums.push([item.trackMetadata.album, 1]); + } + item.trackMetadata.artist.forEach((artist) => { + if (!artists[artist.link.split(":")[2]]) { + artists[artist.link.split(":")[2]] = 1; + } else { + artists[artist.link.split(":")[2]] += 1; + } + }); + }); + } + const topAlbums = albums.sort((a, b) => b[1] - a[1]).slice(0, 10); + const ownedTopAlbums = ownedAlbums.sort((a, b) => b[1] - a[1]).slice(0, 10); + const topArtists = Object.keys(artists).sort((a, b) => artists[b] - artists[a]).filter((id) => id.match(/^[a-zA-Z0-9]{22}$/)).slice(0, 50); + const ownedTopArtists = Object.keys(ownedArtists).sort((a, b) => ownedArtists[b] - ownedArtists[a]).filter((id) => id.match(/^[a-zA-Z0-9]{22}$/)).slice(0, 50); + const artistsMeta = await apiRequest("artistsMetadata", `https://api.spotify.com/v1/artists?ids=${topArtists.join(",")}`); + const ownedArtistsMeta = await apiRequest("artistsMetadata", `https://api.spotify.com/v1/artists?ids=${ownedTopArtists.join(",")}`); + const topGenres = artistsMeta.artists.reduce((acc, artist) => { + artist.numTracks = artists[artist.id]; + artist.genres.forEach((genre) => { + const index = acc.findIndex(([g]) => g === genre); + if (index !== -1) { + acc[index][1] += artist.numTracks; + } else { + acc.push([genre, artist.numTracks]); + } + }); + return acc; + }, []); + const ownedTopGenres = ownedArtistsMeta.artists.reduce((acc, artist) => { + artist.numTracks = ownedArtists[artist.id]; + artist.genres.forEach((genre) => { + const index = acc.findIndex(([g]) => g === genre); + if (index !== -1) { + acc[index][1] += artist.numTracks; + } else { + acc.push([genre, artist.numTracks]); + } + }); + return acc; + }, []); + const fetchedFeatures = await fetchAudioFeatures(trackUids); + const audioFeatures = { + popularity: totalObscurity, + explicitness: explicitTracks, + danceability: 0, + energy: 0, + valence: 0, + speechiness: 0, + acousticness: 0, + instrumentalness: 0, + liveness: 0, + tempo: 0, + loudness: 0 + }; + const ownedAudioFeatures = { + popularity: ownedObscurity, + explicitness: ownedExplicitTracks, + danceability: 0, + energy: 0, + valence: 0, + speechiness: 0, + acousticness: 0, + instrumentalness: 0, + liveness: 0, + tempo: 0, + loudness: 0 + }; + for (let i = 0; i < fetchedFeatures.length; i++) { + if (i === ownedTrackCount) { + for (let key in audioFeatures) { + ownedAudioFeatures[key] = audioFeatures[key]; + } + } + if (!fetchedFeatures[i]) + continue; + const track = fetchedFeatures[i]; + audioFeatures["danceability"] += track["danceability"]; + audioFeatures["energy"] += track["energy"]; + audioFeatures["valence"] += track["valence"]; + audioFeatures["speechiness"] += track["speechiness"]; + audioFeatures["acousticness"] += track["acousticness"]; + audioFeatures["instrumentalness"] += track["instrumentalness"]; + audioFeatures["liveness"] += track["liveness"]; + audioFeatures["tempo"] += track["tempo"]; + audioFeatures["loudness"] += track["loudness"]; + } + for (let key in audioFeatures) { + audioFeatures[key] /= fetchedFeatures.length; + } + for (let key in ownedAudioFeatures) { + ownedAudioFeatures[key] /= ownedTrackCount; + } + const ownedStats = { + audioFeatures: ownedAudioFeatures, + trackCount: ownedTrackCount, + totalDuration: ownedDuration, + artists: ownedArtistsMeta.artists, + artistCount: Object.keys(ownedArtists).length, + genres: ownedTopGenres, + playlistCount: indexOfFirstNotOwned, + albums: ownedTopAlbums + }; + const allStats = { + audioFeatures, + trackCount, + totalDuration, + artists: artistsMeta.artists, + artistCount: Object.keys(artists).length, + genres: topGenres, + playlistCount: playlists.length, + albums: topAlbums + }; + if (set) { + if (option === "all") + setLibrary(allStats); + else + setLibrary(ownedStats); + } + Spicetify.LocalStorage.set(`stats:library:all`, JSON.stringify(allStats)); + Spicetify.LocalStorage.set(`stats:library:owned`, JSON.stringify(ownedStats)); + console.log("total library fetch time:", window.performance.now() - start); + }; + import_react14.default.useEffect(() => { + updatePageCache(3, fetchData, activeOption, true); + }, []); + import_react14.default.useEffect(() => { + fetchData(activeOption); + }, [activeOption]); + if (!library) + return /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "stats-loadingWrapper" + }, /* @__PURE__ */ import_react14.default.createElement("svg", { + role: "img", + height: "46", + width: "46", + "aria-hidden": "true", + viewBox: "0 0 24 24", + "data-encore-id": "icon", + className: "Svg-sc-ytk21e-0 Svg-img-24-icon" + }, /* @__PURE__ */ import_react14.default.createElement("path", { + d: "M14.5 2.134a1 1 0 0 1 1 0l6 3.464a1 1 0 0 1 .5.866V21a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1V3a1 1 0 0 1 .5-.866zM16 4.732V20h4V7.041l-4-2.309zM3 22a1 1 0 0 1-1-1V3a1 1 0 0 1 2 0v18a1 1 0 0 1-1 1zm6 0a1 1 0 0 1-1-1V3a1 1 0 0 1 2 0v18a1 1 0 0 1-1 1z" + })), /* @__PURE__ */ import_react14.default.createElement("h1", null, "Analysing Your Library"))); + const parseVal = (obj) => { + switch (obj[0]) { + case "tempo": + return Math.round(obj[1]) + "bpm"; + case "loudness": + return Math.round(obj[1]) + "dB"; + case "popularity": + return Math.round(obj[1]) + "%"; + default: + return Math.round(obj[1] * 100) + "%"; + } + }; + const statCards = []; + Object.entries(library.audioFeatures).forEach((obj) => { + statCards.push(/* @__PURE__ */ import_react14.default.createElement(stat_card_default, { + stat: obj[0][0].toUpperCase() + obj[0].slice(1), + value: parseVal(obj) + })); + }); + const artistCards = library.artists.slice(0, 10).map((artist) => /* @__PURE__ */ import_react14.default.createElement(artist_card_default, { + name: artist.name, + image: artist.images[2] ? artist.images[2].url : artist.images[1] ? artist.images[1].url : "https://images.squarespace-cdn.com/content/v1/55fc0004e4b069a519961e2d/1442590746571-RPGKIXWGOO671REUNMCB/image-asset.gif", + uri: artist.uri, + subtext: `Appears in ${artist.numTracks} tracks` + })); + const albumCards = library.albums.map(([album, frequency]) => { + return /* @__PURE__ */ import_react14.default.createElement(artist_card_default, { + name: album.name, + image: album.covers.standardLink, + uri: album.link, + subtext: `Appears in ${frequency} tracks` + }); + }); + const scrollGrid = (event) => { + const grid = event.target.parentNode.querySelector("div"); + grid.scrollLeft += grid.clientWidth; + }; + const scrollGridLeft = (event) => { + const grid = event.target.parentNode.querySelector("div"); + grid.scrollLeft -= grid.clientWidth; + }; + return /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, /* @__PURE__ */ import_react14.default.createElement("section", { + className: "contentSpacing" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: `collection-collection-header stats-header` + }, /* @__PURE__ */ import_react14.default.createElement("h1", { + "data-encore-id": "type", + className: "Type__TypeElement-sc-goli3j-0 TypeElement-canon-type" + }, "Library Analysis"), /* @__PURE__ */ import_react14.default.createElement("div", { + className: "collection-searchBar-searchBar" + }, /* @__PURE__ */ import_react14.default.createElement(refresh_button_default, { + refreshCallback: () => { + fetchData(activeOption, true); + } + }), dropdown)), /* @__PURE__ */ import_react14.default.createElement("div", { + className: "stats-page" + }, /* @__PURE__ */ import_react14.default.createElement("section", { + className: "stats-libraryOverview" + }, /* @__PURE__ */ import_react14.default.createElement(stat_card_default, { + stat: "Total Playlists", + value: library.playlistCount + }), /* @__PURE__ */ import_react14.default.createElement(stat_card_default, { + stat: "Total Tracks", + value: library.trackCount + }), /* @__PURE__ */ import_react14.default.createElement(stat_card_default, { + stat: "Total Artists", + value: library.artistCount + }), /* @__PURE__ */ import_react14.default.createElement(stat_card_default, { + stat: "Total Minutes", + value: Math.floor(library.totalDuration / 60) + }), /* @__PURE__ */ import_react14.default.createElement(stat_card_default, { + stat: "Total Hours", + value: (library.totalDuration / (60 * 60)).toFixed(1) + })), /* @__PURE__ */ import_react14.default.createElement("section", null, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-header" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-topRow" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-titleWrapper" + }, /* @__PURE__ */ import_react14.default.createElement("h2", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-canon-textBase-type main-shelf-title" + }, "Most Frequent Genres")))), /* @__PURE__ */ import_react14.default.createElement(genres_card_default, { + genres: library.genres, + total: library.trackCount + }), /* @__PURE__ */ import_react14.default.createElement("section", { + className: "stats-gridInlineSection" + }, /* @__PURE__ */ import_react14.default.createElement("button", { + className: "stats-scrollButton", + onClick: scrollGridLeft + }, "<"), /* @__PURE__ */ import_react14.default.createElement("button", { + className: "stats-scrollButton", + onClick: scrollGrid + }, ">"), /* @__PURE__ */ import_react14.default.createElement("div", { + className: `main-gridContainer-gridContainer stats-gridInline stats-specialGrid` + }, statCards))), /* @__PURE__ */ import_react14.default.createElement("section", { + className: "main-shelf-shelf Shelf" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-header" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-topRow" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-titleWrapper" + }, /* @__PURE__ */ import_react14.default.createElement("h2", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-canon-textBase-type main-shelf-title" + }, "Most Frequent Artists")))), /* @__PURE__ */ import_react14.default.createElement("section", { + className: "stats-gridInlineSection" + }, /* @__PURE__ */ import_react14.default.createElement("button", { + className: "stats-scrollButton", + onClick: scrollGridLeft + }, "<"), /* @__PURE__ */ import_react14.default.createElement("button", { + className: "stats-scrollButton", + onClick: scrollGrid + }, ">"), /* @__PURE__ */ import_react14.default.createElement("div", { + className: `main-gridContainer-gridContainer stats-gridInline` + }, artistCards))), /* @__PURE__ */ import_react14.default.createElement("section", { + className: "main-shelf-shelf Shelf" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-header" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-topRow" + }, /* @__PURE__ */ import_react14.default.createElement("div", { + className: "main-shelf-titleWrapper" + }, /* @__PURE__ */ import_react14.default.createElement("h2", { + className: "Type__TypeElement-sc-goli3j-0 TypeElement-canon-textBase-type main-shelf-title" + }, "Most Frequent Albums")))), /* @__PURE__ */ import_react14.default.createElement("section", { + className: "stats-gridInlineSection" + }, /* @__PURE__ */ import_react14.default.createElement("button", { + className: "stats-scrollButton", + onClick: scrollGridLeft + }, "<"), /* @__PURE__ */ import_react14.default.createElement("button", { + className: "stats-scrollButton", + onClick: scrollGrid + }, ">"), /* @__PURE__ */ import_react14.default.createElement("div", { + className: `main-gridContainer-gridContainer stats-gridInline` + }, albumCards)))))); + }; + var library_default = import_react14.default.memo(LibraryPage); + + // package.json + var version = "0.1.0"; + + // src/constants.ts + var STATS_VERSION = version; + var LATEST_RELEASE = "https://api.github.com/repos/harbassan/spicetify-stats/releases"; + + // src/app.tsx + var pages = { + ["Artists"]: /* @__PURE__ */ import_react15.default.createElement(top_artists_default, null), + ["Tracks"]: /* @__PURE__ */ import_react15.default.createElement(top_tracks_default, null), + ["Genres"]: /* @__PURE__ */ import_react15.default.createElement(top_genres_default, null), + ["Library"]: /* @__PURE__ */ import_react15.default.createElement(library_default, null) + }; + var checkForUpdates = (setNewUpdate) => { + fetch(LATEST_RELEASE).then((res) => res.json()).then( + (result) => { + try { + setNewUpdate(result[0].name.slice(1) !== STATS_VERSION); + } catch (err) { + console.log(err); + } + }, + (error) => { + console.log("Failed to check for updates", error); + } + ); + }; + var App = () => { + const [navBar, activeLink, setActiveLink] = useNavigationBar_default(["Artists", "Tracks", "Genres", "Library"]); + const [newUpdate, setNewUpdate] = import_react15.default.useState(false); + console.log("app render"); + console.log(newUpdate); + import_react15.default.useEffect(() => { + setActiveLink(Spicetify.LocalStorage.get("stats:active-link") || "Artists"); + checkForUpdates(setNewUpdate); + }, []); + import_react15.default.useEffect(() => { + Spicetify.LocalStorage.set("stats:active-link", activeLink); + }, [activeLink]); + return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, newUpdate && /* @__PURE__ */ import_react15.default.createElement("div", { + className: "new-update" + }, "New app update available! Visit ", /* @__PURE__ */ import_react15.default.createElement("a", { + href: "https://github.com/harbassan/spicetify-stats/releases" + }, "harbassan/spicetify-stats"), " to install."), navBar, pages[activeLink]); + }; + var app_default = App; + + // node_modules/spicetify-creator/dist/temp/index.jsx + var import_react16 = __toESM(require_react()); + function render() { + return /* @__PURE__ */ import_react16.default.createElement(app_default, null); + } + return __toCommonJS(temp_exports); +})(); +const render=()=>stats.default(); diff --git a/.config/spicetify/CustomApps/stats/manifest.json b/.config/spicetify/CustomApps/stats/manifest.json new file mode 100644 index 00000000..2a652239 --- /dev/null +++ b/.config/spicetify/CustomApps/stats/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "Statistics", + "icon": "\r\n\r\n\r\n\r\n\r\n\r\n\r\n", + "active-icon": "\r\n\r\n\r\n\r\n\r\n\r\n\r\n", + "subfiles": [], + "subfiles_extension": [ + "extension.js" + ] +} \ No newline at end of file diff --git a/.config/spicetify/CustomApps/stats/previews/library_analysis.png b/.config/spicetify/CustomApps/stats/previews/library_analysis.png new file mode 100644 index 00000000..75113b60 Binary files /dev/null and b/.config/spicetify/CustomApps/stats/previews/library_analysis.png differ diff --git a/.config/spicetify/CustomApps/stats/previews/top_artists.png b/.config/spicetify/CustomApps/stats/previews/top_artists.png new file mode 100644 index 00000000..7d226a24 Binary files /dev/null and b/.config/spicetify/CustomApps/stats/previews/top_artists.png differ diff --git a/.config/spicetify/CustomApps/stats/previews/top_genres.png b/.config/spicetify/CustomApps/stats/previews/top_genres.png new file mode 100644 index 00000000..ca869fac Binary files /dev/null and b/.config/spicetify/CustomApps/stats/previews/top_genres.png differ diff --git a/.config/spicetify/CustomApps/stats/previews/top_tracks.png b/.config/spicetify/CustomApps/stats/previews/top_tracks.png new file mode 100644 index 00000000..c7fdd551 Binary files /dev/null and b/.config/spicetify/CustomApps/stats/previews/top_tracks.png differ diff --git a/.config/spicetify/CustomApps/stats/style.css b/.config/spicetify/CustomApps/stats/style.css new file mode 100644 index 00000000..cb485256 --- /dev/null +++ b/.config/spicetify/CustomApps/stats/style.css @@ -0,0 +1,210 @@ +/* ../../AppData/Local/Temp/tmp-19288-CUnNgMBeJddq/18888d8cb0d1/navBar.module.css */ +.navBar-module__topBarHeaderItem___v29bR_stats { + -webkit-app-region: no-drag; + display: inline-block; + pointer-events: auto; +} +.navBar-module__topBarHeaderItemLink___VeyBY_stats { + margin: 0 8px 0 0; +} +.navBar-module__topBarActive___-qYPu_stats { + background-color: var(--spice-tab-active); + border-radius: 4px; +} +.navBar-module__topBarHeaderItemLink___VeyBY_stats { + border-radius: 4px; + color: var(--spice-text); + display: inline-block; + margin: 0 8px; + padding: 8px 16px; + position: relative; + text-decoration: none !important; + cursor: pointer; +} +.navBar-module__topBarNav___1OtdR_stats { + -webkit-app-region: drag; + pointer-events: none; + width: 100%; +} +.navBar-module__topBarHeaderItem___v29bR_stats .navBar-module__optionsMenuDropBox___tD9mA_stats { + color: var(--spice-text); + border: 0; + max-width: 150px; + height: 42px; + padding: 0 30px 0 12px; + background-color: initial; + cursor: pointer; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.navBar-module__topBarHeaderItem___v29bR_stats .navBar-module__optionsMenuDropBox___tD9mA_stats svg { + position: absolute; + margin-left: 8px; +} +div.navBar-module__topBarHeaderItemLink___VeyBY_stats { + padding: 0; +} + +/* ../../AppData/Local/Temp/tmp-19288-CUnNgMBeJddq/18888d8c9df0/app.css */ +.stats-grid { + --grid-gap: 24px; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); +} +.stats-refreshButton { + width: 32px; + height: 32px; +} +.collection-searchBar-searchBar { + display: flex; +} +.stats-specialGrid { + grid-template-columns: repeat(11, 180px) !important; +} +.stats-gridInline { + --grid-gap: 24px; + grid-template-columns: repeat(10, 180px); + overflow-x: hidden; + scroll-behavior: smooth; +} +.stats-loadingWrapper { + display: flex; + justify-content: center; + align-items: center; + min-height: 75vh; + flex-direction: column; + gap: 16px; +} +.stats-libraryOverview { + display: flex; + gap: 24px; + align-items: center; +} +.stats-page { + display: flex; + flex-direction: column; + gap: 24px; +} +.stats-trackPageTitle { + display: flex; + gap: 24px; + align-items: center; +} +.stats-scrollButton { + width: 40px; + border-radius: 8px; + border: none; + padding: 0; + margin-right: 5px; + background-color: var(--spice-player); + color: var(--spice-subtext); +} +.stats-scrollButton:hover { + background-color: #282828; +} +.stats-createPlaylistButton { + box-sizing: border-box; + -webkit-tap-highlight-color: transparent; + font-size: 0.8125rem; + font-weight: 700; + font-family: var(--font-family, CircularSp, CircularSp-Arab, CircularSp-Hebr, CircularSp-Cyrl, CircularSp-Grek, CircularSp-Deva, var(--fallback-fonts, sans-serif)); + background-color: transparent; + border-radius: 500px; + cursor: pointer; + position: relative; + text-align: center; + text-decoration: none; + text-transform: none; + touch-action: manipulation; + transition-duration: 33ms; + transition-property: + background-color, + border-color, + color, + box-shadow, + filter, + transform; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + vertical-align: middle; + transform: translate3d(0px, 0px, 0px); + padding-block: 3px; + padding-inline: 15px; + border: 1px solid var(--essential-subdued, #878787); + color: var(--text-base, #000000); + min-block-size: 32px; + display: inline-flex; + align-items: center; + justify-content: center; +} +.stats-createPlaylistButton:hover { + transform: scale(1.04); + border-color: var(--essential-base, #000000); +} +.stats-header { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + -webkit-box-align: center; + -ms-flex-align: center; + align-content: space-between; + align-items: center; + color: var(--spice-text); + display: flex; + justify-content: space-between; + margin: 16px 0; +} +.stats-tracklistHeader > div { + display: flex; + -webkit-app-region: no-drag; + gap: 20px; + align-items: center; +} +.stats-genreCard { + display: flex; + flex-direction: column; + gap: 10px; + padding: 16px; + border-radius: 8px; + background: var(--spice-player); + position: relative; +} +.stats-genreRow { + width: 100%; + height: 20px; + display: flex; + gap: 10px; +} +.stats-genreRowFill { + background: var(--spice-button); + height: 100%; + border-radius: 8px; + display: flex; + align-items: center; +} +.stats-genreText { + color: var(--spice-player); + font-size: 0.875rem; + margin-left: 7px; + font-weight: bold; +} +.stats-genreValue { + color: var(--spice-text); + font-size: 0.875rem; +} +.stats-cardValue { + font-size: 2rem; + font-weight: bold; + color: var(--spice-text); +} +.stats-cardText { + color: var(--spice-text); +} +.new-update { + background-color: var(--spice-player); + color: var(--spice-text); + border-radius: 8px; + padding: 2px 12px; + margin: 0 24px; + border: 0px; +} diff --git a/.config/spicetify/Themes/Comfy/color.ini b/.config/spicetify/Themes/Comfy/color.ini deleted file mode 100644 index f030374c..00000000 --- a/.config/spicetify/Themes/Comfy/color.ini +++ /dev/null @@ -1,406 +0,0 @@ -[Comfy] -text = FFFFFF -subtext = B9BBBE -main = 23283D -main-transition = 1E2233 -highlight = 45495b -highlight-elevated = 32364a -sidebar = 1E2233 -player = 101320 -card = 191F2E -shadow = 1E2233 -selected-row = F1F1F1 -button = 7289DA -button-active = 5C6FB1 -button-disabled = 4B588C -tab-active = 1E2233 -notification = 7289DA -notification-error = d25050 -misc = 000000 -play-button = 7289da -play-button-active = 869adf -progress-fg = 1ed760 -progress-bg = 7289da -heart = d25050 -liked-left = 3a62f5 -liked-right = c4efd9 -pagelink-active = 5c6eb1 -radio-btn-active = 7289DA - -[Nord] -text = B2BCCC -subtext = B2BCCC -main = 2E3440 -main-transition = 262B35 -highlight = 50555f -highlight-elevated = 3d424d -sidebar = 262B35 -player = 363d4c -card = 363d4c -shadow = 1d2128 -button = 8A99AF -button-active = 718CAD -button-disabled = 434C5E -tab-active = 363d4c -notification = 363d4c -notification-error = A9555E -misc = FFFFFF -play-button = 8A99AF -play-button-active = 718CAD -progress-fg = 8A99AF -progress-bg = 4b566a -heart = 718CAD -liked-left = 262B35 -liked-right = B2BCCC -pagelink-active = b7c1d5 -radio-btn-active = 363d4c - -[Lunar] -text = f3f3f3 -subtext = cecece -main = 161616 -main-transition = 101010 -highlight = 2a2a2a -highlight-elevated = 232323 -sidebar = 202020 -player = 202020 -card = 202020 -shadow = 252525 -selected-row = cecece -button = 3281ea -button-active = 0284e8 -button-disabled = 303030 -tab-active = ebbcba -notification = 3281ea -notification-error = b10c0c -misc = 252525 -play-button = ebbcba -play-button-active = eba9a7 -progress-fg = 025ca1 -progress-bg = 202020 -heart = ebbcba -liked-left = 3a62f5 -liked-right = c4efd9 -pagelink-active = ffffff -radio-btn-active = 0284e8 - -[catppuccin-dark] -text = cad3f5 -subtext = b8c0e0 -main = 181926 -main-transition = 181926 -highlight = 333645 -highlight-elevated = 232533 -sidebar = 24273a -player = 24273a -card = 494d64 -shadow = 5b6078 -selected-row = b8c0e0 -button = 8aadf4 -button-active = 7dc4e4 -button-disabled = 494d64 -tab-active = ed8796 -notification = 8aadf4 -notification-error = ed8796 -misc = 5b6078 -play-button = f5bde6 -play-button-active = f0c6c6 -progress-fg = 91d7e3 -progress-bg = 494d64 -heart = f5a97f -liked-left = a6da95 -liked-right = b7bdf8 -pagelink-active = ffffff -radio-btn-active = 7dc4e4 - -[catppuccin-light] -text = cad3f5 -subtext = b8c0e0 -main = 494d64 -main-transition = 181926 -highlight = 5c6179 -highlight-elevated = 545a71 -sidebar = 24273a -player = 24273a -card = 494d64 -shadow = 5b6078 -selected-row = b8c0e0 -button = 8aadf4 -button-active = 7dc4e4 -button-disabled = 494d64 -tab-active = ed8796 -notification = 8aadf4 -notification-error = ed8796 -misc = 5b6078 -play-button = f5bde6 -play-button-active = f0c6c6 -progress-fg = 91d7e3 -progress-bg = 494d64 -heart = f5a97f -liked-left = a6da95 -liked-right = b7bdf8 -pagelink-active = ffffff -radio-btn-active = 7dc4e4 - -[Mono] -text = FFFFFF -subtext = B9BBBE -main = 171717 -main-transition = FFFFFF -highlight = 3b3b3b -highlight-elevated = 262626 -sidebar = 101010 -player = 101010 -card = 343434 -shadow = 595858 -selected-row = F1F1F1 -button = FFFFFF -button-active = c5c5c5 -button-disabled = 4a4949 -tab-active = 303030 -notification = 101010 -notification-error = d25050 -misc = 000000 -play-button = FFFFFF -play-button-active = FFFFFF -progress-fg = FFFFFF -progress-bg = 343434 -heart = FFFFFF -liked-left = 000000 -liked-right = ffffff -pagelink-active = 787878 -radio-btn-active = 737373 - -[Deep] -text = 4f9a87 -subtext = 406560 -button-text = 4f9a87 -main = 040614 -main-transition = 0F111A -highlight = 0f1f28 -highlight-elevated = 09111d -sidebar = 0F111A -player = 0F111A -subbutton-text = 040614 -card = 0f1118 -shadow = 0f1118 -selected-row = 4f9a87 -sub-button = 4f9a87 -button = 106165 -button-active = 4f9a87 -button-disabled = 0C1C19 -tab-active = 0a1527 -notification = 051024 -notification-error = 051024 -playback-bar = 4f9a87 -misc = 406560 -play-button = 106165 -play-button-active = 4f9a87 -progress-fg = 4f9a87 -progress-bg = 106165 -heart = d25050 -liked-left = 3a62f5 -liked-right = c4efd9 -pagelink-active = 4f9a87 -radio-btn-active = 4f9a87 - -[Sunset] -text = ffce3f -subtext = fef3bb -main = 171717 -main-transition = 000000 -highlight = 3d3c32 -highlight-elevated = 272722 -sidebar = 101010 -player = 101010 -card = cc9756 -shadow = e3b47b -selected-row = fef3bb -button = ffce3f -button-active = bf9b30 -button-disabled = 4a4949 -tab-active = 303030 -notification = ffffff -notification-error = d25050 -misc = 000000 -play-button = ffce3f -play-button-active = fc9e3a -progress-fg = ff8300 -progress-bg = 343434 -heart = ff8300 -liked-left = 000000 -liked-right = ffffff -pagelink-active = fef3bb -radio-btn-active = fef3bb - -[Neon] -text = 588bae -subtext = eaffff -main = 171717 -main-transition = 000000 -highlight = 3b3b3b -highlight-elevated = 262626 -sidebar = 101010 -player = 101010 -card = 7fa1b5 -shadow = a9c9db -selected-row = F1F1F1 -button = 588bae -button-active = 3b5d75 -button-disabled = 4a4949 -tab-active = 303030 -notification = FFFFFF -notification-error = d25050 -misc = 000000 -play-button = 588bae -play-button-active = 5085ab -progress-fg = 00afdb -progress-bg = 343434 -heart = 00afdb -liked-left = 000000 -liked-right = ffffff -pagelink-active = bbe7fe -radio-btn-active = eaffff - -[Forest] -text = B2C5B3 -subtext = d5ddde -main = 171717 -main-transition = 000000 -highlight = 3b3b3b -highlight-elevated = 262626 -sidebar = 101010 -player = 101010 -card = 5c6e59 -shadow = 3c5148 -selected-row = F1F1F1 -button = B2C5B3 -button-active = F1F1F1 -button-disabled = 4a4949 -tab-active = 303030 -notification = FFFFFF -notification-error = d25050 -misc = 000000 -play-button = 3c5148 -play-button-active = 43705d -progress-fg = 3c5148 -progress-bg = 343434 -heart = 3c5148 -liked-left = 000000 -liked-right = ffffff -pagelink-active = 3c5148 -radio-btn-active = 737373 - -[Sakura] -text = fcb4ca -subtext = ffdcdc -main = 171717 -main-transition = 000000 -highlight = 3d3838 -highlight-elevated = 272525 -sidebar = 101010 -player = 101010 -card = d68ba2 -shadow = fcb4ca -selected-row = ffdcdc -button = fcb4ca -button-active = d48aa0 -button-disabled = 4a4949 -tab-active = 303030 -notification = FFFFFF -notification-error = d25050 -misc = 000000 -play-button = f42c38 -play-button-active = ba182b -progress-fg = Cfeefa -progress-bg = 343434 -heart = f25477 -liked-left = 000000 -liked-right = ffffff -pagelink-active = f5bcdb -radio-btn-active = ffdcdc - -[Vaporwave] -text = 01CDFE -subtext = eaffff -main = 171717 -main-transition = 000000 -highlight = 3b3b3b -highlight-elevated = 262626 -sidebar = 101010 -player = 101010 -card = 007f9e -shadow = 2ec2e6 -selected-row = F1F1F1 -button = 01CDFE -button-active = 118ba8 -button-disabled = 4a4949 -tab-active = 303030 -notification = FFFFFF -notification-error = d25050 -misc = 000000 -play-button = ffd300 -play-button-active = e3c01b -progress-fg = f706cf -progress-bg = 343434 -heart = f706cf -liked-left = 000000 -liked-right = ffffff -pagelink-active = c0d6fa -radio-btn-active = eaffff - -[Velvet] -text = AD434E -subtext = 762F37 -main = 1E1E1E -main-transition = 161616 -highlight = 322324 -highlight-elevated = 272021 -sidebar = 161616 -player = 080808 -card = 0F0F0F -shadow = 161616 -selected-row = 973B45 -button = 6B2B32 -button-active = 552328 -button-disabled = 262626 -tab-active = 161616 -notification = 6B2B32 -notification-error = 60272D -misc = 000000 -play-button = 552328 -play-button-active = 6B2B32 -progress-fg = 81333B -progress-bg = A23F49 -heart = 60272D -liked-left = 2D2D2D -liked-right = 8C3740 -pagelink-active = 4A1F23 -radio-btn-active = 6B2B32 - -[wal16] -text = ${xrdb:color15:FFFFFF} -subtext = ${xrdb:color6:B9BBBE} -main = ${xrdb:color0:23283D} -main-transition = ${xrdb:color0:000000} -sidebar = ${xrdb:color8:1E2233} -player = ${xrdb:color4:101320} -card = ${xrdb:color8:191F2E} -shadow = ${xrdb:color0:1E2233} -selected-row = ${xrdb:color15:F1F1F1} -button = ${xrdb:color6:7289DA} -button-active = ${xrdb:color14:5C6FB1} -button-disabled = ${xrdb:color8:4B588C} -tab-active = ${xrdb:color9:1E2233} -notification = FFFFFF -notification-error = d25050 -misc = ${xrdb:color0:000000} -play-button = ${xrdb:color11:5C6FB1} -play-button-active = ${xrdb:color3:7289DA} -progress-fg = ${xrdb:color10:1ed760} -progress-bg = ${xrdb:color0:f1f1f1} -heart = ${xrdb:color10:d25050} -liked-left = ${xrdb:color10:3a62f5} -liked-right = ${xrdb:color11:c4efd9} -pagelink-active = ${xrdb:color13:5c6eb1} -radio-btn-active = ${xrdb:color13:7289DA} diff --git a/.config/spicetify/Themes/Comfy/theme.js b/.config/spicetify/Themes/Comfy/theme.js deleted file mode 100644 index 43c754a8..00000000 --- a/.config/spicetify/Themes/Comfy/theme.js +++ /dev/null @@ -1,9 +0,0 @@ -(() => { - const themeScript = document.createElement("SCRIPT"); - themeScript.setAttribute("type", "text/javascript"); - themeScript.setAttribute( - "src", - "https://comfy-themes.github.io/Spicetify/Comfy/theme.script.js" - ); - document.head.appendChild(themeScript); -})(); diff --git a/.config/spicetify/Themes/Comfy/user.css b/.config/spicetify/Themes/Comfy/user.css deleted file mode 100644 index b1f5982a..00000000 --- a/.config/spicetify/Themes/Comfy/user.css +++ /dev/null @@ -1 +0,0 @@ -@import url("https://comfy-themes.github.io/Spicetify/Comfy/app.css"); diff --git a/.config/spicetify/config-xpui.ini b/.config/spicetify/config-xpui.ini index e6c6bcdc..79b16b4a 100644 --- a/.config/spicetify/config-xpui.ini +++ b/.config/spicetify/config-xpui.ini @@ -18,9 +18,9 @@ custom_apps = lyrics-plus|marketplace spotify_path = /opt/spotify color_scheme = Comfy overwrite_assets = 1 -spotify_launch_flags = +spotify_launch_flags = check_spicetify_upgrade = 0 -prefs_path = ~/.config/spotify/prefs +prefs_path = /home/matt/.config/spotify/prefs current_theme = Comfy inject_css = 1 replace_colors = 1 diff --git a/.config/starship.toml b/.config/starship.toml new file mode 100644 index 00000000..51ed057b --- /dev/null +++ b/.config/starship.toml @@ -0,0 +1,149 @@ +# Get editor completions based on the config schema +"$schema" = 'https://starship.rs/config-schema.json' + +# Inserts a blank line between shell prompts +add_newline = true + +# Replace the '❯' symbol in the prompt with '➜' +[character] # The name of the module we are configuring is 'character' +success_symbol = '[➜](bold green)' # The 'success_symbol' segment is being set to '➜' with the color 'bold green' + +[aws] +symbol = " " + +[buf] +symbol = " " + +[c] +symbol = " " + +[conda] +symbol = " " + +[dart] +symbol = " " + +[directory] +read_only = " 󰌾" + +[docker_context] +symbol = " " + +[elixir] +symbol = " " + +[elm] +symbol = " " + +[fossil_branch] +symbol = " " + +[git_branch] +symbol = " " + +[golang] +symbol = " " + +[guix_shell] +symbol = " " + +[haskell] +symbol = " " + +[haxe] +symbol = "⌘ " + +[hg_branch] +symbol = " " + +[hostname] +ssh_symbol = " " + +[java] +symbol = " " + +[julia] +symbol = " " + +[lua] +symbol = " " + +[memory_usage] +symbol = "󰍛 " + +[meson] +symbol = "󰔷 " + +[nim] +symbol = "󰆥 " + +[nix_shell] +symbol = " " + +[nodejs] +symbol = " " + +[os.symbols] +Alpaquita = " " +Alpine = " " +Amazon = " " +Android = " " +Arch = " " +Artix = " " +CentOS = " " +Debian = " " +DragonFly = " " +Emscripten = " " +EndeavourOS = " " +Fedora = " " +FreeBSD = " " +Garuda = "󰛓 " +Gentoo = " " +HardenedBSD = "󰞌 " +Illumos = "󰈸 " +Linux = " " +Mabox = " " +Macos = " " +Manjaro = " " +Mariner = " " +MidnightBSD = " " +Mint = " " +NetBSD = " " +NixOS = " " +OpenBSD = "󰈺 " +openSUSE = " " +OracleLinux = "󰌷 " +Pop = " " +Raspbian = " " +Redhat = " " +RedHatEnterprise = " " +Redox = "󰀘 " +Solus = "󰠳 " +SUSE = " " +Ubuntu = " " +Unknown = " " +Windows = "󰍲 " + +[package] +symbol = "󰏗 " + +[pijul_channel] +symbol = "🪺 " + +[python] +symbol = " " + +[rlang] +symbol = "󰟔 " + +[ruby] +symbol = " " + +[rust] +symbol = " " + +[scala] +symbol = " " + +[spack] +symbol = "🅢 " diff --git a/.config/xplr/init.lua b/.config/xplr/init.lua new file mode 100644 index 00000000..0bf56b58 --- /dev/null +++ b/.config/xplr/init.lua @@ -0,0 +1,3249 @@ +---@diagnostic disable +local xplr = xplr -- The globally exposed configuration to be overridden. +---@diagnostic enable + +-- This is the built-in configuration file that gets loaded and sets the +-- default values when xplr loads, before loading any other custom +-- configuration file. +-- +-- You can use this file as a reference to create a your custom config file. +-- +-- To create a custom configuration file, you need to define the script version +-- for compatibility checks. +-- +-- See https://xplr.dev/en/upgrade-guide +-- +-- ```lua +version = '0.21.2' +-- ``` + +-- # Configuration ------------------------------------------------------------ +-- +-- xplr can be configured using [Lua][1] via a special file named `init.lua`, +-- which can be placed in `~/.config/xplr/` (local to user) or `/etc/xplr/` +-- (global) depending on the use case. +-- +-- When xplr loads, it first executes the [built-in init.lua][2] to set the +-- default values, which is then overwritten by another config file, if found +-- using the following lookup order: +-- +-- 1. `--config /path/to/init.lua` +-- 2. `~/.config/xplr/init.lua` +-- 3. `/etc/xplr/init.lua` +-- +-- The first one found will be loaded by xplr and the lookup will stop. +-- +-- The loaded config can be further extended using the `-C` or `--extra-config` +-- command-line option. +-- +-- +-- [1]: https://www.lua.org +-- [2]: https://github.com/sayanarijit/xplr/blob/main/src/init.lua +-- [3]: https://xplr.dev/en/upgrade-guide + +-- ## Config ------------------------------------------------------------------ +-- +-- The xplr configuration, exposed via `xplr.config` Lua API contains the +-- following sections. +-- +-- See: +-- +-- * [xplr.config.general](https://xplr.dev/en/general-config) +-- * [xplr.config.node_types](https://xplr.dev/en/node_types) +-- * [xplr.config.layouts](https://xplr.dev/en/layouts) +-- * [xplr.config.modes](https://xplr.dev/en/modes) + +-- ### General Configuration -------------------------------------------------- +-- +-- The general configuration properties are grouped together in +-- `xplr.config.general`. + +-- Set it to `true` if you want to ignore the startup errors. You can still see +-- the errors in the logs. +-- +-- Type: boolean +xplr.config.general.disable_debug_error_mode = false + +-- Set it to `true` if you want to enable mouse scrolling. +-- +-- Type: boolean +xplr.config.general.enable_mouse = true + +-- Set it to `true` to show hidden files by default. +-- +-- Type: boolean +xplr.config.general.show_hidden = true + +-- Set it to `true` to use only a subset of selected operations that forbids +-- executing commands or performing write operations on the file-system. +-- +-- Type: boolean +xplr.config.general.read_only = false + +-- Set it to `true` if you want to enable a safety feature that will save you +-- from yourself when you type recklessly. +-- +-- Type: boolean +xplr.config.general.enable_recover_mode = false + +-- Set it to `true` if you want to hide all remaps in the help menu. +-- +-- Type: boolean +xplr.config.general.hide_remaps_in_help_menu = false + +-- Set it to `true` if you want the cursor to stay in the same position when +-- the focus is on the first path and you navigate to the previous path +-- (by pressing `up`/`k`), or when the focus is on the last path and you +-- navigate to the next path (by pressing `down`/`j`). +-- The default behavior is to rotate from the last/first path. +-- +-- Type: boolean +xplr.config.general.enforce_bounded_index_navigation = false + +-- This is the shape of the prompt for the input buffer. +-- +-- Type: nullable string +xplr.config.general.prompt.format = "❯ " + +-- This is the style of the prompt for the input buffer. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.prompt.style = {} + +-- The string to indicate an information in logs. +-- +-- Type: nullable string +xplr.config.general.logs.info.format = "INFO" + +-- The style for the information logs. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.logs.info.style = { fg = "LightBlue" } + +-- The string to indicate an success in logs. +-- +-- Type: nullable string +xplr.config.general.logs.success.format = "SUCCESS" + +-- The style for the success logs. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.logs.success.style = { fg = "Green" } + +-- The string to indicate an warnings in logs. +-- +-- Type: nullable string +xplr.config.general.logs.warning.format = "WARNING" + +-- The style for the warnings logs. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.logs.warning.style = { fg = "Yellow" } + +-- The string to indicate an error in logs. +-- +-- Type: nullable string +xplr.config.general.logs.error.format = "ERROR" + +-- The style for the error logs. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.logs.error.style = { fg = "Red" } + +-- Columns to display in the table header. +-- +-- Type: nullable list of tables with the following fields: +-- +-- * format: nullable string +-- * style: [Style](https://xplr.dev/en/style) +xplr.config.general.table.header.cols = { + { format = " index", style = {} }, + { format = "╭─── path", style = {} }, + { format = "perm", style = {} }, + { format = "size", style = {} }, + { format = "modified", style = {} }, +} + +-- Style of the table header. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.table.header.style = {} + +-- Height of the table header. +-- +-- Type: nullable integer +xplr.config.general.table.header.height = 1 + +-- Columns to display in each row in the table. +-- +-- Type: nullable list of tables with the following fields: +-- +-- * format: nullable string +-- * style: [Style](https://xplr.dev/en/style) +xplr.config.general.table.row.cols = { + { + format = "builtin.fmt_general_table_row_cols_0", + style = {}, + }, + { + format = "builtin.fmt_general_table_row_cols_1", + style = {}, + }, + { + format = "builtin.fmt_general_table_row_cols_2", + style = {}, + }, + { + format = "builtin.fmt_general_table_row_cols_3", + style = {}, + }, + { + format = "builtin.fmt_general_table_row_cols_4", + style = {}, + }, +} + +-- Default style of the table. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.table.row.style = {} + +-- Height of the table rows. +-- +-- Type: nullable integer +xplr.config.general.table.row.height = 0 + +-- Default style of the table. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.table.style = {} + +-- Tree to display in the table. +-- +-- Type: nullable list of tables with the following fields: +-- +-- * format: nullable string +-- * style: [Style](https://xplr.dev/en/style) +xplr.config.general.table.tree = { + { format = "├", style = {} }, + { format = "├", style = {} }, + { format = "╰", style = {} }, +} + +-- Spacing between the columns in the table. +-- +-- Type: nullable integer +xplr.config.general.table.col_spacing = 1 + +-- Constraint for the column widths. +-- +-- Type: nullable list of [Constraint](https://xplr.dev/en/layouts#constraint) +xplr.config.general.table.col_widths = { + { Percentage = 10 }, + { Percentage = 50 }, + { Percentage = 10 }, + { Percentage = 10 }, + { Percentage = 20 }, +} + +-- Renderer for each item in the selection list. +-- +-- Type: nullable string +xplr.config.general.selection.item.format = "builtin.fmt_general_selection_item" + +-- Style for each item in the selection list. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.selection.item.style = {} + +-- The default search algorithm +-- +-- Type: [Search Algorithm](https://xplr.dev/en/searching#algorithm) +xplr.config.general.search.algorithm = "Fuzzy" + +-- The default search ordering +-- +-- Type: boolean +xplr.config.general.search.unordered = false + +-- The content that is placed before the item name for each row by default. +-- +-- Type: nullable string +xplr.config.general.default_ui.prefix = " " + +-- The content which is appended to each item name for each row by default. +-- +-- Type: nullable string +xplr.config.general.default_ui.suffix = "" + +-- The default style of each item for each row. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.default_ui.style = {} + +-- The string placed before the item name for a focused row. +-- +-- Type: nullable string +xplr.config.general.focus_ui.prefix = "▸[" + +-- The string placed after the item name for a focused row. +-- +-- Type: nullable string +xplr.config.general.focus_ui.suffix = "]" + +-- Style for focused item. +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.focus_ui.style = { add_modifiers = { "Bold" } } + +-- The string placed before the item name for a selected row. +-- +-- Type: nullable string +xplr.config.general.selection_ui.prefix = " {" + +-- The string placed after the item name for a selected row. +-- +-- Type: nullable string +xplr.config.general.selection_ui.suffix = "}" + +-- Style for selected rows. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.selection_ui.style = { + fg = "DarkGray", + add_modifiers = { "CrossedOut" }, +} + +-- The string placed before item name for a selected row that gets the focus. +-- +-- Type: nullable string +xplr.config.general.focus_selection_ui.prefix = "▸[" + +-- The string placed after the item name for a selected row that gets the focus. +-- +-- Type: nullable string +xplr.config.general.focus_selection_ui.suffix = "]" + +-- Style for a selected row that gets the focus. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.focus_selection_ui.style = { + add_modifiers = { "Bold", "CrossedOut" }, +} + +-- The shape of the separator for the Sort & filter panel. +-- +-- Type: nullable string +xplr.config.general.sort_and_filter_ui.separator.format = " › " + +-- The style of the separator for the Sort & filter panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.sort_and_filter_ui.separator.style = { + add_modifiers = { "Dim" }, +} + +-- The content of the default identifier in Sort & filter panel. +-- +-- Type: nullable string +xplr.config.general.sort_and_filter_ui.default_identifier.format = nil + +-- Style for the default identifier in Sort & filter panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.sort_and_filter_ui.default_identifier.style = {} + +-- The shape of the forward direction indicator for sort identifiers in Sort & filter panel. +-- +-- Type: nullable string +xplr.config.general.sort_and_filter_ui.sort_direction_identifiers.forward.format = "↓" + +-- Style of forward direction indicator in Sort & filter panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.sort_and_filter_ui.sort_direction_identifiers.forward.style = nil + +-- The shape of the reverse direction indicator for sort identifiers in Sort & filter panel. +-- +-- Type: nullable string +xplr.config.general.sort_and_filter_ui.sort_direction_identifiers.reverse.format = "↑" + +-- Style of reverse direction indicator in Sort & filter panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.sort_and_filter_ui.sort_direction_identifiers.reverse.style = nil + +-- The identifiers used to denote applied sorters in the Sort & filter panel. +-- +-- Type: nullable mapping of the following key-value pairs: +-- +-- * key: [Sorter](https://xplr.dev/en/sorting#sorter) +-- * value: +-- * format: nullable string +-- * style: [Style](https://xplr.dev/en/style) +xplr.config.general.sort_and_filter_ui.sorter_identifiers = { + ByExtension = { format = "ext", style = {} }, + ByICanonicalAbsolutePath = { format = "[ci]abs", style = {} }, + ByIRelativePath = { format = "[i]rel", style = {} }, + ByISymlinkAbsolutePath = { format = "[si]abs", style = {} }, + ByIsBroken = { format = "⨯", style = {} }, + ByIsDir = { format = "dir", style = {} }, + ByIsFile = { format = "file", style = {} }, + ByIsReadonly = { format = "ro", style = {} }, + ByIsSymlink = { format = "sym", style = {} }, + ByMimeEssence = { format = "mime", style = {} }, + ByRelativePath = { format = "rel", style = {} }, + BySize = { format = "size", style = {} }, + ByCreated = { format = "created", style = {} }, + ByLastModified = { format = "modified", style = {} }, + ByCanonicalAbsolutePath = { format = "[c]abs", style = {} }, + ByCanonicalExtension = { format = "[c]ext", style = {} }, + ByCanonicalIsDir = { format = "[c]dir", style = {} }, + ByCanonicalIsFile = { format = "[c]file", style = {} }, + ByCanonicalIsReadonly = { format = "[c]ro", style = {} }, + ByCanonicalMimeEssence = { format = "[c]mime", style = {} }, + ByCanonicalSize = { format = "[c]size", style = {} }, + ByCanonicalCreated = { format = "[c]created", style = {} }, + ByCanonicalLastModified = { format = "[c]modified", style = {} }, + BySymlinkAbsolutePath = { format = "[s]abs", style = {} }, + BySymlinkExtension = { format = "[s]ext", style = {} }, + BySymlinkIsDir = { format = "[s]dir", style = {} }, + BySymlinkIsFile = { format = "[s]file", style = {} }, + BySymlinkIsReadonly = { format = "[s]ro", style = {} }, + BySymlinkMimeEssence = { format = "[s]mime", style = {} }, + BySymlinkSize = { format = "[s]size", style = {} }, + BySymlinkCreated = { format = "[s]created", style = {} }, + BySymlinkLastModified = { format = "[s]modified", style = {} }, +} + +-- The identifiers used to denote applied filters in the Sort & filter panel. +-- +-- Type: nullable mapping of the following key-value pairs: +-- +-- * key: [Filter](https://xplr.dev/en/filtering#filter) +-- * value: +-- * format: nullable string +-- * style: [Style](https://xplr.dev/en/style) +xplr.config.general.sort_and_filter_ui.filter_identifiers = { + RelativePathDoesContain = { format = "rel=~", style = {} }, + RelativePathDoesEndWith = { format = "rel=$", style = {} }, + RelativePathDoesNotContain = { format = "rel!~", style = {} }, + RelativePathDoesNotEndWith = { format = "rel!$", style = {} }, + RelativePathDoesNotStartWith = { format = "rel!^", style = {} }, + RelativePathDoesStartWith = { format = "rel=^", style = {} }, + RelativePathIs = { format = "rel==", style = {} }, + RelativePathIsNot = { format = "rel!=", style = {} }, + RelativePathDoesMatchRegex = { format = "rel=/", style = {} }, + RelativePathDoesNotMatchRegex = { format = "rel!/", style = {} }, + IRelativePathDoesContain = { format = "[i]rel=~", style = {} }, + IRelativePathDoesEndWith = { format = "[i]rel=$", style = {} }, + IRelativePathDoesNotContain = { format = "[i]rel!~", style = {} }, + IRelativePathDoesNotEndWith = { format = "[i]rel!$", style = {} }, + IRelativePathDoesNotStartWith = { format = "[i]rel!^", style = {} }, + IRelativePathDoesStartWith = { format = "[i]rel=^", style = {} }, + IRelativePathIs = { format = "[i]rel==", style = {} }, + IRelativePathIsNot = { format = "[i]rel!=", style = {} }, + IRelativePathDoesMatchRegex = { format = "[i]rel=/", style = {} }, + IRelativePathDoesNotMatchRegex = { format = "[i]rel!/", style = {} }, + AbsolutePathDoesContain = { format = "abs=~", style = {} }, + AbsolutePathDoesEndWith = { format = "abs=$", style = {} }, + AbsolutePathDoesNotContain = { format = "abs!~", style = {} }, + AbsolutePathDoesNotEndWith = { format = "abs!$", style = {} }, + AbsolutePathDoesNotStartWith = { format = "abs!^", style = {} }, + AbsolutePathDoesStartWith = { format = "abs=^", style = {} }, + AbsolutePathIs = { format = "abs==", style = {} }, + AbsolutePathIsNot = { format = "abs!=", style = {} }, + AbsolutePathDoesMatchRegex = { format = "abs=/", style = {} }, + AbsolutePathDoesNotMatchRegex = { format = "abs!/", style = {} }, + IAbsolutePathDoesContain = { format = "[i]abs=~", style = {} }, + IAbsolutePathDoesEndWith = { format = "[i]abs=$", style = {} }, + IAbsolutePathDoesNotContain = { format = "[i]abs!~", style = {} }, + IAbsolutePathDoesNotEndWith = { format = "[i]abs!$", style = {} }, + IAbsolutePathDoesNotStartWith = { format = "[i]abs!^", style = {} }, + IAbsolutePathDoesStartWith = { format = "[i]abs=^", style = {} }, + IAbsolutePathIs = { format = "[i]abs==", style = {} }, + IAbsolutePathIsNot = { format = "[i]abs!=", style = {} }, + IAbsolutePathDoesMatchRegex = { format = "[i]abs=/", style = {} }, + IAbsolutePathDoesNotMatchRegex = { format = "[i]abs!/", style = {} }, +} + +-- The identifiers used to denote applied search input. +-- +-- Type: { format = nullable string, style = [Style](https://xplr.dev/en/style) } +xplr.config.general.sort_and_filter_ui.search_identifiers = { + Fuzzy = { format = "fzy:", style = {} }, + Regex = { format = "reg:", style = {} }, +} + +-- The shape of ordered indicator for search ordering identifiers in Sort & filter panel. +-- +-- Type: nullable string +xplr.config.general.sort_and_filter_ui.search_direction_identifiers.ordered.format = +"↓" + +-- The shape of unordered indicator for search ordering identifiers in Sort & filter panel. +-- +-- Type: nullable string +xplr.config.general.sort_and_filter_ui.search_direction_identifiers.unordered.format = "" + +-- The content for panel title by default. +-- +-- Type: nullable string +xplr.config.general.panel_ui.default.title.format = nil + +-- The style for panel title by default. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.default.title.style = { + fg = "Reset", + add_modifiers = { "Bold" }, +} + +-- Style of the panels by default. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.default.style = {} + +-- Defines where to show borders for the panels by default. +-- +-- Type: nullable list of [Border](https://xplr.dev/en/borders#border) +xplr.config.general.panel_ui.default.borders = { + "Top", + "Right", + "Bottom", + "Left", +} + +-- Type of the borders by default. +-- +-- Type: nullable [Border Type](https://xplr.dev/en/borders#border-type) +xplr.config.general.panel_ui.default.border_type = "Rounded" + +-- Style of the panel borders by default. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.default.border_style = { fg = "DarkGray" } + +-- The content for the table panel title. +-- +-- Type: nullable string +xplr.config.general.panel_ui.table.title.format = nil + +-- Style of the table panel title. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.table.title.style = {} + +-- Style of the table panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.table.style = {} + +-- Defines where to show borders for the table panel. +-- +-- Type: nullable list of [Border](https://xplr.dev/en/borders#border) +xplr.config.general.panel_ui.table.borders = nil + +-- Type of the borders for table panel. +-- +-- Type: nullable [Border Type](https://xplr.dev/en/borders#border-type) +xplr.config.general.panel_ui.table.border_type = nil + +-- Style of the table panel borders. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.table.border_style = {} + +-- The content for the help menu panel title. +-- +-- Type: nullable string +xplr.config.general.panel_ui.help_menu.title.format = nil + +-- Style of the help menu panel title. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.help_menu.title.style = {} + +-- Style of the help menu panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.help_menu.style = {} + +-- Defines where to show borders for the help menu panel. +-- +-- Type: nullable list of [Border](https://xplr.dev/en/borders#border) +xplr.config.general.panel_ui.help_menu.borders = nil + +-- Type of the borders for help menu panel. +-- +-- Type: nullable [Border Type](https://xplr.dev/en/borders#border-type) +xplr.config.general.panel_ui.help_menu.border_type = nil + +-- Style of the help menu panel borders. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.help_menu.border_style = {} + +-- The content for the input & logs panel title. +-- +-- Type: nullable string +xplr.config.general.panel_ui.input_and_logs.title.format = nil + +-- Style of the input & logs panel title. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.input_and_logs.title.style = {} + +-- Style of the input & logs panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.input_and_logs.style = {} +-- Defines where to show borders for the input & logs panel. +-- +-- Type: nullable list of [Border](https://xplr.dev/en/borders#border) +xplr.config.general.panel_ui.input_and_logs.borders = nil + +-- Type of the borders for input & logs panel. +-- +-- Type: nullable [Border Type](https://xplr.dev/en/borders#border-type) +xplr.config.general.panel_ui.input_and_logs.border_type = nil + +-- Style of the input & logs panel borders. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.input_and_logs.border_style = {} + +-- The content for the selection panel title. +-- +-- Type: nullable string +xplr.config.general.panel_ui.selection.title.format = nil + +-- Style of the selection panel title. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.selection.title.style = {} + +-- Style of the selection panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.selection.style = {} +-- Defines where to show borders for the selection panel. +-- +-- Type: nullable list of [Border](https://xplr.dev/en/borders#border) +xplr.config.general.panel_ui.selection.borders = nil + +-- Type of the borders for selection panel. +-- +-- Type: nullable [Border Type](https://xplr.dev/en/borders#border-type) +xplr.config.general.panel_ui.selection.border_type = nil + +-- Style of the selection panel borders. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.selection.border_style = {} + +-- The content for the sort & filter panel title. +-- +-- Type: nullable string +xplr.config.general.panel_ui.sort_and_filter.title.format = nil + +-- Style of the sort & filter panel title. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.sort_and_filter.title.style = {} + +-- Style of the sort & filter panel. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.sort_and_filter.style = {} + +-- Defines where to show borders for the sort & filter panel. +-- +-- Type: nullable list of [Border](https://xplr.dev/en/borders#border) +xplr.config.general.panel_ui.sort_and_filter.borders = nil + +-- Type of the borders for sort & filter panel. +-- +-- Type: nullable [Border Type](https://xplr.dev/en/borders#border-type) +xplr.config.general.panel_ui.sort_and_filter.border_type = nil + +-- Style of the sort & filter panel borders. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.general.panel_ui.sort_and_filter.border_style = {} + +-- Initial group if sorters applied to the nodes list in the table. +-- +-- Type: nullable list of [Node Sorter](https://xplr.dev/en/sorting#node-sorter-applicable) +xplr.config.general.initial_sorting = { + { sorter = "ByCanonicalIsDir", reverse = true }, + { sorter = "ByIRelativePath", reverse = false }, +} + +-- The name of one of the modes to use when xplr loads. +-- +-- Type: nullable string +xplr.config.general.initial_mode = "default" + +-- The name of one of the layouts to use when xplr loads. +-- +-- Type: nullable string +xplr.config.general.initial_layout = "default" + +-- Set it to a file path to start fifo when xplr loads. +-- Generally it is used to integrate with external tools like previewers. +-- +-- Type: nullable string +xplr.config.general.start_fifo = nil + +-- Use it to define a set of key bindings that are available by default in +-- every [mode](https://xplr.dev/en/mode). They can be overwritten. +-- +-- Type: [Key Bindings](https://xplr.dev/en/configure-key-bindings#key-bindings) +xplr.config.general.global_key_bindings = { + on_key = { + ["esc"] = { + messages = { + "PopMode", + }, + }, + ["ctrl-c"] = { + messages = { + "Terminate", + }, + }, + }, +} + +-- ### Node Types ------------------------------------------------------------- +-- +-- This section defines how to deal with different kinds of nodes (files, +-- directories, symlinks etc.) based on their properties. +-- +-- One node can fall into multiple categories. For example, a node can have the +-- *extension* `md`, and also be a *file*. In that case, the properties from +-- the more specific category i.e. *extension* will be used. +-- +-- This can be configured using the `xplr.config.node_types` Lua API. + +-- The style for the directory nodes +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.node_types.directory.style = {} + +-- Metadata for the directory nodes. +-- You can set as many metadata as you want. +-- +-- Type: nullable string +-- +-- Example: +-- +-- ```lua +-- xplr.config.node_types.directory.meta.foo = "foo" +-- xplr.config.node_types.directory.meta.bar = "bar" +-- ``` +xplr.config.node_types.directory.meta.icon = "ð" + +-- The style for the file nodes. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.node_types.file.style = {} + +-- Metadata for the file nodes. +-- You can set as many metadata as you want. +-- +-- Type: nullable string +-- +-- Example: +-- +-- ```lua +-- xplr.config.node_types.file.meta.foo = "foo" +-- xplr.config.node_types.file.meta.bar = "bar" +-- ``` +xplr.config.node_types.file.meta.icon = "ƒ" + +-- The style for the symlink nodes. +-- +-- Type: [Style](https://xplr.dev/en/style) +xplr.config.node_types.symlink.style = {} + +-- Metadata for the symlink nodes. +-- You can set as many metadata as you want. +-- +-- Type: nullable string +-- +-- Example: +-- +-- ```lua +-- xplr.config.node_types.symlink.meta.foo = "foo" +-- xplr.config.node_types.symlink.meta.bar = "bar" +-- ``` +xplr.config.node_types.symlink.meta.icon = "§" + +-- Metadata and style based on mime types. +-- It is possible to use the wildcard `*` to match all mime sub types. It will +-- be overwritten by the more specific sub types that are defined. +-- +-- Type: mapping of the following key-value pairs: +-- +-- * key: string +-- * value: +-- * key: string +-- * value: [Node Type](https://xplr.dev/en/node-type) +-- +-- Example: +-- +-- ```lua +-- xplr.config.node_types.mime_essence = { +-- application = { +-- -- application/* +-- ["*"] = { meta = { icon = "a" } }, +-- +-- -- application/pdf +-- pdf = { meta = { icon = "" }, style = { fg = "Blue" } }, +-- +-- -- application/zip +-- zip = { meta = { icon = ""} }, +-- }, +-- } +-- ``` +xplr.config.node_types.mime_essence = {} + +-- Metadata and style based on extension. +-- +-- Type: mapping of the following key-value pairs: +-- +-- * key: string +-- * value: [Node Type](https://xplr.dev/en/node-type) +-- +-- Example: +-- +-- ```lua +-- xplr.config.node_types.extension.md = { meta = { icon = "" }, style = { fg = "Blue" } } +-- xplr.config.node_types.extension.rs = { meta = { icon = "🦀" } } +-- ``` +xplr.config.node_types.extension = {} + +-- Metadata and style based on special file names. +-- +-- Type: mapping of the following key-value pairs: +-- +-- * key: string +-- * value: [Node Type](https://xplr.dev/en/node-type) +-- +-- Example: +-- +-- ```lua +-- xplr.config.node_types.special["Cargo.toml"] = { meta = { icon = "" } } +-- xplr.config.node_types.special["Downloads"] = { meta = { icon = "" }, style = { fg = "Blue" } } +-- ``` +xplr.config.node_types.special = {} + +-- ### Layouts ---------------------------------------------------------------- +-- +-- xplr layouts define the structure of the UI, i.e. how many panel we see, +-- placement and size of the panels, how they look etc. +-- +-- This is configuration exposed via the `xplr.config.layouts` API. +-- +-- `xplr.config.layouts.builtin` contain some built-in panels which can be +-- overridden, but you can't add or remove panels in it. +-- +-- You can add new panels in `xplr.config.layouts.custom`. +-- +-- ##### Example: Defining Custom Layout +-- +-- ![demo](https://s6.gifyu.com/images/layout.png) +-- +-- ```lua +-- xplr.config.layouts.builtin.default = { +-- Horizontal = { +-- config = { +-- margin = 1, +-- horizontal_margin = 2, +-- vertical_margin = 3, +-- constraints = { +-- { Percentage = 50 }, +-- { Percentage = 50 }, +-- } +-- }, +-- splits = { +-- "Table", +-- "HelpMenu", +-- } +-- } +-- } +-- ``` + +-- The default layout +-- +-- Type: [Layout](https://xplr.dev/en/layout) +xplr.config.layouts.builtin.default = { + Horizontal = { + config = { + constraints = { + { Percentage = 70 }, + { Percentage = 30 }, + }, + }, + splits = { + { + Vertical = { + config = { + constraints = { + { Length = 3 }, + { Min = 1 }, + { Length = 3 }, + }, + }, + splits = { + "SortAndFilter", + "Table", + "InputAndLogs", + }, + }, + }, + { + Vertical = { + config = { + constraints = { + { Percentage = 30 }, + { Percentage = 70 }, + }, + }, + splits = { + "Selection", + "HelpMenu", + }, + }, + }, + }, + }, +} + +-- The layout without help menu +-- +-- Type: [Layout](https://xplr.dev/en/layout) +xplr.config.layouts.builtin.no_help = { + Horizontal = { + config = { + constraints = { + { Percentage = 70 }, + { Percentage = 30 }, + }, + }, + splits = { + { + Vertical = { + config = { + constraints = { + { Length = 3 }, + { Min = 1 }, + { Length = 3 }, + }, + }, + splits = { + "SortAndFilter", + "Table", + "InputAndLogs", + }, + }, + }, + "Selection", + }, + }, +} + +-- The layout without selection panel +-- +-- Type: [Layout](https://xplr.dev/en/layout) +xplr.config.layouts.builtin.no_selection = { + Horizontal = { + config = { + constraints = { + { Percentage = 70 }, + { Percentage = 30 }, + }, + }, + splits = { + { + Vertical = { + config = { + constraints = { + { Length = 3 }, + { Min = 1 }, + { Length = 3 }, + }, + }, + splits = { + "SortAndFilter", + "Table", + "InputAndLogs", + }, + }, + }, + "HelpMenu", + }, + }, +} + +-- The layout without help menu and selection panel +-- +-- Type: [Layout](https://xplr.dev/en/layout) +xplr.config.layouts.builtin.no_help_no_selection = { + Vertical = { + config = { + constraints = { + { Length = 3 }, + { Min = 1 }, + { Length = 3 }, + }, + }, + splits = { + "SortAndFilter", + "Table", + "InputAndLogs", + }, + }, +} + +-- This is where you can define custom layouts +-- +-- Type: mapping of the following key-value pairs: +-- +-- * key: string +-- * value: [Layout](https://xplr.dev/en/layout) +-- +-- Example: +-- +-- ```lua +-- xplr.config.layouts.custom.example = "Nothing" -- Show a blank screen +-- xplr.config.general.initial_layout = "example" -- Load the example layout +-- ``` +xplr.config.layouts.custom = {} + +-- ### Modes ------------------------------------------------------------------ +-- +-- xplr is a modal file explorer. That means the users switch between different +-- modes, each containing a different set of key bindings to avoid clashes. +-- Users can switch between these modes at run-time. +-- +-- The modes can be configured using the `xplr.config.modes` Lua API. +-- +-- `xplr.config.modes.builtin` contain some built-in modes which can be +-- overridden, but you can't add or remove modes in it. + +-- The builtin default mode. +-- Visit the [Default Key Bindings](https://xplr.dev/en/default-key-bindings) +-- to see what each mode does. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.default = { + name = "default", + key_bindings = { + on_key = { + ["#"] = { + messages = { + "PrintAppStateAndQuit", + }, + }, + ["."] = { + help = "show hidden", + messages = { + { + ToggleNodeFilter = { filter = "RelativePathDoesNotStartWith", input = "." }, + }, + "ExplorePwdAsync", + }, + }, + [":"] = { + help = "action", + messages = { + "PopMode", + { SwitchModeBuiltin = "action" }, + }, + }, + ["?"] = { + help = "global help menu", + messages = { + { + BashExec = [===[ + [ -z "$PAGER" ] && PAGER="less -+F" + cat -- "${XPLR_PIPE_GLOBAL_HELP_MENU_OUT}" | ${PAGER:?} + ]===], + }, + }, + }, + ["G"] = { + help = "go to bottom", + messages = { + "PopMode", + "FocusLast", + }, + }, + ["ctrl-a"] = { + help = "select/unselect all", + messages = { + "ToggleSelectAll", + }, + }, + ["ctrl-f"] = { + help = "search", + messages = { + "PopMode", + { SwitchModeBuiltin = "search" }, + { SetInputBuffer = "" }, + }, + }, + ["ctrl-i"] = { + help = "next visited path", + messages = { + "NextVisitedPath", + }, + }, + ["ctrl-o"] = { + help = "last visited path", + messages = { + "LastVisitedPath", + }, + }, + ["ctrl-r"] = { + help = "refresh screen", + messages = { + "ClearScreen", + }, + }, + ["ctrl-u"] = { + help = "clear selection", + messages = { + "ClearSelection", + }, + }, + ["ctrl-w"] = { + help = "switch layout", + messages = { + { SwitchModeBuiltin = "switch_layout" }, + }, + }, + ["d"] = { + help = "delete", + messages = { + "PopMode", + { SwitchModeBuiltin = "delete" }, + }, + }, + ["down"] = { + help = "down", + messages = { + "FocusNext", + }, + }, + ["enter"] = { + help = "quit with result", + messages = { + "PrintResultAndQuit", + }, + }, + ["f"] = { + help = "filter", + messages = { + "PopMode", + { SwitchModeBuiltin = "filter" }, + }, + }, + ["g"] = { + help = "go to", + messages = { + "PopMode", + { SwitchModeBuiltin = "go_to" }, + }, + }, + ["left"] = { + help = "back", + messages = { + "Back", + }, + }, + ["q"] = { + help = "quit", + messages = { + "Quit", + }, + }, + ["r"] = { + help = "rename", + messages = { + "PopMode", + { SwitchModeBuiltin = "rename" }, + { + BashExecSilently0 = [===[ + NAME=$(basename "${XPLR_FOCUS_PATH:?}") + "$XPLR" -m 'SetInputBuffer: %q' "${NAME:?}" + ]===], + }, + }, + }, + ["ctrl-d"] = { + help = "duplicate as", + messages = { + "PopMode", + { SwitchModeBuiltin = "duplicate_as" }, + { + BashExecSilently0 = [===[ + NAME=$(basename "${XPLR_FOCUS_PATH:?}") + "$XPLR" -m 'SetInputBuffer: %q' "${NAME:?}" + ]===], + }, + }, + }, + ["right"] = { + help = "enter", + messages = { + "Enter", + }, + }, + ["s"] = { + help = "sort", + messages = { + "PopMode", + { SwitchModeBuiltin = "sort" }, + }, + }, + ["space"] = { + help = "toggle selection", + messages = { + "ToggleSelection", + "FocusNext", + }, + }, + ["up"] = { + help = "up", + messages = { + "FocusPrevious", + }, + }, + ["~"] = { + help = "go home", + messages = { + { + BashExecSilently0 = [===[ + "$XPLR" -m 'ChangeDirectory: %q' "${HOME:?}" + ]===], + }, + }, + }, + ["page-up"] = { + help = "scroll up", + messages = { + "ScrollUp", + }, + }, + ["page-down"] = { + help = "scroll down", + messages = { + "ScrollDown", + }, + }, + ["{"] = { + help = "scroll up half", + messages = { + "ScrollUpHalf", + }, + }, + ["}"] = { + help = "scroll down half", + messages = { + "ScrollDownHalf", + }, + }, + ["ctrl-n"] = { + help = "next selection", + messages = { + "FocusNextSelection", + }, + }, + ["ctrl-p"] = { + help = "prev selection", + messages = { + "FocusPreviousSelection", + }, + }, + }, + on_number = { + help = "input", + messages = { + "PopMode", + { SwitchModeBuiltin = "number" }, + "BufferInputFromKey", + }, + }, + }, +} + +xplr.config.modes.builtin.default.key_bindings.on_key["v"] = + xplr.config.modes.builtin.default.key_bindings.on_key["space"] +xplr.config.modes.builtin.default.key_bindings.on_key["V"] = + xplr.config.modes.builtin.default.key_bindings.on_key["ctrl-a"] +xplr.config.modes.builtin.default.key_bindings.on_key["/"] = + xplr.config.modes.builtin.default.key_bindings.on_key["ctrl-f"] +xplr.config.modes.builtin.default.key_bindings.on_key["h"] = + xplr.config.modes.builtin.default.key_bindings.on_key["left"] +xplr.config.modes.builtin.default.key_bindings.on_key["j"] = + xplr.config.modes.builtin.default.key_bindings.on_key["down"] +xplr.config.modes.builtin.default.key_bindings.on_key["k"] = + xplr.config.modes.builtin.default.key_bindings.on_key["up"] +xplr.config.modes.builtin.default.key_bindings.on_key["l"] = + xplr.config.modes.builtin.default.key_bindings.on_key["right"] +xplr.config.modes.builtin.default.key_bindings.on_key["tab"] = + xplr.config.modes.builtin.default.key_bindings.on_key["ctrl-i"] -- compatibility workaround + +-- The builtin debug error mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.debug_error = { + name = "debug error", + layout = { + Vertical = { + config = { + constraints = { + { Min = 14 }, + { MinLessThanScreenHeight = 14 }, + }, + }, + splits = { + { + Static = { + CustomParagraph = { + ui = { title = { format = "debug error" } }, + body = [[ + + Some errors occurred during startup. + If you think this is a bug, please report it at: + + https://github.com/sayanarijit/xplr/issues/new + + Press `enter` to open the logs in your $EDITOR. + Press `escape` to ignore the errors and continue with the default config. + + To disable this mode, set `xplr.config.general.disable_debug_error_mode` + to `true` in your config file. + ]], + }, + }, + }, + "InputAndLogs", + }, + }, + }, + key_bindings = { + on_key = { + ["enter"] = { + help = "open logs in editor", + messages = { + { + BashExec = [===[ + cat "${XPLR_PIPE_LOGS_OUT:?}" | ${EDITOR:-vi} - + ]===], + }, + }, + }, + ["q"] = { + help = "quit", + messages = { + "Quit", + }, + }, + }, + default = { + messages = {}, + }, + }, +} + +-- The builtin recover mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.recover = { + name = "recover", + layout = { + Static = { + CustomParagraph = { + ui = { title = { format = "recover" } }, + body = [[ + + You pressed an invalid key and went into "recover" mode. + This mode saves you from performing unwanted actions. + + Let's calm down, press `escape`, and try again. + + To disable this mode, set `xplr.config.general.enable_recover_mode` + to `false` in your config file. + ]], + }, + }, + }, + key_bindings = { + default = { + messages = {}, + }, + }, +} + +-- The builtin go to path mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.go_to_path = { + name = "go to path", + key_bindings = { + on_key = { + ["enter"] = { + help = "submit", + messages = { + { + BashExecSilently0 = [===[ + PTH="$XPLR_INPUT_BUFFER" + PTH_ESC=$(printf %q "$PTH") + if [ -d "$PTH" ]; then + "$XPLR" -m 'ChangeDirectory: %q' "$PTH" + elif [ -e "$PTH" ]; then + "$XPLR" -m 'FocusPath: %q' "$PTH" + else + "$XPLR" -m 'LogError: %q' "could not find $PTH_ESC" + fi + ]===], + }, + "PopMode", + }, + }, + ["tab"] = { + help = "try complete", + messages = { + { CallLuaSilently = "builtin.try_complete_path" }, + }, + }, + }, + default = { + messages = { + "UpdateInputBufferFromKey", + }, + }, + }, +} + +-- The builtin selection ops mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.selection_ops = { + name = "selection ops", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["e"] = { + help = "edit selection", + messages = { + { + BashExec0 = [===[ + TMPFILE="$(mktemp)" + while IFS= read -r -d '' PTH; do + echo $(printf %q "${PTH:?}") >> "${TMPFILE:?}" + done < "${XPLR_PIPE_SELECTION_OUT:?}" + ${EDITOR:-vi} "${TMPFILE:?}" + [ ! -e "$TMPFILE" ] && exit + "$XPLR" -m ClearSelection + while IFS= read -r PTH_ESC; do + "$XPLR" -m 'SelectPath: %q' "$(eval printf %s ${PTH_ESC:?})" + done < "${TMPFILE:?}" + rm -- "${TMPFILE:?}" + ]===], + }, + "PopMode", + }, + }, + ["l"] = { + help = "list selection", + messages = { + { + BashExec0 = [===[ + [ -z "$PAGER" ] && PAGER="less -+F" + + while IFS= read -r -d '' PTH; do + echo $(printf %q "$PTH") + done < "${XPLR_PIPE_SELECTION_OUT:?}" | ${PAGER:?} + ]===], + }, + "PopMode", + }, + }, + ["c"] = { + help = "copy here", + messages = { + { + BashExec0 = [===[ + "$XPLR" -m ExplorePwd + while IFS= read -r -d '' PTH; do + PTH_ESC=$(printf %q "$PTH") + BASENAME=$(basename -- "$PTH") + BASENAME_ESC=$(printf %q "$BASENAME") + if [ -e "$BASENAME" ]; then + echo + echo "$BASENAME_ESC exists, do you want to overwrite it?" + read -p "[y]es, [n]o, [S]kip: " ANS < /dev/tty + case "$ANS" in + [yY]*) + ;; + [nN]*) + read -p "Enter new name: " BASENAME < /dev/tty + BASENAME_ESC=$(printf %q "$BASENAME") + ;; + *) + continue + ;; + esac + fi + if cp -vr -- "${PTH:?}" "./${BASENAME:?}"; then + "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC copied to ./$BASENAME_ESC" + "$XPLR" -m 'FocusPath: %q' "$BASENAME" + else + "$XPLR" -m 'LogError: %q' "could not copy $PTH_ESC to ./$BASENAME_ESC" + fi + done < "${XPLR_PIPE_SELECTION_OUT:?}" + echo + read -p "[press enter to continue]" + ]===], + }, + "PopMode", + }, + }, + ["m"] = { + help = "move here", + messages = { + { + BashExec0 = [===[ + "$XPLR" -m ExplorePwd + while IFS= read -r -d '' PTH; do + PTH_ESC=$(printf %q "$PTH") + BASENAME=$(basename -- "$PTH") + BASENAME_ESC=$(printf %q "$BASENAME") + if [ -e "$BASENAME" ]; then + echo + echo "$BASENAME_ESC exists, do you want to overwrite it?" + read -p "[y]es, [n]o, [S]kip: " ANS < /dev/tty + case "$ANS" in + [yY]*) + ;; + [nN]*) + read -p "Enter new name: " BASENAME < /dev/tty + BASENAME_ESC=$(printf %q "$BASENAME") + ;; + *) + continue + ;; + esac + fi + if mv -v -- "${PTH:?}" "./${BASENAME:?}"; then + "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC moved to ./$BASENAME_ESC" + "$XPLR" -m 'FocusPath: %q' "$BASENAME" + else + "$XPLR" -m 'LogError: %q' "could not move $PTH_ESC to ./$BASENAME_ESC" + fi + done < "${XPLR_PIPE_SELECTION_OUT:?}" + echo + read -p "[press enter to continue]" + ]===], + }, + "PopMode", + }, + }, + ["s"] = { + help = "softlink here", + messages = { + { + BashExec0 = [===[ + "$XPLR" -m ExplorePwd + while IFS= read -r -d '' PTH; do + PTH_ESC=$(printf %q "$PTH") + BASENAME=$(basename -- "$PTH") + BASENAME_ESC=$(printf %q "$BASENAME") + if [ -e "$BASENAME" ]; then + echo + echo "$BASENAME_ESC exists, do you want to overwrite it?" + read -p "[y]es, [n]o, [S]kip: " ANS < /dev/tty + case "$ANS" in + [yY]*) + ;; + [nN]*) + read -p "Enter new name: " BASENAME < /dev/tty + BASENAME_ESC=$(printf %q "$BASENAME") + ;; + *) + continue + ;; + esac + fi + if ln -sv -- "${PTH:?}" "./${BASENAME:?}"; then + "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC softlinked as ./$BASENAME_ESC" + "$XPLR" -m 'FocusPath: %q' "$BASENAME" + else + "$XPLR" -m 'LogError: %q' "could not softlink $PTH_ESC as ./$BASENAME_ESC" + fi + done < "${XPLR_PIPE_SELECTION_OUT:?}" + echo + read -p "[press enter to continue]" + ]===], + }, + "PopMode", + }, + }, + ["h"] = { + help = "hardlink here", + messages = { + { + BashExec0 = [===[ + "$XPLR" -m ExplorePwd + while IFS= read -r -d '' PTH; do + PTH_ESC=$(printf %q "$PTH") + BASENAME=$(basename -- "$PTH") + BASENAME_ESC=$(printf %q "$BASENAME") + if [ -e "$BASENAME" ]; then + echo + echo "$BASENAME_ESC exists, do you want to overwrite it?" + read -p "[y]es, [n]o, [S]kip: " ANS < /dev/tty + case "$ANS" in + [yY]*) + ;; + [nN]*) + read -p "Enter new name: " BASENAME < /dev/tty + BASENAME_ESC=$(printf %q "$BASENAME") + ;; + *) + continue + ;; + esac + fi + if ln -v -- "${PTH:?}" "./${BASENAME:?}"; then + "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC hardlinked as ./$BASENAME_ESC" + "$XPLR" -m 'FocusPath: %q' "$BASENAME" + else + "$XPLR" -m 'LogError: %q' "could not hardlink $PTH_ESC as ./$BASENAME_ESC" + fi + done < "${XPLR_PIPE_SELECTION_OUT:?}" + echo + read -p "[press enter to continue]" + ]===], + }, + "PopMode", + }, + }, + ["u"] = { + help = "clear selection", + messages = { + "ClearSelection", + "PopMode", + }, + }, + }, + }, +} + +-- The builtin create mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.create = { + name = "create", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["d"] = { + help = "create directory", + messages = { + "PopMode", + { SwitchModeBuiltin = "create_directory" }, + { SetInputBuffer = "" }, + }, + }, + ["f"] = { + help = "create file", + messages = { + "PopMode", + { SwitchModeBuiltin = "create_file" }, + { SetInputBuffer = "" }, + }, + }, + }, + }, +} + +-- The builtin create directory mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.create_directory = { + name = "create directory", + prompt = "ð ❯ ", + key_bindings = { + on_key = { + ["tab"] = { + help = "try complete", + messages = { + { CallLuaSilently = "builtin.try_complete_path" }, + }, + }, + ["enter"] = { + help = "submit", + messages = { + { + BashExecSilently0 = [===[ + PTH="$XPLR_INPUT_BUFFER" + PTH_ESC=$(printf %q "$PTH") + if [ "$PTH" ]; then + mkdir -p -- "$PTH" \ + && "$XPLR" -m 'SetInputBuffer: ""' \ + && "$XPLR" -m ExplorePwd \ + && "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC created" \ + && "$XPLR" -m 'FocusPath: %q' "$PTH" + else + "$XPLR" -m PopMode + fi + ]===], + }, + }, + }, + }, + default = { + messages = { + "UpdateInputBufferFromKey", + }, + }, + }, +} + +-- The builtin create file mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.create_file = { + name = "create file", + prompt = "ƒ ❯ ", + key_bindings = { + on_key = { + ["tab"] = { + help = "try complete", + messages = { + { CallLuaSilently = "builtin.try_complete_path" }, + }, + }, + ["enter"] = { + help = "submit", + messages = { + { + BashExecSilently0 = [===[ + PTH="$XPLR_INPUT_BUFFER" + PTH_ESC=$(printf %q "$PTH") + if [ "$PTH" ]; then + mkdir -p -- "$(dirname $(realpath -m $PTH))" # This may fail. + touch -- "$PTH" \ + && "$XPLR" -m 'SetInputBuffer: ""' \ + && "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC created" \ + && "$XPLR" -m 'ExplorePwd' \ + && "$XPLR" -m 'FocusPath: %q' "$PTH" + else + "$XPLR" -m PopMode + fi + ]===], + }, + }, + }, + }, + default = { + messages = { + "UpdateInputBufferFromKey", + }, + }, + }, +} + +-- The builtin number mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.number = { + name = "number", + prompt = ":", + key_bindings = { + on_key = { + ["down"] = { + help = "to down", + messages = { + "FocusNextByRelativeIndexFromInput", + "PopMode", + }, + }, + ["enter"] = { + help = "to index", + messages = { + "FocusByIndexFromInput", + "PopMode", + }, + }, + ["up"] = { + help = "to up", + messages = { + "FocusPreviousByRelativeIndexFromInput", + "PopMode", + }, + }, + }, + on_navigation = { + messages = { + "UpdateInputBufferFromKey", + }, + }, + on_number = { + help = "input", + messages = { + "UpdateInputBufferFromKey", + }, + }, + }, +} + +xplr.config.modes.builtin.number.key_bindings.on_key["j"] = + xplr.config.modes.builtin.number.key_bindings.on_key["down"] +xplr.config.modes.builtin.number.key_bindings.on_key["k"] = + xplr.config.modes.builtin.number.key_bindings.on_key["up"] + +-- The builtin go to mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.go_to = { + name = "go to", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["f"] = { + help = "follow symlink", + messages = { + "FollowSymlink", + "PopMode", + }, + }, + ["g"] = { + help = "top", + messages = { + "FocusFirst", + "PopMode", + }, + }, + ["p"] = { + help = "path", + messages = { + "PopMode", + { SwitchModeBuiltin = "go_to_path" }, + { SetInputBuffer = "" }, + }, + }, + ["i"] = { + help = "initial $PWD", + messages = { + "PopMode", + { + BashExecSilently0 = [===[ + "$XPLR" -m 'ChangeDirectory: %q' "${XPLR_INITIAL_PWD:?}" + ]===], + }, + }, + }, + ["x"] = { + help = "open in gui", + messages = { + { + BashExecSilently0 = [===[ + if [ -z "$OPENER" ]; then + if command -v xdg-open; then + OPENER=xdg-open + elif command -v open; then + OPENER=open + else + "$XPLR" -m 'LogError: %q' "$OPENER not found" + exit 1 + fi + fi + while IFS= read -r -d '' PTH; do + $OPENER "${PTH:?}" > /dev/null 2>&1 + done < "${XPLR_PIPE_RESULT_OUT:?}" + ]===], + }, + "ClearScreen", + "PopMode", + }, + }, + }, + }, +} + +-- The builtin rename mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.rename = { + name = "rename", + key_bindings = { + on_key = { + ["tab"] = { + help = "try complete", + messages = { + { CallLuaSilently = "builtin.try_complete_path" }, + }, + }, + ["enter"] = { + help = "submit", + messages = { + { + BashExecSilently0 = [===[ + SRC="${XPLR_FOCUS_PATH:?}" + SRC_ESC=$(printf %q "$SRC") + TARGET="${XPLR_INPUT_BUFFER:?}" + TARGET_ESC=$(printf %q "$TARGET") + if [ -e "${TARGET:?}" ]; then + "$XPLR" -m 'LogError: %q' "$TARGET_ESC already exists" + else + mv -- "${SRC:?}" "${TARGET:?}" \ + && "$XPLR" -m ExplorePwd \ + && "$XPLR" -m 'FocusPath: %q' "$TARGET" \ + && "$XPLR" -m 'LogSuccess: %q' "$SRC_ESC renamed to $TARGET_ESC" + fi + ]===], + }, + "PopMode", + }, + }, + }, + default = { + messages = { + "UpdateInputBufferFromKey", + }, + }, + }, +} + +-- The builtin duplicate as mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.duplicate_as = { + name = "duplicate as", + key_bindings = { + on_key = { + ["tab"] = { + help = "try complete", + messages = { + { CallLuaSilently = "builtin.try_complete_path" }, + }, + }, + ["enter"] = { + help = "submit", + messages = { + { + BashExecSilently0 = [===[ + SRC="${XPLR_FOCUS_PATH:?}" + SRC_ESC=$(printf %q "$SRC") + TARGET="${XPLR_INPUT_BUFFER:?}" + TARGET_ESC=$(printf %q "$TARGET") + if [ -e "${TARGET:?}" ]; then + "$XPLR" -m 'LogError: %q' "$TARGET_ESC already exists" + else + cp -r -- "${SRC:?}" "${TARGET:?}" \ + && "$XPLR" -m ExplorePwd \ + && "$XPLR" -m 'FocusPath: %q' "$TARGET_ESC" \ + && "$XPLR" -m 'LogSuccess: %q' "$SRC_ESC duplicated as $TARGET_ESC" + fi + ]===], + }, + "PopMode", + }, + }, + }, + default = { + messages = { + "UpdateInputBufferFromKey", + }, + }, + }, +} + +-- The builtin delete mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.delete = { + name = "delete", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["D"] = { + help = "force delete", + messages = { + { + BashExec0 = [===[ + cat "${XPLR_PIPE_RESULT_OUT:?}" | xargs -0 printf '%q\n' + echo + read -p "Permanently delete these files? [Y/n]: " ANS + [ "${ANS:-Y}" = "Y" ] || [ "$ANS" = "y" ] || exit 0 + echo + + "$XPLR" -m ExplorePwd + while IFS= read -r -d '' PTH; do + PTH_ESC=$(printf %q "$PTH") + if rm -rfv -- "${PTH:?}"; then + "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC deleted" + else + "$XPLR" -m 'LogError: %q' "could not delete $PTH_ESC" + "$XPLR" -m 'FocusPath: %q' "$PTH" + fi + done < "${XPLR_PIPE_RESULT_OUT:?}" + echo + read -p "[press enter to continue]" + ]===], + }, + "PopMode", + }, + }, + ["d"] = { + help = "delete", + messages = { + { + BashExec0 = [===[ + cat "${XPLR_PIPE_RESULT_OUT:?}" | xargs -0 printf '%q\n' + echo + read -p "Permanently delete these files? [Y/n]: " ANS + [ "${ANS:-Y}" = "Y" ] || [ "$ANS" = "y" ] || exit 0 + echo + + "$XPLR" -m ExplorePwd + while IFS= read -r -d '' PTH; do + PTH_ESC=$(printf %q "$PTH") + if [ -d "$PTH" ] && [ ! -L "$PTH" ]; then + if rmdir -v -- "${PTH:?}"; then + "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC deleted" + else + "$XPLR" -m 'LogError: %q' "could not delete $PTH_ESC" + "$XPLR" -m 'FocusPath: %q' "$PTH" + fi + else + if rm -v -- "${PTH:?}"; then + "$XPLR" -m 'LogSuccess: %q' "$PTH_ESC deleted" + else + "$XPLR" -m 'LogError: %q' "could not delete $PTH_ESC" + "$XPLR" -m 'FocusPath: %q' "$PTH" + fi + fi + done < "${XPLR_PIPE_RESULT_OUT:?}" + echo + read -p "[press enter to continue]" + ]===], + }, + "PopMode", + }, + }, + }, + }, +} + +-- The builtin action mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.action = { + name = "action to", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["!"] = { + help = "shell", + messages = { + "PopMode", + { Call0 = { command = os.getenv("SHELL") or "bash", args = { "-i" } } }, + "ExplorePwdAsync", + }, + }, + ["c"] = { + help = "create", + messages = { + "PopMode", + { SwitchModeBuiltin = "create" }, + }, + }, + ["e"] = { + help = "open in editor", + messages = { + { + BashExec0 = [===[ + ${EDITOR:-vi} "${XPLR_FOCUS_PATH:?}" + ]===], + }, + "PopMode", + }, + }, + ["l"] = { + help = "logs", + messages = { + { + BashExec = [===[ + [ -z "$PAGER" ] && PAGER="less -+F" + cat -- "${XPLR_PIPE_LOGS_OUT}" | ${PAGER:?} + ]===], + }, + "PopMode", + }, + }, + ["s"] = { + help = "selection operations", + messages = { + "PopMode", + { SwitchModeBuiltin = "selection_ops" }, + }, + }, + ["m"] = { + help = "toggle mouse", + messages = { + "PopMode", + "ToggleMouse", + }, + }, + ["p"] = { + help = "edit permissions", + messages = { + "PopMode", + { SwitchModeBuiltin = "edit_permissions" }, + { + BashExecSilently0 = [===[ + PERM=$(stat -c '%a' -- "${XPLR_FOCUS_PATH:?}") + "$XPLR" -m 'SetInputBuffer: %q' "${PERM:?}" + ]===], + }, + }, + }, + ["v"] = { + help = "vroot", + messages = { + "PopMode", + { SwitchModeBuiltin = "vroot" }, + }, + }, + ["q"] = { + help = "quit options", + messages = { + "PopMode", + { SwitchModeBuiltin = "quit" }, + }, + }, + }, + on_number = { + help = "go to index", + messages = { + "PopMode", + { SwitchModeBuiltin = "number" }, + "BufferInputFromKey", + }, + }, + }, +} + +-- The builtin quit mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.quit = { + name = "quit", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["enter"] = { + help = "just quit", + messages = { + "Quit", + }, + }, + ["p"] = { + help = "quit printing pwd", + messages = { + "PrintPwdAndQuit", + }, + }, + ["f"] = { + help = "quit printing focus", + messages = { + "PrintFocusPathAndQuit", + }, + }, + ["s"] = { + help = "quit printing selection", + messages = { + "PrintSelectionAndQuit", + }, + }, + ["r"] = { + help = "quit printing result", + messages = { + "PrintResultAndQuit", + }, + }, + }, + }, +} + +-- The builtin search mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.search = { + name = "search", + prompt = "/", + key_bindings = { + on_key = { + ["up"] = { + help = "up", + messages = { + "FocusPrevious", + }, + }, + ["down"] = { + help = "down", + messages = { + "FocusNext", + }, + }, + ["ctrl-z"] = { + help = "toggle ordering", + messages = { + "ToggleSearchOrder", + "ExplorePwdAsync", + }, + }, + ["ctrl-a"] = { + help = "toggle search algorithm", + messages = { + "ToggleSearchAlgorithm", + "ExplorePwdAsync", + }, + }, + ["ctrl-r"] = { + help = "regex search", + messages = { + "SearchRegexFromInput", + "ExplorePwdAsync", + }, + }, + ["ctrl-f"] = { + help = "fuzzy search", + messages = { + "SearchFuzzyFromInput", + "ExplorePwdAsync", + }, + }, + ["ctrl-s"] = { + help = "sort (no search order)", + messages = { + "DisableSearchOrder", + "ExplorePwdAsync", + { SwitchModeBuiltinKeepingInputBuffer = "sort" }, + }, + }, + ["right"] = { + help = "enter", + messages = { + "Enter", + { SetInputBuffer = "" }, + }, + }, + ["left"] = { + help = "back", + messages = { + "Back", + { SetInputBuffer = "" }, + }, + }, + ["tab"] = { + help = "toggle selection", + messages = { + "ToggleSelection", + "FocusNext", + }, + }, + ["enter"] = { + help = "submit", + messages = { + "AcceptSearch", + "PopMode", + }, + }, + ["esc"] = { + help = "cancel", + messages = { + "CancelSearch", + "PopMode", + }, + }, + }, + default = { + messages = { + "UpdateInputBufferFromKey", + "SearchFromInput", + "ExplorePwdAsync", + }, + }, + }, +} + +xplr.config.modes.builtin.search.key_bindings.on_key["ctrl-n"] = + xplr.config.modes.builtin.search.key_bindings.on_key["down"] +xplr.config.modes.builtin.search.key_bindings.on_key["ctrl-p"] = + xplr.config.modes.builtin.search.key_bindings.on_key["up"] + +-- The builtin filter mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.filter = { + name = "filter", + key_bindings = { + on_key = { + ["r"] = { + help = "relative path does match regex", + messages = { + { SwitchModeBuiltin = "relative_path_does_match_regex" }, + { SetInputBuffer = "" }, + { AddNodeFilterFromInput = "RelativePathDoesMatchRegex" }, + "ExplorePwdAsync", + }, + }, + ["R"] = { + help = "relative path does not match regex", + messages = { + { SwitchModeBuiltin = "relative_path_does_not_match_regex" }, + { SetInputBuffer = "" }, + { AddNodeFilterFromInput = "RelativePathDoesNotMatchRegex" }, + "ExplorePwdAsync", + }, + }, + ["backspace"] = { + help = "remove last filter", + messages = { + "RemoveLastNodeFilter", + "ExplorePwdAsync", + }, + }, + ["ctrl-r"] = { + help = "reset filters", + messages = { + "ResetNodeFilters", + "ExplorePwdAsync", + }, + }, + ["ctrl-u"] = { + help = "clear filters", + messages = { + "ClearNodeFilters", + "ExplorePwdAsync", + }, + }, + }, + }, +} + +-- The builtin relative_path_does_match_regex mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.relative_path_does_match_regex = { + name = "relative path does match regex", + prompt = xplr.config.general.sort_and_filter_ui.filter_identifiers.RelativePathDoesMatchRegex.format, + key_bindings = { + on_key = { + ["enter"] = { + help = "submit", + messages = { + "PopMode", + }, + }, + ["esc"] = { + messages = { + { RemoveNodeFilterFromInput = "RelativePathDoesMatchRegex" }, + "PopMode", + "ExplorePwdAsync", + }, + }, + }, + default = { + messages = { + { RemoveNodeFilterFromInput = "RelativePathDoesMatchRegex" }, + "UpdateInputBufferFromKey", + { AddNodeFilterFromInput = "RelativePathDoesMatchRegex" }, + "ExplorePwdAsync", + }, + }, + }, +} + +-- The builtin relative_path_does_not_match_regex mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.relative_path_does_not_match_regex = { + name = "relative path does not match regex", + prompt = xplr.config.general.sort_and_filter_ui.filter_identifiers.RelativePathDoesNotMatchRegex.format, + key_bindings = { + on_key = { + ["enter"] = { + help = "submit", + messages = { + "PopMode", + }, + }, + ["esc"] = { + messages = { + { RemoveNodeFilterFromInput = "RelativePathDoesNotMatchRegex" }, + "PopMode", + "ExplorePwdAsync", + }, + }, + }, + default = { + messages = { + { RemoveNodeFilterFromInput = "RelativePathDoesNotMatchRegex" }, + "UpdateInputBufferFromKey", + { AddNodeFilterFromInput = "RelativePathDoesNotMatchRegex" }, + "ExplorePwdAsync", + }, + }, + }, +} + +-- The builtin sort mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.sort = { + name = "sort", + key_bindings = { + on_key = { + ["!"] = { + help = "reverse sorters", + messages = { + "ReverseNodeSorters", + "ExplorePwdAsync", + }, + }, + ["E"] = { + help = "by canonical extension reverse", + messages = { + { AddNodeSorter = { sorter = "ByCanonicalExtension", reverse = true } }, + "ExplorePwdAsync", + }, + }, + ["M"] = { + help = "by canonical mime essence reverse", + messages = { + { AddNodeSorter = { sorter = "ByCanonicalMimeEssence", reverse = true } }, + "ExplorePwdAsync", + }, + }, + ["N"] = { + help = "by node type reverse", + messages = { + { AddNodeSorter = { sorter = "ByCanonicalIsDir", reverse = true } }, + { AddNodeSorter = { sorter = "ByCanonicalIsFile", reverse = true } }, + { AddNodeSorter = { sorter = "ByIsSymlink", reverse = true } }, + "ExplorePwdAsync", + }, + }, + ["R"] = { + help = "by relative path reverse", + messages = { + { AddNodeSorter = { sorter = "ByIRelativePath", reverse = true } }, + "ExplorePwdAsync", + }, + }, + ["S"] = { + help = "by size reverse", + messages = { + { AddNodeSorter = { sorter = "BySize", reverse = true } }, + "ExplorePwdAsync", + }, + }, + ["backspace"] = { + help = "remove last sorter", + messages = { + "RemoveLastNodeSorter", + "ExplorePwdAsync", + }, + }, + ["ctrl-r"] = { + help = "reset sorters", + messages = { + "ResetNodeSorters", + "ExplorePwdAsync", + }, + }, + ["ctrl-u"] = { + help = "clear sorters", + messages = { + "ClearNodeSorters", + "ExplorePwdAsync", + }, + }, + ["e"] = { + help = "by canonical extension", + messages = { + { AddNodeSorter = { sorter = "ByCanonicalExtension", reverse = false } }, + "ExplorePwdAsync", + }, + }, + ["enter"] = { + help = "submit", + messages = { + "PopModeKeepingInputBuffer", + }, + }, + ["esc"] = { + messages = { + "PopModeKeepingInputBuffer", + }, + }, + ["m"] = { + help = "by canonical mime essence", + messages = { + { AddNodeSorter = { sorter = "ByCanonicalMimeEssence", reverse = false } }, + "ExplorePwdAsync", + }, + }, + ["n"] = { + help = "by node type", + messages = { + { AddNodeSorter = { sorter = "ByCanonicalIsDir", reverse = false } }, + { AddNodeSorter = { sorter = "ByCanonicalIsFile", reverse = false } }, + { AddNodeSorter = { sorter = "ByIsSymlink", reverse = false } }, + "ExplorePwdAsync", + }, + }, + ["r"] = { + help = "by relative path", + messages = { + { AddNodeSorter = { sorter = "ByIRelativePath", reverse = false } }, + "ExplorePwdAsync", + }, + }, + ["s"] = { + help = "by size", + messages = { + { AddNodeSorter = { sorter = "BySize", reverse = false } }, + "ExplorePwdAsync", + }, + }, + ["c"] = { + help = "by created", + messages = { + { AddNodeSorter = { sorter = "ByCreated", reverse = false } }, + "ExplorePwdAsync", + }, + }, + ["C"] = { + help = "by created reverse", + messages = { + { AddNodeSorter = { sorter = "ByCreated", reverse = true } }, + "ExplorePwdAsync", + }, + }, + ["l"] = { + help = "by last modified", + messages = { + { AddNodeSorter = { sorter = "ByLastModified", reverse = false } }, + "ExplorePwdAsync", + }, + }, + ["L"] = { + help = "by last modified reverse", + messages = { + { AddNodeSorter = { sorter = "ByLastModified", reverse = true } }, + "ExplorePwdAsync", + }, + }, + }, + }, +} + +-- The builtin switch layout mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.switch_layout = { + name = "switch layout", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["1"] = { + help = "default", + messages = { + { SwitchLayoutBuiltin = "default" }, + "PopMode", + }, + }, + ["2"] = { + help = "no help menu", + messages = { + { SwitchLayoutBuiltin = "no_help" }, + "PopMode", + }, + }, + ["3"] = { + help = "no selection panel", + messages = { + { SwitchLayoutBuiltin = "no_selection" }, + "PopMode", + }, + }, + ["4"] = { + help = "no help or selection", + messages = { + { SwitchLayoutBuiltin = "no_help_no_selection" }, + "PopMode", + }, + }, + }, + }, +} + +-- The builtin vroot mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.vroot = { + name = "vroot", + layout = "HelpMenu", + key_bindings = { + on_key = { + ["v"] = { + help = "toggle vroot", + messages = { + "PopMode", + "ToggleVroot", + }, + }, + ["."] = { + help = "vroot $PWD", + messages = { + "PopMode", + { + BashExecSilently0 = [===[ + "$XPLR" -m 'SetVroot: %q' "${PWD:?}" + ]===], + }, + }, + }, + ["/"] = { + help = "vroot /", + messages = { + "PopMode", + { SetVroot = "/" }, + }, + }, + ["~"] = { + help = "vroot $HOME", + messages = { + "PopMode", + { + BashExecSilently0 = [===[ + "$XPLR" -m 'SetVroot: %q' "${HOME:?}" + ]===], + }, + }, + }, + ["ctrl-r"] = { + help = "reset vroot", + messages = { + "PopMode", + "ResetVroot", + }, + }, + ["ctrl-u"] = { + help = "unset vroot", + messages = { + "PopMode", + "UnsetVroot", + }, + }, + }, + }, +} + +-- The builtin edit permissions mode. +-- +-- Type: [Mode](https://xplr.dev/en/mode) +xplr.config.modes.builtin.edit_permissions = { + name = "edit permissions", + key_bindings = { + on_key = { + ["u"] = { + help = "+user", + messages = { + { + BashExecSilently0 = [===[ + PERM="${XPLR_INPUT_BUFFER:-000}" + U="${PERM: -3:-2}" + G="${PERM: -2:-1}" + O="${PERM: -1}" + + U="$(( (${U:-0} + 1) % 8 ))" + "$XPLR" -m 'SetInputBuffer: %q' "${U:-0}${G:-0}${O:-0}" + ]===], + }, + }, + }, + ["U"] = { + help = "-user", + messages = { + { + BashExecSilently0 = [===[ + PERM="${XPLR_INPUT_BUFFER:-000}" + U="${PERM: -3:-2}" + G="${PERM: -2:-1}" + O="${PERM: -1}" + + U="$(( ${U:-0}-1 < 0 ? 7 : ${U:-0}-1 ))" + "$XPLR" -m 'SetInputBuffer: %q' "${U:-0}${G:-0}${O:-0}" + ]===], + }, + }, + }, + ["g"] = { + help = "+group", + messages = { + { + BashExecSilently0 = [===[ + PERM="${XPLR_INPUT_BUFFER:-000}" + U="${PERM: -3:-2}" + G="${PERM: -2:-1}" + O="${PERM: -1}" + + G="$(( (${G:-0} + 1) % 8 ))" + "$XPLR" -m 'SetInputBuffer: %q' "${U:-0}${G:-0}${O:-0}" + ]===], + }, + }, + }, + ["G"] = { + help = "-group", + messages = { + { + BashExecSilently0 = [===[ + PERM="${XPLR_INPUT_BUFFER:-000}" + U="${PERM: -3:-2}" + G="${PERM: -2:-1}" + O="${PERM: -1}" + + G="$(( ${G:-0}-1 < 0 ? 7 : ${G:-0}-1 ))" + "$XPLR" -m 'SetInputBuffer: %q' "${U:-0}${G:-0}${O:-0}" + ]===], + }, + }, + }, + ["o"] = { + help = "+other", + messages = { + { + BashExecSilently0 = [===[ + PERM="${XPLR_INPUT_BUFFER:-000}" + U="${PERM: -3:-2}" + G="${PERM: -2:-1}" + O="${PERM: -1}" + + O="$(( (${O:-0} + 1) % 8 ))" + "$XPLR" -m 'SetInputBuffer: %q' "${U:-0}${G:-0}${O:-0}" + ]===], + }, + }, + }, + ["O"] = { + help = "-other", + messages = { + { + BashExecSilently0 = [===[ + PERM="${XPLR_INPUT_BUFFER:-000}" + U="${PERM: -3:-2}" + G="${PERM: -2:-1}" + O="${PERM: -1}" + + O="$(( ${O:-0}-1 < 0 ? 7 : ${O:-0}-1 ))" + "$XPLR" -m 'SetInputBuffer: %q' "${U:-0}${G:-0}${O:-0}" + ]===], + }, + }, + }, + ["m"] = { + help = "max", + messages = { + { + BashExecSilently0 = [===[ + "$XPLR" -m 'SetInputBuffer: %q' "777" + ]===], + }, + }, + }, + ["M"] = { + help = "min", + messages = { + { + BashExecSilently0 = [===[ + "$XPLR" -m 'SetInputBuffer: %q' "000" + ]===], + }, + }, + }, + ["ctrl-r"] = { + help = "reset", + messages = { + { + BashExecSilently0 = [===[ + PERM=$(stat -c '%a' -- "${XPLR_FOCUS_PATH:?}") + "$XPLR" -m 'SetInputBuffer: %q' "${PERM:?}" + ]===], + }, + }, + }, + ["enter"] = { + help = "submit", + messages = { + { + BashExecSilently0 = [===[ + chmod "${XPLR_INPUT_BUFFER:?}" -- "${XPLR_FOCUS_PATH:?}" + ]===], + }, + "PopMode", + "ExplorePwdAsync", + }, + }, + }, + default = { + messages = { + "UpdateInputBufferFromKey", + }, + }, + }, +} + +-- This is where you define custom modes. +-- +-- Type: mapping of the following key-value pairs: +-- +-- * key: string +-- * value: [Mode](https://xplr.dev/en/mode) +-- +-- Example: +-- +-- ```lua +-- xplr.config.modes.custom.example = { +-- name = "example", +-- key_bindings = { +-- on_key = { +-- enter = { +-- help = "default mode", +-- messages = { +-- "PopMode", +-- { SwitchModeBuiltin = "default" }, +-- }, +-- }, +-- }, +-- }, +-- } +-- +-- xplr.config.general.initial_mode = "example" +-- ``` +xplr.config.modes.custom = {} + +-- ## Function ---------------------------------------------------------------- +-- +-- While `xplr.config` defines all the static parts of the configuration, +-- `xplr.fn` defines all the dynamic parts using functions. +-- +-- See: [Lua Function Calls](https://xplr.dev/en/lua-function-calls) +-- +-- As always, `xplr.fn.builtin` is where the built-in functions are defined +-- that can be overwritten. + +-- Tries to auto complete the path in the input buffer +xplr.fn.builtin.try_complete_path = function(m) + if not m.input_buffer then + return + end + + local function matches_all(str, paths) + for _, path in ipairs(paths) do + if string.sub(path, 1, #str) ~= str then + return false + end + end + return true + end + + local path = m.input_buffer + local explorer_config = { + filters = { + { filter = "RelativePathDoesStartWith", input = xplr.util.basename(path) }, + }, + } + local parent = xplr.util.dirname(path) + if not parent or parent == "" then + parent = "./" + elseif parent ~= "/" then + parent = parent .. "/" + end + + local nodes = xplr.util.explore(parent, explorer_config) + local found = {} + for _, node in ipairs(nodes) do + table.insert(found, parent .. node.relative_path) + end + local count = #found + + if count == 0 then + return + elseif count == 1 then + return { + { SetInputBuffer = found[1] }, + } + else + local first = found[1] + while #first > #path and matches_all(path, found) do + path = string.sub(first, 1, #path + 1) + end + + if matches_all(path, found) then + return { + { SetInputBuffer = path }, + } + end + + return { + { SetInputBuffer = string.sub(path, 1, #path - 1) }, + } + end +end + +xplr.fn.builtin.fmt_general_selection_item = function(n) + local nl = xplr.util.paint("\\n", { add_modifiers = { "Italic", "Dim" } }) + local sh_config = { with_prefix_dots = true, without_suffix_dots = true } + local shortened = xplr.util.shorten(n.absolute_path, sh_config) + if n.is_dir then + shortened = shortened .. "/" + end + local ls_style = xplr.util.lscolor(n.absolute_path) + local meta_style = xplr.util.node_type(n).style + local style = xplr.util.style_mix({ ls_style, meta_style }) + return xplr.util.paint(shortened:gsub("\n", nl), style) +end + +-- Renders the first column in the table +xplr.fn.builtin.fmt_general_table_row_cols_0 = function(m) + local r = "" + if m.is_before_focus then + r = r .. " -" + else + r = r .. " " + end + + r = r .. m.relative_index .. "│" .. m.index + + return r +end + +-- Renders the second column in the table +xplr.fn.builtin.fmt_general_table_row_cols_1 = function(m) + local nl = xplr.util.paint("\\n", { add_modifiers = { "Italic", "Dim" } }) + local r = m.tree .. m.prefix + local style = xplr.util.lscolor(m.absolute_path) + style = xplr.util.style_mix({ style, m.style }) + + if m.meta.icon == nil then + r = r .. "" + else + r = r .. m.meta.icon .. " " + end + + local rel = m.relative_path + if m.is_dir then + rel = rel .. "/" + end + r = r .. xplr.util.paint(xplr.util.shell_escape(rel), style) + + r = r .. m.suffix .. " " + + if m.is_symlink then + r = r .. "-> " + + if m.is_broken then + r = r .. "×" + else + local symlink_path = xplr.util.shorten(m.symlink.absolute_path) + if m.symlink.is_dir then + symlink_path = symlink_path .. "/" + end + r = r .. symlink_path:gsub("\n", nl) + end + end + + return r +end + +-- Renders the third column in the table +xplr.fn.builtin.fmt_general_table_row_cols_2 = function(m) + local r = xplr.util.paint("r", { fg = "Green" }) + local w = xplr.util.paint("w", { fg = "Yellow" }) + local x = xplr.util.paint("x", { fg = "Red" }) + local s = xplr.util.paint("s", { fg = "Red" }) + local S = xplr.util.paint("S", { fg = "Red" }) + local t = xplr.util.paint("t", { fg = "Red" }) + local T = xplr.util.paint("T", { fg = "Red" }) + + return xplr.util + .permissions_rwx(m.permissions) + :gsub("r", r) + :gsub("w", w) + :gsub("x", x) + :gsub("s", s) + :gsub("S", S) + :gsub("t", t) + :gsub("T", T) +end + +-- Renders the fourth column in the table +xplr.fn.builtin.fmt_general_table_row_cols_3 = function(m) + if not m.is_dir then + return m.human_size + else + return "" + end +end + +-- Renders the fifth column in the table +xplr.fn.builtin.fmt_general_table_row_cols_4 = function(m) + return tostring(os.date("%a %b %d %H:%M:%S %Y", m.last_modified / 1000000000)) +end + +-- This is where the custom functions can be added. +-- +-- There is currently no restriction on what kind of functions can be defined +-- in `xplr.fn.custom`. +-- +-- You can also use nested tables such as +-- `xplr.fn.custom.my_plugin.my_function` to define custom functions. +xplr.fn.custom = {} + +-- ## Plugins +local home = os.getenv("HOME") +package.path = home + .. "/.config/xplr/plugins/?/init.lua;" + .. home + .. "/.config/xplr/plugins/?.lua;" + .. package.path + + +-- FZF +require("fzf").setup { + mode = "default", + key = "ctrl-f", + bin = "fzf", + args = "--preview 'pistol {}'", + recursive = false, -- If true, search all files under $PWD + enter_dir = false, -- Enter if the result is directory +} + +-- Zoxide +require("zoxide").setup { + bin = "zoxide", + mode = "default", + key = "z", +} + +-- Dual pane +require("dual-pane").setup { + active_pane_width = { Percentage = 70 }, + inactive_pane_width = { Percentage = 30 }, +} + +-- Treeview +require("tree-view").setup({ + mode = "switch_layout", + key = "T", + + -- If you feel slowness, you might want to toggle back to the default view. + toggle_layout_mode = "default", + toggle_layout_key = "esc", + + -- Press backspace to close all and back and close + close_all_and_back_mode = "default", + close_all_and_back_key = "backspace", + + -- Toggle expansion without entering + toggle_expansion_mode = "default", + toggle_expansion_key = "o", + + -- Toggle expansion of all the nodes under pwd + toggle_expansion_all_mode = "default", + toggle_expansion_all_key = "O", + + -- Focus on the next visible line, not compatible with up/down action + focus_next_mode = "default", + focus_next_key = "]", + + -- Focus on the previous visible line, not compatible with up/down action + focus_prev_mode = "default", + focus_prev_key = "[", + + -- Go to the next deep level directory that's open + goto_next_open_mode = "default", + goto_next_open_key = ")", + + -- Go to the previous deep level directory that's open + goto_prev_open_mode = "default", + goto_prev_open_key = "(", + + -- Whether to display the tree in full screen + fullscreen = false, + + -- Indent for the branches of the tree + indent = " ", + + -- Start xplr with tree view layout + as_initial_layout = false, + + -- Disables toggling layout. + as_default_layout = false, + + -- Automatically fallback to this layout for better performance if the + -- branch contains # of nodes more than the threshold value + fallback_layout = "Table", + fallback_threshold = 500, -- default: nil (disabled) +}) + +-- Ranger tripane +require("tri-pane").setup({ + layout_key = "R", -- In switch_layout mode + as_default_layout = false, + left_pane_width = { Percentage = 20 }, + middle_pane_width = { Percentage = 50 }, + right_pane_width = { Percentage = 30 }, + left_pane_renderer = custom_function_to_render_left_pane, + right_pane_renderer = custom_function_to_render_right_pane +}) + +-- Clipboard +require("wl-clipboard").setup { + copy_command = "wl-copy -t text/uri-list", + paste_command = "wl-paste", + keep_selection = false, +} + +-- Dua +require("dua-cli").setup { + mode = "action", + key = "D", +} + +-- Nuke (Open files in default apps) +require("nuke").setup { + pager = "more", -- default: less -R + open = { + run_executables = true, -- default: false + custom = { + { extension = "jpg", command = "geeqie {}" }, + { mime = "video/mp4", command = "mpv {}" }, + { mime_regex = "^video/.*", command = "smplayer {}" }, + { mime_regex = ".*", command = "xdg-open {}" } + } + }, + view = { + show_line_numbers = true, -- default: false + }, + smart_view = { + custom = { + { extension = "so", command = "ldd -r {} | less" }, + } + } +} + +local key = xplr.config.modes.builtin.default.key_bindings.on_key + +key.v = { + help = "nuke", + messages = { "PopMode", { SwitchModeCustom = "nuke" } } +} +key["f3"] = xplr.config.modes.custom.nuke.key_bindings.on_key.v +key["enter"] = xplr.config.modes.custom.nuke.key_bindings.on_key.o + +-- Icons +require "icons".setup() + +-- Clean UI +-- require("zentable").setup() + + +-- ## Hooks ------------------------------------------------------------------- +-- +-- This section of the configuration cannot be overwritten by another config +-- file or plugin, since this is an optional lua return statement specific to +-- each config file. It can be used to define things that should be explicit +-- for reasons like performance concerns, such as hooks. +-- +-- Plugins should expose the hooks, and require users to subscribe to them +-- explicitly. +-- +-- Example: +-- +-- ```lua +-- return { +-- -- Add messages to send when the xplr loads. +-- -- This is similar to the `--on-load` command-line option. +-- -- +-- -- Type: list of [Message](https://xplr.dev/en/message#message)s +-- on_load = { +-- { LogSuccess = "Configuration successfully loaded!" }, +-- { CallLuaSilently = "custom.some_plugin_with_hooks.on_load" }, +-- }, +-- +-- -- Add messages to send when the directory changes. +-- -- +-- -- Type: list of [Message](https://xplr.dev/en/message#message)s +-- on_directory_change = { +-- { LogSuccess = "Changed directory" }, +-- { CallLuaSilently = "custom.some_plugin_with_hooks.on_directory_change" }, +-- }, +-- +-- -- Add messages to send when the focus changes. +-- -- +-- -- Type: list of [Message](https://xplr.dev/en/message#message)s +-- on_focus_change = { +-- { LogSuccess = "Changed focus" }, +-- { CallLuaSilently = "custom.some_plugin_with_hooks.on_focus_change" }, +-- } +-- +-- -- Add messages to send when the mode is switched. +-- -- +-- -- Type: list of [Message](https://xplr.dev/en/message#message)s +-- on_mode_switch = { +-- { LogSuccess = "Switched mode" }, +-- { CallLuaSilently = "custom.some_plugin_with_hooks.on_mode_switch" }, +-- } +-- +-- -- Add messages to send when the layout is switched +-- -- +-- -- Type: list of [Message](https://xplr.dev/en/message#message)s +-- on_layout_switch = { +-- { LogSuccess = "Switched layout" }, +-- { CallLuaSilently = "custom.some_plugin_with_hooks.on_layout_switch" }, +-- } +-- } +-- ``` + +return { + on_load = {}, + on_directory_change = {}, + on_focus_change = {}, + on_mode_switch = {}, + on_layout_switch = {}, +} + +-- ---------------------------------------------------------------------------- +-- > Note: +-- > +-- > It's not recommended to copy the entire configuration, unless you want to +-- > freeze it and miss out on useful updates to the defaults. +-- > +-- > Instead, you can use this as a reference to overwrite only the parts you +-- > want to update. +-- > +-- > If you still want to copy the entire configuration, make sure to put your +-- > customization before the return statement. diff --git a/.config/xplr/plugins/dua-cli b/.config/xplr/plugins/dua-cli new file mode 160000 index 00000000..66ccf983 --- /dev/null +++ b/.config/xplr/plugins/dua-cli @@ -0,0 +1 @@ +Subproject commit 66ccf983fab7f67d6b00adc0365a2b26550e7f81 diff --git a/.config/xplr/plugins/dual-pane b/.config/xplr/plugins/dual-pane new file mode 160000 index 00000000..2c4106c1 --- /dev/null +++ b/.config/xplr/plugins/dual-pane @@ -0,0 +1 @@ +Subproject commit 2c4106c1cc882ac3f832b77a3c72fdce83e17d72 diff --git a/.config/xplr/plugins/fzf b/.config/xplr/plugins/fzf new file mode 160000 index 00000000..f70b267e --- /dev/null +++ b/.config/xplr/plugins/fzf @@ -0,0 +1 @@ +Subproject commit f70b267e90ee2c6b210b5b476ec19ea29b220214 diff --git a/.config/xplr/plugins/icons b/.config/xplr/plugins/icons new file mode 160000 index 00000000..6133ea79 --- /dev/null +++ b/.config/xplr/plugins/icons @@ -0,0 +1 @@ +Subproject commit 6133ea79c41629591c72fa4c51132f7a3cb30782 diff --git a/.config/xplr/plugins/nuke b/.config/xplr/plugins/nuke new file mode 160000 index 00000000..f83a7ed5 --- /dev/null +++ b/.config/xplr/plugins/nuke @@ -0,0 +1 @@ +Subproject commit f83a7ed58a7212771b15fbf1fdfb0a07b23c81e9 diff --git a/.config/xplr/plugins/tree-view b/.config/xplr/plugins/tree-view new file mode 160000 index 00000000..ad2b8e68 --- /dev/null +++ b/.config/xplr/plugins/tree-view @@ -0,0 +1 @@ +Subproject commit ad2b8e685f05a5a3fcc9e12f8992836803ddcb76 diff --git a/.config/xplr/plugins/tri-pane b/.config/xplr/plugins/tri-pane new file mode 160000 index 00000000..d90c65eb --- /dev/null +++ b/.config/xplr/plugins/tri-pane @@ -0,0 +1 @@ +Subproject commit d90c65eb2bdd182f09db2db8969a99666f90c78b diff --git a/.config/xplr/plugins/wl-clipboard b/.config/xplr/plugins/wl-clipboard new file mode 160000 index 00000000..a3ffc874 --- /dev/null +++ b/.config/xplr/plugins/wl-clipboard @@ -0,0 +1 @@ +Subproject commit a3ffc87460c5c7f560bffea689487ae14b36d9c3 diff --git a/.config/xplr/plugins/zentable b/.config/xplr/plugins/zentable new file mode 160000 index 00000000..4e3d3e5a --- /dev/null +++ b/.config/xplr/plugins/zentable @@ -0,0 +1 @@ +Subproject commit 4e3d3e5a16e2b9422d8f714018f0ed2dca90c195 diff --git a/.config/xplr/plugins/zoxide b/.config/xplr/plugins/zoxide new file mode 160000 index 00000000..e50fd35d --- /dev/null +++ b/.config/xplr/plugins/zoxide @@ -0,0 +1 @@ +Subproject commit e50fd35db5c05e750a74c8f54761922464c1ad5f diff --git a/.vscode-oss/extensions/extensions.json b/.vscode-oss/extensions/extensions.json index 840c6f11..4e7b93da 100644 --- a/.vscode-oss/extensions/extensions.json +++ b/.vscode-oss/extensions/extensions.json @@ -1 +1 @@ -[{"identifier":{"id":"kisstkondoros.vscode-gutter-preview","uuid":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5"},"version":"0.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/kisstkondoros.vscode-gutter-preview-0.30.0","scheme":"file"},"relativeLocation":"kisstkondoros.vscode-gutter-preview-0.30.0","metadata":{"id":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5","publisherId":"87e3e2a4-ac17-425a-a4b6-698bc44254fe","publisherDisplayName":null,"targetPlatform":"undefined","isApplicationScoped":false,"updated":false,"isPreReleaseVersion":false,"preRelease":false,"installedTimestamp":1661897741020}},{"identifier":{"id":"pkief.material-product-icons","uuid":"f797dacd-4e80-4f33-8b63-d665c0956013"},"version":"1.5.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-product-icons-1.5.0","scheme":"file"},"relativeLocation":"pkief.material-product-icons-1.5.0","metadata":{"id":"f797dacd-4e80-4f33-8b63-d665c0956013","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686496947697,"preRelease":false}},{"identifier":{"id":"alefragnani.project-manager","uuid":"1b747f06-3789-4ebd-ac99-f1fe430c3347"},"version":"12.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.project-manager-12.7.0","scheme":"file"},"relativeLocation":"alefragnani.project-manager-12.7.0","metadata":{"id":"1b747f06-3789-4ebd-ac99-f1fe430c3347","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686500619115,"preRelease":false}},{"identifier":{"id":"catppuccin.catppuccin-vsc","uuid":"69264e4d-cd3b-468a-8f2b-e69673c7d864"},"version":"2.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/catppuccin.catppuccin-vsc-2.7.0","scheme":"file"},"relativeLocation":"catppuccin.catppuccin-vsc-2.7.0","metadata":{"id":"69264e4d-cd3b-468a-8f2b-e69673c7d864","publisherId":"e7d2ed61-53e0-4dd4-afbe-f536c3bb4316","publisherDisplayName":"Catppuccin","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686757275010,"preRelease":false}},{"identifier":{"id":"rafamel.subtle-brackets","uuid":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8"},"version":"3.0.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/rafamel.subtle-brackets-3.0.0","scheme":"file"},"relativeLocation":"rafamel.subtle-brackets-3.0.0","metadata":{"id":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8","publisherId":"7658adf6-ca84-42d4-8958-da3f6861451a","publisherDisplayName":"Rafa Mel","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686849770863,"preRelease":false}},{"identifier":{"id":"eugenejeon.codesnap-plus-fix","uuid":"b6406d8e-9c12-4078-8150-ca498169cf08"},"version":"1.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eugenejeon.codesnap-plus-fix-1.0.1","scheme":"file"},"relativeLocation":"eugenejeon.codesnap-plus-fix-1.0.1","metadata":{"id":"b6406d8e-9c12-4078-8150-ca498169cf08","publisherId":"b5f3798b-9da6-48b5-b246-c158aad3debc","publisherDisplayName":"Eugene Jeon","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686850202418,"preRelease":false}},{"identifier":{"id":"be5invis.vscode-custom-css","uuid":"1b160753-ae5e-42bb-82ad-d115ce5c10f4"},"version":"7.2.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/be5invis.vscode-custom-css-7.2.1","scheme":"file"},"relativeLocation":"be5invis.vscode-custom-css-7.2.1","metadata":{"id":"1b160753-ae5e-42bb-82ad-d115ce5c10f4","publisherId":"8c148d69-cbc6-480b-bd8b-a42715926324","publisherDisplayName":"be5invis","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686854743467,"preRelease":false}},{"identifier":{"id":"exodiusstudios.comment-anchors","uuid":"5cf10212-681f-48c7-b66f-bcce5dc44a64"},"version":"1.10.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/exodiusstudios.comment-anchors-1.10.3","scheme":"file"},"relativeLocation":"exodiusstudios.comment-anchors-1.10.3","metadata":{"id":"5cf10212-681f-48c7-b66f-bcce5dc44a64","publisherId":"9069d21e-e9c6-4063-8f3a-026d317bb8f4","publisherDisplayName":"Starlane Studios","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686999443730,"preRelease":false}},{"identifier":{"id":"aic.docify","uuid":"aa33eae5-0c47-4b2a-a1e3-b95553fea360"},"version":"1.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/aic.docify-1.3.4","scheme":"file"},"relativeLocation":"aic.docify-1.3.4","metadata":{"id":"aa33eae5-0c47-4b2a-a1e3-b95553fea360","publisherId":"0832ad01-00f9-475b-adc0-143baef69236","publisherDisplayName":"AIC","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686999693827,"preRelease":false}},{"identifier":{"id":"ibm.output-colorizer","uuid":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f"},"version":"0.1.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ibm.output-colorizer-0.1.2","scheme":"file"},"relativeLocation":"ibm.output-colorizer-0.1.2","metadata":{"id":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f","publisherId":"8f186bac-3651-4797-9216-ba30633f600b","publisherDisplayName":"IBM","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687373679322,"preRelease":false}},{"identifier":{"id":"emilast.logfilehighlighter","uuid":"e8b488af-fccf-4adf-b60c-fc7455bea107"},"version":"2.16.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/emilast.logfilehighlighter-2.16.0","scheme":"file"},"relativeLocation":"emilast.logfilehighlighter-2.16.0","metadata":{"id":"e8b488af-fccf-4adf-b60c-fc7455bea107","publisherId":"4534c4fe-f5e7-4c04-943b-3a6dad3e61dc","publisherDisplayName":"Emil Åström","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687448119826,"preRelease":false}},{"identifier":{"id":"nonoroazoro.syncing","uuid":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f"},"version":"3.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/nonoroazoro.syncing-3.3.4","scheme":"file"},"relativeLocation":"nonoroazoro.syncing-3.3.4","metadata":{"id":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f","publisherId":"f6d9d666-6595-44fa-89fc-36a0c3e0c1fa","publisherDisplayName":"nonoroazoro","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687448650376,"preRelease":false}},{"identifier":{"id":"codezombiech.gitignore","uuid":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29"},"version":"0.9.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codezombiech.gitignore-0.9.0","scheme":"file"},"relativeLocation":"codezombiech.gitignore-0.9.0","metadata":{"id":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29","publisherId":"930310c4-ca8b-4e80-9d19-2b1507b2af61","publisherDisplayName":"CodeZombie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687461730753,"preRelease":false}},{"identifier":{"id":"mhutchie.git-graph","uuid":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7"},"version":"1.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mhutchie.git-graph-1.30.0","scheme":"file"},"relativeLocation":"mhutchie.git-graph-1.30.0","metadata":{"id":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7","publisherId":"996496dc-099f-469d-b89c-0d7713179365","publisherDisplayName":"mhutchie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687461730750,"preRelease":false}},{"identifier":{"id":"xuangeaha.just-enough-git","uuid":"2928fca8-125f-40c0-8b28-336febf471d9"},"version":"2023.4.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/xuangeaha.just-enough-git-2023.4.5","scheme":"file"},"relativeLocation":"xuangeaha.just-enough-git-2023.4.5","metadata":{"id":"2928fca8-125f-40c0-8b28-336febf471d9","publisherId":"658fea95-cfc2-48f9-a1ba-240a82577028","publisherDisplayName":"XuangeAha","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687461731466,"preRelease":false}},{"identifier":{"id":"vscodevim.vim","uuid":"d96e79c6-8b25-4be3-8545-0e0ecefcae03"},"version":"1.25.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/vscodevim.vim-1.25.2","scheme":"file"},"relativeLocation":"vscodevim.vim-1.25.2","metadata":{"id":"d96e79c6-8b25-4be3-8545-0e0ecefcae03","publisherId":"5d63889b-1b67-4b1f-8350-4f1dce041a26","publisherDisplayName":"vscodevim","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687513432409,"preRelease":false}},{"identifier":{"id":"pucelle.vscode-css-navigation","uuid":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb"},"version":"1.13.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pucelle.vscode-css-navigation-1.13.3","scheme":"file"},"relativeLocation":"pucelle.vscode-css-navigation-1.13.3","metadata":{"id":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb","publisherId":"7650fded-a9d9-4383-a346-4136ebe47608","publisherDisplayName":"pucelle","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687525767160,"preRelease":false}},{"identifier":{"id":"bierner.markdown-preview-github-styles","uuid":"5cbdf58a-694a-4aba-af08-61d00842eb03"},"version":"2.0.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.markdown-preview-github-styles-2.0.2","scheme":"file"},"relativeLocation":"bierner.markdown-preview-github-styles-2.0.2","metadata":{"id":"5cbdf58a-694a-4aba-af08-61d00842eb03","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526068773,"preRelease":false}},{"identifier":{"id":"davidanson.vscode-markdownlint","uuid":"daf8b44d-8aae-4da2-80c5-1f770219f643"},"version":"0.51.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/davidanson.vscode-markdownlint-0.51.0","scheme":"file"},"relativeLocation":"davidanson.vscode-markdownlint-0.51.0","metadata":{"id":"daf8b44d-8aae-4da2-80c5-1f770219f643","publisherId":"2e4d1cda-6ef0-4e42-a352-ab540afe8ff0","publisherDisplayName":"David Anson","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526078061,"preRelease":false}},{"identifier":{"id":"redhat.vscode-yaml","uuid":"2061917f-f76a-458a-8da9-f162de22b97e"},"version":"1.13.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-yaml-1.13.0","scheme":"file"},"relativeLocation":"redhat.vscode-yaml-1.13.0","metadata":{"id":"2061917f-f76a-458a-8da9-f162de22b97e","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526490062,"preRelease":false}},{"identifier":{"id":"yzhang.markdown-all-in-one","uuid":"98790d67-10fa-497c-9113-f6c7489207b2"},"version":"3.5.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yzhang.markdown-all-in-one-3.5.1","scheme":"file"},"relativeLocation":"yzhang.markdown-all-in-one-3.5.1","metadata":{"id":"98790d67-10fa-497c-9113-f6c7489207b2","publisherId":"36c8b41c-6ef6-4bf5-a5b7-65bef29b606f","publisherDisplayName":"Yu Zhang","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526549681,"preRelease":false}},{"identifier":{"id":"mechatroner.rainbow-csv","uuid":"3792588c-3d35-442d-91ea-fe6a755e8155"},"version":"3.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mechatroner.rainbow-csv-3.7.0","scheme":"file"},"relativeLocation":"mechatroner.rainbow-csv-3.7.0","metadata":{"id":"3792588c-3d35-442d-91ea-fe6a755e8155","publisherId":"0d5438b6-325a-4f88-aa28-6192aa2cf2a6","publisherDisplayName":"mechatroner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687534339390,"preRelease":false}},{"identifier":{"id":"chrmarti.regex","uuid":"7ed7bccd-f358-4c6f-88c0-1296185abaa1"},"version":"0.4.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/chrmarti.regex-0.4.0","scheme":"file"},"relativeLocation":"chrmarti.regex-0.4.0","metadata":{"id":"7ed7bccd-f358-4c6f-88c0-1296185abaa1","publisherId":"6c6b26a3-e134-4d03-ad02-7e48f7c9f342","publisherDisplayName":"Christof Marti","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687534788382,"preRelease":false}},{"identifier":{"id":"albert.tabout","uuid":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e"},"version":"0.2.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/albert.tabout-0.2.2","scheme":"file"},"relativeLocation":"albert.tabout-0.2.2","metadata":{"id":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e","publisherId":"f7f9797b-4ad7-43fc-8863-63698264f6f7","publisherDisplayName":"Albert Romkes","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687534875041,"preRelease":false}},{"identifier":{"id":"bierner.color-info","uuid":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9"},"version":"0.7.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.color-info-0.7.2","scheme":"file"},"relativeLocation":"bierner.color-info-0.7.2","metadata":{"id":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687609868675,"preRelease":false}},{"identifier":{"id":"yandeu.five-server","uuid":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5"},"version":"0.2.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yandeu.five-server-0.2.3","scheme":"file"},"relativeLocation":"yandeu.five-server-0.2.3","metadata":{"id":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5","publisherId":"a342b7ab-2d58-4313-9c2d-f506bb2aa10c","publisherDisplayName":"Yannick","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687609921654,"preRelease":false}},{"identifier":{"id":"jrebocho.vscode-random","uuid":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f"},"version":"1.11.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/jrebocho.vscode-random-1.11.0","scheme":"file"},"relativeLocation":"jrebocho.vscode-random-1.11.0","metadata":{"id":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f","publisherId":"4081ae01-a71e-4225-9b06-9dd59fe64e59","publisherDisplayName":"Jorge Rebocho","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687856820861,"preRelease":false}},{"identifier":{"id":"streetsidesoftware.code-spell-checker","uuid":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7"},"version":"2.20.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-2.20.5","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-2.20.5","metadata":{"id":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687857060185,"preRelease":false}},{"identifier":{"id":"streetsidesoftware.code-spell-checker-spanish","uuid":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb"},"version":"2.1.9","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-spanish-2.1.9","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-spanish-2.1.9","metadata":{"id":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687857078433,"preRelease":false}},{"identifier":{"id":"ms-vscode-remote.remote-ssh-edit","uuid":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c"},"version":"0.86.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-edit-0.86.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-edit-0.86.0","metadata":{"id":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687860707934,"preRelease":false}},{"identifier":{"id":"ms-vscode-remote.remote-ssh","uuid":"607fd052-be03-4363-b657-2bd62b83d28a"},"version":"0.102.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-0.102.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-0.102.0","metadata":{"id":"607fd052-be03-4363-b657-2bd62b83d28a","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687860708377,"preRelease":false}},{"identifier":{"id":"philsinatra.nested-comments","uuid":"03b96169-4c19-4c9e-ada8-d5d208ebe80e"},"version":"4.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/philsinatra.nested-comments-4.0.1","scheme":"file"},"relativeLocation":"philsinatra.nested-comments-4.0.1","metadata":{"id":"03b96169-4c19-4c9e-ada8-d5d208ebe80e","publisherId":"ee1ae119-5f58-4c1e-9274-290a7ad1d55f","publisherDisplayName":"Phil Sinatra","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1687880138284,"preRelease":false}},{"identifier":{"id":"ms-azuretools.vscode-docker","uuid":"0479fc1c-3d67-49f9-b087-fb9069afe48f"},"version":"1.25.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-azuretools.vscode-docker-1.25.2","scheme":"file"},"relativeLocation":"ms-azuretools.vscode-docker-1.25.2","metadata":{"id":"0479fc1c-3d67-49f9-b087-fb9069afe48f","publisherId":"52b787f2-79a9-4f32-99b4-393afe3005d3","publisherDisplayName":"Microsoft","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1688206455625,"preRelease":false}},{"identifier":{"id":"yutengjing.vscode-colorize-plus","uuid":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7"},"version":"0.12.13","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yutengjing.vscode-colorize-plus-0.12.13","scheme":"file"},"relativeLocation":"yutengjing.vscode-colorize-plus-0.12.13","metadata":{"id":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7","publisherId":"05f2f040-a2c0-4aae-a680-d6b707520bdd","publisherDisplayName":"YuTengjing","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1688295151628,"preRelease":false}},{"identifier":{"id":"wakatime.vscode-wakatime","uuid":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3"},"version":"24.2.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/wakatime.vscode-wakatime-24.2.0","scheme":"file"},"relativeLocation":"wakatime.vscode-wakatime-24.2.0","metadata":{"id":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3","publisherId":"27977793-9e84-451b-8977-744ce63f3d70","publisherDisplayName":"WakaTime","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1688377215442,"preRelease":false}},{"identifier":{"id":"brandonkirbyson.vscode-animations","uuid":"7d7c0d21-6653-4c11-9310-75b7180bbf81"},"version":"1.0.12","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/brandonkirbyson.vscode-animations-1.0.12","scheme":"file"},"relativeLocation":"brandonkirbyson.vscode-animations-1.0.12","metadata":{"id":"7d7c0d21-6653-4c11-9310-75b7180bbf81","publisherId":"55df104d-985f-438b-b4c6-3a5c30f35183","publisherDisplayName":"Brandon Kirbyson","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1688542884104,"preRelease":false}},{"identifier":{"id":"ms-vscode.remote-explorer","uuid":"11858313-52cc-4e57-b3e4-d7b65281e34b"},"version":"0.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode.remote-explorer-0.4.1","scheme":"file"},"relativeLocation":"ms-vscode.remote-explorer-0.4.1","metadata":{"id":"11858313-52cc-4e57-b3e4-d7b65281e34b","publisherId":"5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee","publisherDisplayName":"Microsoft","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689238830187,"preRelease":false}},{"identifier":{"id":"alefragnani.bookmarks","uuid":"b689fcc8-d494-4dbf-a228-2c694a578afc"},"version":"13.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.bookmarks-13.4.1","scheme":"file"},"relativeLocation":"alefragnani.bookmarks-13.4.1","metadata":{"id":"b689fcc8-d494-4dbf-a228-2c694a578afc","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689238830066,"preRelease":false}},{"identifier":{"id":"redhat.vscode-xml","uuid":"6703768d-d42f-474e-9f6e-5f288d53f6e8"},"version":"0.26.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-xml-0.26.1-linux-x64","scheme":"file"},"relativeLocation":"redhat.vscode-xml-0.26.1-linux-x64","metadata":{"id":"6703768d-d42f-474e-9f6e-5f288d53f6e8","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"linux-x64","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689238830007,"preRelease":false}},{"identifier":{"id":"visualstudioexptteam.intellicode-api-usage-examples","uuid":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3"},"version":"0.2.7","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.intellicode-api-usage-examples-0.2.7","scheme":"file"},"relativeLocation":"visualstudioexptteam.intellicode-api-usage-examples-0.2.7","metadata":{"id":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689260288044,"preRelease":false}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode","uuid":"876e8f93-74d0-4f4f-91b7-34a09f19f444"},"version":"1.2.30","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-1.2.30","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-1.2.30","metadata":{"id":"876e8f93-74d0-4f4f-91b7-34a09f19f444","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689260288117,"preRelease":false}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode-completions","uuid":"b8febe71-368d-482e-96f5-6f53d03e640b"},"version":"1.0.22","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-completions-1.0.22","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-completions-1.0.22","metadata":{"id":"b8febe71-368d-482e-96f5-6f53d03e640b","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689260299464,"preRelease":false}},{"identifier":{"id":"eamodio.gitlens","uuid":"4de763bd-505d-4978-9575-2b7696ecf94e"},"version":"14.1.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eamodio.gitlens-14.1.0","scheme":"file"},"relativeLocation":"eamodio.gitlens-14.1.0","metadata":{"id":"4de763bd-505d-4978-9575-2b7696ecf94e","publisherId":"678d198b-9b2e-49d3-96ff-6d801c9575df","publisherDisplayName":"GitKraken","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689319579032,"preRelease":false}},{"identifier":{"id":"usernamehw.errorlens","uuid":"9d8c32ab-354c-4daf-a9bf-20b633734435"},"version":"3.12.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/usernamehw.errorlens-3.12.0","scheme":"file"},"relativeLocation":"usernamehw.errorlens-3.12.0","metadata":{"id":"9d8c32ab-354c-4daf-a9bf-20b633734435","publisherId":"151820df-5dc5-4c97-8751-eb84643203fa","publisherDisplayName":"Alexander","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689321618490,"preRelease":false}},{"identifier":{"id":"pkief.material-icon-theme","uuid":"5db78037-f674-459f-a236-db622c427c5b"},"version":"4.29.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-icon-theme-4.29.0","scheme":"file"},"relativeLocation":"pkief.material-icon-theme-4.29.0","metadata":{"id":"5db78037-f674-459f-a236-db622c427c5b","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689416567227,"preRelease":false}},{"identifier":{"id":"codeium.codeium","uuid":"acab4f40-b6db-42ec-bcd1-01802cbdd988"},"version":"1.2.51","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codeium.codeium-1.2.51","scheme":"file"},"relativeLocation":"codeium.codeium-1.2.51","metadata":{"id":"acab4f40-b6db-42ec-bcd1-01802cbdd988","publisherId":"082b0525-4adf-4bcc-b60f-afa86c60860d","publisherDisplayName":"Codeium","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689424923250,"preRelease":false}},{"identifier":{"id":"leonardssh.vscord","uuid":"20675c06-f272-4cc8-8611-83ebb5583c5a"},"version":"5.1.14","location":{"$mid":1,"fsPath":"/home/matt/.vscode-oss/extensions/leonardssh.vscord-5.1.14","path":"/home/matt/.vscode-oss/extensions/leonardssh.vscord-5.1.14","scheme":"file"},"relativeLocation":"leonardssh.vscord-5.1.14","metadata":{"id":"20675c06-f272-4cc8-8611-83ebb5583c5a","publisherId":"2c34273e-24b8-499a-b859-8e27e48decc5","publisherDisplayName":"leonardssh","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689505379739,"preRelease":false}}] \ No newline at end of file +[{"identifier":{"id":"kisstkondoros.vscode-gutter-preview","uuid":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5"},"version":"0.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/kisstkondoros.vscode-gutter-preview-0.30.0","scheme":"file"},"relativeLocation":"kisstkondoros.vscode-gutter-preview-0.30.0","metadata":{"id":"eedfd044-d5ac-4389-973d-3ac1fdb98ad5","publisherId":"87e3e2a4-ac17-425a-a4b6-698bc44254fe","publisherDisplayName":null,"targetPlatform":"undefined","isApplicationScoped":false,"updated":false,"isPreReleaseVersion":false,"preRelease":false,"installedTimestamp":1661897741020}},{"identifier":{"id":"pkief.material-product-icons","uuid":"f797dacd-4e80-4f33-8b63-d665c0956013"},"version":"1.5.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-product-icons-1.5.0","scheme":"file"},"relativeLocation":"pkief.material-product-icons-1.5.0","metadata":{"id":"f797dacd-4e80-4f33-8b63-d665c0956013","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686496947697,"preRelease":false}},{"identifier":{"id":"alefragnani.project-manager","uuid":"1b747f06-3789-4ebd-ac99-f1fe430c3347"},"version":"12.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.project-manager-12.7.0","scheme":"file"},"relativeLocation":"alefragnani.project-manager-12.7.0","metadata":{"id":"1b747f06-3789-4ebd-ac99-f1fe430c3347","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686500619115,"preRelease":false}},{"identifier":{"id":"catppuccin.catppuccin-vsc","uuid":"69264e4d-cd3b-468a-8f2b-e69673c7d864"},"version":"2.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/catppuccin.catppuccin-vsc-2.7.0","scheme":"file"},"relativeLocation":"catppuccin.catppuccin-vsc-2.7.0","metadata":{"id":"69264e4d-cd3b-468a-8f2b-e69673c7d864","publisherId":"e7d2ed61-53e0-4dd4-afbe-f536c3bb4316","publisherDisplayName":"Catppuccin","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686757275010,"preRelease":false}},{"identifier":{"id":"rafamel.subtle-brackets","uuid":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8"},"version":"3.0.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/rafamel.subtle-brackets-3.0.0","scheme":"file"},"relativeLocation":"rafamel.subtle-brackets-3.0.0","metadata":{"id":"d477f472-4e0f-4b5c-bb35-b7c157fa4eb8","publisherId":"7658adf6-ca84-42d4-8958-da3f6861451a","publisherDisplayName":"Rafa Mel","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686849770863,"preRelease":false}},{"identifier":{"id":"eugenejeon.codesnap-plus-fix","uuid":"b6406d8e-9c12-4078-8150-ca498169cf08"},"version":"1.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eugenejeon.codesnap-plus-fix-1.0.1","scheme":"file"},"relativeLocation":"eugenejeon.codesnap-plus-fix-1.0.1","metadata":{"id":"b6406d8e-9c12-4078-8150-ca498169cf08","publisherId":"b5f3798b-9da6-48b5-b246-c158aad3debc","publisherDisplayName":"Eugene Jeon","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686850202418,"preRelease":false}},{"identifier":{"id":"be5invis.vscode-custom-css","uuid":"1b160753-ae5e-42bb-82ad-d115ce5c10f4"},"version":"7.2.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/be5invis.vscode-custom-css-7.2.1","scheme":"file"},"relativeLocation":"be5invis.vscode-custom-css-7.2.1","metadata":{"id":"1b160753-ae5e-42bb-82ad-d115ce5c10f4","publisherId":"8c148d69-cbc6-480b-bd8b-a42715926324","publisherDisplayName":"be5invis","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686854743467,"preRelease":false}},{"identifier":{"id":"exodiusstudios.comment-anchors","uuid":"5cf10212-681f-48c7-b66f-bcce5dc44a64"},"version":"1.10.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/exodiusstudios.comment-anchors-1.10.3","scheme":"file"},"relativeLocation":"exodiusstudios.comment-anchors-1.10.3","metadata":{"id":"5cf10212-681f-48c7-b66f-bcce5dc44a64","publisherId":"9069d21e-e9c6-4063-8f3a-026d317bb8f4","publisherDisplayName":"Starlane Studios","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686999443730,"preRelease":false}},{"identifier":{"id":"aic.docify","uuid":"aa33eae5-0c47-4b2a-a1e3-b95553fea360"},"version":"1.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/aic.docify-1.3.4","scheme":"file"},"relativeLocation":"aic.docify-1.3.4","metadata":{"id":"aa33eae5-0c47-4b2a-a1e3-b95553fea360","publisherId":"0832ad01-00f9-475b-adc0-143baef69236","publisherDisplayName":"AIC","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1686999693827,"preRelease":false}},{"identifier":{"id":"ibm.output-colorizer","uuid":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f"},"version":"0.1.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ibm.output-colorizer-0.1.2","scheme":"file"},"relativeLocation":"ibm.output-colorizer-0.1.2","metadata":{"id":"113b22c8-8125-42ec-8c6b-80c3f5d5fa5f","publisherId":"8f186bac-3651-4797-9216-ba30633f600b","publisherDisplayName":"IBM","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687373679322,"preRelease":false}},{"identifier":{"id":"emilast.logfilehighlighter","uuid":"e8b488af-fccf-4adf-b60c-fc7455bea107"},"version":"2.16.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/emilast.logfilehighlighter-2.16.0","scheme":"file"},"relativeLocation":"emilast.logfilehighlighter-2.16.0","metadata":{"id":"e8b488af-fccf-4adf-b60c-fc7455bea107","publisherId":"4534c4fe-f5e7-4c04-943b-3a6dad3e61dc","publisherDisplayName":"Emil Åström","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687448119826,"preRelease":false}},{"identifier":{"id":"nonoroazoro.syncing","uuid":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f"},"version":"3.3.4","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/nonoroazoro.syncing-3.3.4","scheme":"file"},"relativeLocation":"nonoroazoro.syncing-3.3.4","metadata":{"id":"e7db78ad-ac9f-4919-99bb-3627e07b6d1f","publisherId":"f6d9d666-6595-44fa-89fc-36a0c3e0c1fa","publisherDisplayName":"nonoroazoro","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687448650376,"preRelease":false}},{"identifier":{"id":"codezombiech.gitignore","uuid":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29"},"version":"0.9.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codezombiech.gitignore-0.9.0","scheme":"file"},"relativeLocation":"codezombiech.gitignore-0.9.0","metadata":{"id":"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29","publisherId":"930310c4-ca8b-4e80-9d19-2b1507b2af61","publisherDisplayName":"CodeZombie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687461730753,"preRelease":false}},{"identifier":{"id":"mhutchie.git-graph","uuid":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7"},"version":"1.30.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mhutchie.git-graph-1.30.0","scheme":"file"},"relativeLocation":"mhutchie.git-graph-1.30.0","metadata":{"id":"438221f8-1107-4ccd-a6fe-f3b7fe0856b7","publisherId":"996496dc-099f-469d-b89c-0d7713179365","publisherDisplayName":"mhutchie","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687461730750,"preRelease":false}},{"identifier":{"id":"xuangeaha.just-enough-git","uuid":"2928fca8-125f-40c0-8b28-336febf471d9"},"version":"2023.4.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/xuangeaha.just-enough-git-2023.4.5","scheme":"file"},"relativeLocation":"xuangeaha.just-enough-git-2023.4.5","metadata":{"id":"2928fca8-125f-40c0-8b28-336febf471d9","publisherId":"658fea95-cfc2-48f9-a1ba-240a82577028","publisherDisplayName":"XuangeAha","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687461731466,"preRelease":false}},{"identifier":{"id":"vscodevim.vim","uuid":"d96e79c6-8b25-4be3-8545-0e0ecefcae03"},"version":"1.25.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/vscodevim.vim-1.25.2","scheme":"file"},"relativeLocation":"vscodevim.vim-1.25.2","metadata":{"id":"d96e79c6-8b25-4be3-8545-0e0ecefcae03","publisherId":"5d63889b-1b67-4b1f-8350-4f1dce041a26","publisherDisplayName":"vscodevim","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687513432409,"preRelease":false}},{"identifier":{"id":"pucelle.vscode-css-navigation","uuid":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb"},"version":"1.13.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pucelle.vscode-css-navigation-1.13.3","scheme":"file"},"relativeLocation":"pucelle.vscode-css-navigation-1.13.3","metadata":{"id":"f97a6398-d553-44cf-9ebf-54e8dbf8d3fb","publisherId":"7650fded-a9d9-4383-a346-4136ebe47608","publisherDisplayName":"pucelle","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687525767160,"preRelease":false}},{"identifier":{"id":"bierner.markdown-preview-github-styles","uuid":"5cbdf58a-694a-4aba-af08-61d00842eb03"},"version":"2.0.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.markdown-preview-github-styles-2.0.2","scheme":"file"},"relativeLocation":"bierner.markdown-preview-github-styles-2.0.2","metadata":{"id":"5cbdf58a-694a-4aba-af08-61d00842eb03","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526068773,"preRelease":false}},{"identifier":{"id":"davidanson.vscode-markdownlint","uuid":"daf8b44d-8aae-4da2-80c5-1f770219f643"},"version":"0.51.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/davidanson.vscode-markdownlint-0.51.0","scheme":"file"},"relativeLocation":"davidanson.vscode-markdownlint-0.51.0","metadata":{"id":"daf8b44d-8aae-4da2-80c5-1f770219f643","publisherId":"2e4d1cda-6ef0-4e42-a352-ab540afe8ff0","publisherDisplayName":"David Anson","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526078061,"preRelease":false}},{"identifier":{"id":"redhat.vscode-yaml","uuid":"2061917f-f76a-458a-8da9-f162de22b97e"},"version":"1.13.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-yaml-1.13.0","scheme":"file"},"relativeLocation":"redhat.vscode-yaml-1.13.0","metadata":{"id":"2061917f-f76a-458a-8da9-f162de22b97e","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526490062,"preRelease":false}},{"identifier":{"id":"yzhang.markdown-all-in-one","uuid":"98790d67-10fa-497c-9113-f6c7489207b2"},"version":"3.5.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yzhang.markdown-all-in-one-3.5.1","scheme":"file"},"relativeLocation":"yzhang.markdown-all-in-one-3.5.1","metadata":{"id":"98790d67-10fa-497c-9113-f6c7489207b2","publisherId":"36c8b41c-6ef6-4bf5-a5b7-65bef29b606f","publisherDisplayName":"Yu Zhang","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687526549681,"preRelease":false}},{"identifier":{"id":"mechatroner.rainbow-csv","uuid":"3792588c-3d35-442d-91ea-fe6a755e8155"},"version":"3.7.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/mechatroner.rainbow-csv-3.7.0","scheme":"file"},"relativeLocation":"mechatroner.rainbow-csv-3.7.0","metadata":{"id":"3792588c-3d35-442d-91ea-fe6a755e8155","publisherId":"0d5438b6-325a-4f88-aa28-6192aa2cf2a6","publisherDisplayName":"mechatroner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687534339390,"preRelease":false}},{"identifier":{"id":"chrmarti.regex","uuid":"7ed7bccd-f358-4c6f-88c0-1296185abaa1"},"version":"0.4.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/chrmarti.regex-0.4.0","scheme":"file"},"relativeLocation":"chrmarti.regex-0.4.0","metadata":{"id":"7ed7bccd-f358-4c6f-88c0-1296185abaa1","publisherId":"6c6b26a3-e134-4d03-ad02-7e48f7c9f342","publisherDisplayName":"Christof Marti","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687534788382,"preRelease":false}},{"identifier":{"id":"albert.tabout","uuid":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e"},"version":"0.2.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/albert.tabout-0.2.2","scheme":"file"},"relativeLocation":"albert.tabout-0.2.2","metadata":{"id":"4ef6c2d5-de36-45a1-9015-18c1d4a3a25e","publisherId":"f7f9797b-4ad7-43fc-8863-63698264f6f7","publisherDisplayName":"Albert Romkes","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687534875041,"preRelease":false}},{"identifier":{"id":"bierner.color-info","uuid":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9"},"version":"0.7.2","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/bierner.color-info-0.7.2","scheme":"file"},"relativeLocation":"bierner.color-info-0.7.2","metadata":{"id":"0f8bd812-5d52-4fff-bd1c-6b0a7ee9cad9","publisherId":"f164f116-e2aa-496b-84dc-2451248e8beb","publisherDisplayName":"Matt Bierner","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687609868675,"preRelease":false}},{"identifier":{"id":"yandeu.five-server","uuid":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5"},"version":"0.2.3","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yandeu.five-server-0.2.3","scheme":"file"},"relativeLocation":"yandeu.five-server-0.2.3","metadata":{"id":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5","publisherId":"a342b7ab-2d58-4313-9c2d-f506bb2aa10c","publisherDisplayName":"Yannick","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687609921654,"preRelease":false}},{"identifier":{"id":"jrebocho.vscode-random","uuid":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f"},"version":"1.11.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/jrebocho.vscode-random-1.11.0","scheme":"file"},"relativeLocation":"jrebocho.vscode-random-1.11.0","metadata":{"id":"a4678ccd-2309-4cdd-b6cf-94af8dd7001f","publisherId":"4081ae01-a71e-4225-9b06-9dd59fe64e59","publisherDisplayName":"Jorge Rebocho","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687856820861,"preRelease":false}},{"identifier":{"id":"streetsidesoftware.code-spell-checker","uuid":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7"},"version":"2.20.5","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-2.20.5","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-2.20.5","metadata":{"id":"f6dbd813-b0a0-42c1-90ea-10dde9d925a7","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687857060185,"preRelease":false}},{"identifier":{"id":"streetsidesoftware.code-spell-checker-spanish","uuid":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb"},"version":"2.1.9","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/streetsidesoftware.code-spell-checker-spanish-2.1.9","scheme":"file"},"relativeLocation":"streetsidesoftware.code-spell-checker-spanish-2.1.9","metadata":{"id":"8d6dcf6f-1957-4dd5-809e-addb07d8c1fb","publisherId":"67600ca7-88fb-4104-9f7e-dd51c00facf2","publisherDisplayName":"Street Side Software","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687857078433,"preRelease":false}},{"identifier":{"id":"ms-vscode-remote.remote-ssh-edit","uuid":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c"},"version":"0.86.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-edit-0.86.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-edit-0.86.0","metadata":{"id":"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687860707934,"preRelease":false}},{"identifier":{"id":"ms-vscode-remote.remote-ssh","uuid":"607fd052-be03-4363-b657-2bd62b83d28a"},"version":"0.102.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode-remote.remote-ssh-0.102.0","scheme":"file"},"relativeLocation":"ms-vscode-remote.remote-ssh-0.102.0","metadata":{"id":"607fd052-be03-4363-b657-2bd62b83d28a","publisherId":"ac9410a2-0d75-40ec-90de-b59bb705801d","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1687860708377,"preRelease":false}},{"identifier":{"id":"philsinatra.nested-comments","uuid":"03b96169-4c19-4c9e-ada8-d5d208ebe80e"},"version":"4.0.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/philsinatra.nested-comments-4.0.1","scheme":"file"},"relativeLocation":"philsinatra.nested-comments-4.0.1","metadata":{"id":"03b96169-4c19-4c9e-ada8-d5d208ebe80e","publisherId":"ee1ae119-5f58-4c1e-9274-290a7ad1d55f","publisherDisplayName":"Phil Sinatra","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1687880138284,"preRelease":false}},{"identifier":{"id":"yutengjing.vscode-colorize-plus","uuid":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7"},"version":"0.12.13","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/yutengjing.vscode-colorize-plus-0.12.13","scheme":"file"},"relativeLocation":"yutengjing.vscode-colorize-plus-0.12.13","metadata":{"id":"beb993a6-6574-4cb8-9fa7-365fc6bb7fd7","publisherId":"05f2f040-a2c0-4aae-a680-d6b707520bdd","publisherDisplayName":"YuTengjing","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1688295151628,"preRelease":false}},{"identifier":{"id":"wakatime.vscode-wakatime","uuid":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3"},"version":"24.2.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/wakatime.vscode-wakatime-24.2.0","scheme":"file"},"relativeLocation":"wakatime.vscode-wakatime-24.2.0","metadata":{"id":"f2fd462f-f1bd-4c62-b54f-59a4e5ffc6a3","publisherId":"27977793-9e84-451b-8977-744ce63f3d70","publisherDisplayName":"WakaTime","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1688377215442,"preRelease":false}},{"identifier":{"id":"brandonkirbyson.vscode-animations","uuid":"7d7c0d21-6653-4c11-9310-75b7180bbf81"},"version":"1.0.12","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/brandonkirbyson.vscode-animations-1.0.12","scheme":"file"},"relativeLocation":"brandonkirbyson.vscode-animations-1.0.12","metadata":{"id":"7d7c0d21-6653-4c11-9310-75b7180bbf81","publisherId":"55df104d-985f-438b-b4c6-3a5c30f35183","publisherDisplayName":"Brandon Kirbyson","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1688542884104,"preRelease":false}},{"identifier":{"id":"ms-vscode.remote-explorer","uuid":"11858313-52cc-4e57-b3e4-d7b65281e34b"},"version":"0.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/ms-vscode.remote-explorer-0.4.1","scheme":"file"},"relativeLocation":"ms-vscode.remote-explorer-0.4.1","metadata":{"id":"11858313-52cc-4e57-b3e4-d7b65281e34b","publisherId":"5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee","publisherDisplayName":"Microsoft","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689238830187,"preRelease":false}},{"identifier":{"id":"alefragnani.bookmarks","uuid":"b689fcc8-d494-4dbf-a228-2c694a578afc"},"version":"13.4.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/alefragnani.bookmarks-13.4.1","scheme":"file"},"relativeLocation":"alefragnani.bookmarks-13.4.1","metadata":{"id":"b689fcc8-d494-4dbf-a228-2c694a578afc","publisherId":"3fbdef65-bdf5-4723-aeaf-9e12a50546ef","publisherDisplayName":"Alessandro Fragnani","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689238830066,"preRelease":false}},{"identifier":{"id":"redhat.vscode-xml","uuid":"6703768d-d42f-474e-9f6e-5f288d53f6e8"},"version":"0.26.1","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/redhat.vscode-xml-0.26.1-linux-x64","scheme":"file"},"relativeLocation":"redhat.vscode-xml-0.26.1-linux-x64","metadata":{"id":"6703768d-d42f-474e-9f6e-5f288d53f6e8","publisherId":"eed56242-9699-4317-8bc7-e9f4b9bdd3ff","publisherDisplayName":"Red Hat","targetPlatform":"linux-x64","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689238830007,"preRelease":false}},{"identifier":{"id":"visualstudioexptteam.intellicode-api-usage-examples","uuid":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3"},"version":"0.2.7","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.intellicode-api-usage-examples-0.2.7","scheme":"file"},"relativeLocation":"visualstudioexptteam.intellicode-api-usage-examples-0.2.7","metadata":{"id":"9fa2a00e-3bfa-4c2a-abc4-a865bb2b5cf3","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689260288044,"preRelease":false}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode","uuid":"876e8f93-74d0-4f4f-91b7-34a09f19f444"},"version":"1.2.30","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-1.2.30","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-1.2.30","metadata":{"id":"876e8f93-74d0-4f4f-91b7-34a09f19f444","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689260288117,"preRelease":false}},{"identifier":{"id":"visualstudioexptteam.vscodeintellicode-completions","uuid":"b8febe71-368d-482e-96f5-6f53d03e640b"},"version":"1.0.22","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/visualstudioexptteam.vscodeintellicode-completions-1.0.22","scheme":"file"},"relativeLocation":"visualstudioexptteam.vscodeintellicode-completions-1.0.22","metadata":{"id":"b8febe71-368d-482e-96f5-6f53d03e640b","publisherId":"e8db1608-52e8-4d8d-92a6-779c5db302a9","publisherDisplayName":"Microsoft","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689260299464,"preRelease":false}},{"identifier":{"id":"eamodio.gitlens","uuid":"4de763bd-505d-4978-9575-2b7696ecf94e"},"version":"14.1.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/eamodio.gitlens-14.1.0","scheme":"file"},"relativeLocation":"eamodio.gitlens-14.1.0","metadata":{"id":"4de763bd-505d-4978-9575-2b7696ecf94e","publisherId":"678d198b-9b2e-49d3-96ff-6d801c9575df","publisherDisplayName":"GitKraken","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689319579032,"preRelease":false}},{"identifier":{"id":"usernamehw.errorlens","uuid":"9d8c32ab-354c-4daf-a9bf-20b633734435"},"version":"3.12.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/usernamehw.errorlens-3.12.0","scheme":"file"},"relativeLocation":"usernamehw.errorlens-3.12.0","metadata":{"id":"9d8c32ab-354c-4daf-a9bf-20b633734435","publisherId":"151820df-5dc5-4c97-8751-eb84643203fa","publisherDisplayName":"Alexander","targetPlatform":"undefined","isApplicationScoped":false,"isMachineScoped":false,"isBuiltin":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689321618490,"preRelease":false}},{"identifier":{"id":"pkief.material-icon-theme","uuid":"5db78037-f674-459f-a236-db622c427c5b"},"version":"4.29.0","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/pkief.material-icon-theme-4.29.0","scheme":"file"},"relativeLocation":"pkief.material-icon-theme-4.29.0","metadata":{"id":"5db78037-f674-459f-a236-db622c427c5b","publisherId":"f9e5bc2f-fea1-4075-917f-d83e01e69f56","publisherDisplayName":"Philipp Kief","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689416567227,"preRelease":false}},{"identifier":{"id":"codeium.codeium","uuid":"acab4f40-b6db-42ec-bcd1-01802cbdd988"},"version":"1.2.51","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/codeium.codeium-1.2.51","scheme":"file"},"relativeLocation":"codeium.codeium-1.2.51","metadata":{"id":"acab4f40-b6db-42ec-bcd1-01802cbdd988","publisherId":"082b0525-4adf-4bcc-b60f-afa86c60860d","publisherDisplayName":"Codeium","targetPlatform":"undefined","updated":false,"isPreReleaseVersion":false,"installedTimestamp":1689424923250,"preRelease":false}},{"identifier":{"id":"leonardssh.vscord","uuid":"20675c06-f272-4cc8-8611-83ebb5583c5a"},"version":"5.1.14","location":{"$mid":1,"path":"/home/matt/.vscode-oss/extensions/leonardssh.vscord-5.1.14","scheme":"file"},"relativeLocation":"leonardssh.vscord-5.1.14","metadata":{"id":"20675c06-f272-4cc8-8611-83ebb5583c5a","publisherId":"2c34273e-24b8-499a-b859-8e27e48decc5","publisherDisplayName":"leonardssh","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689505379739,"preRelease":false}},{"identifier":{"id":"ms-azuretools.vscode-docker","uuid":"0479fc1c-3d67-49f9-b087-fb9069afe48f"},"version":"1.26.0","location":{"$mid":1,"fsPath":"/home/matt/.vscode-oss/extensions/ms-azuretools.vscode-docker-1.26.0","path":"/home/matt/.vscode-oss/extensions/ms-azuretools.vscode-docker-1.26.0","scheme":"file"},"relativeLocation":"ms-azuretools.vscode-docker-1.26.0","metadata":{"id":"0479fc1c-3d67-49f9-b087-fb9069afe48f","publisherId":"52b787f2-79a9-4f32-99b4-393afe3005d3","publisherDisplayName":"Microsoft","targetPlatform":"undefined","isApplicationScoped":false,"updated":true,"isPreReleaseVersion":false,"installedTimestamp":1689607985192,"preRelease":false}}] \ No newline at end of file diff --git a/.zshrc b/.zshrc index 577d7412..7376645e 100644 --- a/.zshrc +++ b/.zshrc @@ -128,13 +128,18 @@ alias yayupdate='yay -Syu' alias search='pacseek' alias gpt='tgpt' alias clock='tty-clock -sbc' -alias l='xplr' +alias files='xplr' alias sysproc='sysz' alias cat='bat' alias dots='yadm enter lazygit' +alias audiorestart='systemctl --user restart wireplumber pipewire pipewire-pulse' +alias info='tldr' +alias cd='z' +alias disks='duf' +alias cdh='zi' PATH=$PATH:/home/matt/.local/bin TERMINAL=$TERMINAL:/usr/bin/kitty export EDITOR=codium - neofetch +neofetch