Skip to content

fix(fields): 注册路径的全屏长文本编辑器认 disabled(#3402) - #3403

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-3402-registered-fullscreen-disabled
Aug 5, 2026
Merged

fix(fields): 注册路径的全屏长文本编辑器认 disabled(#3402)#3403
yinlianghui merged 2 commits into
mainfrom
claude/issue-3402-registered-fullscreen-disabled

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#3402

前提先坐实(issue 自标 static-only)

issue 只有静态证据,所以先写动态探针复现,再动手。探针断言的是 origin/main 上的缺陷行为,跑出来是绿的 —— 前提成立:

PROBE textarea: inline disabled = true
PROBE textarea: toggle present = true, toggle disabled = false
PROBE textarea: dialog opened = true
PROBE textarea: dialog input disabled = false
PROBE textarea: onChange calls = [["EDITED WHILE DISABLED"]]
PROBE textarea mid-edit: input disabled = false , save disabled = false
PROBE textarea mid-edit: onChange calls = [["EDITED WHILE SUBMITTING"]]
PROBE richtext: inline disabled = true , toggle disabled = false
PROBE richtext: dialog opened = true , dialog input disabled = false
PROBE richtext: onChange calls = [["# EDITED WHILE DISABLED"]]

最后一行就是缺陷本身:禁用字段的值被改掉了。内联控件正确地灰着 —— 这正是它难被发现的原因,绕过它的按钮就贴在它上面。修完再跑同一个探针,3/3 全红(方向:Red,与预期一致),探针随即删除,由下面的 pin 测试取代。

改了什么

disabled 此前只落到内联控件:showFullscreenButton 不看它,两个调用点不传它,FullscreenFieldEditor 压根没声明这个 prop。

FullscreenFieldEditor 现在声明 disabled,形制对齐内置分支的 locked 闸门(#3400 / PR #3401),四条各司其职:

  • 展开按钮留着但 disabled —— disabled 是「不可交互、灰掉」,不是 readonly 的「平铺展示」(后者由两个 widget 的只读提前返回负责,连按钮都不渲染);
  • openFullscreen 自己也拦 —— 属性和 pointer-events 都可能在重构里丢掉;
  • 对话框自己扛 —— disabled 不只是静态标志,表单渲染器把 isSubmitting 也 OR 了进来,它可能在对话框已经打开时翻真,那一刻按钮已经不是闸门了。所以编辑器经 children第三个参数收到 disabled,"Done" 也 disabled;
  • onCommit 前置 gate —— 值离开该组件进入宿主状态的唯一出口,没有任何原生机制守它(它是另一个控件上读 React state 的 click handler)。

Cancel / Esc 任何状态下都保持可用 —— 否则提交进行中会把用户关死在模态框里。

两个 widget 各把 disabled 解析一次交给两个编辑面(RichTextField 里与 formatLabel / hint / placeholder 完全同形,原因也相同)。

⛔ 按裁定未碰:form.tsx(内置分支 #3401 已修)、两个 widget 的 readonly 提前返回、ObjectForm / stripRegisteredFieldProps

没有加 readonly prop:两个宿主都在算出展开按钮之前就提前返回只读展示,该组件在 readonly 下根本不会被渲染,加了就是「声明了但没有生产者」—— 本包一直在删的形状(#3232/#3233)。将来若有宿主要在只读下渲染编辑器,prop 与生产者必须一起加。

逐条 limb 反向验证(先定方向,再跑)

四组实验,每组的预期方向都在跑之前写死,四组全部命中:

limb拆掉什么预期实测
AcommitFullscreenif (!disabled)(保留 "Done" 的 disabled 属性)全绿 —— React 不会给 disabled 按钮派发 onClick,DOM 层看不见这条21/21 绿
B"Done" 的 disabled 属性(保留 handler gate)属性断言红、写回断言绿locks the dialog controls ×2 红,refuses the write-back ×2 绿
C属性 handler gate 都拆写回断言转红4 红,onChange 被调用,值为 EDITED WHILE SUBMITTING
D展开按钮的 disabled 属性(保留 openFullscreen gate)属性断言红、开框断言绿keeps the expand button and disables it ×2 红,does not open the dialog… ×2 绿

limb A 是个如实要说明的结果:那条 handler gate 单独拆掉时,任何 DOM 驱动的测试都照不出来 —— 只要按钮还带着 disabled,点击就被 React 过滤掉了。它不是「白写的」:limb B/C 证明属性一旦丢失,它就是挡在点击和写回之间的唯一一道。这也直接改了测试的写法:最初「锁住控件 + 拒绝写回」是同一个 test,limb B 暴露出写回断言在属性断言失败时根本执行不到 —— 也就是说它只能在「原生属性已经在干活」的世界里运行,那等于没 pin。现已拆成两个独立 test。

测试

新增两个文件(每个 widget 一组,共 21 个 case):disabled 按钮禁 / 点了也不开框 / 内联仍禁 / 不写回 / 提交中翻真时对话框自锁 / 仍可 Cancel 退出 / 正常字段全屏编辑与提交不回归 / readonly 提前返回不回归 / 未开 mobile_fullscreen 时(禁用与否)都不出按钮。

规则消费半径而非改动包来扫 fixture:FullscreenFieldEditor 只有这两个宿主(未从包入口导出,children 增加第三个参数是包内改动),但两个 widget 被 form 渲染器、ObjectFormActionParamDialog、SDUI 注册适配器消费,故一并跑了 packages/fields + plugin-form 的 mobileFullscreen + components 的 form 全屏套件 + types 的 metadata 测试 + ActionParamDialog:

Test Files 86 passed (86)
Tests 1057 passed (1057)

vitest list 确认两个新文件确实落在过滤范围内(防「路径过滤被吞」假绿):

[dom] packages/fields/src/widgets/__tests__/RichTextField.fullscreenDisabled.test.tsx
[dom] packages/fields/src/widgets/__tests__/TextAreaField.fullscreenDisabled.test.tsx

type-check 绿(@object-ui/fields,10 tasks successful);lint 0 error;check-control-bytes OK,改动文件另做了越过该 gate 盲区的自查(grep -naP,零命中)。

Changeset:@object-ui/fields patch。

🤖 Generated with Claude Code

https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt


Generated by Claude Code

…ath (#3402)
`disabled` reached the inline control of `TextAreaField` / `RichTextField` and
nothing else. `showFullscreenButton` did not consult it, neither call site
forwarded it, and `FullscreenFieldEditor` did not declare the prop at all — so a
disabled long-text or rich-text field was greyed out inline while its expand
button stayed live, its dialog accepted any edit, and "Done" wrote that edit back
through `onCommit`.
The issue carried static evidence only, so the premise was reproduced with a
dynamic probe first: toggle `disabled=false`, dialog opened, dialog input
`disabled=false`, `onChange` called with "EDITED WHILE DISABLED" — on both
widgets, and again with `disabled` flipped true under an already-open dialog.
`FullscreenFieldEditor` now declares `disabled`, shaped like the built-in path's
`locked` gate (#3400 / PR #3401): the toggle stays but is disabled and refuses to
open, the dialog's editor is disabled via a new third `children` argument, and
"Done" is disabled and gated before `onCommit`. The dialog holds on its own
rather than trusting the button, because `disabled` also carries the form's
`isSubmitting` and can flip true while the dialog is open. Cancel and Esc stay
live so a submit in flight cannot trap the user in a modal.
`readonly` is untouched: both widgets early-return a read-only display before the
affordance is computed, which is why readonly was never part of this defect, and
no `readonly` prop is added here that no host would produce.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@vercel

vercelBot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 5, 2026 7:06pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.1 KB350 KB
Entry fileindex-Wo1b7ZQ6.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.47KB3.09KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)18.38KB4.49KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)3.65KB1.42KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.25KB0.53KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)478.45KB105.05KB
core (index.js)2.25KB0.80KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)136.23KB34.75KB
fields (index.js)227.38KB55.79KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)26.14KB6.07KB
i18n (useSafeTranslation.js)3.26KB1.44KB
layout (index.js)38.53KB10.71KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.05KB1.53KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.98KB12.37KB
plugin-charts (index.js)61.04KB17.31KB
plugin-chatbot (index.js)180.09KB42.72KB
plugin-dashboard (index.js)112.01KB28.86KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)231.54KB57.09KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)111.54KB26.97KB
plugin-gantt (index.js)162.55KB39.57KB
plugin-grid (index.js)185.08KB49.04KB
plugin-kanban (index.js)47.89KB13.18KB
plugin-list (index.js)105.02KB25.36KB
plugin-map (index.js)16.81KB5.24KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.55KB10.59KB
plugin-timeline (index.js)25.76KB7.33KB
plugin-tree (index.js)8.34KB2.82KB
plugin-view (index.js)83.67KB20.43KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)19.28KB6.38KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.02KB0.55KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.46KB1.21KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)0.20KB0.18KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

…ed helper
Comment-only. Two JSDoc blocks had accreted on `openThenDisable`; they say one
thing, so they are one block.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.1 KB350 KB
Entry fileindex-Wo1b7ZQ6.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.47KB3.09KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)18.38KB4.49KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)3.65KB1.42KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.25KB0.53KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)478.45KB105.05KB
core (index.js)2.25KB0.80KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)136.23KB34.75KB
fields (index.js)227.38KB55.79KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)26.14KB6.07KB
i18n (useSafeTranslation.js)3.26KB1.44KB
layout (index.js)38.53KB10.71KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.05KB1.53KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.98KB12.37KB
plugin-charts (index.js)61.04KB17.31KB
plugin-chatbot (index.js)180.09KB42.72KB
plugin-dashboard (index.js)112.01KB28.86KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)231.54KB57.09KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)111.54KB26.97KB
plugin-gantt (index.js)162.55KB39.57KB
plugin-grid (index.js)185.08KB49.04KB
plugin-kanban (index.js)47.89KB13.18KB
plugin-list (index.js)105.02KB25.36KB
plugin-map (index.js)16.81KB5.24KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.55KB10.59KB
plugin-timeline (index.js)25.76KB7.33KB
plugin-tree (index.js)8.34KB2.82KB
plugin-view (index.js)83.67KB20.43KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)19.28KB6.38KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.02KB0.55KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.46KB1.21KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)0.20KB0.18KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@yinlianghui
yinlianghui marked this pull request as ready for review August 5, 2026 19:13
@yinlianghui
yinlianghui added this pull request to the merge queueAug 5, 2026
Merged via the queue into main with commit 7d08c3fAug 5, 2026
17 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3402-registered-fullscreen-disabled branch August 5, 2026 19:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

2 participants

@yinlianghui@claude