diff --git a/README.md b/README.md index f542a69..f721071 100644 --- a/README.md +++ b/README.md @@ -69,14 +69,23 @@ cobalt is ***NOT*** a piracy tool and cannot be used as such. it can only downlo cobalt is my passion project, update schedule depends solely on my free time, motivation, and mood. don't expect any consistency in update releases. -## cobalt licenses +## cobalt license cobalt code is licensed under [AGPL-3.0](https://github.com/wukko/cobalt/blob/current/LICENSE). -update banners and various assets of cobalt branding included within the repo are *not* covered by the AGPL-3.0 license and cannot be used using same terms. +cobalt branding, mascots, and other related assets included in the repo are ***copyrighted*** and not covered by the AGPL-3.0 license. you ***cannot*** use them under same terms. + +you are allowed to host an ***unmodified*** instance of cobalt with branding, but this ***does not*** give you permission to use it anywhere else, or make derivatives of it in any way. + +### notes: +- mascots and other assets are a part of the branding. + +- when making an alternative version of the project, please replace or remove all branding (including the name). + +- you **must** link the original repo when using any parts of code (such as using separate processing modules in your project) or forking the project. + +- if you make a modified version of cobalt, the codebase **must** be published under the same license (according to AGPL-3.0). ## 3rd party licenses -[Fluent Emoji by Microsoft](https://github.com/microsoft/fluentui-emoji) (used in cobalt) is under [MIT](https://github.com/microsoft/fluentui-emoji/blob/main/LICENSE) license. - -[Noto Sans Mono](https://fonts.google.com/noto/specimen/Noto+Sans+Mono/) fonts (used in cobalt) are licensed under the [OFL](https://fonts.google.com/noto/specimen/Noto+Sans+Mono/about) license. - -many update banners were taken from [tenor.com](https://tenor.com/). \ No newline at end of file +- [Fluent Emoji by Microsoft](https://github.com/microsoft/fluentui-emoji) (used in cobalt) is under [MIT](https://github.com/microsoft/fluentui-emoji/blob/main/LICENSE) license. +- [Noto Sans Mono](https://fonts.google.com/noto/specimen/Noto+Sans+Mono/) fonts (used in cobalt) are licensed under the [OFL](https://fonts.google.com/noto/specimen/Noto+Sans+Mono/about) license. +- many update banners were taken from [tenor.com](https://tenor.com/). diff --git a/src/config.json b/src/config.json index ae0c16f..f1aa4a2 100644 --- a/src/config.json +++ b/src/config.json @@ -54,7 +54,8 @@ } }, "links": { - "saveToGalleryShortcut": "https://www.icloud.com/shortcuts/b401917928fd407daf1db0fd07eb7e78", + "saveToGalleryShortcut": "https://www.icloud.com/shortcuts/14e9aebf04b24156acc34ceccf7e6fcd", + "saveToFilesShortcut": "https://www.icloud.com/shortcuts/2134cd9d4d6b41448b2201f933542b2e", "statusPage": "https://status.cobalt.tools/", "troubleshootingGuide": "https://github.com/wukko/cobalt/blob/current/docs/troubleshooting.md" }, diff --git a/src/front/assets/meowbalt/error.png b/src/front/assets/meowbalt/error.png new file mode 100644 index 0000000..533858a Binary files /dev/null and b/src/front/assets/meowbalt/error.png differ diff --git a/src/front/assets/meowbalt/question.png b/src/front/assets/meowbalt/question.png new file mode 100644 index 0000000..330cd69 Binary files /dev/null and b/src/front/assets/meowbalt/question.png differ diff --git a/src/front/cobalt.css b/src/front/cobalt.css index 585fb4e..267092c 100644 --- a/src/front/cobalt.css +++ b/src/front/cobalt.css @@ -192,7 +192,7 @@ input[type="text"], z-index: -1; position: absolute; border: var(--accent-highlight) solid 0.15rem; - border-radius: 8px/9px; + border-radius: 22px; } .desktop button:hover, .desktop .switch:hover, @@ -441,11 +441,17 @@ button:active, -webkit-backdrop-filter: blur(7px); } .popup.small { - width: 20%; + width: 21rem; box-shadow: 0px 0px 60px 0px var(--accent-hover); - padding: 1.7rem; + padding: 18px; transform: translate(-50%,-50%)scale(.95); pointer-events: all; + border-radius: 22px; +} +.popup.small .popup-content-inner { + display: flex; + flex-direction: column; + gap: 18px; } .popup.small.visible { transform: translate(-50%, -50%); @@ -462,12 +468,30 @@ button:active, .popup.small .popup-title { margin-bottom: 0.6rem; } -.popup.small .explanation { - margin-bottom: 0.9rem; -} .popup.small .close-error.switch { background: var(--accent)!important; color: var(--background); + height: 2.5rem; +} +#popup-error, +#popup-download { + display: flex; + flex-direction: column; + padding-top: 4rem; +} +#popup-error { + justify-content: center; + align-items: center; +} +.popout-meowbalt { + position: absolute; + top: -7rem; + user-select: none; + -webkit-user-select: none; + pointer-events: none; + height: 180px; + width: 180px; + aspect-ratio: 1/1; } .popup.scrollable { height: 95%; @@ -531,7 +555,8 @@ button:active, -webkit-user-select: text; } .desc-error { - padding-bottom: 1.5rem; + padding-bottom: 0rem; + text-align: center; } .popup-title { font-size: 1.5rem; @@ -957,44 +982,43 @@ button:active, .changelog-img, .changelog-banner, .close-error, -.changelog-tag-version, #download-switcher .switch, #popup-about .switch, .popup-tabs .switch, .text-to-copy, .text-to-copy.text-backdrop, #filename-preview { - border-radius: 6px / 7px; + border-radius: 8px / 9px; } [type=checkbox] { border-radius: 3px / 4px; } .popup, .scrollable .popup-content { - border-radius: 8px; + border-radius: 12px; } .popup-header .glass-bkg { - border-top-left-radius: 8px 9px; - border-top-right-radius: 8px 9px; + border-top-left-radius: 11px 12px; + border-top-right-radius: 11px 12px; border-bottom: var(--accent-highlight) solid 0.1rem; top: -1px; } .popup-tabs .glass-bkg { - border-bottom-left-radius: 8px 9px; - border-bottom-right-radius: 8px 9px; + border-bottom-left-radius: 11px 12px; + border-bottom-right-radius: 11px 12px; border-top: var(--accent-highlight) solid 0.1rem; bottom: -1px; } -.switches :first-child { - border-top-left-radius: 6px 7px; - border-bottom-left-radius: 6px 7px; +.switches .switch:first-child { + border-top-left-radius: 8px 9px; + border-bottom-left-radius: 8px 9px; } -.switches :last-child { - border-top-right-radius: 6px 7px; - border-bottom-right-radius: 6px 7px; +.switches .switch:last-child { + border-top-right-radius: 8px 9px; + border-bottom-right-radius: 8px 9px; } .text-backdrop { - border-radius: 3px / 4px; + border-radius: 4px / 5px; } .collapse-list:first-child, .collapse-list:first-child .collapse-header { @@ -1017,17 +1041,11 @@ button:active, } /* adapt the page according to screen size */ @media screen and (max-width: 1550px) { - .popup.small { - width: 25% - } .popup { width: 40%; } } @media screen and (max-width: 1440px) { - .popup.small { - width: 30% - } .popup { width: 45%; } @@ -1038,17 +1056,11 @@ button:active, } } @media screen and (max-width: 1200px) { - .popup.small { - width: 35% - } .popup { width: 55%; } } @media screen and (max-width: 1025px) { - .popup.small { - width: 40% - } .popup { width: 60%; } @@ -1058,6 +1070,16 @@ button:active, width: 75%; } } +@media screen and (max-width: 680px) { + .popup { + width: 90%; + } +} +@media screen and (max-width: 660px) { + #cobalt-main-box { + width: calc(100% - (0.7rem * 2)); + } +} /* mobile page */ @media screen and (max-width: 499px) { .tab { @@ -1070,10 +1092,7 @@ button:active, width: calc(100% - 1.3rem); } } -@media screen and (max-width: 660px) { - #cobalt-main-box { - width: calc(100% - (0.7rem * 2)); - } +@media screen and (max-width: 535px) { #cobalt-main-box #bottom { flex-direction: row-reverse; } @@ -1128,7 +1147,7 @@ button:active, transform: unset; } .popup.small { - width: calc(100% - 1.7rem * 2); + width: calc(100% - 18px * 2); height: auto; top: unset; bottom: 0; @@ -1143,8 +1162,8 @@ button:active, border-top: var(--accent-highlight) solid 0.15rem; } .popup.small.visible { - transform: none; - transition: transform 210ms cubic-bezier(0.062, 0.82, 0.165, 1), opacity 130ms ease-in-out; + transform: translateY(0rem); + transition: transform 250ms cubic-bezier(0.075, 0.82, 0.165, 1), opacity 130ms ease-in-out; } .popup.small .popup-header { background: none; diff --git a/src/front/cobalt.js b/src/front/cobalt.js index cdf143b..4efedcd 100644 --- a/src/front/cobalt.js +++ b/src/front/cobalt.js @@ -8,7 +8,7 @@ const isFirefox = ua.match("firefox/"); const isOldFirefox = ua.match("firefox/") && ua.split("firefox/")[1].split('.')[0] < 103; const regex = new RegExp(/https:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/); -const notification = `
`; +const notification = ``; const switchers = { "theme": ["auto", "light", "dark"], @@ -600,15 +600,11 @@ window.onload = () => { if (setUn !== null) { if (setUn) { sSet("migrated", "true") - eid("desc-migration").innerHTML += `

${loc.DataTransferSuccess}` - } else { - eid("desc-migration").innerHTML += `

${loc.DataTransferError}` } } } loadSettings(); detectColorScheme(); - popup("migration", 1); } window.history.replaceState(null, '', window.location.pathname); diff --git a/src/localization/languages/en.json b/src/localization/languages/en.json index 7bc6900..587b7ca 100644 --- a/src/localization/languages/en.json +++ b/src/localization/languages/en.json @@ -16,7 +16,6 @@ "AccessibilityOpenDonate": "open donation popup", "TitlePopupAbout": "what's cobalt?", "TitlePopupSettings": "settings", - "TitlePopupError": "uh-oh...", "TitlePopupChangelog": "what's new?", "TitlePopupDonate": "support cobalt", "TitlePopupDownload": "how to save?", @@ -46,7 +45,7 @@ "AccessibilityEnableDownloadPopup": "ask what to do with downloads", "SettingsQualityDescription": "if selected quality isn't available, closest one is used instead.", "NoScriptMessage": "cobalt uses javascript for api requests and interactive interface. you have to allow javascript to use this site. there are no pesty scripts, pinky promise.", - "DownloadPopupDescriptionIOS": "easiest way to save videos on ios:\n1. add this siri shortcut.\n2. press \"share\" above and select \"save to photos\" in appeared share sheet.\nif asked, review the permission request, and press \"always allow\".\n\nalternative method:\npress and hold the download button, hide the video preview, and select \"download linked file\" to download.\nthen, open safari downloads, select the file you downloaded, open share menu, and finally press \"save video\".", + "DownloadPopupDescriptionIOS": "how to save to photos:\n1. add save to photos shortcut.\n2. press \"share\" button above this text.\n3. select \"save to photos\" in the share sheet.\n\nhow to save to files:\n1. add save to files shortcut.\n2. press \"share\" button above this text.\n3. select \"save to files\" in the share sheet.\n4. select a folder to save the file to and press \"open\".\n\nboth shortcuts can only be used from the cobalt web app.", "DownloadPopupDescription": "download button opens a new tab with requested file. you can disable this popup in settings.", "ClickToCopy": "press to copy", "Download": "download", @@ -91,7 +90,7 @@ "ChangelogPressToHide": "collapse", "Donate": "donate", "DonateSub": "help it stay online", - "DonateExplanation": "cobalt doesn't shove ads in your face and doesn't sell your personal data, and thus is completely free to use for everyone. but development and maintenance of a media-heavy service used by over 350k people is quite costly. both in terms of time and money. as a student, it's rather difficult for me to handle such expenses on my own.\n\nif cobalt has helped you in the past and you want to keep it growing and evolving, you can do so by making a donation!\n\nby donating you're helping everyone who uses cobalt: teachers, students, musicians, content creators, artists, lecturers, and many, many more!\n\nin past few months donations have let me:\n*; increase stability and uptime to nearly 100%.\n*; speed up ALL downloads, especially heavier ones.\n*; open cobalt api for free public use.\n*; withstand several huge user influxes with 0 downtime.\n*; move to a reliable and trustworthy cloud infrastructure provider.\n*; separate frontend and api for resilience and future decentralization.\n\nevery cent matters and is extremely appreciated, you can truly make a difference!", + "DonateExplanation": "cobalt doesn't shove ads in your face and doesn't sell your personal data, meaning that it's completely free to use for everyone. but development and maintenance of a media-heavy service used by over 750k people is quite costly. both in terms of time and money.\n\nif cobalt helped you in the past and you want to keep it growing and evolving, you can return the favor by making a donation!\n\nyour donation will help all cobalt users: educators, students, content creators, artists, musicians, and many, many more!\n\nin past, donations have let cobalt:\n*; increase stability and uptime to nearly 100%.\n*; speed up ALL downloads, especially heavier ones.\n*; open the api for free public use.\n*; withstand several huge user influxes with 0 downtime.\n*; add resource-intensive features (such as gif conversion).\n*; continue improving our infrastructure.\n*; keep developers happy.\n\nevery cent matters and is extremely appreciated, you can truly make a difference!\n\nif you can't donate, share cobalt with a friend! we don't get ads anywhere, so cobalt is spread by word of mouth.\nsharing is the easiest way to help achieve the goal of better internet for everyone.", "DonateVia": "donate via", "DonateHireMe": "...or you can hire me :)", "SettingsVideoMute": "mute audio", @@ -103,7 +102,7 @@ "ServicesNote": "this list is not final and keeps expanding over time, make sure to check it once in a while!", "FollowSupport": "keep in touch with cobalt for news, support, and more:", "SourceCode": "explore source code, report issues, star or fork the repo:", - "PrivacyPolicy": "cobalt's privacy policy is simple: no data about you is ever collected or stored. zero, zilch, nada, nothing.\nwhat you download is solely your business, not mine or anyone else's.\n\nif your download requires live render, some non-backtraceable data is temporarily stored in server's RAM. it's necessary for this feature to function.\n\nin this case info about requested content is stored for 90 seconds and then permanently removed.\nno one (even me) has access to this data. official cobalt codebase doesn't provide a way to read it outside of processing functions.\n\nyou can check cobalt's source code yourself and see that everything is as stated.", + "PrivacyPolicy": "cobalt's privacy policy is simple: no data about you is ever collected or stored. zero, zilch, nada, nothing.\nwhat you download is solely your business, not mine or anyone else's.\n\nif your download requires rendering, then data about requested content is encrypted and temporarily stored in server's RAM. it's necessary for this feature to function.\n\nencrypted data is stored for 90 seconds and then permanently removed.\n\nstored data is only possible to decrypt with unique encryption keys from your download link. furthermore, the official cobalt codebase doesn't provide a way to read temporarily stored data outside of processing functions.\n\nyou can check cobalt's source code yourself and see that everything is as stated.", "ErrorYTUnavailable": "this youtube video is unavailable, it could be region or age restricted. try another one!", "ErrorYTTryOtherCodec": "i couldn't find anything to download with your settings. try another codec or quality!\n\nsometimes youtube api acts unexpectedly. try again or try another settings.", "SettingsCodecSubtitle": "youtube codec", @@ -155,8 +154,8 @@ "DonateImageDescription": "cat sleeping on a laptop keyboard and typing letters repeatedly", "SettingsTwitterGif": "convert gifs to .gif", "SettingsTwitterGifDescription": "converting looping videos to .gif reduces quality and majorly increases file size. if you want best efficiency, keep this setting off.", - "UpdateTwitterGif": "twitter gifs and pinterest", "ErrorTweetProtected": "this tweet is from a private account, so i can't see it. try another one!", - "ErrorTweetNSFW": "this tweet contains sensitive content, so i can't see it. try another one!" + "ErrorTweetNSFW": "this tweet contains sensitive content, so i can't see it. try another one!", + "UpdateEncryption": "encryption and new services" } } diff --git a/src/localization/languages/ru.json b/src/localization/languages/ru.json index 7af3413..57f07f0 100644 --- a/src/localization/languages/ru.json +++ b/src/localization/languages/ru.json @@ -16,7 +16,6 @@ "AccessibilityOpenDonate": "сделать пожертвование", "TitlePopupAbout": "что за кобальт?", "TitlePopupSettings": "настройки", - "TitlePopupError": "опаньки...", "TitlePopupChangelog": "что нового?", "TitlePopupDonate": "поддержи кобальт", "TitlePopupDownload": "как сохранить?", @@ -46,7 +45,7 @@ "AccessibilityEnableDownloadPopup": "спрашивать, что делать с загрузками", "SettingsQualityDescription": "если выбранное качество недоступно, то выбирается ближайшее к нему.", "NoScriptMessage": "кобальт использует javascript для обработки ссылок и интерактивного интерфейса. ты должен разрешить использование javascript, чтобы пользоваться сайтом. тут нет никаких зловредных скриптов, обещаю.", - "DownloadPopupDescriptionIOS": "наиболее простой метод скачивания видео на ios:\n1. добавь этот сценарий siri.\n2. нажми \"поделиться\" выше и выбери \"save to photos\" в открывшемся окне.\nесли появляется окно с запросом разрешения, то прочитай его, потом нажми \"всегда разрешать\".\n\nальтернативный метод:\nзажми кнопку \"скачать\", затем скрой превью и выбери \"загрузить файл по ссылке\" в появившемся окне.\nпотом открой загрузки в safari, выбери скачанный файл, нажми иконку \"поделиться\", и, наконец, нажми \"сохранить видео\".", + "DownloadPopupDescriptionIOS": "как сохранить в фото:\n1. добавь этот сценарий siri: save to photos.\n2. нажми \"поделиться\" выше этого текста.\n3. выбери \"save to photos\" в открывшемся окне.\n\nкак сохранить в файлы:\n1. добавь этот сценарий siri: save to files.\n2. нажми \"поделиться\" выше этого текста.\n3. выбери \"save to files\" в открывшемся окне.\n4. выбери папку для сохранения файла и нажми \"открыть\".\n\nоба сценария работают только вместе с веб-приложением кобальта.", "DownloadPopupDescription": "кнопка скачивания открывает новое окно с файлом. ты можешь отключить выбор метода скачивания файла в настройках.", "ClickToCopy": "нажми, чтобы скопировать", "Download": "скачать", @@ -92,7 +91,7 @@ "ChangelogPressToHide": "скрыть", "Donate": "донаты", "DonateSub": "ты можешь помочь!", - "DonateExplanation": "кобальт не пихает рекламу тебе в лицо и не продаёт твои личные данные, а значит работает совершенно бесплатно для всех. но разработка и поддержка медиа сервиса, которым пользуются более 350 тысяч людей, обходится довольно затратно. мне, как студенту, оплачивать такое в одиночку довольно трудно.\n\nесли кобальт тебе помог и ты хочешь, чтобы он продолжал работать и развиваться, то это можно сделать через донаты!\n\nделая донат ты помогаешь всем, кто пользуется кобальтом: преподавателям, студентам, музыкантам, художникам, контент-мейкерам и многим-многим другим!\n\nза последние несколько месяцев благодаря донатам я смог:\n*; повысить стабильность и аптайм почти до 100%.\n*; ускорить ВСЕ загрузки, особенно наиболее тяжёлые.\n*; открыть api кобальта для свободного публичного использования.\n*; выдержать несколько огромных наплывов пользователей без перебоев.\n*; перейти к надёжному поставщику облачной инфры.\n*; разделить фронтенд и api для обеспечения отказоустойчивости и децентрализации в будущем.\n\nкаждый донат невероятно ценится и помогает кобальту развиваться!", + "DonateExplanation": "кобальт не пихает рекламу тебе в лицо и не продаёт твои личные данные, а значит работает совершенно бесплатно для всех. но разработка и поддержка медиа сервиса, которым пользуются более 750 тысяч людей, обходится довольно затратно.\n\nесли кобальт тебе помог и ты хочешь, чтобы он продолжал расти и развиваться, то это можно сделать через донаты!\n\nтвой донат поможет всем, кто пользуется кобальтом: преподавателям, студентам, музыкантам, художникам, контент-мейкерам и многим-многим другим!\n\nв прошлом донаты помогли кобальту:\n*; повысить стабильность и аптайм почти до 100%.\n*; ускорить ВСЕ загрузки, особенно наиболее тяжёлые.\n*; открыть api для бесплатного использования.\n*; выдержать несколько огромных наплывов пользователей без перебоев.\n*; добавить ресурсоемкие фичи (например конвертацию в gif).\n*; продолжать улучшать нашу инфраструктуру.\n*; радовать разработчиков.\n\nкаждый донат невероятно ценится и помогает кобальту развиваться!\n\nесли ты не можешь отправить донат, то поделись кобальтом с другом! мы нигде не размещаем рекламу, поэтому кобальт распространяется из уст в уста.\nподелиться - самый простой способ помочь достичь цели лучшего интернета для всех.", "DonateVia": "открыть", "DonateHireMe": "...или же ты можешь пригласить меня на работу :)", "SettingsVideoMute": "убрать аудио", @@ -104,7 +103,7 @@ "ServicesNote": "этот список далеко не финальный и постоянно пополняется, заглядывай сюда почаще!", "FollowSupport": "подписывайся на соц.сети кобальта для новостей и поддержки:", "SourceCode": "шарься в исходнике, пиши о проблемах, или же форкай репозиторий:", - "PrivacyPolicy": "политика конфиденциальности кобальта довольно проста: никакие данные о тебе никогда не собираются и не хранятся. нуль, ноль, нада, ничего.\nто, что ты скачиваешь, - твоё личное дело, а не чьё-либо ещё.\n\nесли твоей загрузке требуется лайв рендер, то некоторые неотслеживаемые данные временно держатся в ОЗУ сервера. это необходимо для работы данной функции.\n\nв этом случае данные о запрошенном контенте хранятся в течение 90 секунд. по истечении этого времени всё стирается. ни у кого (даже у меня) нет доступа к временно хранящимся данным, так как официальная кодовая база кобальта не предусматривает возможности их чтения вне функций обработки.\n\nты всегда можешь посмотреть исходный код кобальта и убедиться, что всё так, как заявлено.", + "PrivacyPolicy": "политика конфиденциальности кобальта довольно проста: никакие данные о тебе никогда не собираются и не хранятся. нуль, ноль, нада, ничего.\nто, что ты скачиваешь, - твоё личное дело, а не чьё-либо ещё.\n\nесли твоей загрузке требуется рендер, то зашифрованные данные о ней временно хранятся в ОЗУ сервера. это необходимо для работы данной функции.\n\nзашифрованные данные хранятся в течение 90 секунд и затем безвозвратно удаляются.\n\ncохранённые данные можно расшифровать только с помощью уникальных ключей шифрования из твоей ссылки на скачивание. кроме того, официальная кодовая база кобальта не предусматривает возможности чтения эти данные вне функций обработки.\n\nты всегда можешь посмотреть исходный код кобальта и убедиться, что всё так, как заявлено.", "ErrorYTUnavailable": "это видео недоступно, возможно оно ограничено по региону или доступу. попробуй другое!", "ErrorYTTryOtherCodec": "я не нашёл того, что мог бы скачать с твоими настройками. попробуй другой кодек или качество!", "SettingsCodecSubtitle": "кодек для видео с youtube", @@ -157,8 +156,8 @@ "DonateImageDescription": "кошка спит на клавиатуре ноутбука и многократно печатает буквы", "SettingsTwitterGif": "конвертировать гифки в .gif", "SettingsTwitterGifDescription": "конвертирование зацикленного видео в .gif снижает качество и значительно увеличивает размер файла. если важна максимальная эффективность, то не используй эту функцию.", - "UpdateTwitterGif": "гифки с твиттера и одноклассники", "ErrorTweetProtected": "этот твит из закрытого аккаунта, поэтому я не могу его увидеть. попробуй другой!", - "ErrorTweetNSFW": "этот твит содержит деликатный контент, поэтому я не могу его увидеть. попробуй другой!" + "ErrorTweetNSFW": "этот твит содержит деликатный контент, поэтому я не могу его увидеть. попробуй другой!", + "UpdateEncryption": "шифрование и новые сервисы" } } diff --git a/src/localization/manager.js b/src/localization/manager.js index 2b251fe..c22f950 100644 --- a/src/localization/manager.js +++ b/src/localization/manager.js @@ -19,6 +19,7 @@ export function replaceBase(s) { return s .replace(/\n/g, '
') .replace(/{saveToGalleryShortcut}/g, links.saveToGalleryShortcut) + .replace(/{saveToFilesShortcut}/g, links.saveToFilesShortcut) .replace(/{repo}/g, repo) .replace(/{statusPage}/g, links.statusPage) .replace(/\*;/g, "•"); diff --git a/src/modules/pageRender/elements.js b/src/modules/pageRender/elements.js index 53ad3c4..7912939 100644 --- a/src/modules/pageRender/elements.js +++ b/src/modules/pageRender/elements.js @@ -69,15 +69,17 @@ export function popup(obj) { } return ` ${obj.standalone ? ` -