Merge remote-tracking branch 'origin/develop'

This commit is contained in:
nobody 2022-07-09 10:02:04 +02:00
commit da247d483b
No known key found for this signature in database
GPG Key ID: 8F6DE3D614FCFD7A
29 changed files with 326 additions and 231 deletions

View File

@ -26,7 +26,7 @@ LocalCDN is a fork of Decentraleyes and a web browser extension that emulates Co
#### How does it work?
LocalCDN uses redirection for certain requests. There is a [mapping file](https://codeberg.org/nobody/LocalCDN/src/branch/main/core/mappings.js#L71) that lists the source (all CDNs and the path to the frameworks) and a [resource file](https://codeberg.org/nobody/LocalCDN/src/branch/main/core/resources.js#L328) that defines the destination.
Currently only JavaScript and CSS files are redirected. However, some CSS files internally refer to other files, e.g. Font Awesome. All requests are redirected to a local file, e.g. [jQuery](https://codeberg.org/nobody/LocalCDN/src/branch/main/resources/jquery). This is the reason why the extension is currently 14 MB in size. Only if LocalCDN cannot find a local resource (and the option is enabled), a request will be blocked.
Currently only JavaScript and CSS files are redirected. However, some CSS files internally refer to other files, e.g. Font Awesome. All requests are redirected to a local file, e.g. [jQuery](https://codeberg.org/nobody/LocalCDN/src/branch/main/resources/jquery). This is the reason why the extension is over 17 MB in size. Only if LocalCDN cannot find a local resource (and the option is enabled), a request will be blocked.
An adblocker (e.g. uBlock Origin, uMatrix or AdGuard) decides which requests are allowed. Only if your adblocker allows a request, it will be intercepted by LocalCDN. LocalCDN catches the request after an adblocker and not before.
@ -41,18 +41,10 @@ An adblocker (e.g. uBlock Origin, uMatrix or AdGuard) decides which requests are
#### Other CDN emulators
[<img src="https://codeberg.org/nobody/LocalCDN/raw/branch/main/screenshots/replacement_other_cdn_emulators.png" alt="Other CDN emulators" width="500"/>](screenshots/replacement_other_cdn_emulators.png)
## We need you!
![We Need You!](pages/images/we-need-you.png?raw=true "We Need You!")
The whole Internet is full of different frameworks and CDNs that negatively affect your privacy. If you find a website that embeds another unsupported version of a framework, please report that website.
#### :warning: **Important** :warning:
In some cases, LocalCDN is not allowed to replace requested resources because the website sets up a strong Same Origin Policy (SOP). Please read [Broken JavaScript or CSS on some websites](https://codeberg.org/nobody/LocalCDN/wiki/Home#user-content-7-a-website-looks-weird-or-cannot-be-used-if-i-deactivate-localcdn-everything-works-what-is-the-problem) before opening an issue. [Here](https://www.localcdn.org/test/check) you can also find an online tool to test a website. This test covers the most common causes and provides solutions.
On behalf of everyone: Thank you!
## Screenshots
#### Light

View File

@ -317,7 +317,7 @@ https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js
https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js
https://cdnjs.cloudflare.com/ajax/libs/d3/5.16.0/d3.min.js
https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js
https://cdnjs.cloudflare.com/ajax/libs/d3/7.5.0/d3.min.js
https://cdnjs.cloudflare.com/ajax/libs/d3/7.6.1/d3.min.js
https://cdnjs.cloudflare.com/ajax/libs/d3-legend/2.25.6/d3-legend.min.js
https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.3/dayjs.min.js
https://cdnjs.cloudflare.com/ajax/libs/dexie/3.2.2/dexie.min.js
@ -1344,7 +1344,7 @@ https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/4.2.0/mdb.min.js
https://cdnjs.cloudflare.com/ajax/libs/Modaal/0.4.4/css/modaal.min.css
https://cdnjs.cloudflare.com/ajax/libs/Modaal/0.4.4/js/modaal.min.js
https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js
https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.3/moment-with-locales.min.js
https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment-with-locales.min.js
https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment-with-langs.min.js
https://cdnjs.cloudflare.com/ajax/libs/mootools/1.4.5/mootools-core-full-compat-yc.min.js
https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core.min.js
@ -1809,15 +1809,15 @@ https://cdn.jsdelivr.net/npm/@findify/bundle@6.9.15/dist/styles.css
https://cdn.jsdelivr.net/npm/@findify/bundle@6.9.15/dist/vendors~components~initializer.js
https://cdn.jsdelivr.net/npm/@findify/bundle@6.9.15/dist/vendors~initializer.js
https://cdn.jsdelivr.net/npm/@findify/bundle@6.9.15/dist/vendors~sentry.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/autocomplete.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/bundle.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/initializer.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/polyfill.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/raw.css
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/recommendation.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/search.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/sentry.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.49/dist/styles.css
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/autocomplete.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/bundle.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/initializer.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/polyfill.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/raw.css
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/recommendation.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/search.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/sentry.js
https://cdn.jsdelivr.net/npm/@findify/bundle@7.1.50/dist/styles.css
https://cdn.jsdelivr.net/npm/instantsearch.css@7.4.5/themes/algolia-min.css
https://cdn.jsdelivr.net/npm/leaflet.featuregroup.subgroup@1.0.2/dist/leaflet.featuregroup.subgroup.js
https://cdn.jsdelivr.net/npm/ngx-bootstrap@6.2.0/datepicker/bs-datepicker.css
@ -1836,8 +1836,8 @@ https://cdn.jsdelivr.net/npm/swiper@6.8.4/swiper-bundle.min.css
https://cdn.jsdelivr.net/npm/swiper@6.8.4/swiper-bundle.min.js
https://cdn.jsdelivr.net/npm/swiper@7.4.1/swiper-bundle.min.css
https://cdn.jsdelivr.net/npm/swiper@7.4.1/swiper-bundle.min.js
https://cdn.jsdelivr.net/npm/swiper@8.2.6/swiper-bundle.min.css
https://cdn.jsdelivr.net/npm/swiper@8.2.6/swiper-bundle.min.js
https://cdn.jsdelivr.net/npm/swiper@8.3.0/swiper-bundle.min.css
https://cdn.jsdelivr.net/npm/swiper@8.3.0/swiper-bundle.min.js
https://cdn.jsdelivr.net/npm/urlize.js/urlize.js
https://cdn.jsdelivr.net/npm/vanilla-lazyload@17.8.2/dist/lazyload.min.js
https://cdn.jsdelivr.net/npm/videojs-seek-buttons@1.6.0/dist/videojs-seek-buttons.css

View File

@ -328,107 +328,107 @@
"description": "The result then looks like this:"
},
"helpHtmlFilterWhyTitle": {
"message": "",
"message": "Tại sao việc loại bỏ các thuộc tính crossorigin và toàn vẹn lại cần thiết?",
"description": "Why is it necessary to remove crossorigin and integrity attributes?"
},
"helpHtmlFilterCrossorigin": {
"message": "",
"message": "Thuộc tính crossorigin ngăn chặn sự thay thế vì mục tiêu không khớp với mục tiêu được yêu cầu.",
"description": "The crossorigin attribute prevents the replacement because the destination does not match the requested one."
},
"helpHtmlFilterIntegrity": {
"message": "",
"message": "Để tiết kiệm dung lượng đĩa và cung cấp nhiều khuôn khổ hơn, LocalCDN sẽ nâng cấp một khuôn khổ. Một thẻ toàn vẹn là hàm băm của tệp. Nếu kiểm tra không thành công, trình duyệt sẽ không bao gồm một khuôn khổ. Việc kiểm tra sự toàn vẹn sẽ không thành công vì ví dụ: hàm băm của jQuery 1.10.1 và jQuery 1.12.4 là khác nhau.",
"description": "To save disk space and to deliver more frameworks LocalCDN upgrades a framework. An integrity tag is the hash value of a file. If the check fails, the browser wont include a framework. The integrity check will fail because the hash values for e.g. jQuery 1.10.1 and jQuery 1.12.4 are different."
},
"helpHtmlFilterErrors": {
"message": "",
"message": "Không may thay, đôi khi các ký tự đặc biệt được hiển thị không chính xác. Trong trường hợp này, bạn có thể tắt cài đặt một lần nữa để hiển thị âm sắc một cách chính xác.",
"description": "Unfortunately, it sometimes happens that special characters are then displayed incorrectly. In this case you can deactivate the setting again, to display the umlauts correctly."
},
"helpRuleGeneratorDescription": {
"message": "",
"message": "Nếu bạn muốn tự động chuyển hướng tất cả các kết nối CDN được hỗ trợ sang LocalCDN, bạn có thể thêm các quy tắc này vào trình chặn quảng cáo của mình để cho phép các chuyển hướng này. Nếu bạn không muốn thêm các quy tắc này, bạn phải cho phép từng kết nối CDN riêng lẻ cho từng trang web.",
"description": "If you want to automatically redirect all supported CDN connections to LocalCDN, you can add these rules to your adblocker to allow these redirections. If you do not want to add these rules, you must allow each CDN connection individually for each website."
},
"helpRuleGeneratorUblockTitle": {
"message": "",
"message": "Chỉ uBlock Origin:",
"description": "Only uBlock Origin:"
},
"helpRuleGeneratorUblockDescription": {
"message": "",
"message": "Các quy tắc này chỉ có ý nghĩa trong chế độ »medium« hoặc »hard«, vì nó chặn tất cả các tài nguyên của bên thứ ba. Chúng không cần thiết trong chế độ »mặc định«, »easy« hoặc »very-easy«. Để biết thêm thông tin, hãy truy cập Wiki uBlock Origin.",
"description": "These rules are only relevant in »medium« or »hard« mode, because it blocks all 3rd-party resources. They are not necessary in »default«, »easy« or »very-easy« mode. For more information, please visit the uBlock Origin Wiki."
},
"helpRuleGeneratorUblockTableIcon": {
"message": "",
"message": "Biểu Tượng",
"description": "Icon"
},
"helpRuleGeneratorUblockTableMode": {
"message": "",
"message": "Chế Độ",
"description": "Mode"
},
"helpRuleGeneratorUblockTableUseful": {
"message": "",
"message": "Quy tắc có hữu ích",
"description": "Rules useful"
},
"helpRuleGeneratorUblockTableDefaultEasy": {
"message": "",
"message": "Mặc định/Easy",
"description": "Default/Easy"
},
"helpRuleGeneratorUblockTableMedium": {
"message": "",
"message": "Medium",
"description": "Medium"
},
"helpRuleGeneratorUblockTableHard": {
"message": "",
"message": "Hard",
"description": "Hard"
},
"helpWebsiteIssuesDescription": {
"message": "",
"message": "Có hai lý do có thể xảy ra: Hoặc do khuôn khổ/thư viện được yêu cầu nhưng LocalCDN không (chưa) phân phối hoặc do SOP. SOP (Điều khoản đồng nguồn) là một cơ chế bảo mật quyết định dữ liệu nào mà trình duyệt được phép tải. Nó giúp cô lập các tài liệu độc hại, từ đó làm giảm thiểu các vectơ tấn công có thể xảy ra. Điều khoản này ngăn chặn các trình duyệt tải các khuôn khổ bên ngoài của LocalCDN. Thật không may, hiện nay chưa có giải pháp cho vấn đề này.",
"description": "There are two possible reasons: Either a framework/library is required that LocalCDN doesnt (yet) deliver or an SOP. A SOP (Same origin policy) is a security mechanism that determines what data the browser is allowed to load. It helps to isolate malicious documents and thus reduce possible attack vectors. This policy prevents the browser from loading the external frameworks of LocalCDN. Unfortunately there is no solution for this at the moment."
},
"helpBlockGoogleFontsDescription": {
"message": "",
"message": "LocalCDN có thể thay thế các »Biểu tượng Material của Google«. Để nắm bắt được kết nối, trình chặn quảng cáo của bạn (ví dụ: uBlock Origin, uMatrix hoặc AdGuard) phải cho phép yêu cầu. LocalCDN sẽ lắng nghe các yêu cầu này và nếu truy vấn chứa »Biểu tượng Material của Google«, tài nguyên sẽ được thay thế. Nếu bạn bỏ tuỳ chọn »Chặn các yêu cầu với tài nguyên không có sẵn«, các tài nguyên không tồn tại sẽ được phép thông qua và \"Google Fonts\" sẽ được tải vì \"Biểu tượng Material của Google\" và \"Google Fonts\" sử dụng cùng một miền. Nếu bạn không muốn điều này, bạn có thể chặn »Google Fonts« trên LocalCDN.",
"description": "LocalCDN can replace »Google Material Icons«. To catch the connection your adblocker (e.g. uBlock Origin, uMatrix or AdGuard) must allow the request. LocalCDN listens on these requests and if the query contains »Google Material Icons«, the resource will be replaced. If you uncheck the »Block requests for missing content« option, non-existent resources will be allowed to pass and »Google Fonts« will be loaded, because »Google Material Icons« and »Google Fonts« use the same domain. If you dont want this, you can block »Google Fonts« on LocalCDN."
},
"helpStatisticsDescription": {
"message": "",
"message": "Đừng lo, sẽ không có gì được truyền đi. Điều đó sẽ trái với tất cả các nguyên tắc của tôi. Thống kê (ở định dạng JSON) chứa các thông tin sau: Ngày, CDN + bộ đếm và khuôn khổ + bộ đếm. Đó là tất cả. Tôi có một ví dụ dưới đây:",
"description": "Dont panic, nothing will be transmitted. It would be against all my principles. The statistics (JSON format) contains the following information: Date, CDN+counter and framework+counter. Thats all. Ive an example here:"
},
"helpStatisticsContent": {
"message": "",
"message": "Thống kê không chứa thông tin về trình duyệt, hệ điều hành, trang web yêu cầu, địa chỉ IP hoặc bất kỳ thông tin nào khác. Chỉ có ngày, CDN + bộ đếm và khung + bộ đếm. Nó cho bạn biết những khuôn khổ nào đã được thay thế bởi LocalCDN, tần suất và những CDN nào được yêu cầu.",
"description": "The statistics contain no information about the browser, operating system, requesting website, IP addresses or any other information. Just date, CDN+counter and framework+counter. It shows you which frameworks are replaced by LocalCDNs how often and which CDNs were requested."
},
"helpStatisticsTruthTitle": {
"message": "",
"message": "Làm thế nào để tôi biết những gì bạn đang nói là sự thật?",
"description": "How do I know thats true?"
},
"helpStatisticsTruthDescription": {
"message": "",
"message": "Bộ nhớ mở rộng có thể được xem trực tiếp thông qua trình duyệt Firefox. Mở URL »about: debugging«, đi tới »Storage« và chọn »Extension Storage«. Trong khóa »internalStatisticsData« bạn sẽ tìm thấy dữ liệu được thu thập. Dữ liệu đó có thể được sao chép và đưa vào JSON PrettyPrinter để làm cho nó dễ đọc hơn. Lưu ý rằng bạn phải xóa dấu ngoặc kép đầu tiên và cuối cùng của dữ liệu và tên khóa của nó. Bạn sẽ có thể nhìn thấy chi tiết trong video này.",
"description": "The extension storage can be viewed directly with the Firefox browser. Open the URL »about:debugging«, switch to »Storage« and select »Extension Storage«. Under the key »internalStatisticsData« you will find the collected data. Just copy it and put it into a JSON PrettyPrinter to make it more readable. Please note that you have to remove the first and last quotation mark and the key to it. You should be able to see this clearly in this video."
},
"helpSyncTitle": {
"message": "",
"message": "Những gì sẽ được đồng bộ hoá khi tôi chọn »đồng bộ hoá« làm loại lưu trữ?",
"description": "What will be synchronized when I select »sync« as storage type?"
},
"helpSyncDescription": {
"message": "",
"message": "Đồng bộ hóa sẽ chỉ hoạt động nếu bạn đã đăng nhập bằng tài khoản Firefox của mình trên thiết bị và cho phép các add-on đồng bộ hóa trong cài đặt. Một máy chủ riêng mà bạn kiểm soát cũng có thể được sử dụng để đồng bộ hóa. Điều này sẽ đồng bộ hóa hầu hết các cài đặt của LocalCDN trên tất cả các thiết bị.",
"description": "Sync will only work if you are logged in with a Firefox account on the device and have allowed add-ons to sync in the settings. A separate sync server under your control will also work. This will synchronize most of the settings of LocalCDN across all devices."
},
"helpSyncAccount": {
"message": "",
"message": "Nếu bạn không có tài khoản đồng bộ hóa, sẽ không có gì được đồng bộ hóa. Trong trường hợp này, sẽ không có gì khác biệt so với loại lưu trữ được chọn.",
"description": "If you dont have a sync account, nothing will be synchronized. In that case it makes no difference what type of storage you have selected."
},
"helpSyncContentNever": {
"message": "",
"message": "Những thứ không bao giờ được đồng bộ hoá:",
"description": "Things that are never synchronized:"
},
"helpNumberOfInjections": {
"message": "",
"message": "Số lần sử dụng",
"description": "Numbers of injections"
},
"helpYes": {
"message": "",
"message": "",
"description": "Yes"
},
"helpNo": {
"message": "",
"message": "Không",
"description": "No"
},
"helpData": {
@ -440,47 +440,47 @@
"description": "Settings that will be synchronized:"
},
"helpIcons": {
"message": "",
"message": "Mặc định, Sáng, Xanh lam/Xám",
"description": "Default, Light, Blue/Grey"
},
"helpSyncContentLinks": {
"message": "",
"message": "Thêm thông tin về Firefox Sync:",
"description": "More information about Firefox Sync:"
},
"helpBrowserCompatibility": {
"message": "",
"message": "Tính tương thích của trình duyệt",
"description": "Browser compatibility"
},
"helpReplace": {
"message": "",
"message": "Thay thế",
"description": "Replace"
},
"helpReplaceOther": {
"message": "",
"message": "Thay thế các tài nguyên khác",
"description": "Replace other resources"
},
"helpUpgradeAllResources": {
"message": "",
"message": "Nâng cấp toàn bộ các tài nguyên",
"description": "Upgrade all resources"
},
"helpExplanationChrome": {
"message": "",
"message": "Tất cả các trình duyệt dựa trên Chromium",
"description": "All Chromium based Browser"
},
"helpLimitation": {
"message": "",
"message": "Đây không phải là hạn chế của LocalCDN mà là do thiếu hỗ trợ API trong các trình duyệt dựa trên Chromium.",
"description": "This is not a limitation of LocalCDN, but missing API support of Chromium based browsers."
},
"titleBadgeDefault": {
"message": "",
"message": "Biểu tượng mặc định",
"description": "Default badge"
},
"titleBadgeHTMLFilter": {
"message": "",
"message": "Biểu tượng lọc HTML",
"description": "HTML filter badge"
},
"titleBadgeMissingResource": {
"message": "",
"message": "Biểu tượng cho tài nguyên bị thiếu",
"description": "Missing resource badge"
}
}

View File

@ -33,9 +33,11 @@ var stateManager = {};
stateManager.registerInjection = function (tabIdentifier, injection, url) {
let injectionIdentifier, registeredTab, injectionCount, missingCount, initiatorDomain, listedToManipulateDOM;
injectionIdentifier = injection.source + injection.path + injection.version;
registeredTab = stateManager.tabs[tabIdentifier];
registeredTab.injections[injectionIdentifier] = injection;
if (injection['result'] !== false) {
injectionIdentifier = injection.source + injection.path;
registeredTab = stateManager.tabs[tabIdentifier];
registeredTab.injections[injectionIdentifier] = injection;
}
initiatorDomain = helpers.extractDomainFromUrl(url, true) || Address.EXAMPLE;
listedToManipulateDOM = stateManager._domainIsListed(initiatorDomain, 'manipulate-dom');

View File

@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "LocalCDN",
"version": "2.6.29",
"version": "2.6.30",
"browser_specific_settings": {
"gecko": {
"id": "{b86e4813-687a-43e6-ab65-0bde4ab75758}",

View File

@ -178,7 +178,7 @@ targets.setLastVersion = function (type, version) {
if (type.startsWith('/d3/4.')) return '4.13.0';
if (type.startsWith('/d3/5.')) return '5.16.0';
if (type.startsWith('/d3/6.')) return '6.7.0';
if (type.startsWith('/d3/7.')) return '7.5.0';
if (type.startsWith('/d3/7.')) return '7.6.1';
if (type.startsWith('/d3-legend/2.')) return '2.25.6';
if (type.startsWith('/datatables/1.')) return '1.11.0';
if (type.startsWith('/dayjs/1.')) return '1.11.3';
@ -199,7 +199,7 @@ targets.setLastVersion = function (type, version) {
if (type.startsWith('/findify')) {
if (helpers.compareVersion('6.9.15', version)) return '6.9.15'; // <= 6.9.15
if (helpers.compareVersion('6.17.0', version)) return '6.17.0'; // > 6.9.15 to <= 6.17.0
return '7.1.49';
return '7.1.50';
}
if (type.startsWith('/fancybox/2.')) return '2.1.7';
if (type.startsWith('/fancybox/3.')) return '3.5.7';
@ -330,7 +330,7 @@ targets.setLastVersion = function (type, version) {
if (type.startsWith('/modernizr/2.')) return '2.8.3';
if (type.startsWith('/moment.js/2.')) {
if (helpers.compareVersion('2.5.1', version)) return '2.5.1'; // <= v2.5.1
return '2.29.3';
return '2.29.4';
}
if (type.startsWith('/mootools/1.')) {
if (helpers.compareVersion('1.4.5', version)) return '1.4.5'; // <= v1.4.5
@ -411,7 +411,7 @@ targets.setLastVersion = function (type, version) {
if (type.startsWith('/Swiper/5.')) return '5.4.5';
if (type.startsWith('/Swiper/6.')) return '6.8.4';
if (type.startsWith('/Swiper/7.')) return '7.4.1';
if (type.startsWith('/Swiper/8.') || type.startsWith('/Swiper/')) return '8.2.6';
if (type.startsWith('/Swiper/8.') || type.startsWith('/Swiper/')) return '8.3.0';
if (type.startsWith('/tether/1.')) return '1.4.7';
if (type.startsWith('/tinymce/5.')) return '5.10.5';
if (type.startsWith('/tinymce/6.')) return '6.1.0';

View File

@ -55,7 +55,7 @@ header {
.subpanel:last-child {
border-bottom: solid #d3d3d3 1px;
padding-bottom: 4px;
padding-bottom: 8px;
}
.content {
@ -267,79 +267,6 @@ footer {
filter: contrast(0.5);
}
/**
* Toggles
*/
#protection-toggle, #manipulateDOM-toggle, #google-fonts-toggle {
cursor: pointer;
float: right;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none;
}
.switch {
display: inline-block;
height: 18px;
position: relative;
width: 40px;
}
.switch input {
height: 0;
opacity: 0;
width: 0;
}
.slider, .slider-disabled {
background-color: #b40000;
border-radius: 34px;
bottom: 0;
cursor: pointer;
left: 0;
position: absolute;
right: 0;
top: 0;
-webkit-transition: 0.1s;
transition: 0.1s;
}
.slider::before, .slider-disabled::before {
background-color: #f9f9fa;
border-radius: 50%;
bottom: 2px;
content: "";
height: 14px;
left: 2px;
position: absolute;
-webkit-transition: 0.3s;
transition: 0.3s;
width: 14px;
}
input:checked + .slider {
background-color: #6bb798;
}
input:checked + .slider::before {
-webkit-transform: translateX(22px);
-ms-transform: translateX(22px);
transform: translateX(22px);
}
.slider-disabled {
background-color: lightgray;
cursor: not-allowed;
}
.slider:hover {
background-color: #7e0000;
}
input:checked + .slider:hover {
background-color: #4b806a;
}
/**
* Miscellaneous
@ -384,7 +311,9 @@ input:checked + .slider:hover {
color: #555;
display: flex;
font-style: italic;
height: 24px;
overflow: hidden;
padding: 4px 0;
white-space: nowrap;
}
@ -405,6 +334,8 @@ input:checked + .slider:hover {
width: 100%;
}
/**
* Compatibility
*/
@ -497,27 +428,6 @@ input:checked + .slider:hover {
background-image: url("../../icons/logging-light.svg");
}
input:checked + .slider {
background-color: #6bb798;
}
.slider {
background-color: #b54b4b;
}
.slider::before {
background-color: #323232;
}
.slider-disabled {
background-color: #777;
cursor: not-allowed;
}
.slider-disabled::before {
background-color: #323232;
}
#label-donate {
background-color: #404040;
color: #bbb;

View File

@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="popup.css">
<link rel="stylesheet" type="text/css" href="toggle.css">
<link rel="stylesheet" type="text/css" href="../base.css">
</head>
<body>
@ -27,10 +28,17 @@
<div id="website-context" class="panel hidden">
<div class="subpanel">
<div id="protection-toggle">
<label class="switch">
<input type="checkbox" id="protection-toggle-switch">
<span id="toggle-switch-domain" class="slider"></span>
</label>
<label class='toggle' for='protection-toggle-switch'>
<input type='checkbox' name='protection-toggle-switch' id='protection-toggle-switch' class="toggle__input">
<span class="toggle__display" hidden>
<svg width='18' height='14' viewBox='0 0 18 14' fill='none' xmlns='http://www.w3.org/2000/svg' aria-hidden="true" focusable="false" class="toggle__icon toggle__icon--checkmark">
<path d='M6.08471 10.6237L2.29164 6.83059L1 8.11313L6.08471 13.1978L17 2.28255L15.7175 1L6.08471 10.6237Z' fill='currentcolor' stroke='currentcolor' />
</svg>
<svg width='13' height='13' viewBox='0 0 13 13' fill='none' xmlns='http://www.w3.org/2000/svg' aria-hidden="true" focusable="false" class="toggle__icon toggle__icon--cross">
<path d='M11.167 0L6.5 4.667L1.833 0L0 1.833L4.667 6.5L0 11.167L1.833 13L6.5 8.333L11.167 13L13 11.167L8.333 6.5L13 1.833L11.167 0Z' fill='currentcolor' />
</svg>
</span>
</label>
</div>
<div class="label-domain">
<span id="domain-indicator"></span>
@ -38,9 +46,16 @@
</div>
<div class="subpanel" id="div-manipulateDOM">
<div id="manipulateDOM-toggle">
<label class="switch">
<input type="checkbox" id="manipulateDOM-toggle-switch">
<span id="toggle-switch-manipulateDOM" class="slider"></span>
<label class='toggle' for='manipulateDOM-toggle-switch'>
<input type='checkbox' name='manipulateDOM-toggle-switch' id='manipulateDOM-toggle-switch' class="toggle__input">
<span class="toggle__display" hidden>
<svg width='18' height='14' viewBox='0 0 18 14' fill='none' xmlns='http://www.w3.org/2000/svg' aria-hidden="true" focusable="false" class="toggle__icon toggle__icon--checkmark">
<path d='M6.08471 10.6237L2.29164 6.83059L1 8.11313L6.08471 13.1978L17 2.28255L15.7175 1L6.08471 10.6237Z' fill='currentcolor' stroke='currentcolor' />
</svg>
<svg width='13' height='13' viewBox='0 0 13 13' fill='none' xmlns='http://www.w3.org/2000/svg' aria-hidden="true" focusable="false" class="toggle__icon toggle__icon--cross">
<path d='M11.167 0L6.5 4.667L1.833 0L0 1.833L4.667 6.5L0 11.167L1.833 13L6.5 8.333L11.167 13L13 11.167L8.333 6.5L13 1.833L11.167 0Z' fill='currentcolor' />
</svg>
</span>
</label>
</div>
<div id="label-manipulateDOM" class="label-domain">
@ -49,9 +64,16 @@
</div>
<div class="subpanel" id="div-google-fonts">
<div id="google-fonts-toggle">
<label class="switch">
<input type="checkbox" id="google-fonts-toggle-switch">
<span id="toggle-switch-google-fonts" class="slider"></span>
<label class='toggle' for='google-fonts-toggle-switch'>
<input type='checkbox' name='google-fonts-toggle-switch' id='google-fonts-toggle-switch' class="toggle__input">
<span class="toggle__display" hidden>
<svg width='18' height='14' viewBox='0 0 18 14' fill='none' xmlns='http://www.w3.org/2000/svg' aria-hidden="true" focusable="false" class="toggle__icon toggle__icon--checkmark">
<path d='M6.08471 10.6237L2.29164 6.83059L1 8.11313L6.08471 13.1978L17 2.28255L15.7175 1L6.08471 10.6237Z' fill='currentcolor' stroke='currentcolor' />
</svg>
<svg width='13' height='13' viewBox='0 0 13 13' fill='none' xmlns='http://www.w3.org/2000/svg' aria-hidden="true" focusable="false" class="toggle__icon toggle__icon--cross">
<path d='M11.167 0L6.5 4.667L1.833 0L0 1.833L4.667 6.5L0 11.167L1.833 13L6.5 8.333L11.167 13L13 11.167L8.333 6.5L13 1.833L11.167 0Z' fill='currentcolor' />
</svg>
</span>
</label>
</div>
<div class="label-domain">

View File

@ -102,7 +102,7 @@ popup._renderContextualContents = function () {
popup._renderDomainAllowlistPanel = function () {
let websiteContextElement, protectionToggleElement, domainIndicatorElement,
manipulateDOMToggleElement, manipulateDOMToggleStyle, googleFontsToggleElement, googleFontsToggleStyle;
manipulateDOMToggleElement, googleFontsToggleElement;
websiteContextElement = document.getElementById('website-context');
websiteContextElement.setAttribute('class', 'panel');
@ -113,10 +113,8 @@ popup._renderDomainAllowlistPanel = function () {
protectionToggleElement.setAttribute('dir', popup._scriptDirection);
domainIndicatorElement.innerText = popup._domain;
manipulateDOMToggleElement = document.getElementById('manipulateDOM-toggle-switch');
manipulateDOMToggleStyle = document.getElementById('toggle-switch-manipulateDOM');
googleFontsToggleElement = document.getElementById('google-fonts-toggle-switch');
googleFontsToggleStyle = document.getElementById('toggle-switch-google-fonts');
if (popup._blockGoogleFonts === false) {
document.getElementById('div-google-fonts').hidden = true;
@ -124,17 +122,12 @@ popup._renderDomainAllowlistPanel = function () {
if (popup._domainIsAllowlisted === true) {
manipulateDOMToggleElement.disabled = true;
manipulateDOMToggleStyle.setAttribute('class', 'slider-disabled');
googleFontsToggleElement.disabled = true;
googleFontsToggleStyle.setAttribute('class', 'slider-disabled');
protectionToggleElement.checked = false;
protectionToggleElement.addEventListener('click', popup._enableProtection);
return;
}
googleFontsToggleStyle.setAttribute('class', 'slider');
googleFontsToggleElement.disabled = false;
if (popup._domainGoogleFonts) {
@ -146,7 +139,6 @@ popup._renderDomainAllowlistPanel = function () {
}
manipulateDOMToggleElement.disabled = false;
manipulateDOMToggleStyle.setAttribute('class', 'slider');
protectionToggleElement.checked = true;
protectionToggleElement.addEventListener('click', popup._disableProtection);
@ -164,6 +156,8 @@ popup._renderDomainAllowlistPanel = function () {
manipulateDOMToggleElement.checked = true;
manipulateDOMToggleElement.addEventListener('click', popup._disableManipulateDOM);
}
websiteContextElement.style.display = 'block';
};
popup._renderInjectionPanel = function (groupedInjections) {

151
pages/popup/toggle.css Normal file
View File

@ -0,0 +1,151 @@
/**
* Toggles
*/
#protection-toggle, #manipulateDOM-toggle, #google-fonts-toggle {
cursor: pointer;
float: right;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none;
}
.toggle {
cursor: pointer;
}
button.toggle {
background-color: transparent;
border: 0;
font: inherit;
padding: 0;
}
.toggle__input {
opacity: 0;
position: absolute;
}
.toggle__display {
align-items: center;
background-color: #b54b4b;
border-radius: 100vw;
box-sizing: content-box;
display: inline-flex;
height: 24px;
justify-content: space-around;
position: relative;
transition: 0.1s;
width: 44px;
}
.toggle__display::before {
background-color: white;
border-radius: 50%;
box-sizing: border-box;
content: "";
height: 20px;
left: 2px;
position: absolute;
top: 50%;
transform: translate(0, -50%);
transition: inherit;
width: 20px;
will-change: transform;
z-index: 2;
}
.toggle__display:hover {
background-color: #7e0000;
}
.toggle:focus .toggle__display,
.toggle__input:focus + .toggle__display {
outline: 1px dotted #212121;
outline: 1px auto -webkit-focus-ring-color;
outline-offset: 2px;
}
.toggle:focus,
.toggle:focus:not(:focus-visible) .toggle__display,
.toggle__input:focus:not(:focus-visible) + .toggle__display {
outline: 0;
}
.toggle[aria-pressed="true"] .toggle__display,
.toggle__input:checked + .toggle__display {
background-color: #6bb798;
}
.toggle__input:checked + .toggle__display:hover {
background-color: #4b806a;
}
.toggle[aria-pressed="true"] .toggle__display::before,
.toggle__input:checked + .toggle__display::before {
transform: translate(100%, -50%);
}
.toggle[disabled] .toggle__display,
.toggle__input:disabled + .toggle__display {
background-color: lightgray;
cursor: not-allowed;
}
[dir="rtl"] .toggle__display::before {
left: auto;
right: 2px;
}
[dir="rtl"] .toggle[aria-pressed="true"] + .toggle__display::before,
[dir="rtl"] .toggle__input:checked + .toggle__display::before {
transform: translate(-100%, -50%);
}
.toggle__icon {
color: inherit;
display: inline-block;
fill: currentcolor;
height: 1em;
overflow: hidden;
vertical-align: middle;
width: 1em;
}
.toggle__icon--cross {
color: #f0f0f0;
font-size: 85%;
}
.toggle__icon--checkmark {
color: #f0f0f0;
}
*,
::before,
::after {
box-sizing: border-box;
}
@media (prefers-color-scheme: dark) {
.toggle__icon--checkmark,
.toggle__icon--cross {
color: #323232;
}
.toggle__display::before {
background-color: #323232;
}
.toggle[disabled] .toggle__display,
.toggle__input:disabled + .toggle__display {
background-color: #777;
cursor: not-allowed;
}
.slider-disabled::before {
background-color: #323232;
}
}

View File

@ -27,51 +27,18 @@
<div class="release-notes-area">
<p>Updated</p>
<ul>
<li>izimodal v1.6.0 -> v1.6.1 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1008">#1008</a>)</li>
<li>findify-bundle v7.1.43 -> v7.1.49 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1009">#1009</a>)</li>
<li>Google Material Icons v129 -> v134 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons Outlined v104 -> v106 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons Round v103 -> v105 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons Sharp v104 -> v106 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons TwoTone v107 -> v109 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Swiper v8.1.6 -> v8.2.6 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1011">#1011</a>)</li>
<li>video.js v7.20.0 -> v7.20.1 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1012">#1012</a>)</li>
<li>instantsearch.js v4.40.6 -> v4.43.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1013">#1013</a>)</li>
<li>underscore.js v1.13.3 -> v1.13.4 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1014">#1014</a>)</li>
<li>element-ui v2.15.8 -> v2.15.9 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1015">#1015</a>)</li>
<li>dayjs v1.11.2 -> v1.11.3 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1016">#1016</a>)</li>
<li>vue v3.2.36 -> v3.2.37 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1017">#1017</a>)</li>
<li>mathjax v3.2.1 -> v3.2.2 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1018">#1018</a>)</li>
<li>lightgallery v2.4.0 -> v2.5.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1022">#1022</a>)</li>
<li>mdb-ui-kit v4.1.0 -> v4.2.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1023">#1023</a>)</li>
<li>react v18.1.0 -> v18.2.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1024">#1024</a>)</li>
<li>react-dom v18.1.0 -> v18.2.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1025">#1025</a>)</li>
<li>libphonenumber-js v1.10.6 -> v1.10.7 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1027">#1027</a>)</li>
<li>vue-i18n v8.27.1 -> v8.27.2 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1028">#1028</a>)</li>
<li>d3 v7.4.4 -> v7.5.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1032">#1032</a>)</li>
<li>bodymovin v5.9.4 -> v5.9.6 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1033">#1033</a>)</li>
<li>react-side-effect v2.1.1 -> v2.1.2 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1034">#1034</a>)</li>
<li>tinymce v6.0.3 -> v6.1.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1039">#1039</a>)</li>
<li>jquery-validate v1.19.4 -> v1.19.5 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1040">#1040</a>)</li>
<li>d3 v7.5.0 -> v7.6.1 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1045">#1045</a>)</li>
<li>moment.js v2.29.3 -> v2.29.4 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1046">#1046</a>)</li>
<li>Swiper v8.2.6 -> v8.3.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1047">#1047</a>)</li>
<li>findify-bundle v7.1.49 -> v7.1.50 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1048">#1048</a>)</li>
</ul>
<p>Mapping</p>
<p>Improved</p>
<ul>
<li>bootstrap -> cdnjs.cloudflare.com (<a href="https://codeberg.org/nobody/LocalCDN/issues/615">#615</a>)</li>
<li>angular-translate -> cdnjs.cloudflare.com (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>angularjs-slider v2.x.x - v5.x.x -> v6.7.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>chart.js -> cdnjs.cloudflare.com (<a href="https://codeberg.org/nobody/LocalCDN/issues/1037">#1037</a>)</li>
</ul>
<p>Added</p>
<ul>
<li>angular-translate-loader-partial v2.19.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>angular-i18n v1.8.3 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>twix.js v0.3.0 v1.3.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>moment.js v2.5.1 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>Popup accessibility improved (<a href="https://codeberg.org/nobody/LocalCDN/issues/1041">#1041</a>)</li>
</ul>
<p>Fixed</p>
<ul>
<li>Badge color for missing resources (<a href="https://codeberg.org/nobody/LocalCDN/issues/1031">#1031</a>)</li>
<li>Still logging if disabled (<a href="https://codeberg.org/nobody/LocalCDN/issues/1038">#1038</a>)</li>
<li>Popup does not show injections (<a href="https://codeberg.org/nobody/LocalCDN/issues/1043">#1043</a>)</li>
</ul>
</div>
<div id="generator-section">
@ -110,6 +77,55 @@
</div>
<div id="history"><span id="history-indicator">+</span> Previous Versions</div>
<div id="history-release-notes">
<p class='release-date'>2022-07-03 (v2.6.29)</p>
<p>Updated</p>
<ul>
<li>izimodal v1.6.0 -> v1.6.1 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1008">#1008</a>)</li>
<li>findify-bundle v7.1.43 -> v7.1.49 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1009">#1009</a>)</li>
<li>Google Material Icons v129 -> v134 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons Outlined v104 -> v106 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons Round v103 -> v105 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons Sharp v104 -> v106 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Google Material Icons TwoTone v107 -> v109 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1010">#1010</a>)</li>
<li>Swiper v8.1.6 -> v8.2.6 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1011">#1011</a>)</li>
<li>video.js v7.20.0 -> v7.20.1 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1012">#1012</a>)</li>
<li>instantsearch.js v4.40.6 -> v4.43.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1013">#1013</a>)</li>
<li>underscore.js v1.13.3 -> v1.13.4 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1014">#1014</a>)</li>
<li>element-ui v2.15.8 -> v2.15.9 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1015">#1015</a>)</li>
<li>dayjs v1.11.2 -> v1.11.3 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1016">#1016</a>)</li>
<li>vue v3.2.36 -> v3.2.37 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1017">#1017</a>)</li>
<li>mathjax v3.2.1 -> v3.2.2 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1018">#1018</a>)</li>
<li>lightgallery v2.4.0 -> v2.5.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1022">#1022</a>)</li>
<li>mdb-ui-kit v4.1.0 -> v4.2.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1023">#1023</a>)</li>
<li>react v18.1.0 -> v18.2.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1024">#1024</a>)</li>
<li>react-dom v18.1.0 -> v18.2.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1025">#1025</a>)</li>
<li>libphonenumber-js v1.10.6 -> v1.10.7 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1027">#1027</a>)</li>
<li>vue-i18n v8.27.1 -> v8.27.2 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1028">#1028</a>)</li>
<li>d3 v7.4.4 -> v7.5.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1032">#1032</a>)</li>
<li>bodymovin v5.9.4 -> v5.9.6 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1033">#1033</a>)</li>
<li>react-side-effect v2.1.1 -> v2.1.2 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1034">#1034</a>)</li>
<li>tinymce v6.0.3 -> v6.1.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1039">#1039</a>)</li>
<li>jquery-validate v1.19.4 -> v1.19.5 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1040">#1040</a>)</li>
</ul>
<p>Mapping</p>
<ul>
<li>bootstrap -> cdnjs.cloudflare.com (<a href="https://codeberg.org/nobody/LocalCDN/issues/615">#615</a>)</li>
<li>angular-translate -> cdnjs.cloudflare.com (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>angularjs-slider v2.x.x - v5.x.x -> v6.7.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>chart.js -> cdnjs.cloudflare.com (<a href="https://codeberg.org/nobody/LocalCDN/issues/1037">#1037</a>)</li>
</ul>
<p>Added</p>
<ul>
<li>angular-translate-loader-partial v2.19.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>angular-i18n v1.8.3 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>twix.js v0.3.0 v1.3.0 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
<li>moment.js v2.5.1 (<a href="https://codeberg.org/nobody/LocalCDN/issues/1029">#1029</a>)</li>
</ul>
<p>Fixed</p>
<ul>
<li>Badge color for missing resources (<a href="https://codeberg.org/nobody/LocalCDN/issues/1031">#1031</a>)</li>
<li>Still logging if disabled (<a href="https://codeberg.org/nobody/LocalCDN/issues/1038">#1038</a>)</li>
</ul>
<p class='release-date'>2022-05-29 (v2.6.28)</p>
<p>Updated</p>
<ul>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1665,6 +1665,14 @@ p.findify-layouts--recommendation--grid__title {
margin: 0 -10px;
}
.findify-components-autocomplete--content__horizontal {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
/* imported from styles.css */
.findify-components-autocomplete--tip__tip {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 84 KiB