diff --git a/CHANGELOG.md b/CHANGELOG.md index a9b2ba5b..8b814cb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ a git tag (see [RELEASING.md](RELEASING.md)). ## [Unreleased] +## [0.10.1] — 2026-07-21 + +**Kotlin port parity: the Compose `FieldView` now renders a multi-hue palette.** + +### Fixed + +- **`FieldView` (`@fundamental-engine/compose`, Kotlin) collapsed a multi-colour palette to a single hue** (#1090). It took one `accent` and drew every particle as `lerp(COOL, accent, heat)`, where the JS and Swift engines' `FieldOptions` carry a `palette` — so an Android field rendered monochrome where iOS rendered multi-hue. Adds `palette: List`, colouring each particle by a stable pool index across all four render modes (DOTS, GLOW, LINES, TRAILS). **Backward-compatible**: the parameter defaults to `[accent]`, the previous behaviour, so existing callers are unaffected. Verified against the iOS `10-intro-star` reference, which the Android field now matches. + +> **Scope.** This is a **Kotlin-only** change. The JS and Swift engines are byte-identical to 0.10.0 — they already had the palette. The npm and Swift artifacts are republished at 0.10.1 only to keep the cross-plane version in lockstep; there is no JS or Swift behaviour change in this release. +> +> **Still open:** the parity matrix does not track colour (#1091), which is why this divergence reached an app before any gate. Closing it would fail a future single-accent-vs-palette mismatch at CI instead. + - **Release tooling: scope the version bump to `./packages/*`, not the `@fundamental-engine/*` name glob.** The glob also matched the private workspace apps (`apps/site`, `apps/starter`, `apps/observatory`), which share the npm scope but version independently — and `exec npm version` ignores the `private` flag, so it silently bumped them to the release version (0.10.0 caught this: observatory jumped `0.0.0 → 0.10.0` before it was reverted by hand). The path filter targets exactly the seven publishable packages, so no private app is bumped and the old "revert the apps afterward" step is gone. `pnpm publish` already skipped private packages, so only the version bump was ever affected. Fixed in `RELEASING.md`, `PUBLISHING.md`, and `release.yml`. ## [0.10.0] — 2026-07-21 diff --git a/PUBLISHING.md b/PUBLISHING.md index 63a30143..b3ecb1b0 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -55,7 +55,7 @@ pnpm --filter "./packages/*" publish --access public --no-git-checks --otp= --no-git-tag-version diff --git a/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt b/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt index 9f9d0d2a..7b3f8fa6 100644 --- a/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt +++ b/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt @@ -19,7 +19,7 @@ import com.fundamental.core.math.Vec3 * lockstep with the JS constant / the release version: `VersionLockstepTests` fails the build if this * drifts from `packages/core/package.json` (#923) — update it here on every release bump. */ -const val FIELD_VERSION: String = "0.10.0" +const val FIELD_VERSION: String = "0.10.1" /** * Options for [FieldHandle.snapshot] (JS `FieldSnapshotOptions`). Composes with the runtime privacy diff --git a/docs/release-notes/0.10.1.md b/docs/release-notes/0.10.1.md new file mode 100644 index 00000000..d5302b93 --- /dev/null +++ b/docs/release-notes/0.10.1.md @@ -0,0 +1,25 @@ +# 0.10.1 + +**Kotlin port parity: the Compose `FieldView` renders a multi-hue palette.** + +## What changed + +The Android `FieldView` took a single `accent` and drew every particle from it, collapsing a +multi-colour field to one hue — where the JS and Swift engines already accepted a `palette`. It now +takes `palette: List` and colours each particle by a stable pool index, across all four render +modes. Verified against the iOS `10-intro-star`, which the Android field now matches. + +**Backward-compatible.** `palette` defaults to `[accent]`, so existing callers are unaffected. + +## Scope + +**Kotlin-only.** JS and Swift are unchanged from 0.10.0 — they had the palette already. npm and Swift +are republished at 0.10.1 only to hold the cross-plane version in lockstep; no JS or Swift behaviour +changed. + +## Still open + +The parity matrix does not track colour ([#1091]) — the reason this gap reached an app before a gate +caught it. Closing it makes a future palette divergence a CI failure rather than a shipped bug. + +Full detail: [CHANGELOG](../../CHANGELOG.md#0101--2026-07-21). diff --git a/packages/core/package.json b/packages/core/package.json index 93736176..ffdccc79 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/core", - "version": "0.10.0", + "version": "0.10.1", "description": "A reciprocal DOM-physics field — elements bend the field; the field's density bends them back.", "type": "module", "license": "MIT", diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 88c586fc..3dff2312 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -4,4 +4,4 @@ * with `packages/core/package.json` by `version.test.ts` (the build fails if they drift), so the * release bump is the single source of truth. */ -export const FIELD_VERSION = '0.10.0'; +export const FIELD_VERSION = '0.10.1'; diff --git a/packages/create/package.json b/packages/create/package.json index db40a5fb..5bdaa9b4 100644 --- a/packages/create/package.json +++ b/packages/create/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/create", - "version": "0.10.0", + "version": "0.10.1", "type": "module", "description": "Scaffold a Fundamental starter — `npm create @fundamental-engine` — vanilla, React, or web-component, contained and signals-first by default.", "keywords": [ diff --git a/packages/dom/package.json b/packages/dom/package.json index 8ef54da9..1da42ddd 100644 --- a/packages/dom/package.json +++ b/packages/dom/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/dom", - "version": "0.10.0", + "version": "0.10.1", "description": "The platform-adjacent layer for Fundamental — native-first registries for measurement, semantic state, feedback, relationships, visual-semantic bindings, and overlays. The browser primitives Fundamental wishes existed, built on the ones it has.", "type": "module", "license": "MIT", diff --git a/packages/elements/package.json b/packages/elements/package.json index 12555f68..d5bd8bb1 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/elements", - "version": "0.10.0", + "version": "0.10.1", "description": "Web-component keystone for Fundamental — the custom element + declarative data-body bodies.", "type": "module", "license": "MIT", diff --git a/packages/react/package.json b/packages/react/package.json index 17649f73..f9e893f8 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/react", - "version": "0.10.0", + "version": "0.10.1", "description": "React adapter for Fundamental — a reciprocal DOM-physics field as a component + useFieldField hook.", "type": "module", "license": "MIT", diff --git a/packages/three/package.json b/packages/three/package.json index f105bc04..89c413a6 100644 --- a/packages/three/package.json +++ b/packages/three/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/three", - "version": "0.10.0", + "version": "0.10.1", "description": "Three.js authoring surface for Fundamental — run the reciprocal field engine headless and render its swarm as a THREE.Points layer (the particle bridge), plus threeHost() and threeBackend() (a RenderBackend) for binding the engine to a WebGL scene.", "type": "module", "license": "MIT", diff --git a/packages/vanilla/package.json b/packages/vanilla/package.json index 8e2824c0..7e9051d7 100644 --- a/packages/vanilla/package.json +++ b/packages/vanilla/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/vanilla", - "version": "0.10.0", + "version": "0.10.1", "description": "Framework-free TypeScript wrapper for Fundamental — the reciprocal DOM-physics field as a typed FieldField class + mountField(), with no custom-element registration and no framework dependency.", "type": "module", "license": "MIT", diff --git a/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift b/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift index c6061fe4..06b60b84 100644 --- a/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift +++ b/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift @@ -21,7 +21,7 @@ import Foundation /// mirroring the Kotlin port. Kept in lockstep with the package version (npm `latest`) and the JS /// `FIELD_VERSION`: `VersionLockstepTests` fails the suite if this drifts from /// `packages/core/package.json` (#923) — update it here on every release bump. -public let FIELD_VERSION: String = "0.10.0" +public let FIELD_VERSION: String = "0.10.1" /// Options for ``FieldHandle/snapshot(_:)`` (JS `FieldSnapshotOptions`). Composes with the runtime privacy /// ``FieldPolicy`` and an optional ``SnapshotProfile``, always resolving to the TIGHTEST (most private)