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
24 changes: 24 additions & 0 deletions .changeset/9615-locale-count-ten.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
'@object-ui/fields': patch
---

`file-size-guard`'s docblock no longer restates a built-in locale count, and points at the
test that re-derives it (objectui#9615).

The shared `fields.file.exceedsMaxSize` docblock asserted that the key was already
translated in all **11** built-in locales. `@object-ui/i18n` ships ten —
`BUILT_IN_LANGUAGE_CODES` and the `@object-ui/i18n/locales` map agree on
`en zh ja ko de fr es pt ru ar`, and `readme-locale-count-7989.test.ts` asserts that
agreement. This is not an internal note: the docblock is emitted into
`dist/widgets/file-size-guard.d.ts`, which is in this package's `files`, so the false count
went out in every tarball and is what a consumer's editor shows on hover.

Correcting the numeral to ten was weighed and refused. A restated count is the construct
that permitted the error, and this repository has now watched it recur three times over the
same fact — objectui#3351 in a changeset file, objectui#7989 in `packages/i18n/README.md`,
and this one in published source. So the number is **gone** rather than corrected: the
sentence now claims only what it needs (the key is translated in every locale the package
ships) and names `all-locales-key-parity.test.ts` as the instrument that re-derives it.
That test asserts the stronger invariant — every pack defines every `en` key — over
whatever the pack set is on the day it runs, so an eleventh pack makes the sentence more
true rather than false, and there is no figure left to rot (AGENTS.md commandment #9).
12 changes: 6 additions & 6 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind + Shadcn. It renders JSON metadata from the @objectstack/spec protocol into pixel-perfect, accessible, and interactive enterprise interfaces.

**Where We Are:** Foundation is **solid and shipping** — 39 packages published on npm, 99+ components, 6,700+ tests, 80 Storybook stories, 43/43 builds passing, ~85% protocol alignment. SpecBridge, Expression Engine, Action Engine, data binding, all view plugins (Grid/Kanban/Calendar/Gantt/Timeline/Map/Gallery), Record components, Report engine, Dashboard BI features, mobile UX, i18n (11 locales), WCAG AA accessibility, Console through Phase 20 (L3), **AppShell Navigation Renderer** (P0.1), **Flow Designer** (P2.4), **Feed/Chatter UI** (P1.5), **App Creation & Editing Flow** (P1.11), **System Settings & App Management** (P1.12), **Page/Dashboard Editor Console Integration** (P1.11), **Right-Side Visual Editor Drawer** (P1.11), **Console Engine Schema Integration** (P1.14), and **Unified Home Dashboard** (P1.7.1) — all ✅ complete. **ViewDesigner** has been removed — its capabilities (drag-to-reorder, undo/redo) are now provided by the ViewConfigPanel (right-side config panel).
**Where We Are:** Foundation is **solid and shipping** — 39 packages published on npm, 99+ components, 6,700+ tests, 80 Storybook stories, 43/43 builds passing, ~85% protocol alignment. SpecBridge, Expression Engine, Action Engine, data binding, all view plugins (Grid/Kanban/Calendar/Gantt/Timeline/Map/Gallery), Record components, Report engine, Dashboard BI features, mobile UX, i18n (10 locales), WCAG AA accessibility, Console through Phase 20 (L3), **AppShell Navigation Renderer** (P0.1), **Flow Designer** (P2.4), **Feed/Chatter UI** (P1.5), **App Creation & Editing Flow** (P1.11), **System Settings & App Management** (P1.12), **Page/Dashboard Editor Console Integration** (P1.11), **Right-Side Visual Editor Drawer** (P1.11), **Console Engine Schema Integration** (P1.14), and **Unified Home Dashboard** (P1.7.1) — all ✅ complete. **ViewDesigner** has been removed — its capabilities (drag-to-reorder, undo/redo) are now provided by the ViewConfigPanel (right-side config panel).

**What Remains:** The gap to **Airtable-level UX** is primarily in:
1. ~~**AppShell** — No dynamic navigation renderer from spec JSON (last P0 blocker)~~ ✅ Complete
Expand Down Expand Up @@ -305,7 +305,7 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
- [x] Appearance section: Color, Field text color, Row height (icon toggle), Wrap headers, Show field descriptions, Collapse all by default
- [x] User actions section: Edit records inline (→ inlineEdit), Add/delete records inline, Navigation mode (page/drawer/modal/split/popover/new_window/none)
- [x] Calendar endDateField support
- [x] i18n for all 11 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko)
- [x] i18n for all 10 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko)
- [x] **Live preview: ViewConfigPanel changes sync in real-time to all list types (Grid/Kanban/Calendar/Timeline/Gallery/Map)** _(all 7 phases complete — see P1.8.1 gap analysis below)_
- ✅ `showSort` added to `ObjectViewSchema` and propagated through plugin-view (Grid only)
- ✅ Appearance properties (`rowHeight`, `densityMode`) flow through `renderListView` schema for all view types
Expand Down Expand Up @@ -601,7 +601,7 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
- [x] Add `description` field to `NamedListView` protocol interface (spec alignment)
- [x] Add `disabledWhen` predicate to `ConfigField` type — grid-only fields (striped/bordered/wrapHeaders/resizable) disabled for non-grid views
- [x] Add `expandedSections` prop to `ConfigPanelRenderer` for external section collapse control (auto-focus/highlight)
- [x] Add `helpText` to navigation-dependent fields (width/openNewTab) with i18n hints (all 11 locales)
- [x] Add `helpText` to navigation-dependent fields (width/openNewTab) with i18n hints (all 10 locales)
- [x] 24 new tests: expandedSections override (3), disabledWhen evaluation (2), grid-only disabledWhen predicates (16), helpText validation (2), description spec alignment (1)

**Phase 6 — Config Panel Cleanup (Invalid Items Fix):**
Expand Down Expand Up @@ -629,7 +629,7 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
- [x] Records section: selection mode, addRecord sub-editor (collapsible)
- [x] Export & Print section: allowExport + sub-config, showRecordCount, allowPrinting (collapsible, defaultCollapsed)
- [x] Field selector upgrade: eye/eye-off toggle for visibility (replacing checkboxes), search input for field filtering, Show All/Hide All batch operations, grip handles for visual reorder hints
- [x] i18n keys added for all 11 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko, + ar)
- [x] i18n keys added for all 10 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko)
- [x] 110 schema tests pass (+7 new section tests)
- [x] 136 ViewConfigPanel interaction tests pass (updated for eye toggles, section expansion)
- [x] 31 ObjectView integration tests pass (updated for section expansion)
Expand Down Expand Up @@ -1348,7 +1348,7 @@ The `FlowDesigner` is a canvas-based flow editor that bridges the gap between th

**Header & Breadcrumb i18n:**
- [x] AppHeader breadcrumb labels (`Dashboards`, `Pages`, `Reports`, `System`) now use `t()` translation via `useObjectTranslation`.
- [x] `console.breadcrumb` i18n keys added to all 11 locales (en, zh, ja, ko, de, fr, es, pt, ru, ar).
- [x] `console.breadcrumb` i18n keys added to all 10 locales (en, zh, ja, ko, de, fr, es, pt, ru, ar).
- [x] `header-bar` renderer: `resolveCrumbLabel()` handles both string and `I18nLabel` objects for breadcrumb labels.
- [x] `breadcrumb` renderer: `resolveItemLabel()` handles both string and `I18nLabel` objects for item labels.

Expand Down Expand Up @@ -1848,7 +1848,7 @@ All 313 `@object-ui/fields` tests pass.
> **Goal:** Salesforce-style detail page enhancements: i18n for all detail page UI elements, improved empty value display, related list actions, and auto-discovery of related lists.

**i18n Integration:**
- [x] Add `detail.*` translation keys to all 11 locale files (en, zh, ja, de, fr, es, ar, ru, pt, ko)
- [x] Add `detail.*` translation keys to all 10 locale files (en, zh, ja, de, fr, es, ar, ru, pt, ko)
- [x] `useDetailTranslation` safe wrapper hook with English fallback (follows existing useGridTranslation/useListViewTranslation pattern)
- [x] DetailView fully i18n-integrated (Back, Edit, Share, Delete, Duplicate, Export, View history, Record not found, Related heading, favorites, navigation)
- [x] DetailSection copy tooltip i18n via `useSectionTranslation`
Expand Down
19 changes: 15 additions & 4 deletions packages/fields/src/widgets/file-size-guard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,21 @@
* calls it or conspicuously does not.
*
* Both widgets deliberately share the `fields.file.exceedsMaxSize` key too. The
* sentence names a file and a limit and says nothing file-widget-specific, it is
* already translated in all 11 built-in locales, and a parallel `fields.image.*`
* twin would be the same sentence maintained twice — drifting the moment one
* translator rewords one of them.
* sentence names a file and a limit and says nothing file-widget-specific, and a
* parallel `fields.image.*` twin would be the same sentence maintained twice —
* drifting the moment one translator rewords one of them.
*
* The key is already translated in every locale `@object-ui/i18n` ships. ⛔ How
* many that is, this comment does not say: `all-locales-key-parity.test.ts` in
* that package is what re-derives it, and it asserts the stronger fact this
* sentence actually needs — every pack defines every `en` key — over whatever
* the pack set is on the day it runs. A restated count cannot be re-derived by
* the next reader, and this line proved it: it shipped in the published source
* of `@object-ui/fields` naming a built-in locale count one HIGHER than the
* packs `@object-ui/i18n` actually ships, and stayed that way through every
* reading of this file (AGENTS.md commandment #9; objectui#9615). ⛔ The wrong
* numeral is deliberately not quoted back here — a census greps for it, and a
* post-mortem that restates it lights that census up forever.
*/

/**
Expand Down
Loading