Every place where MinDis works around a defect or gap in a dependency, so each can be removed once upstream fixes it. Each entry names the cause, where the workaround lives, and how to tell it is no longer needed. The code comments at those places explain the mechanics; this is the register.
When adding a workaround, add it here. When upgrading one of the libraries below, check its entries.
- Cause: since conditional stylesheet imports (JDK-8364149, JavaFX 27), imported rules decode
their declarations lazily against the importing stylesheet's string store. A parsed (text)
stylesheet has none, so importing a precompiled
.bssthrows an NPE injavafx.css.Declaration.readBinaryand the app does not start. JavaFX substitutes the.bssfor any.csspath that has one beside it, which AtlantaFX's themes do. - Workaround:
ThemeStyler.withModenaTokensimports the theme through AtlantaFX'sstylesheet:URL with every module listed, which serves the CSS text. - Cost: the theme is parsed from text instead of loaded precompiled, some 10–40 ms per theme switch.
- Fixed when: importing
base.getUserAgentStylesheet()(the plain.csspath) inwithModenaTokensstarts the app and passesModenaTokensTest. The import itself is still needed for the Modena tokens below; only the URL changes back.
- Cause:
Node#requestFocusclears:focus-visible, and the public API that sets it,Node#requestFocusTraversal, only visits focus-traversable nodes. The sidebar's entries are one Tab stop, so all but the active entry are not traversable. - Workaround:
AppShell.KEYBOARD_FOCUS, a:keyboard-focuspseudo-class set when the arrow keys move focus, styled alongside:focus-visibleinshell.css. - Fixed when: JavaFX offers a public way to focus a node with
focusVisibleset; switchAppShell.focusNavButtonto it and drop the pseudo-class.
- Cause: the msiwrapper step fails with
AccessDeniedExceptioncopying the final.exe. - Workaround: the Windows installer is an MSI (
installerTypeinmindis-gui/build.gradle.kts). - Fixed when:
./gradlew jpackage -PinstallerType=exesucceeds with WiX v5.
- Cause: for
text/cssit writes the CSS as is (data:text/css;charset=utf-8,...), and JavaFX percent-decodes a non-Base64data:URI, so any%in the CSS (derive(..., 40%)) breaks it. The same applies toThemeManager.Change#applyStylesheet, which uses it. - Workaround:
ThemeStylerencodes its stylesheets as Base64 itself and installs them withThemeStyler.applyrather thanChange#applyStylesheet. - Fixed when:
Styles.encodeescapes the content or uses Base64.
- Cause: AtlantaFX puts
-color-fg-emphasis(light) on accent-filled controls regardless of the accent, which reads at 2.2–2.8:1 on light accents (green, orange, teal). - Workaround:
ThemeStyler.ACCENT_TEXT_CSSand-color-accent-on: dark text and marks on accents where light text falls below 3:1 (ThemeStyler.needsDarkTextOn), also used bydashboard.cssandshell/power-pane.css. - Fixed when: AtlantaFX derives the on-accent colour from the accent; then point
-color-accent-onat its token, or drop it.ContrastTesttells whether the result still reads.
- Cause: AtlantaFX styles no hover state for
Tile. - Workaround:
.tile:hoverinmodules/settings.css. - Fixed when: AtlantaFX's
Tilehighlights on hover by itself.
- Cause: GemsFX's bundled stylesheets look up Modena tokens (
-fx-control-inner-background,-fx-selection-bar-text,-fx-outer-border, ...) that AtlantaFX never defines, and hardcode light-theme literals (white,#e0e0e0,yellow, ...). Unresolved lookups log a warning each and paint nothing; literals stay light in the dark theme. Several GemsFX controls install this CSS as a per-node user-agent stylesheet (getUserAgentStylesheet()). - Workarounds:
ThemeStyler.MODENA_TOKENS_CSS: the Modena tokens, mapped to AtlantaFX's.ThemeStyler.SEARCH_POPUP_CSS: the search popup's flat rows and their hover/selected fills.CalendarPickers,TimePickers,SearchFields: per-control token and literal overrides.shell/power-pane.css: the PowerPane's drawer, dialog and info-center literals.
- Fixed when: GemsFX's CSS follows AtlantaFX tokens (or exposes its own). Remove a piece and
watch the
javafx.csslog while using the control in both themes;ModenaTokensTestandContrastTestcover the search popup and the screens.
- Cause:
CustomPopupControl.showsets the node orientation before showing the window, which runs a CSS pass while the popup is not yet inWindow.getWindows(). AtlantaFX'sThemeManageronly puts our stylesheet on a window once it is there, so that first pass sees the user-agent stylesheet alone. - Workaround: the Modena tokens are in the user-agent layer (
ThemeStyler.withModenaTokens), not in the per-scene stylesheet. - Fixed when: GemsFX no longer needs the Modena tokens (above) — then
withModenaTokenscan go andThemeManagercan take the plain theme.ModenaTokensTestshows a popup with only the user-agent layer.
- Cause: GemsFX's module descriptor requires
javafx.swing, used only bySVGUtilbehindSVGImageView, which MinDis does not use. - Workaround:
extraJavaModuleInforewrites GemsFX's descriptor without it (build-logic/.../org.mindis.gradle.module.gradle.kts), so the Swing bridge stays out of the runtime image. The rewritten descriptor must be re-checked on every GemsFX upgrade. - Fixed when: GemsFX makes it
requires staticor drops it.
- Cause: GemsFX, PickerFX and ControlsFX declare
javafx-swingandjavafx-fxmlas POM dependencies, pinned to JavaFX 17. - Workaround: both are excluded in
build-logic/.../org.mindis.gradle.feature.javafx.gradle.kts. - Fixed when: those POMs drop or align the dependencies.
- Cause: PickerFX's published metadata declares ControlsFX, which its code never references.
- Workaround: excluded in
mindis-gui/build.gradle.kts, keeping it out of the installer andTHIRD-PARTY-NOTICES. - Fixed when: PickerFX's metadata drops it.
- Cause: micrometer-core 1.16.x class files carry type annotations that crash javac when read from the module path.
- Workaround: pinned to 1.15.12 in
versions/build.gradle.kts. - Fixed when: the build compiles with the pin removed.