- Ships IBM Plex Mono (Regular/Medium/SemiBold, OFL) and routes
the mono Typography + every explicit FontFamily.Monospace site
through hammerMonoFontFamily(), so ← ↗ and other Unicode glyphs
render the same on every platform.
- Reverts the back-arrow icon shim (a4be47ba); ← renders correctly
in Plex Mono now.
- Swaps HdSearchField's ⌕ for Icons.Default.Search (U+2315 isn't
in Plex Mono).
- OutlineOverview: clicking a scene title dismisses the modal and
opens that scene in the editor; trailing ↗ marks the affordance.
Reverts the Nucleus packaging port and its follow-ups:
- 93c7973c Trying nucleus for packaging Snap stays bespoke
- 7c14bcd5 Broaden artifact staging to handle Nucleus sandboxed pipeline paths
- d24f6183 Add homepage and debMaintainer for electron-builder
- 8831e9c5 Update release workflows for Nucleus packaging
- 4af31163 Port :desktop packaging to Nucleus framework
Compose Desktop is back as the packaging backend (jpackage targets,
custom packageMsix task, bespoke buildDistSnap/AppImage/Flatpak via
registerLinuxDistributionTasks). The Nucleus runtime libraries —
nucleus.darkmode-detector and nucleus.decorated-window-jbr — are
kept for window decoration and dark-mode detection in code, along
with the JBR jvmToolchain vendor pin and the libs.versions.toml
'nucleus' version entry that they depend on.
The Nucleus-pipeline state is preserved on branch
'nucleus-build-pipeline' for future reference.
Spins up a real Jetty server and a real headless client in the same JVM,
runs the actual sync protocol over HTTP, and asserts against the shared
FakeFileSystem. Covers seven scenarios: smoke (handshake), client upload,
server download, independent edits, conflict resolved to server, conflict
resolved to client, and client delete.
- New :integrationTests Gradle module with the RoundTripTestBase harness,
HeadlessClient driver, and seven scenario tests.
- :server enables java-test-fixtures so EndToEndTest, E2eTestData, and
SqliteTestDatabase are shared with the new module instead of duplicated.
- CI: build.yml runs the suite on every PR/develop push; prepare-release.yml
adds an integration-tests job that gates all seven package jobs, so a
broken sync protocol blocks the release before any artifact is built.
Detect the native Linux desktop scale factor and feed it to AWT via
sun.java2d.uiScale before Swing initializes. No-op on macOS/Windows and
on JetBrains Runtime (which detects scale natively); needed for any
non-JBR JVM and for future GraalVM Native Image builds.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wrap desktop windows in JewelDecoratedWindow + JewelTitleBar so the app
draws its own title bar (works on any JVM, no JBR needed). Adds nucleus
decorated-window-jni + decorated-window-jewel artifacts, plus the Jewel
int-ui-standalone dep for the IntUiTheme wrapper that JewelDecoratedWindow
reads its colors from. Jewel artifacts live in the IntelliJ snapshots
repo (cache-redirector path resolves to cloudfront 404, the direct
www.jetbrains.com URL works).
DecoratedWindowScope implements FrameWindowScope, so the existing
EditorMenuBar (which uses FrameWindowScope.MenuBar) keeps working — the
JMenuBar will render below the custom title bar on Windows/Linux, and on
macOS it stays in the system menu bar.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Swaps the bespoke OsThemeDetector for Nucleus's dark-mode detector.
The non-composable initial LAF install uses getPlatformDarkModeDetector(),
and the live-update path inside application{} uses the isSystemInDarkMode()
composable so theme changes recompose without a manual listener.
Drops the explicit jna / jna-platform deps that only existed to back-fill
jSystemThemeDetector's transitive graph.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nucleus splits store formats (AppX, Flatpak, PKG) into a separate
sandboxed pipeline whose output path uses a `-sandboxed` suffix —
exact location not pinned down in docs. Switch every staging step
to a recursive find under `desktop/build/compose/binaries/` by file
extension instead of expecting a fixed `<format>/` subdir. Each
step now also fails loudly with a clear message if the expected
artifact isn't found.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
electron-builder rejects .deb builds without these three fields:
homepage, author email, and Linux maintainer. The Nucleus DSL covers
all three via top-level `homepage` and `linux.debMaintainer` (which
takes "Name <email>" together).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nucleus packages via electron-builder, so every desktop-building job
now installs Node.js. Artifact paths move from
build/installers/main-release/<format>/ to
build/compose/binaries/main-release/<format>/.
prepare-release.yml:
- Consolidates the separate snap and flatpak jobs into the linux job,
since Nucleus produces all five Linux formats (.deb/.rpm/.AppImage/
.snap/.flatpak) from one set of tasks.
- Windows job now also builds Portable and AppX targets.
- Replaces per-artifact rename steps with a single staging step using
find/Get-ChildItem with wildcards — electron-builder's naming
pattern differs from jpackage and is more variable.
publish-release.yml:
- Microsoft Store job now downloads hammer.appx from the GitHub release
(mirroring the snap-publish pattern) instead of running the removed
packageMsix gradle task. Partner Center submission Powershell is
unchanged otherwise.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces Compose Desktop's bespoke nativeDistributions + the hand-rolled
packageMsix, snapcraft, flatpak-builder, and appimagetool tasks with
the Nucleus plugin's unified DSL. Nucleus is a fork of compose-desktop-
application that adds first-class AppX/Portable/Snap/Flatpak/AppImage
targets, so org.jetbrains.compose can no longer be applied alongside
it (task name collisions); compose.desktop.currentOs and
compose.components.uiToolingPreview are now resolved via explicit
Maven coordinates instead.
The hand-edited msix/AppxManifest.xml, snap/snapcraft.yaml, and
flatpak/*.yaml are now generated from the DSL; the source files
remain in-tree for now and will be deleted once CI validates the
nucleus output across all targets.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>