diff --git a/.changeset/bulk-update-helper.md b/.changeset/bulk-update-helper.md deleted file mode 100644 index 59a87d20e..000000000 --- a/.changeset/bulk-update-helper.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@object-ui/types": minor -"@object-ui/data-objectstack": minor -"@object-ui/app-shell": patch ---- - -DataSource: add optional `bulkUpdate(resource, ids, patch)` for "same patch, many rows" interactions (Slack "mark all as read", Linear "archive selected"). The ObjectStack adapter routes to `POST /api/v1/data/:object/updateMany` so the client pays one HTTP/auth/RLS round-trip instead of N parallel PATCHes, eliminating mark-all-read jank on inboxes with 50+ unread. - -AppHeader's `markAllRead` now prefers `bulkUpdate`, with a transparent fallback to the per-id loop for adapters that don't implement the helper. diff --git a/.changeset/console-honor-home-page-id.md b/.changeset/console-honor-home-page-id.md deleted file mode 100644 index 5086d8bae..000000000 --- a/.changeset/console-honor-home-page-id.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@object-ui/app-shell": minor ---- - -Console now honors `App.homePageId` for the bare `/console/apps/:appName` -landing route. Previously it always redirected to the first reachable nav -item, so CRM-style apps with KPI dashboards still landed users on the -first object list (e.g. Leads) rather than the configured home page. - -The new `resolveLandingRoute` looks up the `homePageId` nav item, builds -its route (object / view / page / dashboard / report), and falls back to -the existing `findFirstRoute` only when no `homePageId` is set or it -resolves to a routeless item type. diff --git a/.changeset/crm-ux-polish-batch.md b/.changeset/crm-ux-polish-batch.md deleted file mode 100644 index df719704c..000000000 --- a/.changeset/crm-ux-polish-batch.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@object-ui/plugin-kanban": patch -"@object-ui/plugin-detail": patch -"@object-ui/i18n": patch ---- - -CRM UX polish batch: -- Kanban columns: drop the per-column rainbow top stripe. Lane border + header divider are sufficient; cards are now the loudest thing on screen (Linear / HubSpot pattern). -- Stage chevron (`record:path`): bump completed-stage contrast (emerald-800 text on emerald-500/15, was 700 on /10) and future-stage text from `foreground/70` to `foreground/85` for legibility. -- i18n: add `notifications.emptyUnread`, `notifications.filterUnread`, `notifications.filterAll` (en + zh) so the InboxPopover Unread/All sub-filter renders in the active locale. diff --git a/.changeset/crm-ux-polish-pass.md b/.changeset/crm-ux-polish-pass.md deleted file mode 100644 index b8d050581..000000000 --- a/.changeset/crm-ux-polish-pass.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -"@object-ui/plugin-kanban": patch -"@object-ui/plugin-detail": patch -"@object-ui/app-shell": patch -"@object-ui/i18n": patch ---- - -CRM UX polish pass — calmer enterprise look across detail + kanban. - -- **plugin-kanban**: column headers now use a 2px muted accent stripe with - neutral foreground titles + a quiet grey count pill instead of full - rainbow gradient + colored title + colored count. Pipeline boards - (Opportunity, Case, Task, Lead) look like Salesforce/Linear instead of - a toy. WIP-limit overflow remains destructive-red so urgency stays loud. -- **plugin-detail (`record:reference_rail`)**: new `hideEmpty` prop - (default true) collapses entries whose total === 0 into a single - `+ N empty (Quotes · Products …)` chip at the bottom of the rail. - Removes the 4–7 "No records" stack that dominated the aside. -- **plugin-detail (`record:path`)**: completed stages now render with an - emerald-tinted background + bold green check instead of low-contrast - `bg-muted text-muted-foreground` (which read as "light grey on white" - and was borderline unreadable). -- **app-shell (`RecordDetailView`)**: record-not-found short-circuit. - Previously a stale/missing recordId still rendered the page chrome - (rail, discussion, breadcrumb with the raw id), making invalid links - look like a partially broken page. Now renders a clean centered - `Empty` state with database icon + i18n'd "Record not found" copy. -- **i18n**: added `detail.showEmptyRelated_{one,other}` and - `empty.recordNotFound{,Description}` keys (en + zh). diff --git a/.changeset/currency-cell-renderer-nested.md b/.changeset/currency-cell-renderer-nested.md deleted file mode 100644 index 00c7ac1a4..000000000 --- a/.changeset/currency-cell-renderer-nested.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -"@object-ui/fields": patch ---- - -`CurrencyCellRenderer` now reads the currency code from three locations -in priority order: `field.currency` (legacy grid configs) → -`field.defaultCurrency` (canonical top-level) → -`field.currencyConfig.defaultCurrency` (nested shape emitted by -`@objectstack/spec` `Field.currency({ currencyConfig: ... })`). - -Previously the renderer only checked the first two, so currency-type -fields defined via the canonical spec helper rendered without their -configured symbol. When none of the three is set, the cell still -gracefully degrades to a plain formatted number — never silently -assuming USD. diff --git a/.changeset/dense-cards-and-numbers.md b/.changeset/dense-cards-and-numbers.md deleted file mode 100644 index 0f7f37de1..000000000 --- a/.changeset/dense-cards-and-numbers.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"@object-ui/fields": patch -"@object-ui/plugin-kanban": patch ---- - -CRM polish — denser kanban cards, smarter currency, calmer dates. - -- **plugin-kanban card body**: drop the verbose `Label: value` two-column - grid in favor of a single-column dense list (values only, with the - field label preserved as a hover `title` for accessibility). Pipeline - cards across Salesforce / HubSpot / Linear all do this because the - value's own type carries its meaning, and the saved space lets the - title breathe. -- **fields/formatCurrency**: drop trailing `.00` when the value is a - whole number (Salesforce convention: `$1,234.50` keeps cents, - `$1,234` doesn't). Pipeline amounts like `500,000.00` now read as - `500,000`. -- **fields/formatDate** default branch: drop the year when it matches - the current year — `7月21日` instead of `2026年7月21日`. Past- and - future-year dates keep the year for disambiguation - (`2025年11月23日`). -- **fields/CurrencyCellRenderer**: removed the now-redundant - `.replace(/[.,]00$/, '')` workaround that hid cents for `precision:0` - fields; the formatter now handles whole-unit trimming natively. diff --git a/.changeset/gallery-no-empty-cover.md b/.changeset/gallery-no-empty-cover.md deleted file mode 100644 index ab4ecc23d..000000000 --- a/.changeset/gallery-no-empty-cover.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -"@object-ui/plugin-list": patch ---- - -Gallery cards no longer render a giant gradient letter placeholder when -the configured `coverField` has no populated values anywhere in the -dataset. Previously, simply declaring `gallery.coverField` would force -the cover area on even when every record's image was null/empty, producing -oversized 200×200 "C" / "A" letter blocks that dwarfed the actual card -content (the Contact and Account card views in the CRM example were the -most visible offenders). - -The configured-but-empty state now matches the unconfigured state: -collapse the cover area, render a compact title-plus-fields card. -When at least one record in the dataset has a cover image, the cover -area still renders for all cards so heights stay consistent. diff --git a/.changeset/mention-notifications.md b/.changeset/mention-notifications.md deleted file mode 100644 index 5098e2a13..000000000 --- a/.changeset/mention-notifications.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -'@object-ui/plugin-detail': minor -'@object-ui/app-shell': patch ---- - -End-to-end @-mention notifications. - -`@object-ui/plugin-detail` now exports `extractMentions(text, suggestions)` -— a small utility that resolves `@