Skip to content

🎨 Palette: [UX improvement] Replace native disabled with aria-disabled on inline editor save button - #477

Closed
seonghobae wants to merge 4 commits into
developfrom
palette/aria-disabled-save-button-4102716748264453504
Closed

🎨 Palette: [UX improvement] Replace native disabled with aria-disabled on inline editor save button#477
seonghobae wants to merge 4 commits into
developfrom
palette/aria-disabled-save-button-4102716748264453504

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

🎨 Palette: [UX improvement]

  • 💡 What: Changed the save button in the inline editor to use aria-disabled="true" instead of the native disabled attribute when there are validation errors. Intercepts the form submission to show a toast message if the user tries to save an invalid form.
  • 🎯 Why: Native disabled attributes swallow DOM events and prevent focus, breaking keyboard navigation for users tabbing through the page. By using aria-disabled, keyboard users retain their context and focus, and we can provide helpful inline toast feedback explaining why they can't save.
  • ♿ Accessibility: Improves screen reader and keyboard navigation experience by preserving focus and providing explicit feedback.

PR created automatically by Jules for task 4102716748264453504 started by @seonghobae

Summary by CodeRabbit

  • 접근성 개선
    • 유효성 오류가 있는 경우 저장 버튼이 접근성 비활성 상태로 표시됩니다.
    • 비활성 상태에서 저장을 시도하면 작업이 차단되고 오류 안내 토스트가 표시됩니다.

…d on inline editor save button

- 💡 What: Changed the save button in the inline editor to use `aria-disabled="true"` instead of the native `disabled` attribute when there are validation errors, and added an event handler to intercept form submission and show a toast message.
- 🎯 Why: Native `disabled` attributes swallow DOM events and prevent focus, breaking keyboard navigation for users tabbing through the page. By using `aria-disabled`, keyboard users retain their context and focus, and we can provide helpful inline toast feedback explaining *why* they can't save.
- ♿ Accessibility: Improves screen reader and keyboard navigation experience by preserving focus and providing explicit feedback.
@google-labs-jules

Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 75a1153b-f25a-4905-ba5f-934c5b81d5fe

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

편집 폼의 저장 버튼이 유효성 오류를 aria-disabled="true"로 표시합니다. 제출 이벤트는 이 상태를 확인하고 저장을 차단한 뒤 안내 토스트를 표시합니다.

Changes

저장 버튼 접근성 처리

Layer / File(s) Summary
유효성 상태와 제출 차단
app.js
유효성 오류가 있으면 저장 버튼에 aria-disabled="true"를 설정합니다. 오류가 없으면 속성을 제거합니다. 제출 이벤트는 해당 속성을 확인하고 저장을 차단한 뒤 안내 토스트를 표시합니다.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 유효성 오류 시 저장 버튼에 aria-disabled를 적용하는 주요 변경 사항을 정확하고 구체적으로 설명합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch palette/aria-disabled-save-button-4102716748264453504

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app.js`:
- Around line 432-436: saveEditor()에서 saveButton의 aria-disabled 상태를 확인하기 전에
renderDraftValidation.flush()를 호출해 최신 검증 결과를 반영하세요. flush()가
renderEditorValidation()을 호출하므로 중복 호출은 추가하지 말고 기존 saveEditor() 동기 검증은 유지하세요. 또한
저장 버튼의 비활성 상태를 native disabled 속성으로 설정하거나 E2E 검증을 aria-disabled 기준으로 일치시키세요.
- Around line 1076-1080: 저장 차단 검증을 네이티브 disabled가 아닌 aria-disabled 계약에 맞추세요.
tests/e2e/scopeweave.spec.js의 toBeDisabled() 4곳을 aria-disabled="true" 속성 검증으로
변경하고 오류 메시지 및 편집기 표시 검증은 유지하세요. 제출 핸들러에서는 renderDraftValidation.flush() 또는 최신
draft 검증을 먼저 수행한 뒤 aria-disabled 상태를 확인해 유효한 최신 입력이 이전 오류 상태로 차단되지 않게 하세요.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6429c5c9-3b60-4df2-b249-dbda6331a304

📥 Commits

Reviewing files that changed from the base of the PR and between 74a5e99 and 5e7d7d4.

📒 Files selected for processing (1)
  • app.js

Comment thread app.js
Comment thread app.js
seonghobae and others added 3 commits August 12, 2026 01:53
…d on inline editor save button and update hono version

- 💡 What: Changed the save button in the inline editor to use `aria-disabled="true"` instead of the native `disabled` attribute when there are validation errors, and added an event handler to intercept form submission and show a toast message. Also updated `hono` in package-lock.json to resolve Trivy FS scan failure due to a vulnerability.
- 🎯 Why: Native `disabled` attributes swallow DOM events and prevent focus, breaking keyboard navigation for users tabbing through the page. By using `aria-disabled`, keyboard users retain their context and focus, and we can provide helpful inline toast feedback explaining *why* they can't save. Also fixing the CI failure caused by the vulnerable dependency.
- ♿ Accessibility: Improves screen reader and keyboard navigation experience by preserving focus and providing explicit feedback.
…d on inline editor save button and update hono version

- 💡 What: Changed the save button in the inline editor to use `aria-disabled="true"` instead of the native `disabled` attribute when there are validation errors, and added an event handler to intercept form submission and show a toast message. Also updated `hono` in package-lock.json to resolve Trivy FS scan failure due to a vulnerability.
- 🎯 Why: Native `disabled` attributes swallow DOM events and prevent focus, breaking keyboard navigation for users tabbing through the page. By using `aria-disabled`, keyboard users retain their context and focus, and we can provide helpful inline toast feedback explaining *why* they can't save. Also fixing the CI failure caused by the vulnerable dependency.
- ♿ Accessibility: Improves screen reader and keyboard navigation experience by preserving focus and providing explicit feedback.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head e3d8c18d1633399f15d938e057657d6f552fe3ad.

  • Head SHA: e3d8c18d1633399f15d938e057657d6f552fe3ad

  • Workflow run: 31701436838

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (2 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (2 files)"]
  R1 --> V1["required checks"]
Loading

@opencode-agent

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: e3d8c18d1633399f15d938e057657d6f552fe3ad
  • Workflow run: 31701436838
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head e3d8c18d1633399f15d938e057657d6f552fe3ad.

  • Head SHA: e3d8c18d1633399f15d938e057657d6f552fe3ad

  • Workflow run: 31701436838

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (2 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (2 files)"]
  R1 --> V1["required checks"]
Loading

Copy link
Copy Markdown
Contributor Author

Closing as superseded by #468.

This implementation checks the existing aria-disabled attribute before flushing debounced validation. A draft corrected immediately before click/Enter can therefore remain blocked by stale presentation state, while the save decision is split between ARIA state and saveEditor() validation. It also has no focused browser acceptance test and carries lockfile drift.

#468 contains the stronger test-first contract: the button remains focusable, presentation uses aria-disabled/aria-describedby, synchronous saveEditor() validation is the sole mutation authority, immediately corrected drafts submit, and invalid drafts never persist.

@seonghobae seonghobae closed this Aug 14, 2026
@google-labs-jules

Copy link
Copy Markdown

Closing as superseded by #468.

This implementation checks the existing aria-disabled attribute before flushing debounced validation. A draft corrected immediately before click/Enter can therefore remain blocked by stale presentation state, while the save decision is split between ARIA state and saveEditor() validation. It also has no focused browser acceptance test and carries lockfile drift.

#468 contains the stronger test-first contract: the button remains focusable, presentation uses aria-disabled/aria-describedby, synchronous saveEditor() validation is the sole mutation authority, immediately corrected drafts submit, and invalid drafts never persist.

Understood. Acknowledging that this work is now superseded by #468 and stopping work on this task.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant