Found while implementing #5301 (PR #5427). Not fixed there — different package, and the surface is not this card's file.
What
packages/plugin-designer/src/DashboardEditor.tsx guards its widget-title input with isAuthorableTitle, so a title stored as an inline locale map renders resolved and read-only:
value={isAuthorableTitle(widget.title) ? widget.title ?? '' : titleDisplay}
onChange={(e) =. {
if (!isAuthorableTitle(widget.title)) return;
onChange({ title: e.target.value });
}}
readOnly={!isAuthorableTitle(widget.title)}
That branch is correct and cannot lose data — this is an observation, not a defect report. The problem is its stated justification and its tracker.
The premise is stale, and the same file already contradicts it
isAuthorableTitle's doc comment says:
- "Nothing can reach this path from stored metadata yet —
I18nLabel was plain string through rc.5, so no persisted widget title can be a map — which is why the branch is safe to take without a ruling on the authoring UX."
Sixty lines above it, resolveWidgetTitle's doc comment in the same file says:
- "
@objectstack/spec 17.0.0-rc.6 widened I18nLabel from string to string | Record ... so a widget title may be an inline per-locale map."
Both cannot hold. rc.6 is the pinned version, so a persisted map title is reachable today, and the "safe without a ruling" clause has expired.
The card it defers to is closed
The comment and #4163's own Part 2 name #4163 as the home for the real answer ("a per-locale editor, a translate-this-label affordance, or a deliberate decision that Studio only ever authors the string form"). #4163 was closed as completed on 2026-08-15 while that placeholder is still in the tree, so the deferral now points at nothing. The identical placeholder in DashboardWidgetInspector that #4163 Part 2 describes is in the same position.
Why it is newly actionable
#5301's maintainer ruling (2026-08-20) settled the write-back question for the sibling surface: a save writes back only the active locale's entry and preserves the others. PR #5427 implements that as setLocalized(value, language, next) in @object-ui/i18n, co-located with pickLocalized and pinned by the pairing property. The designer's read-only branch was waiting for exactly this rule, and can now adopt it without a new design decision — an author editing in one locale gets a working input instead of a dead one.
Filed unassigned and unqueued: whether to apply the ruling to the designer surface (versus reopening #4163 for the full multi-locale editor) is a triage call, not this finding's to make.
Found while implementing #5301 (PR #5427). Not fixed there — different package, and the surface is not this card's file.
What
packages/plugin-designer/src/DashboardEditor.tsxguards its widget-title input withisAuthorableTitle, so a title stored as an inline locale map renders resolved and read-only:That branch is correct and cannot lose data — this is an observation, not a defect report. The problem is its stated justification and its tracker.
The premise is stale, and the same file already contradicts it
isAuthorableTitle's doc comment says:I18nLabelwas plainstringthrough rc.5, so no persisted widget title can be a map — which is why the branch is safe to take without a ruling on the authoring UX."Sixty lines above it,
resolveWidgetTitle's doc comment in the same file says:@objectstack/spec17.0.0-rc.6 widenedI18nLabelfromstringtostring | Record... so a widget title may be an inline per-locale map."Both cannot hold. rc.6 is the pinned version, so a persisted map title is reachable today, and the "safe without a ruling" clause has expired.
The card it defers to is closed
The comment and #4163's own Part 2 name #4163 as the home for the real answer ("a per-locale editor, a translate-this-label affordance, or a deliberate decision that Studio only ever authors the string form"). #4163 was closed as completed on 2026-08-15 while that placeholder is still in the tree, so the deferral now points at nothing. The identical placeholder in
DashboardWidgetInspectorthat #4163 Part 2 describes is in the same position.Why it is newly actionable
#5301's maintainer ruling (2026-08-20) settled the write-back question for the sibling surface: a save writes back only the active locale's entry and preserves the others. PR #5427 implements that as
setLocalized(value, language, next)in@object-ui/i18n, co-located withpickLocalizedand pinned by the pairing property. The designer's read-only branch was waiting for exactly this rule, and can now adopt it without a new design decision — an author editing in one locale gets a working input instead of a dead one.Filed unassigned and unqueued: whether to apply the ruling to the designer surface (versus reopening #4163 for the full multi-locale editor) is a triage call, not this finding's to make.