diff --git a/.editorconfig b/.editorconfig
index 761ad915b..48e59bb40 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -12,7 +12,7 @@ indent_style = tab
[*.{html,php,phtml}]
indent_style = tab
-[*.js]
+[*.{js,mjs}]
indent_style = tab
[*.{json,jsonc}]
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index bf57785a8..a974f27d4 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -85,6 +85,9 @@ jobs:
- name: Check Right-to-left CSS
run: npm run --silent rtlcss && git diff --exit-code
+ - name: Optimize SVG image files
+ run: npm run --silent svgo && git diff --exit-code
+
# Shell tests
- name: Use shell cache
diff --git a/AGENTS.md b/AGENTS.md
index 5818626ae..ffaed436a 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -75,7 +75,7 @@ FreshRSS_Factory::createEntryDao();
# Runs all tests: PHPUnit, PHPCS, PHPStan, typos
make test-all
-# Auto-fix all trivial issues: whitespace, RTL CSS, translations
+# Auto-fix all trivial issues: whitespace, RTL CSS, translations, SVG image optimization
make fix-all
# See a list of commands:
diff --git a/Makefile b/Makefile
index 06a5b8a32..c2bd348c0 100644
--- a/Makefile
+++ b/Makefile
@@ -107,6 +107,9 @@ node_modules/.bin/eslint:
node_modules/.bin/rtlcss:
npm install
+node_modules/.bin/svgo:
+ npm install
+
# TODO: Add composer install
.PHONY: composer-test
composer-test: bin/phpstan bin/composer
@@ -247,6 +250,10 @@ refresh: ## Refresh feeds by fetching new messages
rtl: node_modules/.bin/rtlcss ## Generate RTL CSS files
npm run-script rtlcss
+.PHONY: svgo
+svgo: node_modules/.bin/svgo ## Optimize SVG image files
+ npm run-script svgo
+
##@ Help
.PHONY: help
help: ## Display this help
diff --git a/docs/_includes/copy_icon.svg b/docs/_includes/copy_icon.svg
new file mode 100644
index 000000000..ec934bd9b
--- /dev/null
+++ b/docs/_includes/copy_icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/docs/_includes/hamburger_icon.svg b/docs/_includes/hamburger_icon.svg
new file mode 100644
index 000000000..9355ec187
--- /dev/null
+++ b/docs/_includes/hamburger_icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/docs/_includes/lang_dropdown.html b/docs/_includes/lang_dropdown.html
index 81dc62508..eed693a91 100644
--- a/docs/_includes/lang_dropdown.html
+++ b/docs/_includes/lang_dropdown.html
@@ -1,9 +1,6 @@
-
-
-
-
+ {% include language_icon.svg %}
diff --git a/docs/_includes/language_icon.svg b/docs/_includes/language_icon.svg
new file mode 100644
index 000000000..4836760ed
--- /dev/null
+++ b/docs/_includes/language_icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
index e34fbfc0c..bf6156401 100644
--- a/docs/_layouts/default.html
+++ b/docs/_layouts/default.html
@@ -24,9 +24,7 @@
-
-
-
+ {% include hamburger_icon.svg %}
{% include lang_dropdown.html location="mobile" %}
@@ -77,6 +75,10 @@
+
+ {% include copy_icon.svg %}
+
+
{% include anchor_headings.html html=content anchorBody="#" generateId=true %}
diff --git a/docs/assets/js/docs.js b/docs/assets/js/docs.js
index c14fce920..9e204303c 100644
--- a/docs/assets/js/docs.js
+++ b/docs/assets/js/docs.js
@@ -27,17 +27,13 @@ document.addEventListener('DOMContentLoaded', () => {
sessionStorage.removeItem('sidebar_scrollTop');
}
+ const copyIconSvg = document.querySelector('template#copy-svg-icon').innerHTML;
for (const el of document.querySelectorAll('div.highlight')) {
- /* eslint-disable @stylistic/max-len */
el.insertAdjacentHTML('afterbegin', `
-
-
-
-
+ ${copyIconSvg}
`);
- /* eslint-enable @stylistic/max-len */
const copyBtn = el.querySelector('button.copy');
copyBtn.addEventListener('click', () => {
const snippet = el.querySelector('code').innerText;
diff --git a/docs/en/contributing.md b/docs/en/contributing.md
index f8a4711a3..e18966140 100644
--- a/docs/en/contributing.md
+++ b/docs/en/contributing.md
@@ -69,7 +69,7 @@ This checklist is designed to ensure high-quality system themes while minimizing
* Include _frss.css in the "files" section of [`metadata.json`](./developers/04_Frontend/02_Design.md).
* Theme-specific icons reside in the `icons` directory.
* Icons should be provided as `svg` files.
- * Ensure clean code without any unnecessary fragments; utilize tools like [SVGOMG](https://jakearchibald.github.io/svgomg/) for cleaning.
+ * Ensure clean code without any unnecessary fragments. SVG files should be optimized using `make svgo`.
* The default color for icons is `#666666`; employ CSS filters for recoloring.
* Utilize CSS variables for colors to facilitate easy color adjustments with [CustomCSS extension](https://github.com/FreshRSS/Extensions).
* Implement a dark mode that aligns with the `.darkMode` CSS class.
diff --git a/docs/img/FreshRSS-logo-font.svg b/docs/img/FreshRSS-logo-font.svg
index 134adfdfc..6b7b5a39f 100644
--- a/docs/img/FreshRSS-logo-font.svg
+++ b/docs/img/FreshRSS-logo-font.svg
@@ -1,16 +1,12 @@
-
+
Logo FreshRSS
-
-
-
-
-
+
+
+
+
+
-
-
+
- FreshRSS
+ FreshRSS
-
diff --git a/docs/img/FreshRSS-logo.svg b/docs/img/FreshRSS-logo.svg
index 4eb268c8a..4855d4c03 100644
--- a/docs/img/FreshRSS-logo.svg
+++ b/docs/img/FreshRSS-logo.svg
@@ -1,25 +1,17 @@
-
+
Logo FreshRSS
-
-
-
-
-
+
+
+
+
+
-
-
+
-
- FreshRSS
-
-
-
-
-
-
-
-
+
+
+ FreshRSS
+
+
-
diff --git a/p/themes/Alternative-Dark/icons/disabled-light.svg b/p/themes/Alternative-Dark/icons/disabled-light.svg
index 8542db156..1d5ab0a68 100644
--- a/p/themes/Alternative-Dark/icons/disabled-light.svg
+++ b/p/themes/Alternative-Dark/icons/disabled-light.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Alternative-Dark/icons/icon.svg b/p/themes/Alternative-Dark/icons/icon.svg
index c6bbd08bd..3b84dc940 100644
--- a/p/themes/Alternative-Dark/icons/icon.svg
+++ b/p/themes/Alternative-Dark/icons/icon.svg
@@ -1,14 +1,10 @@
-
-
-
-Logo FreshRSS
-
-
-
-
-
+
+
+ Logo FreshRSS
+
+
+
+
diff --git a/p/themes/Ansum/icons/configure.svg b/p/themes/Ansum/icons/configure.svg
index 04145eba5..930645ff7 100644
--- a/p/themes/Ansum/icons/configure.svg
+++ b/p/themes/Ansum/icons/configure.svg
@@ -1,62 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/down.svg b/p/themes/Ansum/icons/down.svg
index ee1fc8072..775a3b766 100644
--- a/p/themes/Ansum/icons/down.svg
+++ b/p/themes/Ansum/icons/down.svg
@@ -1,62 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/icon.svg b/p/themes/Ansum/icons/icon.svg
index 7900c0a79..20c96f654 100644
--- a/p/themes/Ansum/icons/icon.svg
+++ b/p/themes/Ansum/icons/icon.svg
@@ -1,75 +1,7 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/p/themes/Ansum/icons/link.svg b/p/themes/Ansum/icons/link.svg
index 44ee847b0..747512e5e 100644
--- a/p/themes/Ansum/icons/link.svg
+++ b/p/themes/Ansum/icons/link.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Ansum/icons/more.svg b/p/themes/Ansum/icons/more.svg
index 6e505e71b..3b4a4cee4 100644
--- a/p/themes/Ansum/icons/more.svg
+++ b/p/themes/Ansum/icons/more.svg
@@ -1,59 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/non-starred.svg b/p/themes/Ansum/icons/non-starred.svg
index 9d49930c0..a6e86a79d 100644
--- a/p/themes/Ansum/icons/non-starred.svg
+++ b/p/themes/Ansum/icons/non-starred.svg
@@ -1,60 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/read.svg b/p/themes/Ansum/icons/read.svg
index d583cce03..b39fe1731 100644
--- a/p/themes/Ansum/icons/read.svg
+++ b/p/themes/Ansum/icons/read.svg
@@ -1,59 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/refresh.svg b/p/themes/Ansum/icons/refresh.svg
index f23fbf4a2..553cc718e 100644
--- a/p/themes/Ansum/icons/refresh.svg
+++ b/p/themes/Ansum/icons/refresh.svg
@@ -1,59 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/rss.svg b/p/themes/Ansum/icons/rss.svg
index 7044bbaa4..6e044bd1d 100644
--- a/p/themes/Ansum/icons/rss.svg
+++ b/p/themes/Ansum/icons/rss.svg
@@ -1,60 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/starred.svg b/p/themes/Ansum/icons/starred.svg
index 3b0bf8cb8..bbc4e540e 100644
--- a/p/themes/Ansum/icons/starred.svg
+++ b/p/themes/Ansum/icons/starred.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Ansum/icons/tick-color.svg b/p/themes/Ansum/icons/tick-color.svg
index fe0c28a84..c717b2fdc 100644
--- a/p/themes/Ansum/icons/tick-color.svg
+++ b/p/themes/Ansum/icons/tick-color.svg
@@ -1,57 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/tick.svg b/p/themes/Ansum/icons/tick.svg
index 9c436e7a0..a922f30b3 100644
--- a/p/themes/Ansum/icons/tick.svg
+++ b/p/themes/Ansum/icons/tick.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Ansum/icons/unread.svg b/p/themes/Ansum/icons/unread.svg
index 6cdd8c383..563741ac7 100644
--- a/p/themes/Ansum/icons/unread.svg
+++ b/p/themes/Ansum/icons/unread.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Ansum/icons/up.svg b/p/themes/Ansum/icons/up.svg
index 631ef9fdb..8af69abee 100644
--- a/p/themes/Ansum/icons/up.svg
+++ b/p/themes/Ansum/icons/up.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Ansum/icons/view-global.svg b/p/themes/Ansum/icons/view-global.svg
index 08632a190..ef1e43ccc 100644
--- a/p/themes/Ansum/icons/view-global.svg
+++ b/p/themes/Ansum/icons/view-global.svg
@@ -1,59 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/view-list.svg b/p/themes/Ansum/icons/view-list.svg
index bcea01055..8355a1839 100644
--- a/p/themes/Ansum/icons/view-list.svg
+++ b/p/themes/Ansum/icons/view-list.svg
@@ -1,60 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Ansum/icons/view-reader.svg b/p/themes/Ansum/icons/view-reader.svg
index 7471037d9..4adf7b73f 100644
--- a/p/themes/Ansum/icons/view-reader.svg
+++ b/p/themes/Ansum/icons/view-reader.svg
@@ -1,59 +1,3 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/p/themes/Dark/icons/icon.svg b/p/themes/Dark/icons/icon.svg
index 4eb53dda9..5c5f5b095 100644
--- a/p/themes/Dark/icons/icon.svg
+++ b/p/themes/Dark/icons/icon.svg
@@ -1,12 +1,11 @@
Logo FreshRSS
-
-
-
-
-
+
+
+
+
+
-
-
+
diff --git a/p/themes/Mapco/icons/configure.svg b/p/themes/Mapco/icons/configure.svg
index 5ffe55442..10371627a 100644
--- a/p/themes/Mapco/icons/configure.svg
+++ b/p/themes/Mapco/icons/configure.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/down.svg b/p/themes/Mapco/icons/down.svg
index f9e06de8a..7b27b1099 100644
--- a/p/themes/Mapco/icons/down.svg
+++ b/p/themes/Mapco/icons/down.svg
@@ -1,30 +1,3 @@
-
-
-
-
-
+
+
diff --git a/p/themes/Mapco/icons/icon.svg b/p/themes/Mapco/icons/icon.svg
index 8ba9478e7..ca1e72f37 100644
--- a/p/themes/Mapco/icons/icon.svg
+++ b/p/themes/Mapco/icons/icon.svg
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/p/themes/Mapco/icons/link.svg b/p/themes/Mapco/icons/link.svg
index 6bcfc1eb9..7f1554f3b 100644
--- a/p/themes/Mapco/icons/link.svg
+++ b/p/themes/Mapco/icons/link.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/more.svg b/p/themes/Mapco/icons/more.svg
index 71535325a..9fb4bb756 100644
--- a/p/themes/Mapco/icons/more.svg
+++ b/p/themes/Mapco/icons/more.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/non-starred.svg b/p/themes/Mapco/icons/non-starred.svg
index 57405ef45..ea7362fea 100644
--- a/p/themes/Mapco/icons/non-starred.svg
+++ b/p/themes/Mapco/icons/non-starred.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/read.svg b/p/themes/Mapco/icons/read.svg
index 91b0a8d17..e6358d978 100644
--- a/p/themes/Mapco/icons/read.svg
+++ b/p/themes/Mapco/icons/read.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/refresh.svg b/p/themes/Mapco/icons/refresh.svg
index 495432162..e2587e120 100644
--- a/p/themes/Mapco/icons/refresh.svg
+++ b/p/themes/Mapco/icons/refresh.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/rss.svg b/p/themes/Mapco/icons/rss.svg
index cf3c34814..4e786b858 100644
--- a/p/themes/Mapco/icons/rss.svg
+++ b/p/themes/Mapco/icons/rss.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/search.svg b/p/themes/Mapco/icons/search.svg
index 690c74942..afd8f2131 100644
--- a/p/themes/Mapco/icons/search.svg
+++ b/p/themes/Mapco/icons/search.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/starred.svg b/p/themes/Mapco/icons/starred.svg
index 998164e85..a860c9837 100644
--- a/p/themes/Mapco/icons/starred.svg
+++ b/p/themes/Mapco/icons/starred.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/tick-color.svg b/p/themes/Mapco/icons/tick-color.svg
index da7d176aa..4ceeac65d 100644
--- a/p/themes/Mapco/icons/tick-color.svg
+++ b/p/themes/Mapco/icons/tick-color.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/unread.svg b/p/themes/Mapco/icons/unread.svg
index 6cdd8c383..563741ac7 100644
--- a/p/themes/Mapco/icons/unread.svg
+++ b/p/themes/Mapco/icons/unread.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/up.svg b/p/themes/Mapco/icons/up.svg
index b5baff62f..75e560b11 100644
--- a/p/themes/Mapco/icons/up.svg
+++ b/p/themes/Mapco/icons/up.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/view-global.svg b/p/themes/Mapco/icons/view-global.svg
index ff9673422..a3f21fb3c 100644
--- a/p/themes/Mapco/icons/view-global.svg
+++ b/p/themes/Mapco/icons/view-global.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/view-normal.svg b/p/themes/Mapco/icons/view-normal.svg
index 5b206352b..d8cda304e 100644
--- a/p/themes/Mapco/icons/view-normal.svg
+++ b/p/themes/Mapco/icons/view-normal.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Mapco/icons/view-reader.svg b/p/themes/Mapco/icons/view-reader.svg
index 30229af23..f03b680e6 100644
--- a/p/themes/Mapco/icons/view-reader.svg
+++ b/p/themes/Mapco/icons/view-reader.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/Nord/icons/link.svg b/p/themes/Nord/icons/link.svg
index 8f12a37d9..6a74f0fc8 100644
--- a/p/themes/Nord/icons/link.svg
+++ b/p/themes/Nord/icons/link.svg
@@ -1 +1,3 @@
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Nord/icons/starred.svg b/p/themes/Nord/icons/starred.svg
index f9041c2c0..968aa87e2 100644
--- a/p/themes/Nord/icons/starred.svg
+++ b/p/themes/Nord/icons/starred.svg
@@ -1 +1,3 @@
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Nord/icons/unread.svg b/p/themes/Nord/icons/unread.svg
index 4f5f95828..d804e8d38 100644
--- a/p/themes/Nord/icons/unread.svg
+++ b/p/themes/Nord/icons/unread.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/p/themes/Pafat/icons/all.svg b/p/themes/Pafat/icons/all.svg
index 1c7ba3ffe..d80798c10 100644
--- a/p/themes/Pafat/icons/all.svg
+++ b/p/themes/Pafat/icons/all.svg
@@ -1,5 +1,3 @@
-
-
-
+
diff --git a/p/themes/Pafat/icons/down.svg b/p/themes/Pafat/icons/down.svg
index 050d6b969..e6cf0faca 100644
--- a/p/themes/Pafat/icons/down.svg
+++ b/p/themes/Pafat/icons/down.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Pafat/icons/icon.svg b/p/themes/Pafat/icons/icon.svg
index b489e18da..0e4055527 100644
--- a/p/themes/Pafat/icons/icon.svg
+++ b/p/themes/Pafat/icons/icon.svg
@@ -1,12 +1,11 @@
Logo FreshRSS
-
-
-
-
-
+
+
+
+
+
-
-
+
diff --git a/p/themes/Pafat/icons/link.svg b/p/themes/Pafat/icons/link.svg
index cc30f9f8b..fddb08b4f 100644
--- a/p/themes/Pafat/icons/link.svg
+++ b/p/themes/Pafat/icons/link.svg
@@ -1,7 +1,7 @@
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
diff --git a/p/themes/Pafat/icons/login.svg b/p/themes/Pafat/icons/login.svg
index cf2b347ad..45c5dc66a 100644
--- a/p/themes/Pafat/icons/login.svg
+++ b/p/themes/Pafat/icons/login.svg
@@ -1,6 +1,6 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/p/themes/Pafat/icons/logout.svg b/p/themes/Pafat/icons/logout.svg
index ac2d180d8..0aa3e420b 100644
--- a/p/themes/Pafat/icons/logout.svg
+++ b/p/themes/Pafat/icons/logout.svg
@@ -1,6 +1,6 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/p/themes/Pafat/icons/next.svg b/p/themes/Pafat/icons/next.svg
index 59d512450..fe69227ef 100644
--- a/p/themes/Pafat/icons/next.svg
+++ b/p/themes/Pafat/icons/next.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Pafat/icons/non-starred.svg b/p/themes/Pafat/icons/non-starred.svg
index e019daffd..aa20f85db 100644
--- a/p/themes/Pafat/icons/non-starred.svg
+++ b/p/themes/Pafat/icons/non-starred.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Pafat/icons/prev.svg b/p/themes/Pafat/icons/prev.svg
index 000ecb10d..c8675aae6 100644
--- a/p/themes/Pafat/icons/prev.svg
+++ b/p/themes/Pafat/icons/prev.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Pafat/icons/read.svg b/p/themes/Pafat/icons/read.svg
index f3ce7532d..b039bddeb 100644
--- a/p/themes/Pafat/icons/read.svg
+++ b/p/themes/Pafat/icons/read.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Pafat/icons/share.svg b/p/themes/Pafat/icons/share.svg
index 5010082cb..36557822c 100644
--- a/p/themes/Pafat/icons/share.svg
+++ b/p/themes/Pafat/icons/share.svg
@@ -1,8 +1,8 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
diff --git a/p/themes/Pafat/icons/starred.svg b/p/themes/Pafat/icons/starred.svg
index b9ab2f9f7..3e16c53ba 100644
--- a/p/themes/Pafat/icons/starred.svg
+++ b/p/themes/Pafat/icons/starred.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Pafat/icons/tag.svg b/p/themes/Pafat/icons/tag.svg
index 9908d4665..3d0871a0f 100644
--- a/p/themes/Pafat/icons/tag.svg
+++ b/p/themes/Pafat/icons/tag.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Pafat/icons/unread.svg b/p/themes/Pafat/icons/unread.svg
index 77ce9c8b4..165f2775e 100644
--- a/p/themes/Pafat/icons/unread.svg
+++ b/p/themes/Pafat/icons/unread.svg
@@ -1,6 +1,6 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/p/themes/Pafat/icons/up.svg b/p/themes/Pafat/icons/up.svg
index bd9be09e9..6a53dfffe 100644
--- a/p/themes/Pafat/icons/up.svg
+++ b/p/themes/Pafat/icons/up.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Swage/icons/add.svg b/p/themes/Swage/icons/add.svg
index 49ca39bb4..513898c31 100644
--- a/p/themes/Swage/icons/add.svg
+++ b/p/themes/Swage/icons/add.svg
@@ -1,7 +1,3 @@
-
-
-
-
-
-
+
+
diff --git a/p/themes/Swage/icons/all.svg b/p/themes/Swage/icons/all.svg
index df7d903b1..0a7ef6926 100644
--- a/p/themes/Swage/icons/all.svg
+++ b/p/themes/Swage/icons/all.svg
@@ -1,7 +1,3 @@
-
-
-
-
-
-
+
+
diff --git a/p/themes/Swage/icons/bookmark-add.svg b/p/themes/Swage/icons/bookmark-add.svg
index 8100c3fe1..13469b101 100644
--- a/p/themes/Swage/icons/bookmark-add.svg
+++ b/p/themes/Swage/icons/bookmark-add.svg
@@ -1,8 +1,7 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Swage/icons/bookmark-tag.svg b/p/themes/Swage/icons/bookmark-tag.svg
index 3632d0fd4..4edc232f3 100644
--- a/p/themes/Swage/icons/bookmark-tag.svg
+++ b/p/themes/Swage/icons/bookmark-tag.svg
@@ -1,3 +1,3 @@
-
-
\ No newline at end of file
+
+
diff --git a/p/themes/Swage/icons/category.svg b/p/themes/Swage/icons/category.svg
index f0b57d5a1..fde2c1dc6 100644
--- a/p/themes/Swage/icons/category.svg
+++ b/p/themes/Swage/icons/category.svg
@@ -1,12 +1,3 @@
-
-
-
-
-
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/configure.svg b/p/themes/Swage/icons/configure.svg
index a1a87180e..dcd31c093 100644
--- a/p/themes/Swage/icons/configure.svg
+++ b/p/themes/Swage/icons/configure.svg
@@ -1,12 +1,4 @@
-
-
-
-
-
+
+
+
-
diff --git a/p/themes/Swage/icons/disabled-light.svg b/p/themes/Swage/icons/disabled-light.svg
index c46f71801..1d5ab0a68 100644
--- a/p/themes/Swage/icons/disabled-light.svg
+++ b/p/themes/Swage/icons/disabled-light.svg
@@ -1,3 +1,3 @@
-
-
+
+
diff --git a/p/themes/Swage/icons/down.svg b/p/themes/Swage/icons/down.svg
index 6450ee37e..0c4dd5ef8 100644
--- a/p/themes/Swage/icons/down.svg
+++ b/p/themes/Swage/icons/down.svg
@@ -1,6 +1,3 @@
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/error.svg b/p/themes/Swage/icons/error.svg
index 840c8c57b..b774705bc 100644
--- a/p/themes/Swage/icons/error.svg
+++ b/p/themes/Swage/icons/error.svg
@@ -1,5 +1,3 @@
-
-
-
-
+
+
diff --git a/p/themes/Swage/icons/icon.svg b/p/themes/Swage/icons/icon.svg
index c6bbd08bd..3b84dc940 100644
--- a/p/themes/Swage/icons/icon.svg
+++ b/p/themes/Swage/icons/icon.svg
@@ -1,14 +1,10 @@
-
-
-
-Logo FreshRSS
-
-
-
-
-
+
+
+ Logo FreshRSS
+
+
+
+
diff --git a/p/themes/Swage/icons/next.svg b/p/themes/Swage/icons/next.svg
index 056e70f3c..38fc4483f 100644
--- a/p/themes/Swage/icons/next.svg
+++ b/p/themes/Swage/icons/next.svg
@@ -1,5 +1,3 @@
-
-
-
-
+
+
diff --git a/p/themes/Swage/icons/non-starred.svg b/p/themes/Swage/icons/non-starred.svg
index 714697060..711ca8962 100644
--- a/p/themes/Swage/icons/non-starred.svg
+++ b/p/themes/Swage/icons/non-starred.svg
@@ -1,6 +1,3 @@
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/prev.svg b/p/themes/Swage/icons/prev.svg
index 2f6ed886c..7e6c1cb66 100644
--- a/p/themes/Swage/icons/prev.svg
+++ b/p/themes/Swage/icons/prev.svg
@@ -1,6 +1,3 @@
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/read.svg b/p/themes/Swage/icons/read.svg
index 4ab272b39..94d8b96b2 100644
--- a/p/themes/Swage/icons/read.svg
+++ b/p/themes/Swage/icons/read.svg
@@ -1 +1,3 @@
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/Swage/icons/refresh.svg b/p/themes/Swage/icons/refresh.svg
index 1c211abf6..11b209627 100644
--- a/p/themes/Swage/icons/refresh.svg
+++ b/p/themes/Swage/icons/refresh.svg
@@ -1,5 +1,3 @@
-
-
-
-
+
+
diff --git a/p/themes/Swage/icons/rss.svg b/p/themes/Swage/icons/rss.svg
index 0be960048..2f001d1a4 100644
--- a/p/themes/Swage/icons/rss.svg
+++ b/p/themes/Swage/icons/rss.svg
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
-
diff --git a/p/themes/Swage/icons/sort-down.svg b/p/themes/Swage/icons/sort-down.svg
index d7ce416cf..4558c2dd6 100644
--- a/p/themes/Swage/icons/sort-down.svg
+++ b/p/themes/Swage/icons/sort-down.svg
@@ -1,3 +1,3 @@
-
-
\ No newline at end of file
+
+
diff --git a/p/themes/Swage/icons/sort-up.svg b/p/themes/Swage/icons/sort-up.svg
index 6449eff7c..20509f467 100644
--- a/p/themes/Swage/icons/sort-up.svg
+++ b/p/themes/Swage/icons/sort-up.svg
@@ -1,3 +1,3 @@
-
-
\ No newline at end of file
+
+
diff --git a/p/themes/Swage/icons/starred.svg b/p/themes/Swage/icons/starred.svg
index 09bf263fd..5528278c1 100644
--- a/p/themes/Swage/icons/starred.svg
+++ b/p/themes/Swage/icons/starred.svg
@@ -1,6 +1,3 @@
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/unread.svg b/p/themes/Swage/icons/unread.svg
index 28c654176..4d31e0a1a 100644
--- a/p/themes/Swage/icons/unread.svg
+++ b/p/themes/Swage/icons/unread.svg
@@ -1,6 +1,3 @@
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/up.svg b/p/themes/Swage/icons/up.svg
index 2b89c550c..8593713f8 100644
--- a/p/themes/Swage/icons/up.svg
+++ b/p/themes/Swage/icons/up.svg
@@ -1,6 +1,3 @@
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/view-global.svg b/p/themes/Swage/icons/view-global.svg
index c289498e6..c8c15355b 100644
--- a/p/themes/Swage/icons/view-global.svg
+++ b/p/themes/Swage/icons/view-global.svg
@@ -1,6 +1,3 @@
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/view-normal.svg b/p/themes/Swage/icons/view-normal.svg
index 9135c070f..affc667f9 100644
--- a/p/themes/Swage/icons/view-normal.svg
+++ b/p/themes/Swage/icons/view-normal.svg
@@ -1,8 +1,3 @@
-
-
-
-
-
-
+
+
-
diff --git a/p/themes/Swage/icons/view-reader.svg b/p/themes/Swage/icons/view-reader.svg
index afb82adf7..e7eb9e091 100644
--- a/p/themes/Swage/icons/view-reader.svg
+++ b/p/themes/Swage/icons/view-reader.svg
@@ -1 +1,3 @@
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/icons/FreshRSS-logo.svg b/p/themes/icons/FreshRSS-logo.svg
index 4eb268c8a..4855d4c03 100644
--- a/p/themes/icons/FreshRSS-logo.svg
+++ b/p/themes/icons/FreshRSS-logo.svg
@@ -1,25 +1,17 @@
-
+
Logo FreshRSS
-
-
-
-
-
+
+
+
+
+
-
-
+
-
- FreshRSS
-
-
-
-
-
-
-
-
+
+
+ FreshRSS
+
+
-
diff --git a/p/themes/icons/add.svg b/p/themes/icons/add.svg
index bcb3e866f..4d41229dc 100644
--- a/p/themes/icons/add.svg
+++ b/p/themes/icons/add.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/all.svg b/p/themes/icons/all.svg
index 00c63170d..8cc3d937a 100644
--- a/p/themes/icons/all.svg
+++ b/p/themes/icons/all.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/bookmark-add.svg b/p/themes/icons/bookmark-add.svg
index 5c0c5e7fb..52b7f9f20 100644
--- a/p/themes/icons/bookmark-add.svg
+++ b/p/themes/icons/bookmark-add.svg
@@ -1,6 +1,6 @@
-
-
+
+
-
\ No newline at end of file
+
diff --git a/p/themes/icons/bookmark-tag.svg b/p/themes/icons/bookmark-tag.svg
index b5f084a0c..8d5b66b9f 100644
--- a/p/themes/icons/bookmark-tag.svg
+++ b/p/themes/icons/bookmark-tag.svg
@@ -1,3 +1,3 @@
-
-
\ No newline at end of file
+
+
diff --git a/p/themes/icons/category.svg b/p/themes/icons/category.svg
index b5470d84a..a419cdbc0 100644
--- a/p/themes/icons/category.svg
+++ b/p/themes/icons/category.svg
@@ -1,7 +1,3 @@
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/icons/close.svg b/p/themes/icons/close.svg
index 87537c191..ef68f7b34 100644
--- a/p/themes/icons/close.svg
+++ b/p/themes/icons/close.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/configure.svg b/p/themes/icons/configure.svg
index 2957a7abe..041a0da09 100644
--- a/p/themes/icons/configure.svg
+++ b/p/themes/icons/configure.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/icons/debug.svg b/p/themes/icons/debug.svg
index e37b1fcb7..1492d1bfb 100644
--- a/p/themes/icons/debug.svg
+++ b/p/themes/icons/debug.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/disabled.svg b/p/themes/icons/disabled.svg
index cc16ff83d..ef68f7b34 100644
--- a/p/themes/icons/disabled.svg
+++ b/p/themes/icons/disabled.svg
@@ -1,3 +1,3 @@
-
-
+
+
diff --git a/p/themes/icons/down.svg b/p/themes/icons/down.svg
index 600ccb961..b72a76195 100644
--- a/p/themes/icons/down.svg
+++ b/p/themes/icons/down.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/enabled.svg b/p/themes/icons/enabled.svg
index dbdcfdbc6..c905778a9 100644
--- a/p/themes/icons/enabled.svg
+++ b/p/themes/icons/enabled.svg
@@ -1,3 +1,3 @@
-
-
+
+
diff --git a/p/themes/icons/error.svg b/p/themes/icons/error.svg
index 6b5976090..c31a835b3 100644
--- a/p/themes/icons/error.svg
+++ b/p/themes/icons/error.svg
@@ -1,4 +1,4 @@
-
-
-
+
+
+
diff --git a/p/themes/icons/favicon.svg b/p/themes/icons/favicon.svg
index a252050b9..7cef784ab 100644
--- a/p/themes/icons/favicon.svg
+++ b/p/themes/icons/favicon.svg
@@ -1,13 +1,12 @@
Logo FreshRSS
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
diff --git a/p/themes/icons/help.svg b/p/themes/icons/help.svg
index e5f918f57..99cb15351 100644
--- a/p/themes/icons/help.svg
+++ b/p/themes/icons/help.svg
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/p/themes/icons/icon.svg b/p/themes/icons/icon.svg
index caa987dac..0b36def91 100644
--- a/p/themes/icons/icon.svg
+++ b/p/themes/icons/icon.svg
@@ -1,12 +1,11 @@
Logo FreshRSS
-
-
-
-
-
+
+
+
+
+
-
-
+
diff --git a/p/themes/icons/important.svg b/p/themes/icons/important.svg
index 6c354bef1..9ab7feec0 100644
--- a/p/themes/icons/important.svg
+++ b/p/themes/icons/important.svg
@@ -1,16 +1,3 @@
-
-
+
+
+
diff --git a/p/themes/icons/key.svg b/p/themes/icons/key.svg
index e51961e49..1e4f11b0c 100644
--- a/p/themes/icons/key.svg
+++ b/p/themes/icons/key.svg
@@ -1 +1,7 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
diff --git a/p/themes/icons/label.svg b/p/themes/icons/label.svg
index fcb878c5b..f7361deb3 100644
--- a/p/themes/icons/label.svg
+++ b/p/themes/icons/label.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/link.svg b/p/themes/icons/link.svg
index 6419547c0..d8539dd2a 100644
--- a/p/themes/icons/link.svg
+++ b/p/themes/icons/link.svg
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/p/themes/icons/login.svg b/p/themes/icons/login.svg
index a3e3f3377..64abbc0ac 100644
--- a/p/themes/icons/login.svg
+++ b/p/themes/icons/login.svg
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+
diff --git a/p/themes/icons/logout.svg b/p/themes/icons/logout.svg
index e690e1d33..6d3570dcf 100644
--- a/p/themes/icons/logout.svg
+++ b/p/themes/icons/logout.svg
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+
diff --git a/p/themes/icons/look.svg b/p/themes/icons/look.svg
index 79464d3ab..1e27b9097 100644
--- a/p/themes/icons/look.svg
+++ b/p/themes/icons/look.svg
@@ -1,4 +1,4 @@
-
-
+
+
diff --git a/p/themes/icons/next.svg b/p/themes/icons/next.svg
index 39ff760b2..5add044fe 100644
--- a/p/themes/icons/next.svg
+++ b/p/themes/icons/next.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/non-starred.svg b/p/themes/icons/non-starred.svg
index 656f17427..396f849e1 100644
--- a/p/themes/icons/non-starred.svg
+++ b/p/themes/icons/non-starred.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/notice.svg b/p/themes/icons/notice.svg
index e21ee13b4..81bc0c376 100644
--- a/p/themes/icons/notice.svg
+++ b/p/themes/icons/notice.svg
@@ -1,5 +1,5 @@
-
-
-
-
+
+
+
+
diff --git a/p/themes/icons/opml-dyn.svg b/p/themes/icons/opml-dyn.svg
index 4c0711367..e7ef68bc7 100644
--- a/p/themes/icons/opml-dyn.svg
+++ b/p/themes/icons/opml-dyn.svg
@@ -1,8 +1,8 @@
-
+
-
-
-
-
+
+
+
+
diff --git a/p/themes/icons/opml.svg b/p/themes/icons/opml.svg
index b3e8a830c..df1dd1488 100644
--- a/p/themes/icons/opml.svg
+++ b/p/themes/icons/opml.svg
@@ -1,7 +1,7 @@
-
+
-
-
-
+
+
+
diff --git a/p/themes/icons/prev.svg b/p/themes/icons/prev.svg
index 3c2106449..90ee0a250 100644
--- a/p/themes/icons/prev.svg
+++ b/p/themes/icons/prev.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/read.svg b/p/themes/icons/read.svg
index d3bf517c1..7b15df695 100644
--- a/p/themes/icons/read.svg
+++ b/p/themes/icons/read.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/refresh.svg b/p/themes/icons/refresh.svg
index 62fe56c1e..41f1974d0 100644
--- a/p/themes/icons/refresh.svg
+++ b/p/themes/icons/refresh.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/icons/rss.svg b/p/themes/icons/rss.svg
index 2a8713be3..6924b801f 100644
--- a/p/themes/icons/rss.svg
+++ b/p/themes/icons/rss.svg
@@ -1,6 +1,6 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/p/themes/icons/search.svg b/p/themes/icons/search.svg
index 35a28dfca..6c5e48b64 100644
--- a/p/themes/icons/search.svg
+++ b/p/themes/icons/search.svg
@@ -1,6 +1,6 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/p/themes/icons/share.svg b/p/themes/icons/share.svg
index a17fceda6..96a9ee5df 100644
--- a/p/themes/icons/share.svg
+++ b/p/themes/icons/share.svg
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+
diff --git a/p/themes/icons/sort-down.svg b/p/themes/icons/sort-down.svg
index 4471ca605..09fe8a282 100644
--- a/p/themes/icons/sort-down.svg
+++ b/p/themes/icons/sort-down.svg
@@ -1,3 +1,3 @@
-
-
\ No newline at end of file
+
+
diff --git a/p/themes/icons/sort-up.svg b/p/themes/icons/sort-up.svg
index 59ae7d0b4..48a5c618a 100644
--- a/p/themes/icons/sort-up.svg
+++ b/p/themes/icons/sort-up.svg
@@ -1,3 +1,3 @@
-
-
\ No newline at end of file
+
+
diff --git a/p/themes/icons/spinner.svg b/p/themes/icons/spinner.svg
index 772d0c39f..0c23f7da4 100644
--- a/p/themes/icons/spinner.svg
+++ b/p/themes/icons/spinner.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
+
+
+
diff --git a/p/themes/icons/starred.svg b/p/themes/icons/starred.svg
index 63a44908f..de2ed68ac 100644
--- a/p/themes/icons/starred.svg
+++ b/p/themes/icons/starred.svg
@@ -1,5 +1,3 @@
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/icons/stats.svg b/p/themes/icons/stats.svg
index abb41d084..5583303c7 100644
--- a/p/themes/icons/stats.svg
+++ b/p/themes/icons/stats.svg
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+
diff --git a/p/themes/icons/tag.svg b/p/themes/icons/tag.svg
index f5afe9de0..3d0871a0f 100644
--- a/p/themes/icons/tag.svg
+++ b/p/themes/icons/tag.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/unread.svg b/p/themes/icons/unread.svg
index dc1cc609c..d975e7bec 100644
--- a/p/themes/icons/unread.svg
+++ b/p/themes/icons/unread.svg
@@ -1,6 +1,6 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/p/themes/icons/up.svg b/p/themes/icons/up.svg
index dbae173d9..3b929a9dc 100644
--- a/p/themes/icons/up.svg
+++ b/p/themes/icons/up.svg
@@ -1,3 +1,3 @@
-
+
diff --git a/p/themes/icons/view-global.svg b/p/themes/icons/view-global.svg
index d81e79790..7c5c3fb97 100644
--- a/p/themes/icons/view-global.svg
+++ b/p/themes/icons/view-global.svg
@@ -1 +1,13 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/p/themes/icons/view-normal.svg b/p/themes/icons/view-normal.svg
index c35b101df..a75666a9c 100644
--- a/p/themes/icons/view-normal.svg
+++ b/p/themes/icons/view-normal.svg
@@ -1 +1,3 @@
-
\ No newline at end of file
+
+
+
diff --git a/p/themes/icons/view-reader.svg b/p/themes/icons/view-reader.svg
index 3243aed6e..ec2dc4e8b 100644
--- a/p/themes/icons/view-reader.svg
+++ b/p/themes/icons/view-reader.svg
@@ -1 +1,11 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
diff --git a/p/themes/icons/warning.svg b/p/themes/icons/warning.svg
index 4f4ecdc9a..5101b1ce9 100644
--- a/p/themes/icons/warning.svg
+++ b/p/themes/icons/warning.svg
@@ -1,5 +1,5 @@
-
-
-
-
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
index f5a92065f..7b006e92b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,8 @@
"rtlcss": "^4.3.0",
"stylelint": "^17.15.0",
"stylelint-config-recommended": "^18.0.0",
- "stylelint-order": "^8.1.1"
+ "stylelint-order": "^8.1.1",
+ "svgo": "^4.1.0"
},
"engines": {
"node": ">=20"
@@ -975,6 +976,13 @@
"node": "18 || 20 || >=22"
}
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/brace-expansion": {
"version": "5.0.9",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
@@ -1170,6 +1178,23 @@
"node": ">=12"
}
},
+ "node_modules/css-select": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz",
+ "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^7.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "nth-check": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/css-tree": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
@@ -1184,6 +1209,19 @@
"node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
}
},
+ "node_modules/css-what": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz",
+ "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -1197,6 +1235,42 @@
"node": ">=4"
}
},
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -1260,6 +1334,65 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -3144,6 +3277,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -3539,6 +3685,16 @@
"queue-microtask": "^1.2.2"
}
},
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
"node_modules/semver": {
"version": "7.8.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
@@ -3880,6 +4036,42 @@
"integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
"dev": true
},
+ "node_modules/svgo": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz",
+ "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^11.1.0",
+ "css-select": "^6.0.0",
+ "css-tree": "^3.0.1",
+ "css-what": "^7.0.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.1.1",
+ "sax": "1.6.1"
+ },
+ "bin": {
+ "svgo": "bin/svgo.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/table": {
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
diff --git a/package.json b/package.json
index 6dfb7bb00..31f2af7ae 100644
--- a/package.json
+++ b/package.json
@@ -28,14 +28,16 @@
"markdownlint": "markdownlint-cli2",
"markdownlint_fix": "markdownlint-cli2 --fix",
"rtlcss": "rtlcss -d p/themes/ && find p/themes/ -type f -name '*.rtl.rtl.css' -delete",
+ "svgo": "find p/ docs/ -name '*.svg' -exec svgo {} + | awk '/:$/{name=$0;next} /KiB/ && !/ - 0% /{print name; print}'",
"stylelint": "stylelint '**/*.css'",
"stylelint_fix": "stylelint --fix '**/*.css'",
"test": "npm run eslint && npm run stylelint && npm run markdownlint",
- "fix": "npm run eslint_fix && npm run stylelint_fix && npm run rtlcss && npm run markdownlint_fix"
+ "fix": "npm run eslint_fix && npm run stylelint_fix && npm run rtlcss && npm run markdownlint_fix && npm run svgo"
},
"devDependencies": {
- "eslint": "^10.10.0",
"@eslint/js": "^10.0.1",
+ "@stylistic/stylelint-plugin": "^5.3.0",
+ "eslint": "^10.10.0",
"globals": "^17.12.0",
"markdownlint-cli2": "^0.23.2",
"neostandard": "^0.14.0-next.1",
@@ -43,7 +45,7 @@
"stylelint": "^17.15.0",
"stylelint-config-recommended": "^18.0.0",
"stylelint-order": "^8.1.1",
- "@stylistic/stylelint-plugin": "^5.3.0"
+ "svgo": "^4.1.0"
},
"rtlcssConfig": {
"options": {
diff --git a/svgo.config.mjs b/svgo.config.mjs
new file mode 100644
index 000000000..c753c83b3
--- /dev/null
+++ b/svgo.config.mjs
@@ -0,0 +1,23 @@
+export default {
+ js2svg: {
+ indent: '\t',
+ pretty: true,
+ eol: 'lf',
+ finalNewline: true,
+ },
+ multipass: true,
+ plugins: [ // https://svgo.dev/docs/plugins/
+ {
+ name: 'preset-default', // Built-in plugins enabled by default: https://svgo.dev/docs/preset-default/#plugins-list
+ params: {
+ overrides: {
+ // Disable selected plugins from the default preset
+ removeComments: false,
+ },
+ },
+ },
+
+ // Extra plugins
+ 'removeScripts',
+ ],
+};