Skip to content

finding(app-shell): not one of the 15 empty-collection states under metadata-admin/previews/ uses the shared Empty family — and two of them define a local component *named* Empty that shadows it #8526

Description

@os-justin

Found while landing objectui#8520, whose ruling asked explicitly for this census: "Check what the other empty-collection states in packages/app-shell/src/views/metadata-admin/previews/ do before you pick. If its siblings already use the Empty family, match them; if they all hand-roll something different, that is a finding worth reporting." They all hand-roll. Not claimed, no assignee.

The census

Probe, run at the repo root:

git grep -n -E "\bEmpty(Header|Title|Description|Content|Media)\b" -- 'packages/app-shell/src/views/metadata-admin/previews/*'

Zero hits from @object-ui/components. Lit control in the same pathspec: git grep -c PreviewShell on the same glob fires on every preview file, so the zero is an absence, not a dead pathspec. (The trailing /* matters — 'packages/*/src' without it is a whole-path glob that matches nothing.)

Meanwhile the same probe run repo-wide returns roughly 28 call sites, including 14 files in packages/app-shell/src/views/ outside this directory. So the family is reachable and in heavy use one directory up; this subtree is the hole.

What the 15 sibling empty-collection states render instead, all of them a short sentence in a muted div:

file:line rendered
ActionPreview.tsx:580 div.text-muted-foreground.italic — "Renders full JSON response."
AgentPreview.tsx:255 div.text-xs.text-muted-foreground.italic — the emptyHint prop
AppNavCanvas.tsx:329 div with border-dashed, text-[11px]
BookPreview.tsx:190 PreviewEmptyState (the directory's own full-canvas one)
DatasourcePreview.tsx:158 div.text-xs...italic — "No config keys set."
EmailTemplatePreview.tsx:97 div.text-muted-foreground.italic
FieldStub.tsx:204 span.text-xs.text-muted-foreground
FieldsListEditor.tsx:169 p with border-dashed, text-[11px]
FlowPreview.tsx:345 div.text-muted-foreground.italic
FlowRunsPanel.tsx:348 div.text-[10px].italic
FlowSimulatorPanel.tsx:323 div.italic.text-muted-foreground
JobPreview.tsx:356 div.text-xs.text-amber-700
PageBlockCanvas.tsx:827 div with border-dashed, text-[11px]
SkillPreview.tsx:106 div.text-xs...italic — "No tools whitelisted."
ValidationPreview.tsx:281 div.text-xs.text-amber-700

Six distinct type scales (text-xs, text-[10px], text-[11px], text-sm, unset), three colour treatments, and two different dashed-border conventions — for one visual state.

The part that will bite someone

AgentPreview.tsx:221 and ToolPreview.tsx:296 each declare a local component literally named Empty:

function Empty({ children }: { children: React.ReactNode }) {
  return <div className="text-xs text-muted-foreground italic">{children}</div>;
}

In those two files the shared Empty cannot be imported under its own name at all — the import collides with the local declaration, and there is no compiler error waiting for whoever tries, only a shadowing surprise. objectui#8520 hit exactly this and imported EmptyDescription alone to route around it.

That local Empty is also, at 16px in a 215px column, the correct weight for these panes — measured against the shared container's 118.8px in the same frame (see objectui#8525). So this is not "the previews are wrong and the family is right": the family's container is genuinely too heavy for a preview rail, and the previews grew their own lighter one because nothing lighter was exported.

What is actually being asked for

Not a mechanical sweep. The question is whether the shared family should grow a light block-level member the previews can use — at which point these 15 sites plus the two local Empty declarations converge on it — or whether PreviewShell.tsx's existing PreviewEmptyState should grow a compact variant and be the directory's single answer. Both are design calls above a dev seat.

Filed as an observation, not a defect: every one of the 15 renders readable text today, so none of them has the objectui#8491 / objectui#8504 accessibility defect. What they have is drift.

Dedup

Ran. A natural-language search_issues describing the census against this repo returns one hit, #4659, which is a closed card about unread *.component.yml metadata and unrelated. Control term InspectorSelectField returned 3 in the same session (#8450, #8488, #3306), the count objectui#8520 and objectui#8504 both recorded, so the near-zero is a reading.

Related

objectui#8520 (the card whose ruling asked for this) · objectui#8525 (the shared Empty container's override problems, measured in the same run) · objectui#8504 / objectui#8491 (the em-dash class)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatchedpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions