Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<Color>`, 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
Expand Down
2 changes: 1 addition & 1 deletion PUBLISHING.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ pnpm --filter "./packages/*" publish --access public --no-git-checks --otp=<code

## Versioning

All seven published packages are versioned together (currently `0.10.0`). Bump them as one:
All seven published packages are versioned together (currently `0.10.1`). Bump them as one:

```sh
pnpm --filter "./packages/*" exec npm version <patch|minor|major> --no-git-tag-version
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
25 changes: 25 additions & 0 deletions docs/release-notes/0.10.1.md
Original file line number Diff line number Diff line change
@@ -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<Color>` 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).
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
2 changes: 1 addition & 1 deletion packages/create/package.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion packages/dom/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/elements/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@fundamental-engine/elements",
"version": "0.10.0",
"version": "0.10.1",
"description": "Web-component keystone for Fundamental — the <field-root> custom element + declarative data-body bodies.",
"type": "module",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/react/package.json
Original file line number Diff line number Diff line change
@@ -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 <FieldField> component + useFieldField hook.",
"type": "module",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/three/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/vanilla/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading