Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
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
8 changes: 8 additions & 0 deletions .changeset/13453-collaboration-retire-live-cursors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@object-ui/collaboration": minor
---

Clause-②: no
Metadata-protocol: none

**Breaking:** removed `LiveCursors` and `LiveCursorsProps`, which nothing rendered (objectui#13453). Declared `minor` per the version-alignment policy (a changeset never declares `major`). `usePresence` still reports each user's cursor, so a host can draw them itself.
12 changes: 12 additions & 0 deletions .changeset/13453-core-retire-dead-modules.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@object-ui/core": minor
---

Clause-②: no
Metadata-protocol: none

**Breaking:** removed exports with no reader (objectui#13453). Declared `minor` per the version-alignment policy (a changeset never declares `major`).

- The fluent schema builders from `builder/schema-builder`: `form`, `button`, `input`, `card`, `grid`, `flex` and the `FormBuilder`, `ButtonBuilder`, `InputBuilder`, `CardBuilder`, `GridBuilder`, `FlexBuilder` classes. Write the schema object literally instead.
- The three protocol bridges, `DndProtocol`, `KeyboardProtocol` and `SharingProtocol`: `resolveDndConfig`, `createDragItemProps`, `createDropZoneProps`, `resolveDragConstraints`, `resolveKeyboardConfig`, `parseShortcutKey`, `matchesShortcut`, `createFocusTrapConfig`, `resolveSharingConfig`, `resolveEmbedConfig`, `generateEmbedCode`, `validateSharingConfig` and their types (`DndConfig`, `DragItem`, `DropZone`, `KeyboardShortcut`, `FocusTrapConfig`, `KeyboardNavigationConfig` and the rest). The spec vocabulary they bridged was already deleted upstream; no replacement.
- The test-only helpers `resetColumnIdentityWarnings`, `resetRetiredSortSpellingReports`, `resetDashboardFilterWarnings` and `resetReferenceKeyWarnings` are no longer on the package root. They reset module state for tests and had no other reader.
8 changes: 8 additions & 0 deletions .changeset/13453-react-retire-dead-hooks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@object-ui/react": minor
---

Clause-②: no
Metadata-protocol: none

**Breaking:** removed four hooks with no reader (objectui#13453): `useFocusTrap`, `useFocusReturn` and `useRovingFocus` (from `useFocusManagement`), `usePageTransition`, and `useSchemaPersistence` with `createLocalStorageAdapter`, plus their option and result types. Declared `minor` per the version-alignment policy (a changeset never declares `major`). No replacement inside ObjectUI; a host that used one should keep its own copy.
10 changes: 10 additions & 0 deletions .changeset/13453-test-helpers-off-barrels.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@object-ui/app-shell": minor
"@object-ui/types": minor
"@object-ui/plugin-detail": minor
---

Clause-②: no
Metadata-protocol: none

**Breaking:** test-only reset helpers are no longer on the package roots (objectui#13453): `resetRuntimeConfigForTesting` (`@object-ui/app-shell`), `resetInflightGetsForTesting` (`@object-ui/types`) and `__clearRecordEditableCache` (`@object-ui/plugin-detail`). They reset module state between tests and had no other reader. Declared `minor` per the version-alignment policy (a changeset never declares `major`).
1 change: 0 additions & 1 deletion .changeset/13464-declare-side-effects.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
"@object-ui/plugin-view": patch
"@object-ui/providers": patch
"@object-ui/react": patch
"@object-ui/runner": patch
---

Clause-②: no
Expand Down
1 change: 0 additions & 1 deletion .changeset/25685-one-react-line.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
"@object-ui/plugin-tree": patch
"@object-ui/providers": patch
"@object-ui/react": patch
"@object-ui/runner": patch
---

Clause-②: no
Expand Down
2 changes: 1 addition & 1 deletion .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
"@object-ui/data-objectstack",
"@object-ui/cli",
"@object-ui/create-plugin",
"@object-ui/runner",
"@object-ui/auth",
"@object-ui/permissions",
"@object-ui/mobile",
Expand Down Expand Up @@ -51,6 +50,7 @@
"ignore": [
"@object-ui/example-*",
"@object-ui/site",
"@object-ui/runner",
"@object-ui/test-support"
],
"privatePackages": {
Expand Down
2 changes: 1 addition & 1 deletion QUICK_REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ pnpm changeset publish # Publish to npm (CI only)

| Path | Purpose |
| --- | --- |
| `packages/*` | 38 published packages (`@object-ui/*`), plus the private `vscode-extension` and `test-support` (test-only, never released) |
| `packages/*` | 37 published packages (`@object-ui/*`), plus the private `vscode-extension`, `test-support` (test-only, never released) and `runner` (workspace demo app, never released) |
| `apps/console` | Full ObjectUI console app (Vite + React) |
| `apps/site` | Public docs site at <https://www.objectui.org> (fumadocs) |
| `examples/*` | Runnable examples and the schema catalog — see [`examples/README.md`](./examples/README.md) |
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ Grouped by dependency weight — atoms and fields stay light, heavy widgets live
|---------|-------------|
| **[@object-ui/cli](./packages/cli)** | Scaffold, develop, build, and validate schema-driven apps |
| **[@object-ui/create-plugin](./packages/create-plugin)** | Scaffold a new Object UI plugin |
| **[@object-ui/runner](./packages/runner)** | Universal application runner for testing schemas |
| **[@object-ui/runner](./packages/runner)** | Universal application runner for testing schemas (private workspace app, not published) |
| **[@object-ui/sdui-parser](./packages/sdui-parser)** | Constrained JSX source → schema tree compiler (parse, never execute) |
| **[@object-ui/react-runtime](./packages/react-runtime)** | Trusted runtime execution for `kind: 'react'` pages |
| **[vscode-extension](./packages/vscode-extension)** | IntelliSense and live preview for schema files |
Expand Down
4 changes: 2 additions & 2 deletions apps/console/src/__tests__/faviconAfterNavigation.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ import { AppShell } from '@object-ui/layout';
import {
getFaviconUrl,
initRuntimeConfig,
resetRuntimeConfigForTesting,
} from '@object-ui/app-shell';
import { resetInflightGetsForTesting } from '@object-ui/types';
import { resetRuntimeConfigForTesting } from '../../../../packages/app-shell/src/runtime-config';
import { resetInflightGetsForTesting } from '../../../../packages/types/src/http-inflight';
import { FaviconSync } from '../components/FaviconSync';

/** What an operator configures as `branding.faviconUrl` on the runtime. */
Expand Down
2 changes: 1 addition & 1 deletion apps/console/src/__tests__/localizationBootDedup.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { render, screen, waitFor } from '@testing-library/react';
import { useLocalization, readCachedLanguageSeed } from '@object-ui/i18n';
import { resetInflightGetsForTesting } from '@object-ui/types';
import { resetInflightGetsForTesting } from '../../../../packages/types/src/http-inflight';
import { seedTenantLanguage } from '../languageSeed';
import { LocalizationFetchProvider } from '../LocalizationFetchProvider';

Expand Down
4 changes: 2 additions & 2 deletions apps/console/src/__tests__/runtimeConfigBootDedup.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import {
initRuntimeConfig,
getRuntimeConfig,
resetRuntimeConfigForTesting,
} from '@object-ui/app-shell';
import { resetInflightGetsForTesting } from '@object-ui/types';
import { resetRuntimeConfigForTesting } from '../../../../packages/app-shell/src/runtime-config';
import { resetInflightGetsForTesting } from '../../../../packages/types/src/http-inflight';

/** The `/api/v1/runtime/config` answer, as the server sends it. */
const CONFIG_BODY = {
Expand Down
4 changes: 2 additions & 2 deletions content/docs/utilities/runner.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -441,8 +441,8 @@ pnpm test

## Package Information

**Package Name:** `@object-ui/runner` — published on npm, see the
[npm page](https://www.npmjs.com/package/@object-ui/runner) for the current version
**Package Name:** `@object-ui/runner` — a private workspace package; it is not
published to npm and does not take part in the release group
**Type:** Application, not a library. `package.json` declares no `main`, `module`,
`exports` or `types`, so there is nothing to `import` from it — you run it from a
checkout of this repository, as shown above.
Expand Down
3 changes: 2 additions & 1 deletion packages/app-shell/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,8 @@ export {
// objectui#5522. (Replaces `isClientErrorReportingAllowed`, removed with the
// permission boolean it read — objectstack#12681.)
getClientErrorReporting,
resetRuntimeConfigForTesting,
// `resetRuntimeConfigForTesting` is test-only and stays off the barrel
// (objectui#13453); tests import it from `runtime-config` directly.
} from './runtime-config.js';
export type {
AppShellRuntimeConfig,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
*/

import { describe, it, expect, vi } from 'vitest';
import { resetRetiredSortSpellingReports } from '@object-ui/core';
import { resetRetiredSortSpellingReports } from '../../../../core/src/utils/sort-query';
import { deriveRelatedLists } from '../deriveRelatedLists';

const PARENT = { name: 'task_version', label: 'Task Version', fields: {} };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ vi.mock('sonner', () => ({

import { MetadataCtx, useMutationInvalidationBridge, notifyDataChanged } from '@object-ui/react';
import { ObjectStackAdapter } from '@object-ui/data-objectstack';
import { __clearRecordEditableCache } from '@object-ui/plugin-detail';
import { __clearRecordEditableCache } from '../../../plugin-detail/src/useRecordEditable';
import { RecordDetailView } from './RecordDetailView';

const BASE = 'http://test.local';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ vi.mock('./MetadataInspector', () => ({
}));

import { MetadataCtx } from '@object-ui/react';
import { __clearRecordEditableCache } from '@object-ui/plugin-detail';
import { __clearRecordEditableCache } from '../../../plugin-detail/src/useRecordEditable';
import { RecordDetailView } from './RecordDetailView';

const OBJECT_NAME = 'os_13045_env';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ vi.mock('sonner', () => ({

import { MetadataCtx } from '@object-ui/react';
import { ObjectStackAdapter } from '@object-ui/data-objectstack';
import { __clearRecordEditableCache } from '@object-ui/plugin-detail';
import { __clearRecordEditableCache } from '../../../plugin-detail/src/useRecordEditable';
import { RecordDetailView } from './RecordDetailView';

const BASE = 'http://test.local';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ vi.mock('sonner', () => ({

import { MetadataCtx } from '@object-ui/react';
import { ObjectStackAdapter } from '@object-ui/data-objectstack';
import { __clearRecordEditableCache } from '@object-ui/plugin-detail';
import { __clearRecordEditableCache } from '../../../plugin-detail/src/useRecordEditable';
import { __resetRecordApprovalsStore } from '../hooks/useRecordApprovals';
import { RecordDetailView } from './RecordDetailView';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ vi.mock('sonner', () => ({
import { MetadataCtx } from '@object-ui/react';
import { RelatedCountStore } from '@object-ui/components';
import { ObjectStackAdapter } from '@object-ui/data-objectstack';
import { __clearRecordEditableCache } from '@object-ui/plugin-detail';
import { __clearRecordEditableCache } from '../../../plugin-detail/src/useRecordEditable';
import { __resetRecordApprovalsStore } from '../hooks/useRecordApprovals';
import { RecordDetailView } from './RecordDetailView';
// Registers `record:attachments`, which the package entry registers in the console.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { render, waitFor, cleanup } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import { MetadataCtx } from '@object-ui/react';
import { resetRetiredSortSpellingReports } from '@object-ui/core';
import { resetRetiredSortSpellingReports } from '../../../core/src/utils/sort-query';

vi.mock('@object-ui/auth', async (importOriginal) => ({
...(await importOriginal<Record<string, unknown>>()),
Expand Down
17 changes: 1 addition & 16 deletions packages/collaboration/README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
# @object-ui/collaboration

Real-time collaboration for Object UI — live cursors, presence tracking, comment threads, and conflict resolution.
Real-time collaboration for Object UI — presence tracking, comment threads, and conflict resolution.

## Features

- 🖱️ **Live Cursors** - Display remote user cursors in real time with `LiveCursors`
- 👥 **Presence Avatars** - Show active users with `PresenceAvatars`
- 💬 **Comment Threads** - Threaded comments with @mentions via `CommentThread`
- 🔄 **Realtime Subscriptions** - WebSocket data subscriptions with `useRealtimeSubscription`
Expand All @@ -27,7 +26,6 @@ npm install @object-ui/collaboration
import {
usePresence,
useRealtimeSubscription,
LiveCursors,
PresenceAvatars,
CommentThread,
type Comment,
Expand All @@ -50,7 +48,6 @@ function CollaborativeEditor() {
return (
<div data-connection={connectionState}>
<PresenceAvatars users={users} />
<LiveCursors users={users} />
<div onMouseMove={(event) => updateCursor({ x: event.clientX, y: event.clientY })}>
{lastMessage ? lastMessage.channel : 'waiting for updates'}
</div>
Expand Down Expand Up @@ -101,18 +98,6 @@ import { useConflictResolution } from '@object-ui/collaboration';
const { versions, conflicts, resolveConflict } = useConflictResolution('user-1', 'Alice');
```

### LiveCursors

Displays remote user cursors on the page:

```tsx
import { LiveCursors, type PresenceUser } from '@object-ui/collaboration';

declare const presenceUsers: PresenceUser[];

const cursors = <LiveCursors users={presenceUsers} />;
```

### PresenceAvatars

Shows avatar badges for active users:
Expand Down
143 changes: 0 additions & 143 deletions packages/collaboration/src/LiveCursors.tsx

This file was deleted.

Loading
Loading