You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Converge the empty-state defaults onto DataEmptyState — four packages now answer "is it broken or is it young" four different ways, and two rulings just fixed two of them locally #7132
Filed by the domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM) as the deliberately deferred convergence half of two maintainer rulings that landed within ten minutes of each other:
Both rest on the same principle — objectstack#13848: apps are simplified business implementations; uniform behaviour belongs to the platform, and per-widget/per-section authored copy is the per-app tax being ruled against.
⭐ Why this card exists rather than having been done inside one of those PRs
DataEmptyState (packages/components/src/custom/view-states.tsx) is already consumed by four packages: plugin-list, plugin-kanban, plugin-dashboard and plugin-detail. Its title default is literally 'No data'.
⇒ Changing its defaults would have been a smaller diff that repaired both rulings at once, and #7124's implementer identified exactly that and declined it on purpose, consuming the primitive unchanged and recording the reason in the new component's file header.
That was the correct call, and it is the reason this card is filed rather than lost: the two rulings were dispatched in parallel to two agents who could not see each other's reasoning, and both dispatch orders explicitly forbade designing a cross-surface abstraction, requiring stop-and-report instead. ⚠️A shared abstraction designed simultaneously by two agents is worse than two honest local fixes — and it would have been invisible as a problem, because the diff would have looked elegant.
Both local fixes have now landed. The precondition for doing it properly, once, is satisfied.
⇒ The two rulings did not establish a platform-wide answer; they established it on two surfaces. This card is about whether the other two should follow, and whether the shared primitive should carry the answer.
Then answer: does the shared primitive carry those properties, or does each surface legitimately differ? ⭐ "They legitimately differ, here is the evidence" is a fully valid outcome — close it measured-and-declined.
Sequencing
⚠️packages/components is consumed by all four packages, so a defaults change there is broad-blast. Check the packages/app-shell PR backlog before starting.
Filed by the
domain:uiseat (sessionsession_012wwHa4aaFybxXrfmfHioDM) as the deliberately deferred convergence half of two maintainer rulings that landed within ten minutes of each other:hideEmpty ?? trueover DetailSection's own stated heuristic #7064 / PR fix(plugin-detail): let DetailSection's heuristic own the empty-section default #7123 —eeb6c2f2b, record-detail empty sections (hotcrm#1247 ruling)220c18d05, dashboard widget empty state (hotcrm#1212 ruling)Both rest on the same principle — objectstack#13848: apps are simplified business implementations; uniform behaviour belongs to the platform, and per-widget/per-section authored copy is the per-app tax being ruled against.
⭐ Why this card exists rather than having been done inside one of those PRs
DataEmptyState(packages/components/src/custom/view-states.tsx) is already consumed by four packages:plugin-list,plugin-kanban,plugin-dashboardandplugin-detail. Its title default is literally'No data'.⇒ Changing its defaults would have been a smaller diff that repaired both rulings at once, and #7124's implementer identified exactly that and declined it on purpose, consuming the primitive unchanged and recording the reason in the new component's file header.
That was the correct call, and it is the reason this card is filed rather than lost: the two rulings were dispatched in parallel to two agents who could not see each other's reasoning, and both dispatch orders explicitly forbade designing a cross-surface abstraction, requiring stop-and-report instead.⚠️ A shared abstraction designed simultaneously by two agents is worse than two honest local fixes — and it would have been invisible as a problem, because the diff would have looked elegant.
Both local fixes have now landed. The precondition for doing it properly, once, is satisfied.
The measured spread — four packages, four answers
plugin-detailrecord sectionsplugin-dashboarddataset/table/pivot widgetsWidgetEmptyState—role="status", title + explanation, names the data sourceplugin-list,plugin-kanbanDataEmptyStatedefaults — terse, unexamined against either rulingplugin-chartsObjectChart⇒ The two rulings did not establish a platform-wide answer; they established it on two surfaces. This card is about whether the other two should follow, and whether the shared primitive should carry the answer.
⛔ What this card must NOT do
hideEmpty ?? trueover DetailSection's own stated heuristic #7064. Both are ruled and landed. If convergence would change either surface's behaviour, that is a new question for the maintainer, not a refactor.DataEmptyState". That is the hypothesis, not the ruling. A list and a record-detail section and a chart may legitimately want different empty states — finding(plugin-charts):ObjectCharthas NO empty branch at all — an empty result draws a bare chart frame, the fourth distinct answer on this surface to "is it broken or is it young" #7130 makes exactly that argument for charts (axes may already be self-describing).emptyStatekey to a new surface would reopen it one card later.ChartSchemanode's two data keys are declared-but-unread —ChartDataSeries.datais required and never read, andcategoriesis read as a SERIES list, not axis labels #6896 / PR feat(types)!: retire ChartDataSeries.data, correct categories' prose (#6896) #7111 is in.Suggested first step — measurement, not refactor
Render all four surfaces' empty states side by side and judge them against the two rulings' own stated properties:
role="status"vsrole="alert"is the structural test fix(plugin-dashboard,i18n): a self-explaining default empty state for dashboard widgets #7124 used);Then answer: does the shared primitive carry those properties, or does each surface legitimately differ? ⭐ "They legitimately differ, here is the evidence" is a fully valid outcome — close it measured-and-declined.
Sequencing
packages/componentsis consumed by all four packages, so a defaults change there is broad-blast. Check thepackages/app-shellPR backlog before starting.Refs: #7063 · #7064 · PR #7123 · PR #7124 · #7130 (ObjectChart) · #7125 (dead keys from #7124) · objectstack#13848 · hotcrm#1212 · hotcrm#1247.