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
13 changes: 13 additions & 0 deletions .changeset/10859-console-phase-2c-stubs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
'@object-ui/console': minor
---

chore(console)!: drop the lazy `pie-chart`, `donut-chart` and `radar-chart` stubs (objectui#10859, batch 8 phase 2c)

**BREAKING (authoring):** the console no longer registers lazy stubs for `pie-chart`, `donut-chart` or `radar-chart` in `register-plugins.ts`, nor for `pie-chart` in the dev-only preview gallery. `@object-ui/plugin-charts` retired those keys. `chart`, `object-chart`, `bar-chart` and `chart:bar` stay lazily registered.

Migration:

- `pie-chart` / `donut-chart` / `radar-chart` → `{ "type": "chart", "chartType": "pie" | "donut" | "radar" }`.

**Clause-②: yes**, released as `minor` with this banner.
16 changes: 16 additions & 0 deletions .changeset/10859-known-types-phase-2c.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
'@object-ui/cli': minor
---

chore(cli)!: the generated known-types list drops the four node type keys objectui#10859 batch 8 phase 2c retired

**BREAKING (authoring):** `KNOWN_SCHEMA_TYPES` (regenerated from the registration calls) no longer lists `pie-chart`, `donut-chart`, `radar-chart` or `page-header`, nor their namespaced twins (`plugin-charts:pie-chart`, `plugin-charts:donut-chart`, `plugin-charts:radar-chart`, `layout:page-header`, `protocol-placeholder:page-header`). `objectui check` now reports a root document of one of those types as an unknown type, and `objectui validate` keeps refusing it at `type`, as it already did.

Migration:

- `pie-chart` / `donut-chart` / `radar-chart` → `chart` with `chartType: "pie"` / `"donut"` / `"radar"`;
- `page-header` → `page:header`, with `title` / `subtitle` / `actions` in `properties`.

The registered-types ratchet (`REFUSED_AT_TYPE`) falls from 24 to 20, and its namespaced twin from 379 to 374.

**Clause-②: yes**, released as `minor` with this banner.
13 changes: 13 additions & 0 deletions .changeset/10859-page-header-placeholder.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
'@object-ui/components': minor
---

refactor(components)!: drop `page-header` from the opt-in protocol placeholders (objectui#10859, batch 8 phase 2c)

**BREAKING (authoring):** `PROTOCOL_COMPONENTS` no longer lists `page-header`, so a host that calls `registerPlaceholders()` no longer registers a placeholder under `protocol-placeholder:page-header` or the bare `page-header`. The key was never a protocol page block (the spec's `PageComponentType` member is `page:header`), and `@object-ui/layout` retired its registration in the same release. `page:header` stays in the list.

Migration:

- `{ "type": "page-header", "title": T, "subtitle": S }` → `{ "type": "page:header", "properties": { "title": T, "subtitle": S } }`.

**Clause-②: yes** — a registration leaves the runtime (narrowing), released as `minor` with this banner.
17 changes: 17 additions & 0 deletions .changeset/10859-retire-chart-family-aliases.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
'@object-ui/plugin-charts': minor
---

refactor(plugin-charts)!: retire the `pie-chart`, `donut-chart` and `radar-chart` node type keys; the families are `chart` + `chartType` (objectui#10859, batch 8 phase 2c)

**BREAKING (authoring):** the plugin no longer registers `pie-chart`, `donut-chart` or `radar-chart` (and with them `plugin-charts:pie-chart`, `plugin-charts:donut-chart` and `plugin-charts:radar-chart`), and their `CHART_TYPE_KEYWORD_FAMILIES` rows are gone. `objectui validate` already refused each at `type`. Their one producer, this package's `examples/chart-examples.ts`, now authors `{ type: 'chart', chartType: … }`, which `objectui validate` accepts on both faces. A node still authored with one of the three types now renders the "Unknown component type" panel.

Migration:

- `{ "type": "pie-chart", … }` → `{ "type": "chart", "chartType": "pie", … }`, with the same keys;
- `{ "type": "donut-chart", … }` → `{ "type": "chart", "chartType": "donut", … }`, with the same keys;
- `{ "type": "radar-chart", … }` → `{ "type": "chart", "chartType": "radar", … }`, with the same keys.

A legacy report section whose `chart.type` says one of the three now reaches the generic `chart` renderer with no family derived from that type; give it the matching `chartType`. `chart:bar` is the one family keyword this package still registers.

**Clause-②: yes** — registrations leave the runtime (narrowing), released as `minor` with this banner.
18 changes: 18 additions & 0 deletions .changeset/10859-retire-page-header-layout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
'@object-ui/layout': minor
---

refactor(layout)!: retire the `page-header` node type key; the header node is `page:header` (objectui#10859, batch 8 phase 2c)

**BREAKING (authoring):** `registerLayout()` no longer registers `PageHeader` under `page-header` (and with it `layout:page-header`). `objectui validate` already refused a `page-header` node at `type`, and nothing in this repository authored or emitted it. objectstack's `page-header-subtitle-alias` conversion renames the key `description` → `subtitle` on both header spellings and leaves the type to objectui. A `page-header` node now renders the "Unknown component type" panel. `PageHeader` stays a named export for JSX composition.

Migration, measured against `objectui validate` (`page:header` carries its props in `properties`):

- `{ "type": "page-header", "title": T, "subtitle": S }` → `{ "type": "page:header", "properties": { "title": T, "subtitle": S } }`;
- `actions` (action ids) → `properties.actions`, the same id array;
- `icon` has no `page:header` spelling: the contract refuses `properties.icon` by name (an ADR-0087 D2 tombstone). Drop it, or compose `PageHeader` in JSX, which still takes `icon`;
- `children` (the right-hand slot) has no `page:header` spelling: the contract refuses a node-level `children` by name, and `properties.children` as an unrecognized key. Put the buttons in `properties.actions` as action ids, or compose `PageHeader` in JSX, which still renders its `children`.

`registerLayout()` now registers four keys: `layout:page:card`, `responsive-grid`, `navigation-renderer` and `app-schema-renderer`.

**Clause-②: yes** — a registration leaves the runtime (narrowing), released as `minor` with this banner.
3 changes: 3 additions & 0 deletions .changeset/10859-retire-scatter-chart.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,6 @@ A legacy report section whose `chart.type` says `scatter-chart` now reaches the
`pie-chart`, `donut-chart` and `radar-chart` were ruled the same way but stay registered: this package's `examples/chart-examples.ts` still authors them, so they wait on their own decision.

**Clause-②: yes** — a registration leaves the runtime (narrowing), released as `minor` with this banner.

⚠️ **Dated note, 2026-10-02 — the three chart aliases are retired too — objectui#10859.**
The decision this entry said `pie-chart`, `donut-chart` and `radar-chart` wait on is made (the seat's fork ruling on objectui#10859): later in this same release, phase 2c moved `examples/chart-examples.ts` to `{ type: 'chart', chartType: 'pie' | 'donut' | 'radar' }` and then unregistered all three keys, with their `plugin-charts:` twins and `CHART_TYPE_KEYWORD_FAMILIES` rows. The rest of this entry is kept as the reading of this change.
6 changes: 6 additions & 0 deletions .changeset/11044-base-props-one-list.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,9 @@ Three changes to what is accepted come with it:
- **The cost is named.** On a type that does not declare one of the six keys, the parser tier no longer reports it, whether or not the renderer reads it. For example, `description` on `page-header` is the retired alias of `subtitle` (objectui#3226), and it used to draw `unknown-prop`. It now draws nothing.

`SDUI_BASE_PROPS` and its `SduiBaseProp` / `SduiBasePropScope` types are new exports. Each entry names a `BaseSchema` member, the scope it is a base prop in (`'every-node'` or `'where-undeclared'`), and its type in the generated JSX surface.

⚠️ **Dated note, 2026-10-02 — the `page-header` example no longer applies — objectui#10859.**
Later in this same release objectui#10859 batch 8 (phase 2c) unregistered `page-header`, so a
`page-header` node now draws `unknown-component` before any prop check runs. The cost this entry names
is unchanged for every type that is still registered. The rest of this entry is kept as the reading of
this change.
6 changes: 6 additions & 0 deletions .changeset/7401-chart-family-from-type.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@ Later in this same release objectui#10859 batch 8 (phase 2b) unregistered `scatt
`plugin-charts:scatter-chart`, and its `CHART_TYPE_KEYWORD_FAMILIES` row went with it; the scatter
family is authored as `{ type: 'chart', chartType: 'scatter' }`. `pie-chart`, `donut-chart` and
`radar-chart` stay registered. The rest of this entry is kept as the reading of this change.

⚠️ **Dated note, 2026-10-02 — `pie-chart`, `donut-chart` and `radar-chart` are retired too — objectui#10859.**
Later in this same release objectui#10859 batch 8 (phase 2c) unregistered the three keys, with their
`plugin-charts:` twins and `CHART_TYPE_KEYWORD_FAMILIES` rows, after moving `examples/chart-examples.ts`
to `{ type: 'chart', chartType: 'pie' | 'donut' | 'radar' }`. `chart:bar` is the one family keyword left.
The rest of this entry is kept as the reading of this change.
5 changes: 5 additions & 0 deletions .changeset/9910-children-slot-declare-and-pin.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,8 @@ provider-scoped and portal renderers), `scripts/container-declaration-baseline.j
is at zero, and a registration that is a layout container but renders no
authored list (`page:tabs`, `page:accordion`, `responsive-grid`) now draws the
TRUE `not-a-container` the flag used to silence.

⚠️ **Dated note, 2026-10-02 — `page-header` is retired — objectui#10859.**
Later in this same release objectui#10859 batch 8 (phase 2c) unregistered `@object-ui/layout`'s
`page-header` (and `layout:page-header`), so its `children` slot declaration left with it; authors write
`page:header`. The rest of this entry is kept as the reading of this change.
6 changes: 6 additions & 0 deletions .changeset/app-shell-page-header-subtitle-4761.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,9 @@ pin the card asked for. It asserts the subtitle on the DOM a reader gets (a
nothing and is rejected by the compiler, and — the assertion that actually goes
red if either side drifts again — that both packages' `PageHeaderComponentProps`
declare `subtitle`.

⚠️ **Dated note, 2026-10-02 — the `page-header` node is retired — objectui#10859.**
Later in this same release objectui#10859 batch 8 (phase 2c) unregistered the `page-header` node key.
`@object-ui/layout`'s `PageHeader` stays an exported component (still spelling its secondary line
`subtitle`), and the authored header node is `page:header`. The rest of this entry is kept as the reading
of this change.
33 changes: 19 additions & 14 deletions apps/console/src/__tests__/unfulfilled-chart-stubs-8760.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,9 @@
* fails HERE, on the first render nobody has done yet.
* 2. THE RETIREMENT, as a render outcome. An authored node of a retired type
* now paints the loud OBJUI-001 refusal instead of the eternal skeleton.
* 3. THE CONTROL. `pie-chart` and `bar-chart` — fulfilled variants in the
* same sweep — are unchanged end to end: same registry identity, same
* 3. THE CONTROL. `chart:bar` and `bar-chart` — fulfilled variants in the
* same sweep (`chart:bar` since objectui#10859 batch 8 retired the
* `pie-chart` control) — are unchanged end to end: same registry identity, same
* drawn output, no alert and no placeholder. Each is asserted
* individually; neither reads zero on both sides of the change.
*
Expand Down Expand Up @@ -85,7 +86,7 @@ import { SchemaRenderer } from '@object-ui/react';
// boundary, and paying that cost at import time puts it outside every
// test/hook timeout. The specifier is character-identical to the one
// `register-plugins.ts` hands `registerLazy`, so ESM hands the loader the very
// same module instance. It cannot mask the defect it guards against: the four
// same module instance. It cannot mask the defect it guards against: the seven
// retired keys are ones this module never registers under ANY load order.
import '@object-ui/plugin-charts';
import '../register-plugins';
Expand All @@ -94,12 +95,15 @@ const HERE = dirname(fileURLToPath(import.meta.url));
const REGISTER_PLUGINS = join(HERE, '..', 'register-plugins.ts');

/**
* The three spellings objectui#8760 retired, plus `scatter-chart`, which
* objectui#10859 batch 8 (phase 2b) retired with its registration — the same
* two halves must hold for it: no stub left in this app, no key in the
* registry, and a loud refusal for an authored node.
* The three spellings objectui#8760 retired, plus the four objectui#10859
* batch 8 retired with their registrations — `scatter-chart` (phase 2b) and
* `pie-chart`, `donut-chart`, `radar-chart` (phase 2c). The same two halves
* must hold for each: no stub left in this app, no key in the registry, and a
* loud refusal for an authored node.
*/
const RETIRED = ['line-chart', 'area-chart', 'advanced-chart', 'scatter-chart'] as const;
const RETIRED = [
'line-chart', 'area-chart', 'advanced-chart', 'scatter-chart', 'pie-chart', 'donut-chart', 'radar-chart',
] as const;

/**
* The chart stub list, read from the source it is declared in — never a copy.
Expand Down Expand Up @@ -140,8 +144,8 @@ describe('objectui#8760 — every chart stub this app registers is fulfilled', (
// Non-vacuity for every assertion below: a reader that has stopped reading
// must throw or come back empty, never yield a silently passing zero.
const list = chartStubList();
expect(list.length, 'the stub-list read went vacuous').toBeGreaterThanOrEqual(5);
expect(list, 'the reader is looking at the chart loop').toContain('pie-chart');
expect(list.length, 'the stub-list read went vacuous').toBeGreaterThanOrEqual(3);
expect(list, 'the reader is looking at the chart loop').toContain('chart:bar');
for (const retired of RETIRED) expect(list).not.toContain(retired);
});

Expand All @@ -158,8 +162,9 @@ describe('objectui#8760 — every chart stub this app registers is fulfilled', (
unfulfilled,
'a lazy stub resolves to nothing — the key renders `Loading …` forever',
).toEqual([]);
// 6 since objectui#10859 batch 8 took `scatter-chart` out of the list.
expect(list).toHaveLength(6);
// 3 since objectui#10859 batch 8 took `scatter-chart` (phase 2b) and
// `pie-chart` / `donut-chart` / `radar-chart` (phase 2c) out of the list.
expect(list).toHaveLength(3);
}, 20000);
});

Expand Down Expand Up @@ -188,7 +193,7 @@ describe('objectui#8760 — CONTROL: the fulfilled variants are unmoved, each on
// a DIFFERENT renderer, and each is non-zero on both sides of the change, so
// neither can be the "reads 0 either way" kind that proves nothing.
it.each([
['pie-chart', 'ChartRenderer'],
['chart:bar', 'ChartRenderer'],
['bar-chart', 'ChartBarRenderer'],
])('`%s` still resolves to `%s`', async (type, renderer) => {
await ComponentRegistry.loadLazy(type);
Expand All @@ -198,7 +203,7 @@ describe('objectui#8760 — CONTROL: the fulfilled variants are unmoved, each on
expect(ComponentRegistry.getKnownTypes()).toContain(type);
});

it.each(['pie-chart', 'bar-chart'])('`%s` still draws — no alert, no placeholder', async (type) => {
it.each(['chart:bar', 'bar-chart'])('`%s` still draws — no alert, no placeholder', async (type) => {
await ComponentRegistry.loadLazy(type);
const shot = paint(type, { chartType: 'pie', data: ROWS, xAxisKey: 'm', dataKey: 'v', series: [{ dataKey: 'v' }] });
expect(shot.alerts, `${type} started refusing — the control moved`).toBe(0);
Expand Down
6 changes: 4 additions & 2 deletions apps/console/src/preview-gallery.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ for (const variant of ['metric', 'metric-card']) {
// `register-plugins.ts` alone would have left both keys blessed by
// `check:doc-types` from THIS file, so the retirement would have changed
// nothing an author can observe. Chart families are reached as
// `{ "type": "chart", "chartType": "line" | "area" }`.
for (const variant of ['chart', 'bar-chart', 'pie-chart']) {
// `{ "type": "chart", "chartType": "line" | "area" }`. `pie-chart` left this list
// with its registration (objectui#10859 batch 8, phase 2c), for the same reason:
// author `{ "type": "chart", "chartType": "pie" }`.
for (const variant of ['chart', 'bar-chart']) {
ComponentRegistry.registerLazy(variant, () => import('@object-ui/plugin-charts'), {
namespace: 'plugin-charts',
category: 'chart',
Expand Down
9 changes: 5 additions & 4 deletions apps/console/src/register-plugins.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,11 @@ ComponentRegistry.registerLazy('chart', () => import('@object-ui/plugin-charts')
// in `packages/plugin-charts/src`: `unfulfilled-chart-stubs-8760.test.ts`
// drives this very list through the real loader and fails on the first key
// that resolves to nothing.
// ⛔ `scatter-chart` is RETIRED from this list with its registration
// (objectui#10859 batch 8, phase 2b) — scatter is `{ "type": "chart",
// "chartType": "scatter" }`.
for (const variant of ['object-chart', 'bar-chart', 'pie-chart', 'donut-chart', 'radar-chart', 'chart:bar']) {
// ⛔ `scatter-chart` (objectui#10859 batch 8, phase 2b) and `pie-chart`,
// `donut-chart`, `radar-chart` (phase 2c) are RETIRED from this list with their
// registrations — those families are `{ "type": "chart", "chartType": "scatter"
// | "pie" | "donut" | "radar" }`.
for (const variant of ['object-chart', 'bar-chart', 'chart:bar']) {
ComponentRegistry.registerLazy(variant, () => import('@object-ui/plugin-charts'), {
namespace: 'plugin-charts',
category: 'chart',
Expand Down
2 changes: 1 addition & 1 deletion apps/site/app/components/InteractiveDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import React, { useMemo } from 'react';
import { SchemaRenderer, SchemaRendererContext, toRenderableSchema } from '@object-ui/react';
import { SidebarProvider } from '@object-ui/components';
// Registers `page-header` & friends — see the module header (objectui#3787).
// Registers `@object-ui/layout`'s blocks — see the module header (objectui#3787).
import './registerLayoutBlocks';
import { galleryDataSource } from './galleryDataSource';
import type { SchemaNode } from '@object-ui/core';
Expand Down
2 changes: 1 addition & 1 deletion apps/site/app/components/LiveSplitDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import {
getExample,
type Example,
} from '@object-ui/example-schema-catalog';
// Registers `page-header` & friends — see the module header (objectui#3787).
// Registers `@object-ui/layout`'s blocks — see the module header (objectui#3787).
import './registerLayoutBlocks';

const PRESET_IDS = [
Expand Down
2 changes: 1 addition & 1 deletion apps/site/app/components/SchemaThumbnail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import React, {
import { SchemaRenderer, SchemaRendererContext, toRenderableSchema } from '@object-ui/react';
import { SidebarProvider } from '@object-ui/components';
import type { SchemaNode } from '@object-ui/core';
// Registers `page-header` & friends — see the module header (objectui#3787).
// Registers `@object-ui/layout`'s blocks — see the module header (objectui#3787).
// Named directly, not reached through the module below: `scripts/__tests__/
// site-playground-layout-registration-3904.test.ts` discovers every
// `SchemaRenderer` host and requires it to import THIS module, and a host that
Expand Down
7 changes: 5 additions & 2 deletions apps/site/app/components/registerLayoutBlocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
*/

/**
* Registers `@object-ui/layout`'s blocks (`page-header`, `app-shell`,
* `sidebar-nav`, …) for the docs site's schema renderers.
* Registers `@object-ui/layout`'s blocks (`responsive-grid`,
* `navigation-renderer`, `app-schema-renderer`, `layout:page:card`) for the docs
* site's schema renderers. (The `page-header` alias this module was first added
* for was retired by objectui#10859 batch 8; authors write `page:header`, which
* `@object-ui/components` registers.)
*
* Why this exists (objectui#3787): the site renders catalog examples through
* `SchemaRenderer`, and `ComponentRegistry` only knows a type once the package
Expand Down
4 changes: 2 additions & 2 deletions apps/site/app/playground/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { SchemaRenderer, toRenderableSchema } from '@object-ui/react';
import type { SchemaNode } from '@object-ui/core';
import dynamic from 'next/dynamic';
import { ObjectUIProvider } from '@/app/components/ObjectUIProvider';
// Registers `page-header` & friends — see the module header (objectui#3787).
// Registers `@object-ui/layout`'s blocks — see the module header (objectui#3787).
// The Playground renders hand-typed schemas, so it needs the same registration
// as the three catalog hosts: without it, typing `page-header` here produced the
// red OBJUI-001 "Unknown component type" panel for a component the rest of the
// docs site renders fine (objectui#3904).
// docs site rendered fine (objectui#3904).
import '@/app/components/registerLayoutBlocks';
import { ChevronLeft, ChevronRight, Monitor, Smartphone, Tablet } from 'lucide-react';

Expand Down
Loading
Loading