Repository navigation
Prelaunch - #4
Merged
Merged
Conversation
FormaSpacing's KDoc said "every value is overridable" and FormaTheme's told callers to provide LocalFormaSpacing themselves. Neither worked: that composition local is internal, and FormaTheme provided a fresh FormaSpacing() over whatever was supplied from outside. You could construct a custom scale; you could not install one. Add `spacing: FormaSpacing = FormaTheme.defaultSpacing()` and pass it through, alongside a defaultSpacing() accessor matching the other three. Additive and source-compatible, and it makes the override surface genuinely wider than Material 3's colour/type/shape.
The javadocJar task set a classifier and no source, so every release through 0.2.0 published a 261-byte stub next to 2,344 lines of KDoc. Wire up Dokka 2.2.0 and pack dokkaGeneratePublicationHtml into the jar: :core goes from 261 bytes to 605 KB across 115 pages, :components to 1.3 MB. Central only checks that a -javadoc.jar exists, which is why this went unnoticed.
The mavenLocal() block was scoped to org.jetbrains.compose.ui:ui-tooling-preview as a workaround for an SSL-inspecting proxy, and shipped a comment saying "on this machine" in a public repo. It was also dead: those artifacts are not in the local ~/.m2 at all and resolve from Maven Central directly. The full gate passes with --refresh-dependencies without it. SECURITY.md still named 0.1.x as the supported line after 0.2.0 shipped.
sample/src/main/res/ had no mipmaps and the manifest declared no icon, so the showcase app installed as the default green robot — visible in any screenshot or screen recording that shows the launcher or recents. Adds an adaptive icon (plus monochrome layer) built from the FormaUI mark as a vector drawable for API 26+, and rasterised PNGs at five densities for API 24-25, which :sample still supports. docs/gen-launcher-icons.py regenerates the PNGs from the same geometry as docs/assets/formaui-mark.svg.
The README showed a logo and nothing else — a visual library with no picture of itself, which also blocked the GitHub social preview and every channel that renders a card. ChartTestCapture's captureNodeToImage() already solved the hard part for the chart pixel tests: a View.draw software capture, since captureToImage() cannot work under Robolectric. It takes any SemanticsNodeInteraction, so the same mechanism renders whole boards with no emulator and no device. ShowcaseScreenshotTest composes four boards and asserts each one actually painted before writing it, because a correctly-sized blank PNG is the exact failure ChartPixelRenderTest was written for. gen-marketing-assets.py then composites them into the README hero, the theme-toggle GIF, the Material 3 comparison and the 1280x640 social preview. The comparison uses genuine androidx.compose.material3 widgets on the "before" side rather than unwrapped FormaUI ones: FormaUI's per-component defaults fall back to FormaShapes() outside FormaTheme, so an unwrapped FormaButton keeps its 8dp corners and would have overstated the difference with something a reader could disprove by running the same code.
Applies the prepared merged README, with corrections for what actually shipped: - The theming section documents the new `spacing` parameter, and no longer says the 4dp grid is "a fixed contract, not a parameter." - Drops "distinctive" and unqualified "fully overridable" in favour of the claims that survive inspection. - Answers the AndroidX-Compose-BOM question with a tested result rather than leaving it to the first commenter: a stock BOM 2026.08.00 / AGP 9.3.1 app with dev.formaui:components:0.2.0 added compiles, dexes and packages with no exclusions, because the org.jetbrains.compose artifacts depend on the androidx ones rather than duplicating them. - Test counts re-measured: 288 tests across 47 files, 8,429 lines of test code against 6,780 of implementation. The previous figures predate this branch, and their implementation count silently excluded 3,007 lines of @Preview code — now stated rather than omitted. - Adds the screenshots and a CI build badge.
Route B's dry run told you to confirm a `-javadoc.jar` was present. It always was — as a 261-byte stub, for five consecutive releases. A presence-only check is exactly the check that cannot catch an empty jar, so the step now asks for the entry count. Also names the javadoc jar as Dokka-packed in the "how publishing works" section, which is true as of the previous commit and wasn't before.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
QA gate
All three must pass — CI runs exactly this set. Run them locally first
(
export JAVA_HOME=<JBR>before./gradlew, or the wrapper fails):./gradlew :core:testAndroidHostTest :components:testAndroidHostTest./gradlew :core:compileKotlinWasmJs :components:compileKotlinWasmJs./gradlew :sample:assembleDebugConventions
@paramon every parameter@ExperimentalFormaUiApidp—FormaSpacingtokens onlycommonMain(it would break thewasmJstarget)contentDescriptionon icon-only content, correctsemantics roles
For a new or changed component
Delete this section for docs-only or infrastructure changes.
@Previewcovering all variantssrc/androidHostTest(@Config(sdk = [34]), JUnit asserts) that rendersand asserts on at least one state change
docs/component-inventory.jsonupdated, anddocs/formaui-reference.mdregenerated withpython3 docs/gen-reference.py .— never hand-editedpreview-wasm/…/PreviewRegistry.ktunder the sameid:sampleshowcasecolors/textStyleparameters forwardedREADME.mdcomponent table and count updatedAnything user-visible
CHANGELOG.mdupdated under the unreleased heading