diff --git a/.quarkus/cli/plugins/quarkus-cli-catalog.json b/.quarkus/cli/plugins/quarkus-cli-catalog.json
new file mode 100644
index 000000000..121c3be6f
--- /dev/null
+++ b/.quarkus/cli/plugins/quarkus-cli-catalog.json
@@ -0,0 +1,20 @@
+{
+ "version" : "v1",
+ "lastUpdate" : "16/10/2025 14:52:06",
+ "plugins" : {
+ "tls" : {
+ "name" : "tls",
+ "type" : "extension",
+ "location" : "io.quarkus:quarkus-tls-registry-cli:3.28.3",
+ "description" : null,
+ "inProjectCatalog" : false
+ },
+ "kill" : {
+ "name" : "kill",
+ "type" : "jbang",
+ "location" : "quarkus-kill@quarkusio",
+ "description" : null,
+ "inProjectCatalog" : false
+ }
+ }
+}
\ No newline at end of file
diff --git a/mise.toml b/mise.toml
index 4a5525bb1..3ebebbb06 100644
--- a/mise.toml
+++ b/mise.toml
@@ -1,7 +1,7 @@
[tools]
java = "21.0.2"
maven = "3.9.11"
-quarkus = "3.26.2"
+quarkus = "3.33.1"
jbang = "0.129.0"
node = "lts"
watchexec = "2.3.2"
diff --git a/pom.xml b/pom.xml
index bff0f38e8..25ab4d14f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,6 +4,7 @@
dev.jbang
jbang-dev-site
1.0.0-SNAPSHOT
+ quarkus
21
@@ -14,10 +15,10 @@
io.quarkus.platform
true
- 3.14.0
- 1.10.1
- 3.24.5
- 3.5.3
+ 3.15.0
+ 2.1.0
+ 3.33.1
+ 3.5.4
public/documentation
@@ -80,7 +81,7 @@
io.quarkus
- quarkus-junit5
+ quarkus-junit
test
@@ -118,16 +119,6 @@
quarkus-maven-plugin
${version.quarkus.platform}
true
-
-
-
- build
- generate-code
- generate-code-tests
- native-image-agent
-
-
-
maven-compiler-plugin
@@ -155,6 +146,7 @@
org.jboss.logmanager.LogManager
${maven.home}
+ @{argLine}
@@ -174,6 +166,7 @@
org.jboss.logmanager.LogManager
${maven.home}
+ @{argLine}
diff --git a/src/main/resources/web/app/minimal-mistakes.scss b/src/main/resources/web/app/minimal-mistakes.scss
index ba9d13d5d..d3381c776 100644
--- a/src/main/resources/web/app/minimal-mistakes.scss
+++ b/src/main/resources/web/app/minimal-mistakes.scss
@@ -8,7 +8,7 @@
@import "minimal-mistakes/vendor/breakpoint/breakpoint";
@include breakpoint-set("to ems", true);
@import "minimal-mistakes/vendor/magnific-popup/magnific-popup"; // Magnific Popup
-@import "minimal-mistakes/vendor/susy/susy";
+@import "minimal-mistakes/span";
@import "minimal-mistakes/mixins";
/* Core CSS */
diff --git a/src/main/resources/web/app/minimal-mistakes/_forms.scss b/src/main/resources/web/app/minimal-mistakes/_forms.scss
index af29b9f72..bd3278b40 100644
--- a/src/main/resources/web/app/minimal-mistakes/_forms.scss
+++ b/src/main/resources/web/app/minimal-mistakes/_forms.scss
@@ -25,7 +25,7 @@ form {
}
p {
- margin-bottom: (5px / 2);
+ margin-bottom: (5px * 0.5);
}
ul {
diff --git a/src/main/resources/web/app/minimal-mistakes/_mixins.scss b/src/main/resources/web/app/minimal-mistakes/_mixins.scss
index 4aa9eb09c..e48d1cfad 100644
--- a/src/main/resources/web/app/minimal-mistakes/_mixins.scss
+++ b/src/main/resources/web/app/minimal-mistakes/_mixins.scss
@@ -1,7 +1,11 @@
+@use "sass:color";
+
/* ==========================================================================
MIXINS
========================================================================== */
+@use "sass:math";
+
%tab-focus {
/* Default*/
outline: thin dotted $focus-color;
@@ -15,7 +19,7 @@
========================================================================== */
@function em($target, $context: $doc-font-size) {
- @return ($target / $context) * 1em;
+ @return math.div($target, $context) * 1em;
}
@@ -61,15 +65,15 @@
$color,
$threshold: $yiq-contrasted-threshold
) {
- $red: red($color);
- $green: green($color);
- $blue: blue($color);
+ $red: color.channel($color, 'red', $space: rgb);
+ $green: color.channel($color, 'green', $space: rgb);
+ $blue: color.channel($color, 'blue', $space: rgb);
- $yiq: (($red*299)+($green*587)+($blue*114))/1000;
+ $yiq: (($red*299)+($green*587)+($blue*114))*0.001;
@if $yiq-debug { @debug $yiq, $threshold; }
- @return if($yiq >= $threshold, true, false);
+ @return if(sass($yiq >= $threshold): true; else: false);
}
@function yiq-contrast-color(
@@ -78,7 +82,7 @@
$light: $yiq-contrasted-light-default,
$threshold: $yiq-contrasted-threshold
) {
- @return if(yiq-is-light($color, $threshold), $yiq-contrasted-dark-default, $yiq-contrasted-light-default);
+ @return if(sass(yiq-is-light($color, $threshold)): $yiq-contrasted-dark-default; else: $yiq-contrasted-light-default);
}
@mixin yiq-contrasted(
diff --git a/src/main/resources/web/app/minimal-mistakes/_span.scss b/src/main/resources/web/app/minimal-mistakes/_span.scss
new file mode 100644
index 000000000..f879e93f0
--- /dev/null
+++ b/src/main/resources/web/app/minimal-mistakes/_span.scss
@@ -0,0 +1,9 @@
+// Lightweight replacement for the Susy span() function.
+// Usage: span($n of $total) returns a percentage width.
+@use "sass:math";
+
+@function span($span) {
+ $n: nth($span, 1);
+ $total: nth($span, 3);
+ @return math.percentage(math.div($n, $total));
+}
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_helpers.scss b/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_helpers.scss
index 97e522d11..1accfe9eb 100644
--- a/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_helpers.scss
+++ b/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_helpers.scss
@@ -1,6 +1,8 @@
//////////////////////////////
// Converts the input value to Base EMs
//////////////////////////////
+@use "sass:math";
+
@function breakpoint-to-base-em($value) {
$value-unit: unit($value);
@@ -9,7 +11,7 @@
$base-unit: unit(breakpoint-get('base font size'));
@if $base-unit == 'px' or $base-unit == '%' or $base-unit == 'em' or $base-unit == 'pt' {
- @return base-conversion($value) / base-conversion(breakpoint-get('base font size')) * 1em;
+ @return math.div(base-conversion($value), base-conversion(breakpoint-get('base font size'))) * 1em;
}
@else {
@warn '#{breakpoint-get(\'base font size\')} is not set in valid units for font size!';
@@ -25,16 +27,16 @@
$unit: unit($value);
@if $unit == 'px' {
- @return $value / 16px * 1em;
+ @return math.div($value, 16px) * 1em;
}
@else if $unit == '%' {
- @return $value / 100% * 1em;
+ @return math.div($value, 100%) * 1em;
}
@else if $unit == 'em' {
@return $value;
}
@else if $unit == 'pt' {
- @return $value / 12pt * 1em;
+ @return math.div($value, 12pt) * 1em;
}
@else {
@return $value;
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_parsers.scss b/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_parsers.scss
index f0b053fee..fdf7b347a 100644
--- a/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_parsers.scss
+++ b/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/_parsers.scss
@@ -41,7 +41,7 @@ $Memo-Exists: function-exists(memo-get) and function-exists(memo-set);
// Test to see if it's a comma-separated list
- $or-list: if(list-separator($query) == 'comma', true, false);
+ $or-list: if(sass(list-separator($query) == 'comma'): true; else: false);
@if ($or-list == false and breakpoint-get('legacy syntax') == false) {
@@ -69,7 +69,7 @@ $Memo-Exists: function-exists(memo-get) and function-exists(memo-set);
@else {
$query-string: '';
@for $i from 1 through $length {
- $query-string: $query-string + if($i == 1, '', ', ') + breakpoint-parse(nth($query, $i));
+ $query-string: $query-string + if(sass($i == 1): ''; else: ', ') + breakpoint-parse(nth($query, $i));
}
}
}
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss b/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss
index 368042126..205e25cd5 100644
--- a/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss
+++ b/src/main/resources/web/app/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss
@@ -1,3 +1,5 @@
+@use "sass:math";
+
@function breakpoint-make-resolutions($resolution) {
$length: length($resolution);
@@ -34,8 +36,8 @@
// Write out feature tests
$webkit: '';
$moz: '';
- $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / $base})';
- $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / $base})';
+ $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{math.div($value, $base)})';
+ $moz: '(#{$feature}-moz-device-pixel-ratio: #{math.div($value, $base)})';
// Append to output
$output: append($output, $standard, space);
$output: append($output, $webkit, space);
@@ -44,9 +46,9 @@
@else {
$webkit: '';
$moz: '';
- $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / 1dppx})';
- $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / 1dppx})';
- $fallback: '(#{$feature}resolution: #{$value / 1dppx * 96dpi})';
+ $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{math.div($value, 1dppx)})';
+ $moz: '(#{$feature}-moz-device-pixel-ratio: #{math.div($value, 1dppx)})';
+ $fallback: '(#{$feature}resolution: #{math.div($value, 1dppx) * 96dpi})';
// Append to output
$output: append($output, $standard, space);
$output: append($output, $webkit, space);
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss b/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss
index 27b27bcc3..45826fb3b 100644
--- a/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss
+++ b/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss
@@ -1,5 +1,7 @@
/* Magnific Popup CSS */
+@use "sass:math";
+
@import "settings";
////////////////////////
@@ -52,7 +54,7 @@ $mfp-include-iframe-type: true !default;
$mfp-iframe-padding-top: 40px !default;
$mfp-iframe-background: #000 !default;
$mfp-iframe-max-width: 900px !default;
-$mfp-iframe-ratio: 9/16 !default;
+$mfp-iframe-ratio: math.div(9, 16) !default;
// Image-type options
$mfp-include-image-type: true !default;
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_settings.scss b/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_settings.scss
index e7866b3f1..e4b552d28 100644
--- a/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_settings.scss
+++ b/src/main/resources/web/app/minimal-mistakes/vendor/magnific-popup/_settings.scss
@@ -3,6 +3,8 @@
////////////////////////
// overlay
+@use "sass:math";
+
$mfp-overlay-color: #000; // Color of overlay screen
$mfp-overlay-opacity: 0.8; // Opacity of overlay screen
$mfp-shadow: 0 0 8px rgba(0, 0, 0, 0.6); // Shadow on image or iframe
@@ -28,7 +30,7 @@ $mfp-include-iframe-type: true; // Enable Ifra
$mfp-iframe-padding-top: 40px; // Iframe padding top
$mfp-iframe-background: #000; // Background color of iframes
$mfp-iframe-max-width: 900px; // Maximum width of iframes
-$mfp-iframe-ratio: 9/16; // Ratio of iframe (9/16 = widescreen, 3/4 = standard, etc.)
+$mfp-iframe-ratio: math.div(9, 16); // Ratio of iframe (9/16 = widescreen, 3/4 = standard, etc.)
// Image-type options
$mfp-include-image-type: true; // Enable Image-type popups
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/susy/_su.scss b/src/main/resources/web/app/minimal-mistakes/vendor/susy/_su.scss
deleted file mode 100644
index 83386adba..000000000
--- a/src/main/resources/web/app/minimal-mistakes/vendor/susy/_su.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-// Su
-// ==
-
-@import 'susy/su';
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/susy/_susy-prefix.scss b/src/main/resources/web/app/minimal-mistakes/vendor/susy/_susy-prefix.scss
deleted file mode 100644
index 185b35613..000000000
--- a/src/main/resources/web/app/minimal-mistakes/vendor/susy/_susy-prefix.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-// Susy (Prefixed)
-// ===============
-
-$susy-version: 3;
-
-@import 'susy/utilities';
-@import 'susy/su-validate';
-@import 'susy/su-math';
-@import 'susy/settings';
-@import 'susy/normalize';
-@import 'susy/parse';
-@import 'susy/syntax-helpers';
-@import 'susy/api';
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/susy/_susy.scss b/src/main/resources/web/app/minimal-mistakes/vendor/susy/_susy.scss
deleted file mode 100644
index bfda3d086..000000000
--- a/src/main/resources/web/app/minimal-mistakes/vendor/susy/_susy.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-// Susy (Un-Prefixed)
-// ==================
-
-@import 'susy-prefix';
-@import 'susy/unprefix';
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss b/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss
deleted file mode 100644
index 99db8d1ed..000000000
--- a/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-// SVG Grid Background
-// ===================
-
-@import 'svg-grid/prefix';
-@import 'svg-grid/svg-unprefix';
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss b/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss
deleted file mode 100644
index 21fb45fa5..000000000
--- a/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// Prefixed SVG Plugin
-// ===================
-
-@import 'svg-settings';
-@import 'svg-utilities';
-@import 'svg-grid-math';
-@import 'svg-api';
diff --git a/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss b/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss
deleted file mode 100644
index 7d880e3e2..000000000
--- a/src/main/resources/web/app/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss
+++ /dev/null
@@ -1,114 +0,0 @@
-/// Plugin: SVG Grid Image
-/// ======================
-/// @group plugin_svg-grid
-/// @see susy-svg-grid
-
-
-
-/// ## Overview
-/// If you want to generate svg-backgrounds
-/// for help visualizing and debugging your grids,
-/// import the SVG Grid Plugin.
-///
-/// The plugin adds `svg-grid-colors` setting
-/// to your global defaults,
-/// which you can override in `$susy`.
-/// It also provides you with a new function,
-/// `susy-svg-grid()`,
-/// which will return inline svg for use in
-/// backgrounds or generated content.
-///
-/// This function come with an unprefixed alias by default,
-/// using the `svg-grid` import.
-/// If you only only want prefixed versions of the API,
-/// import the `svg-grid/prefix` partial instead.
-///
-/// @group plugin_svg-grid
-///
-/// @example scss - importing the plugin
-/// // The full path to import Susy will depend on your setup…
-///
-/// // unprefixed
-/// @import 'plugins/svg-grid';
-///
-/// // prefixed
-/// @import 'plugins/svg-grid/prefix';
-///
-/// @example scss - generating background grids
-/// .grid {
-/// background: susy-svg-grid() no-repeat scroll;
-/// }
-
-
-
-// SVG Grid
-// --------
-/// Return inline svg-data in to display the grid.
-///
-/// @group plugin_svg-grid
-///
-/// @param {Map | List} $grid [$susy] -
-/// Map or shorthand defining the current grid
-/// @param {Color | List | null} $colors [null] -
-/// Column color, or list of colors for column-gradient,
-/// used to override the global `svg-grid-colors` setting
-/// @param {Length | null} $offset [null] -
-/// Manually override the default grid-image offset,
-/// to account for grid edges
-///
-/// @return {String} -
-/// CSS inline-data SVG string, in `url(