Repository navigation
Releases
v0.3.0
Artboard now combines multi-module builds into one gallery, and works with Compose Multiplatform 1.12.
Highlights
One gallery for multi-module builds (#4)
Apply the plugin to each module that has previews; nothing is needed at the root. Running a task without a project path now combines every module instead of starting one server per module:
./gradlew artboardRun # one server, one tab per module
./gradlew artboardRunLan # the same, reachable on the local network
./gradlew artboardExport # each module's export, plus build/artboard/combined-export- Each tab is that module's own gallery, live or snapshot, so one build can mix both.
- Modules appear as their builds finish.
- A module run on its own (
./gradlew :feature:a:artboardRun) is unchanged: no tabs. - The combined export is a static site for GitHub Pages or any other static host. Single-module exports never touch it.
- The tabs use the gallery's own chrome and follow its light/dark setting. They support the keyboard, and Back/Forward step through tabs.
Modules can join only while the run tasks execute in parallel. That is the default with the configuration cache; otherwise pass --parallel. A serial build prints a warning and serves the first module only.
Fixes
Compose Multiplatform 1.12 support (#5)
CMP 1.12 changed two APIs Artboard relied on. With CMP 1.12 in 0.2.x:
- JVM snapshots failed with
NoSuchMethodError: …Image.encodeToData$default…. - PNG download in live galleries failed at runtime.
- Previews that read
isSystemInDarkTheme()crashed in live galleries withillegal cast. - Dark JVM snapshots silently rendered light.
Artboard now uses only APIs that are stable across both versions, so 0.3.0 works with CMP 1.11 and 1.12. Snapshot PNGs are pixel-identical to before. Thanks to @Tommyten for the report.
Upgrade
id("io.github.crowded-libs.artboard") version "0.3.0"No consumer source changes required.
v0.2.2
Fix
Android snapshot mode no longer races a consumer's own host tests.
Artboard enables an Android host-test compilation so Robolectric can render previews without the consumer writing AGP DSL. That call used to run as soon as the Android target appeared, which claimed AGP's single host-test slot before a consumer's own withHostTest { … } block ran — so modules that already had real host unit tests failed with "Android host tests have already been enabled."
Artboard now waits for AGP's finalizeDsl (after every build script has configured the target), reuses an existing hostTest compilation when present, and only calls withHostTestBuilder when none exists yet.
Modules that never declared host tests (including samples/android-light) still get the plugin-enabled path as before.
Upgrade
id("io.github.crowded-libs.artboard") version "0.2.2"No consumer source changes required. Live Wasm and JVM snapshot galleries are unaffected.
v0.2.1
Fix
Publish artboard-viewer-dist to Maven Central.
Snapshot galleries (jvm / android only) need this jar for the prebuilt viewer. It was set up to publish in 0.2.0 but was left out of the release workflow (#3 (#3)).
Upgrade
id("io.github.crowded-libs.artboard") version "0.2.1"
No other consumer changes. Live Wasm galleries are unaffected.
v0.2.0
Artboard no longer requires a wasmJs target. Modules that already declare jvm() or only android can still get a spatial gallery of pre-rendered previews; live Wasm remains the fully interactive path.
Highlights
Snapshot galleries (no Wasm required)
Artboard binds to one target you already declare (preference: live Wasm → JVM snapshots → Android snapshots):
wasmJs { browser() }— live interactive gallery (unchanged)jvm()without Wasm — headless Skia renders every theme × locale to PNGsandroid { … }only — same images via Robolectric host tests
Snapshot mode uses a prebuilt viewer (artboard-viewer-dist) over manifest.json + PNGs. Board chrome still works: pan/zoom, search, theme, locale, device, deep links, layout grid, artboardRun, and artboardExport.
./gradlew :ui:artboardSnapshot
./gradlew :ui:artboardRun
./gradlew :ui:artboardExport
Live interaction inside a preview, animation scrubbing, and runtime PNG download still need the Wasm path.
Locale-correct snapshots
Platform locale is set for the full offscreen scene so Compose resources and RTL match the gallery locale control.
Layout grid on image tiles
The screen column/margin/gutter overlay works over snapshot PNGs the same as live frames.
Camera reliability
Gestures accumulate correctly within a frame. Restored cameras are discarded when they would open on empty space, and the board auto-fits instead.
Café showcase
Previews ordered by user flow (browse → item → cart → checkout → orders → settings).
Upgrade
id("io.github.crowded-libs.artboard") version "0.2.0"
No consumer source changes required for existing Wasm galleries. New Maven artifact: artboard-viewer-dist.
Android snapshots: Robolectric sandbox is pinned to API 34 so captures run on JDK 17 (API 36 sandboxes require JDK 21). compileSdk may remain 36.v0.1.6
Highlights
Nested preview scroll
Wheel and trackpad gestures over scrollable preview content (LazyColumn, verticalScroll, and friends) now scroll the preview first. The board only pans when the event isn’t claimed by nested content. Ctrl/⌘ + scroll still zooms toward the pointer, including over lists.
Search fits the board
After you type a search (200ms debounce), the camera animates to fit the matching frames in the visible pane—same behavior as the Fit control. Clearing the search re-fits the full catalog. Initial/restored camera on load is unchanged.
v0.1.5
Gallery view preferences now survive a hard refresh, and the screen layout grid matches Figma’s column math more closely.
Highlights
Persistent gallery layout (Wasm)
Hard-reloading the browser no longer resets how you left the board. The gallery restores:
• Screen layout grid on/off and its column / margin / gutter settings
• Screens-per-row packing
• Light / dark theme
• Device viewport override
• Camera pan and zoom (when the board’s packing still matches)
On Wasm this uses localStorage, namespaced per gallery title. JVM hosts keep an in-memory path (no-op persistence).
Safer restore
Restored cameras are only kept when live board bounds still match what was saved; otherwise the gallery re-fits so a changed catalog or packing doesn’t open on empty space. Prefs flush on page leave, and saveable chrome state is keyed by gallery namespace so switching titles doesn’t leak settings.
Figma-aligned layout grid
The on-screen column overlay uses Figma-style COLUMNS stretch metrics (count / gutter / offset). Margin is exposed as layout-grid Offset (default 24dp), with 6 columns and 8dp gutters by default, so product frames that use a 24 Offset line up with the guides.
Upgrade
// settings or build
id("io.github.crowded-libs.artboard") version "0.1.5"
No consumer code changes required beyond the version bump.
v0.1.4
This release makes the gallery board use horizontal space more efficiently and stops macOS Finder/iCloud duplicate files from breaking artboardRun.
What’s new
• Denser board layout — screen and component rows pack about five previews across (was ~three), so the board is shorter and less sparse on wide viewports.
• Auto-clean conflict-copy junk — Finder/iCloud-style duplicates under build/ (FreeSans 2.ttf, composeResources 3, etc.) are purged during processResources, sync, serve, and export instead of failing the gallery start. You should no longer need a manual clean just to run again.
Upgrade
plugins {
id("io.github.crowded-libs.artboard") version "0.1.4"
}
No consumer source changes. Source composeResources with intentional spaces or Finder-style names still fail artboardDoctor; only build-output junk is auto-removed.
v0.1.3
This release makes the gallery board use horizontal space more efficiently and stops macOS Finder/iCloud duplicate files from breaking artboardRun.
What’s new
• Denser board layout — screen and component rows pack about five previews across (was ~three), so the board is shorter and less sparse on wide viewports.
• Auto-clean conflict-copy junk — Finder/iCloud-style duplicates under build/ (FreeSans 2.ttf, composeResources 3, etc.) are purged during processResources, sync, serve, and export instead of failing the gallery start. You should no longer need a manual clean just to run again.
Upgrade
plugins {
id("io.github.crowded-libs.artboard") version "0.1.3"
}
No consumer source changes. Source composeResources with intentional spaces or Finder-style names still fail artboardDoctor; only build-output junk is auto-removed.
v0.1.2
This release aligns Artboard frame bodies with IDE Compose @Preview host semantics so preview-only branches work the same on the board as in Android Studio and IntelliJ.
What’s new
• Preview frame bodies set LocalInspectionMode to true, matching Compose tooling.
• Consumer code that already switches on inspection mode—sample drawables instead of network images, placeholders, skipped side effects—behaves correctly in the gallery without host-specific workarounds.
• New PreviewFrameEnvironment wraps each frame body with system theme, inspection mode, and locale layout direction.
• Gallery chrome (toolbar, board, menus) stays outside inspection mode so the host remains a normal interactive UI.
• README documents the preview environment contract.
Upgrade
plugins {
id("io.github.crowded-libs.artboard") version "0.1.2"
}No consumer source changes or additional dependencies are required. If your previews already use LocalInspectionMode for samples or placeholders, they should start working on the board after the version bump alone.
v0.1.1
This release makes Artboard galleries easier to navigate and test on tablets and phones.
What’s new
- One-finger panning on touch devices.
- Two-finger pan and pinch-to-zoom with stable focal positioning.
- Touch-slop handling preserves taps, frame controls, and double-tap focus.
- New opt-in artboardRunLan task for testing galleries from an iPad or other device on the local network.
- Automatic private-network URL detection with safe port fallback.
- Additional camera gesture and development-server test coverage.
artboardRun remains loopback-only; LAN access must be explicitly enabled with artboardRunLan.
Upgrade
plugins {
id("io.github.crowded-libs.artboard") version "0.1.1"
}
No consumer source changes or additional dependencies are required.