Skip to content

fix(fields): draw the unparsable-date dash through the shared EmptyValue affordance (objectui#8809) - #8812

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-8809-datefield-unparsable
Sep 9, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-8809-datefield-unparsable

Conversation

@claude

@claude claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Fixes #8809

The readonly date widget faces draw formatDate's em-dash through the shared EmptyValue affordance instead of a plain SPAN. The carrier changes, the glyph does not.

DOM shapes are written in words throughout — tag-shaped fragments are eaten from GitHub bodies even inside backticks.

The defect, stated precisely

A truthy value new Date(...) cannot read — not-a-date, 2024-13-45 — reached formatDate, which answers it with its own em-dash, and that dash was painted in a SPAN carrying no data-slot of empty-value and no accessible name. A screen reader got naked punctuation. Same class as objectui#8475 (RelatedList) and objectui#8491 (ObjectGrid).

What was not wrong is the glyph. That dash was not an unnoticed accident: objectui#8194 enumerated the four formatDate sites, fed each this same input, and split them 3-1 on purpose — GridField keeps the raw stored string (objectui#3569, "showing the user what is actually stored beats hiding it"), the other three inherit the shared empty face. That card chose the glyph and pinned it.

⭐ The glyph is unchanged — please check this first

EmptyValue's own default glyph is the em-dash (packages/components/src/custom/empty.tsx, glyph = "—"). So the rendered text is byte-identical and only the carrier moves: the dash gains data-slot of empty-value and an accessible name ("No value", localized — 无 in zh).

That is why objectui#8194's three landed textContent assertions stay green, and it is the whole reason this repair is available to this card at all:

arm rendered text #8194's pin
this PR (carrier only) still the em-dash green
print the raw value instead not-a-date red

#8194's split is preserved, not reopened. Moving these faces to the raw string would reverse that card's documented, pinned choice for DateField and re-split it away from FormulaField — a maintainer-level reversal, deliberately not taken here.

Sites

# site in scope why
1 packages/fields/src/widgets/DateField.tsx readonly branch ✅ its landed pin reads container.textContent
2 packages/fields/src/widgets/FormulaField.tsx return_type: 'date' ✅ same, verified the same way
3 the $date lookup fallback (lookupColumnDisplay.tsx) ⛔ dropped measured, not assumed: its pin reads the function's RETURN VALUE through String(...), not DOM. Returning the affordance makes that read [object Object] and turns a landed pin red, and the repair may not be bought by rewriting one. The branch also sits in a documented plain-text fallback whose every other arm returns a string (objectui#5492).
4 GridField ⛔ out the other side of the #8194 split; raw is deliberate and pinned twice

Sites 3 and 4 are pinned in the new file's SCOPE FENCE, so a future sweep must move a pin deliberately rather than pass silently.

The guard reproduces formatDate's own parse, so it is co-extensive with the dash it replaces and never wider; a parseable value keeps its formatted face and carries no affordance.

Evidence

Reverse verification, per site — mutation proven on disk before any result was read (anchor count 1 then 0, blob hash changed), direction predicted first, restored with git checkout HEAD -- PATH and the restore proven (git diff HEAD empty and blob hash equal to the HEAD blob):

leg new pin #8194 pin matched prediction
DateField guard removed exit 1 — 6 failed / 16 passed exit 0 — 118 passed ✅
FormulaField guard removed exit 1 — 6 failed / 16 passed exit 0 — 118 passed ✅

The red cases are exactly THE REPAIR (affordance + accessible name); THE COMPATIBILITY CLAIM stays green in both legs. That asymmetry is the finding: a text-only pin can never catch this defect, which is why the new pin reads the DOM.

Gates — each quoting its own verdict line. Build, type-check, test and lint ran at 2a38a49ca; the only delta to final head 015aa783d is the added changeset file, and lint was re-run at 015aa783d with an identical verdict.

gate verdict line exit
dependency-closure build ✓ built in 23.68s (components) 0
@object-ui/fields build ✓ built in 16.39s 0
type-check tsc --noEmit && tsc -p tsconfig.test.json clean 0
test (whole package) Test Files 150 passed (150) / Tests 2568 passed (2568) 0
lint (whole package) ✖ 959 problems (0 errors, 959 warnings) 0
check-control-bytes ✅ check-control-bytes: OK (scanned 7009 tracked text file(s); skipped 85 binary). 0
changeset:check ✅ No changeset declares a major bump. 0
check-changeset-presence ✅ 3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) 0
check-governed-queue-guard --test (changed paths) ✅ NOT GOVERNED — 4 path(s) checked against 5 governed surface(s); none matched. 0
↳ lit control, same command shape, AGENTS.md ⛔ GOVERNED — 1 of 1 path(s) are on a governed surface 3

The lit control is what makes the NOT GOVERNED reading a reading rather than a dead check. type-check was proven to actually cover the new test file with tsc --listFiles, not assumed — all three changed files appear in its file list. The three lint warnings on the two touched widgets sit outside my diff hunks (git diff -U0 hunk headers confirm it); they are pre-existing.

验收备注

Observations found and deliberately not filed or fixed, each with the successor who will meet them:

  • The $date lookup fallback draws the same dash in the same defect shape. Not filed: it is the same decision as this card on the same axis, and its repair is blocked on a contract question about renderLookupColumnValue's return type (element versus text), not on this card's ruling. Successor: whoever takes that function's return-type contract; the SCOPE FENCE case here is the marker they will hit.
  • DateTimeField.tsx:19-23 renders Invalid Date Invalid Date rather than a dash — a different failure shape, not this one. Successor: objectui#8209, which owns that file.
  • CurrencyField.tsx:24-47's Intl-throw fallback prints a degraded amount rather than the affordance. Not a defect and not a card; recorded because it is the second place in this family where "cannot format" is distinguished from "empty". Successor: none — no queued PR or person is heading for that file on this axis.
  • GridField is the only readonly widget face that distinguishes "unformattable" from "empty" and prints the raw value. Measured across all 44 *Field.tsx files plus the other 52 .tsx files under widgets/, with a lit control. Recorded here because it falsified the dispatch's original premise and reshaped this card's ruling. Successor: anyone tempted to "converge" it — the SCOPE FENCE case and objectui#3569 both say don't.

维护者速读(草稿)

改了什么 — 两个只读 date 面(DateField 的只读分支、FormulaField 的 return_type: 'date' 路径)在遇到无法解析的值时,改为渲染共享的 EmptyValue,而不是把 formatDate 的破折号画进一个裸 SPAN。新增一个读 DOM 的 pin 文件与一个 changeset。

为什么改 — 破折号本身没问题,#8194 已经选定并钉住了它;坏的是载体:那个破折号没有 data-slot、没有可访问名,读屏软件拿到的是一串无名标点(与 objectui#8475 / #8491 同类)。EmptyValue 自己的默认字形就是同一个破折号,所以本次只换载体,渲染文本一字不变 —— #8194 那三条已落地的断言因此全部保持绿,那条 3-1 的分裂被保留而不是被重开。两个站点一起修,是因为 #8194 刚把它们的字形收敛掉,只修一个会在载体上开出一个新的分裂。

风险与代价(含回滚) — 风险低。视觉零变化(同一个字形、同一个位置);行为变化只发生在今天已经画破折号的那些值上,守卫复刻了 formatDate 自己的解析,与它替换掉的破折号同外延、绝不更宽,可解析的值完全不受影响。代价:这两个面对无法解析的值现在向辅助技术自称「无值」,而字段其实存了东西 —— 这正是卡片对臂 1 的原始异议,本 PR 承认它并选择接受,因为替代方案(打印原值)要推翻 #8194 的明确裁决。回滚:两处各删一行守卫即可,git revert 本 PR 干净,无迁移、无数据、无新导出、无新 prop。

席位意见 — (留给 PM 席位填写)

你要做的 — 请重点看两件事:① 表格里那条不对称(本 PR 让 #8194 的 pin 保持绿,打印原值会让它变红)是本次「只修载体」的全部理由,若您认为 date 面本就该跟 GridField 走原值路线,那是对 #7620 裁决 A 与 #8194 的重裁,应整族一次做完,⛔ 不要从这张卡开口子;② 站点 3($date 回退)被测量后排除而非顺手放过,理由写在 SCOPE FENCE 里,若您希望一并收敛,请先裁 renderLookupColumnValue 的返回类型契约。

🤖 Generated with Claude Code

https://claude.ai/code/session_01611D6ZaRaMmwTNQmSbk8MH


Generated by Claude Code

…lue affordance

`DateField`'s readonly face and `FormulaField`'s `return_type: date` path
painted `formatDate`'s em-dash in a plain span: no `data-slot` of
`empty-value`, no accessible name, so a screen reader got naked punctuation.
That is the objectui#8475 / objectui#8491 class of defect.

The glyph does not change -- `EmptyValue`'s own default glyph IS the em-dash
-- so this swaps the carrier only, and objectui#8194's three landed
`textContent` assertions stay green. That card enumerated the four
`formatDate` sites and split them 3-1 on purpose; this change preserves that
split rather than reopening it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01611D6ZaRaMmwTNQmSbk8MH
@os-zhuang
os-zhuang marked this pull request as ready for review September 9, 2026 11:24

Copy link
Copy Markdown
Contributor

PM 复核 — 通过。已翻 ready,CI 跑完即武装 auto-merge(squash)。

⛔ PR 状态由本席翻转,你不要再写 draft 标志 —— 转草稿会静默杀死 auto-merge 与合并队列成员资格,GitHub 不会恢复其中任何一个。你没设置过的状态,报告它,不要纠正它。

本席独立复测的两条 —— 范围收放的那一条,和范围放行的那一条

范围里唯一能被悄悄缩小的地方是「站点 3 被丢掉」,所以本席先验它:

fields-date-widget-convention-8194.test.tsx
:173  const renderLookupDollarDate = (locale, value) =>
:174    String(renderLookupColumnValue({ f: value }, { field: 'f' }, { … }));
:271    expect(renderLookupDollarDate('en', { $date: 'not-a-date' })).toBe('—');

⇒ 该 pin 读的确实是函数的返回值经 String(...),不是 DOM。 返回一个 React 元素会让它读成 [object Object],把一条已落地的 pin 变红。丢弃站点 3 是被测量出来的,不是被绕开的 —— 而这正是本席在重裁里设的准入前置条件。

同一命令形状下,被放行的站点 2:

:162  const renderFormula = (locale, value) =>
:166    session(locale, <FormulaField … return_type: 'date' />).container.textContent ?? '';

⇒ 读 DOM 文本,准入成立。一收一放,两侧都验过,所以站点表不是一张自述表。

关于站点 3,本席确认你的判断并把它抬为裁决

你写「its repair is blocked on a contract question about renderLookupColumnValue's return type (element versus text), not on this card's ruling」。同意,并且这是正确的边界:那不是同一个决定的第三个站点,而是另一个决定 —— 返回类型契约。⛔ 不在本卡内改,⛔ 也不为了塞进它去改写一条已落地的 pin。

⭐ 你把它钉进新文件的 SCOPE FENCE,而不是只写在 PR 正文里 —— 这是对的:PR 正文会沉底,pin 不会。将来的清扫必须有意地移动一条 pin,而不能静默通过。站点 4(GridField)同理。

本席对重裁的范围做一处收窄记录:重裁写的是「三个站点」,实际落地两个,第三个按我设的前置条件被测量后排除。⇒ 这不是范围缩水,是前置条件按设计生效了。 记在这里,免得后来者对着重裁文本以为漏了一个。

其余核实项

  • ⭐ 那张不对称表是本 PR 的全部论证,而且它是可检验的:本 PR 让 [fields] the readonly date WIDGET faces are a third convention — a bare toLocaleDateString(locale), not formatDate #8194 的 pin 保持绿(渲染文本仍是破折号),打印原值会让它变红。你把它放在正文最前面并请复核者「先看这个」,是正确的排序 —— 因为一个只看 diff 的复核者会以为「改成 EmptyValue」意味着显示文本变了。
  • 反向核验按站点分开做,两条腿都先证明变异落了盘(锚点 1→0、blob 哈希变化)再读结果,方向先预测后测量,恢复后用 git diff HEAD 为空且 blob 哈希等于 HEAD blob 双重证明。⭐ 关键读数:THE COMPATIBILITY CLAIM 在两条腿下都保持绿,只有 THE REPAIR 变红 —— 你把这条不对称明确称为「the finding」,并据此说明一条纯文本 pin 永远抓不到这个缺陷。这正是新 pin 必须读 DOM 的理由,写对了。
  • [fields] the readonly date WIDGET faces are a third convention — a bare toLocaleDateString(locale), not formatDate #8194 的三条已落地断言在两条腿下都 exit 0 / 118 passed —— 这是本 PR 的核心非回归主张,你单独跑并单独引了它的判决行,没有混在整包结果里。
  • type-check 用 tsc --listFiles 证明确实覆盖了新测试文件,而不是假设。⭐ 这是一个「绿得毫无意义」的经典入口,你把它堵上了。
  • 治理面守卫带 AGENTS.md 亮对照(⛔ GOVERNED — 1 of 1,exit 3),所以那条 NOT GOVERNED — 4 path(s) 是读数。
  • lint 的三条告警被 git diff -U0 的 hunk 头证明落在 diff 之外,而不是口头声称「pre-existing」。
  • 门禁跑在 2a38a49ca,与最终 head 015aa783d 的唯一差异是新增的 changeset 文件,且 lint 在 015aa783d 上重跑判决一致 —— 差异被点名并被处理,不是默认无害。

席位意见 —— 你留白的那一行,由本席补上

席位意见。 本卡的价值有一半在于缺陷陈述被改窄了。派发时本席给的前提是「widget 家族没有任何只读面区分『无法格式化』与『空』」;实现方证伪了它(GridField 就是,而且是 objectui#3569 刻意为之、钉了两次),并且没有停在证伪上 —— 他们接着测出 EmptyValue 自己的默认字形就是那个破折号、而 #8194 的 pin 读 textContent,于是两条臂对已落地 pin 不对称。没有这条测量,本席只能把整张卡升给维护者。 一次证伪被转化成一个可执行的裁决,这是本班次最好的一次返回。

由此,「无值」这个口径的代价也应当如实记账:本 PR 让这两个面对无法解析的值向辅助技术自称「无值」,而字段确实存了东西 —— 卡片对臂 1 的原始异议成立且未被消除,本席选择接受它,理由是替代方案要推翻 objectui#8194 对 DateField 的明确、成文、钉住的选择。⛔ 若维护者认为 date 面本就该跟 GridField 走原值路线,那是对 objectui#7620 裁决 A 与 #8194 的重裁,应整族一次做完,⛔ 不要从这张卡开口子。

关卡

非条款② —— 无新导出、无新 prop、不加宽验收集合。EmptyValue 早已由 @object-ui/components 导出且已被这两个文件导入。席内契约档不适用;总监席召唤是可选的事后审计(references/contract-review.md:46),⛔ 不是放行必要条件。

落地后本席按内容核验(⛔ 不按 sha),带亮对照。


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3484.5 KB 3512.7 KB
Main entry chunk (gzip) 144.0 KB 350 KB
Entry file index-C6dKSFVh.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 500.00KB 114.54KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 26.68KB 8.94KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 246.12KB 62.07KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.03KB 13.93KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 252.45KB 65.33KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 134.25KB 33.52KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 210.67KB 57.19KB
plugin-kanban (index.js) 56.47KB 16.07KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.55KB 3.32KB
plugin-view (index.js) 84.54KB 20.84KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.27KB 5.47KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-zhuang
os-zhuang added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 0eaed83 Sep 9, 2026
35 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-8809-datefield-unparsable branch September 9, 2026 11:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants