This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/karaf-site.git
The following commit(s) were added to refs/heads/trunk by this push:
new cb90932 Self-host Font Awesome, Bootstrap JS and Google Fonts
cb90932 is described below
commit cb9093249552262aeadb6857e153a17a2ecd7cb4
Author: JB Onofré <[email protected]>
AuthorDate: Mon Sep 21 13:33:21 2026 +0200
Self-host Font Awesome, Bootstrap JS and Google Fonts
The theme redesign loaded Font Awesome and Bootstrap's JS bundle from
cdn.jsdelivr.net and Inter/JetBrains Mono from fonts.googleapis.com.
The Content-Security-Policy enforced on *.apache.org only allows
script/style/font requests from 'self' plus a short apache.org
domain allowlist, so the browser silently blocks all three CDNs -
which is why icons (and Bootstrap's JS-driven navbar/dropdown
behavior, and the custom fonts) went missing in production.
- Bundle Font Awesome into assets/css/karaf.css via _scss/karaf.scss,
with its webfonts copied to assets/webfonts by a new
`npm run build:icons` step (gitignored, like karaf.css itself).
- Point _includes/scripts.html at the already-vendored
assets/js/vendor/bootstrap.bundle.min.js instead of the CDN, and
refresh that file from the stale Bootstrap 4.1.1 build to the
5.3.8 build the theme actually targets.
- Self-host Inter and JetBrains Mono under assets/fonts/ with a new
_scss/_fonts.scss, instead of linking fonts.googleapis.com.
---
.gitignore | 1 +
README.md | 7 +-
_includes/head.html | 8 +-
_includes/scripts.html | 2 +-
_scss/_fonts.scss | 169 +++++++++++++++++++++++++++
_scss/karaf.scss | 18 ++-
assets/fonts/inter-latin-ext.woff2 | Bin 0 -> 85068 bytes
assets/fonts/inter-latin.woff2 | Bin 0 -> 48256 bytes
assets/fonts/jetbrains-mono-latin-ext.woff2 | Bin 0 -> 11624 bytes
assets/fonts/jetbrains-mono-latin.woff2 | Bin 0 -> 31432 bytes
assets/js/vendor/bootstrap.bundle.min.js | 8 +-
assets/js/vendor/bootstrap.bundle.min.js.map | 2 +-
package.json | 6 +-
13 files changed, 202 insertions(+), 19 deletions(-)
diff --git a/.gitignore b/.gitignore
index 109fd40..df705e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ target
node_modules
_sass/vendor
assets/css/karaf.css
+assets/webfonts
diff --git a/README.md b/README.md
index d746594..95312f2 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,8 @@ git clone https://github.com/apache/karaf-site.git
Karaf website uses Jekyll to build (generate the HTML resources) and npm/sass
to build the CSS assets (Bootstrap 5 based theme).
+The `Content-Security-Policy` enforced on `*.apache.org` only allows
script/style/font requests from `'self'` and a short list of apache.org
domains, so any asset loaded from a third-party CDN (jsdelivr, Google Fonts,
etc.) is silently blocked by the browser. Bootstrap's JS and Font Awesome must
stay self-hosted: Font Awesome is bundled into `assets/css/karaf.css` via
`_scss/karaf.scss` (with its webfonts copied by `npm run build:icons`), and
Bootstrap's JS bundle is committed at `assets [...]
+
To install Jekyll, refer to https://jekyllrb.com/docs/
Install the node dependencies and the Ruby modules required by the site:
@@ -45,10 +47,11 @@ npm run build
```
npm run build:css # compile the Bootstrap 5 theme (_scss/) to
assets/css/karaf.css
npm run watch:css # rebuild CSS continuously while styling
+npm run build:icons # copy the Font Awesome webfonts to assets/webfonts
npm run optimize:svg # minify the SVG assets (logos) after editing any
images/*.svg
```
-`assets/css/karaf.css` is generated and gitignored — it is not committed. Once
you have run `npm start`, `npm run build`, or `npm run build:css` at least
once, the file exists on disk and you can also run Jekyll directly:
+`assets/css/karaf.css` and `assets/webfonts/` are generated and gitignored —
they are not committed. Once you have run `npm start`, `npm run build`, or `npm
run build:css`/`npm run build:icons` at least once, they exist on disk and you
can also run Jekyll directly:
```
bundle exec jekyll serve
@@ -78,7 +81,7 @@ Build the site for production (this also compiles the CSS and
optimizes the SVGs
JEKYLL_ENV=production npm run build
```
-You can also use Jekyll Docker image to build (run `npm run build:css` first,
since the Docker image cannot resolve the Bootstrap 5 Sass imports):
+You can also use Jekyll Docker image to build (run `npm run build:css` and
`npm run build:icons` first, since the Docker image cannot resolve the
Bootstrap 5 Sass imports or copy the Font Awesome webfonts):
```
docker run --rm --volume="$PWD:/srv/jekyll:Z" jekyll/jekyll jekyll build
diff --git a/_includes/head.html b/_includes/head.html
index 728304a..5545424 100644
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -11,13 +11,7 @@
<link href="/images/favicon.ico" rel="icon">
<link rel="icon" type="image/svg+xml" href="/images/feather.svg">
-<!-- Google Fonts -->
-<link rel="preconnect" href="https://fonts.googleapis.com">
-<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap"
rel="stylesheet">
-
-<!-- Bootstrap 5 + FontAwesome + Karaf theme -->
-<link
href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css"
rel="stylesheet">
+<!-- Bootstrap 5 + FontAwesome + Inter/JetBrains Mono (all bundled into
karaf.css, see _scss/karaf.scss) + Karaf theme -->
<link href="/assets/css/karaf.css" rel="stylesheet">
<!-- Set theme before paint to avoid flash -->
diff --git a/_includes/scripts.html b/_includes/scripts.html
index 17269e9..59ac087 100644
--- a/_includes/scripts.html
+++ b/_includes/scripts.html
@@ -1,5 +1,5 @@
<!-- Bootstrap 5 JS bundle (no jQuery required) -->
-<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
+<script src="/assets/js/vendor/bootstrap.bundle.min.js"></script>
<!-- Anchor links (for doc-friendly headings) if available -->
<script src="/assets/js/vendor/anchor.min.js"></script>
diff --git a/_scss/_fonts.scss b/_scss/_fonts.scss
new file mode 100644
index 0000000..a100332
--- /dev/null
+++ b/_scss/_fonts.scss
@@ -0,0 +1,169 @@
+// Self-hosted Inter + JetBrains Mono (variable fonts, latin + latin-ext
subsets only).
+// The ASF CSP blocks fonts.googleapis.com/fonts.gstatic.com on
karaf.apache.org (see
+// _scss/karaf.scss for the same issue with Font Awesome), so these must ship
from
+// /assets/fonts instead of the Google Fonts CDN. Files fetched from
+//
fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600
+// -- each is a single variable-font file; the browser maps the declared
font-weight
+// onto its wght axis, which is why every weight below reuses the same two
files per family.
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(../fonts/inter-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(../fonts/inter-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(../fonts/inter-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(../fonts/inter-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(../fonts/inter-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(../fonts/inter-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url(../fonts/inter-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url(../fonts/inter-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(../fonts/inter-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(../fonts/inter-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 800;
+ font-display: swap;
+ src: url(../fonts/inter-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 800;
+ font-display: swap;
+ src: url(../fonts/inter-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(../fonts/jetbrains-mono-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(../fonts/jetbrains-mono-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(../fonts/jetbrains-mono-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(../fonts/jetbrains-mono-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url(../fonts/jetbrains-mono-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+
+@font-face {
+ font-family: 'JetBrains Mono';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url(../fonts/jetbrains-mono-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
diff --git a/_scss/karaf.scss b/_scss/karaf.scss
index 5e4013a..c701c01 100644
--- a/_scss/karaf.scss
+++ b/_scss/karaf.scss
@@ -7,8 +7,22 @@
// 2. Bootstrap core
@import "bootstrap/scss/bootstrap";
-// 3. Karaf design tokens as CSS custom properties (light + dark)
+// 3. Font Awesome, self-hosted: the ASF-enforced CSP on *.apache.org only
+// allows style/font requests from 'self' (plus a few apache.org domains), so
+// loading it from a CDN (cdn.jsdelivr.net) gets silently blocked by the
+// browser and every icon on the site disappears. Bundle it into karaf.css
+// instead and serve the webfonts from /assets/webfonts (see package.json's
+// build:icons script, which copies them out of node_modules).
+$fa-font-path: "../webfonts";
+@import "@fortawesome/fontawesome-free/scss/fontawesome";
+@import "@fortawesome/fontawesome-free/scss/solid";
+@import "@fortawesome/fontawesome-free/scss/regular";
+
+// 4. Self-hosted Inter + JetBrains Mono (same CSP reasoning as Font Awesome
above)
+@import "fonts";
+
+// 5. Karaf design tokens as CSS custom properties (light + dark)
@import "karaf-tokens";
-// 4. Karaf component/page custom styles
+// 6. Karaf component/page custom styles
@import "karaf-components";
\ No newline at end of file
diff --git a/assets/fonts/inter-latin-ext.woff2
b/assets/fonts/inter-latin-ext.woff2
new file mode 100644
index 0000000..479d010
Binary files /dev/null and b/assets/fonts/inter-latin-ext.woff2 differ
diff --git a/assets/fonts/inter-latin.woff2 b/assets/fonts/inter-latin.woff2
new file mode 100644
index 0000000..d15208d
Binary files /dev/null and b/assets/fonts/inter-latin.woff2 differ
diff --git a/assets/fonts/jetbrains-mono-latin-ext.woff2
b/assets/fonts/jetbrains-mono-latin-ext.woff2
new file mode 100644
index 0000000..82f9668
Binary files /dev/null and b/assets/fonts/jetbrains-mono-latin-ext.woff2 differ
diff --git a/assets/fonts/jetbrains-mono-latin.woff2
b/assets/fonts/jetbrains-mono-latin.woff2
new file mode 100644
index 0000000..4d09cda
Binary files /dev/null and b/assets/fonts/jetbrains-mono-latin.woff2 differ
diff --git a/assets/js/vendor/bootstrap.bundle.min.js
b/assets/js/vendor/bootstrap.bundle.min.js
index 24c2992..0b87369 100644
--- a/assets/js/vendor/bootstrap.bundle.min.js
+++ b/assets/js/vendor/bootstrap.bundle.min.js
@@ -1,7 +1,7 @@
/*!
- * Bootstrap v4.1.1 (https://getbootstrap.com/)
- * Copyright 2011-2018 The Bootstrap Authors
(https://github.com/twbs/bootstrap/graphs/contributors)
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * Bootstrap v5.3.8 (https://getbootstrap.com/)
+ * Copyright 2011-2025 The Bootstrap Authors
(https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof
module?e(exports,require("jquery")):"function"==typeof
define&&define.amd?define(["exports","jquery"],e):e(t.bootstrap={},t.jQuery)}(this,function(t,e){"use
strict";function i(t,e){for(var n=0;n<e.length;n++){var
i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in
i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return
e&&i(t.prototype,e),n&&i(t,n),t}function c(r){for(var t=1;t<arguments.lengt
[...]
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof
module?module.exports=e():"function"==typeof
define&&define.amd?define(e):(t="undefined"!=typeof
globalThis?globalThis:t||self).bootstrap=e()}(this,function(){"use
strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const
s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't
allow more than one instance per element. Bound instance:
${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).g [...]
//# sourceMappingURL=bootstrap.bundle.min.js.map
\ No newline at end of file
diff --git a/assets/js/vendor/bootstrap.bundle.min.js.map
b/assets/js/vendor/bootstrap.bundle.min.js.map
index 591107c..3e678d4 100644
--- a/assets/js/vendor/bootstrap.bundle.min.js.map
+++ b/assets/js/vendor/bootstrap.bundle.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../../node_modules/popper.js/dist/esm/popper.js","../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/modal.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/index.js"],"names":["$","NAME","DATA_KEY","EVENT_KEY","JQUERY_NO_CONFLICT","Event","ClassName","Alert","DATA_API_KEY","Select
[...]
\ No newline at end of file
+{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","Object","prototype","toString","call","toLowerCase","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","
[...]
\ No newline at end of file
diff --git a/package.json b/package.json
index db0e70e..d1948c1 100644
--- a/package.json
+++ b/package.json
@@ -6,11 +6,13 @@
"scripts": {
"build:css": "sass --no-source-map --quiet-deps
--silence-deprecation=import --load-path=node_modules
_scss/karaf.scss:assets/css/karaf.css",
"watch:css": "sass --watch --quiet-deps --silence-deprecation=import
--load-path=node_modules _scss/karaf.scss:assets/css/karaf.css",
+ "build:icons": "mkdir -p assets/webfonts && cp
node_modules/@fortawesome/fontawesome-free/webfonts/* assets/webfonts/",
"optimize:svg": "svgo --config svgo.config.js images/*.svg",
- "build": "npm run build:css && npm run optimize:svg && bundle exec jekyll
build",
- "start": "npm run build:css && npm run optimize:svg && bundle exec jekyll
serve"
+ "build": "npm run build:icons && npm run build:css && npm run optimize:svg
&& bundle exec jekyll build",
+ "start": "npm run build:icons && npm run build:css && npm run optimize:svg
&& bundle exec jekyll serve"
},
"devDependencies": {
+ "@fortawesome/fontawesome-free": "^6.5.2",
"bootstrap": "^5.3.3",
"sass": "^1.77.0",
"svgo": "^4.1.0"