Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,6 @@
## 2026-06-30 - Restore keyboard focus after synchronous DOM replacement
**Learning:** In applications that rely on replacing large chunks of the DOM tree (e.g., calling `renderAll()` on every state change), elements that triggered the change (like dropdowns or toggle buttons) get destroyed and recreated. This causes the browser to reset focus to the `<body>` element, completely breaking keyboard navigation and forcing screen reader users to start over.
**Action:** When implementing interactions that trigger a full re-render, identify the element that triggered the change (e.g., using its ID or data attributes), and use `requestAnimationFrame` to manually call `.focus()` on the newly rendered equivalent element after the DOM has been updated.
## 2026-07-04 - 인라인 폼 μœ νš¨μ„± 검사 μ‹œκ°μ  ν”Όλ“œλ°± μΆ”κ°€
**Learning:** `aria-invalid` μ†μ„±λ§Œ μΆ”κ°€ν•˜κ³  μ‹œκ°μ μΈ ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ©΄, μ‹œκ°μ  μ‚¬μš©μžκ°€ 였λ₯˜κ°€ λ°œμƒν•œ μœ„μΉ˜λ₯Ό μ§κ΄€μ μœΌλ‘œ νŒŒμ•…ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
**Action:** `aria-invalid="true"`κ°€ μ„€μ •λœ 폼 ν•„λ“œμ— ν…Œλ‘λ¦¬μ™€ 포컀슀 μŠ€νƒ€μΌμ„ μΆ”κ°€ν•˜μ—¬ λͺ…ν™•ν•œ μ‹œκ°μ  였λ₯˜ ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
15 changes: 15 additions & 0 deletions styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,21 @@ select[data-inline-progress]:focus {
outline: none;
}

.editor-field input[aria-invalid="true"],
.editor-field select[aria-invalid="true"],
select[data-inline-progress][aria-invalid="true"] {
border-color: var(--danger);
box-shadow: 0 0 0 1px var(--danger);
}

.editor-field input[aria-invalid="true"]:focus,
.editor-field select[aria-invalid="true"]:focus,
select[data-inline-progress][aria-invalid="true"]:focus {
border-color: var(--danger);
box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);
outline: none;
}

.editor-actions {
margin-top: 24px;
display: flex;
Expand Down
Loading