π¨ Palette: λΉλνν μμ ν΄ν ν€λ³΄λ μ κ·Όμ± κ°μ - #445
π¨ Palette: λΉλνν μμ ν΄ν ν€λ³΄λ μ κ·Όμ± κ°μ #445seonghobae wants to merge 11 commits into
Conversation
λΉλνν μμ(`div`, `span` λ±)μ μ 곡λ `title`μ΄λ `aria-label` ν΄νμ΄ ν€λ³΄λ μ¬μ©μμκ² λ ΈμΆλμ§ μλ μ κ·Όμ± μ΄μλ₯Ό ν΄κ²°ν©λλ€. - `index.html`: νλ‘μ νΈ μ 체μΌμ λ° μ§μ²λ₯ μ νμνλ `.meta-value-card` 3κ³³μ `tabindex="0"` μΆκ° - `app.js`: ν΄ν(description)μ΄ μ‘΄μ¬νλ `.status-badge`μ `tabIndex = 0` λμ μΆκ° - `styles.css`: `:focus-visible` μ νμμ μ λ μμλ₯Ό μΆκ°νμ¬ λͺ νν ν¬μ»€μ€ νμ λ λλ§ - `.jules/palette.md`: λΉλνν μμ ν΄ν μ κ·Όμ± κ΄λ ¨ μΈμ¬μ΄νΈ κΈ°λ‘
|
π 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 New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
π WalkthroughWalkthroughμ€λͺ
μ 보λ₯Ό κ°μ§ μμ½ μΉ΄λμ μν λ°°μ§λ₯Ό ν€λ³΄λ ν¬μ»€μ€ λμμΌλ‘ λ³κ²½νμ΅λλ€. Changesν€λ³΄λ ν¬μ»€μ€ μ κ·Όμ±
Estimated code review effort: 2 (Simple) | ~5 minutes π₯ Pre-merge checks | β 5β Passed checks (5 passed)
β¨ Finishing Touchesπ Generate docstrings
π§ͺ Generate unit tests (beta)
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. Comment |
λΉλνν μμ(`div`, `span` λ±)μ μ 곡λ `title`μ΄λ `aria-label` ν΄νμ΄ ν€λ³΄λ μ¬μ©μμκ² λ ΈμΆλμ§ μλ μ κ·Όμ± μ΄μλ₯Ό ν΄κ²°ν©λλ€. - `index.html`: νλ‘μ νΈ μ 체μΌμ λ° μ§μ²λ₯ μ νμνλ `.meta-value-card` 3κ³³μ `tabindex="0"` μΆκ° - `app.js`: ν΄ν(description)μ΄ μ‘΄μ¬νλ `.status-badge`μ `tabIndex = 0` λμ μΆκ° - `styles.css`: `:focus-visible` μ νμμ μ λ μμλ₯Ό μΆκ°νμ¬ λͺ νν ν¬μ»€μ€ νμ λ λλ§ - `.jules/palette.md`: λΉλνν μμ ν΄ν μ κ·Όμ± κ΄λ ¨ μΈμ¬μ΄νΈ κΈ°λ‘
|
Superseded by #450. The current replacement carries the complete buyer-visible keyboard-focus scope from this PR ( |
Understood. Acknowledging that this work is now obsolete as it has been superseded by #450, and stopping work on this task. |
|
@coderabbitai review Please review exact head |
|
|
λΉλνν μμ(`div`, `span` λ±)μ μ 곡λ `title`μ΄λ `aria-label` ν΄νμ΄ ν€λ³΄λ μ¬μ©μμκ² λ ΈμΆλμ§ μλ μ κ·Όμ± μ΄μλ₯Ό ν΄κ²°ν©λλ€. - `index.html`: νλ‘μ νΈ μ 체μΌμ λ° μ§μ²λ₯ μ νμνλ `.meta-value-card` 3κ³³μ `tabindex="0"` μΆκ° - `app.js`: ν΄ν(description)μ΄ μ‘΄μ¬νλ `.status-badge`μ `tabIndex = 0` λμ μΆκ° - `styles.css`: `:focus-visible` μ νμμ μ λ μμλ₯Ό μΆκ°νμ¬ λͺ νν ν¬μ»€μ€ νμ λ λλ§ - `.jules/palette.md`: λΉλνν μμ ν΄ν μ κ·Όμ± κ΄λ ¨ μΈμ¬μ΄νΈ κΈ°λ‘
λΉλνν μμ(`div`, `span` λ±)μ μ 곡λ `title`μ΄λ `aria-label` ν΄νμ΄ ν€λ³΄λ μ¬μ©μμκ² λ ΈμΆλμ§ μλ μ κ·Όμ± μ΄μλ₯Ό ν΄κ²°ν©λλ€. - `index.html`: νλ‘μ νΈ μ 체μΌμ λ° μ§μ²λ₯ μ νμνλ `.meta-value-card` 3κ³³μ `tabindex="0"` μΆκ° - `app.js`: ν΄ν(description)μ΄ μ‘΄μ¬νλ `.status-badge`μ `tabIndex = 0` λμ μΆκ° - `styles.css`: `:focus-visible` μ νμμ μ λ μμλ₯Ό μΆκ°νμ¬ λͺ νν ν¬μ»€μ€ νμ λ λλ§ - `.jules/palette.md`: λΉλνν μμ ν΄ν μ κ·Όμ± κ΄λ ¨ μΈμ¬μ΄νΈ κΈ°λ‘
λΉλνν μμ(`div`, `span` λ±)μ μ 곡λ `title`μ΄λ `aria-label` ν΄νμ΄ ν€λ³΄λ μ¬μ©μμκ² λ ΈμΆλμ§ μλ μ κ·Όμ± μ΄μλ₯Ό ν΄κ²°ν©λλ€. - `index.html`: νλ‘μ νΈ μ 체μΌμ λ° μ§μ²λ₯ μ νμνλ `.meta-value-card` 3κ³³μ `tabindex="0"` μΆκ° - `app.js`: ν΄ν(description)μ΄ μ‘΄μ¬νλ `.status-badge`μ `tabIndex = 0` λμ μΆκ° - `styles.css`: `:focus-visible` μ νμμ μ λ μμλ₯Ό μΆκ°νμ¬ λͺ νν ν¬μ»€μ€ νμ λ λλ§ - `.jules/palette.md`: λΉλνν μμ ν΄ν μ κ·Όμ± κ΄λ ¨ μΈμ¬μ΄νΈ κΈ°λ‘
λΉλνν μμ(`div`, `span` λ±)μ μ 곡λ `title`μ΄λ `aria-label` ν΄νμ΄ ν€λ³΄λ μ¬μ©μμκ² λ ΈμΆλμ§ μλ μ κ·Όμ± μ΄μλ₯Ό ν΄κ²°ν©λλ€. - `index.html`: νλ‘μ νΈ μ 체μΌμ λ° μ§μ²λ₯ μ νμνλ `.meta-value-card` 3κ³³μ `tabindex="0"` μΆκ° - `app.js`: ν΄ν(description)μ΄ μ‘΄μ¬νλ `.status-badge`μ `tabIndex = 0` λμ μΆκ° - `styles.css`: `:focus-visible` μ νμμ μ λ μμλ₯Ό μΆκ°νμ¬ λͺ νν ν¬μ»€μ€ νμ λ λλ§ - `.jules/palette.md`: λΉλνν μμ ν΄ν μ κ·Όμ± κ΄λ ¨ μΈμ¬μ΄νΈ κΈ°λ‘
There was a problem hiding this comment.
Actionable comments posted: 1
π€ 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 `@index.html`:
- Around line 31-42: Update the focusable summary cards in index.html:31-42 to
use an appropriate non-generic role, assign IDs to their visible labels and
descriptions, and connect each card with aria-labelledby and aria-describedby
while preserving tabindex. In app.js:999-1002, update the status badge with an
appropriate non-live role and description reference; do not use role="status"
for static table cells.
πͺ 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: 32023607-c2e0-4e1e-9843-4dcf7a75c730
π Files selected for processing (4)
.jules/palette.mdapp.jsindex.htmlstyles.css
| <div class="meta-value-card" title="νλ‘μ νΈμ μμ κΈ°κ°(μΌμ) ν©κ³μ λλ€." tabindex="0"> | ||
| <span class="meta-label">μ 체μΌμ</span> | ||
| <strong data-testid="summary-total-days" id="summary-total-days">0μΌ</strong> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div class="meta-grid meta-grid-secondary"> | ||
| <div class="meta-value-card accent-card plan-card" title="κΈ°κ°(μΌμ) κ°μ€μΉκ° λ°μλ νλ‘μ νΈ μ 체 κ³ν μ§μ²λ₯ μ λλ€."> | ||
| <div class="meta-value-card accent-card plan-card" title="κΈ°κ°(μΌμ) κ°μ€μΉκ° λ°μλ νλ‘μ νΈ μ 체 κ³ν μ§μ²λ₯ μ λλ€." tabindex="0"> | ||
| <span class="meta-label">κ³νμ§μ²λ₯ (λμ )</span> | ||
| <strong data-testid="summary-planned-progress" id="summary-planned-progress">0.00%</strong> | ||
| </div> | ||
| <div class="meta-value-card accent-card actual-card" title="κΈ°κ°(μΌμ) κ°μ€μΉκ° λ°μλ νλ‘μ νΈ μ 체 μ€μ μ§μ²λ₯ μ λλ€."> | ||
| <div class="meta-value-card accent-card actual-card" title="κΈ°κ°(μΌμ) κ°μ€μΉκ° λ°μλ νλ‘μ νΈ μ 체 μ€μ μ§μ²λ₯ μ λλ€." tabindex="0"> |
There was a problem hiding this comment.
π― Functional Correctness | π Major | β‘ Quick win
π§© Analysis chain
π Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- candidate files ---'
git ls-files | rg '(^|/)(index\.html|app\.js|ARCHITECTURE\.md|AGENTS\.md|\.jules/)' || true
printf '%s\n' '--- index.html: relevant region ---'
nl -ba index.html | sed -n '1,75p'
printf '%s\n' '--- app.js: progress badge region ---'
nl -ba app.js | sed -n '950,1035p'
printf '%s\n' '--- related identifiers and render paths ---'
rg -n -C 3 'summary-total-days|summary-planned-progress|summary-actual-progress|progressState|description|renderAll\(' index.html app.js styles.css
printf '%s\n' '--- repository guidance ---'
for f in ARCHITECTURE.md AGENTS.md; do
if [ -f "$f" ]; then
printf '%s\n' "--- $f ---"
sed -n '1,220p' "$f"
fi
done
if [ -d .jules ]; then
find .jules -maxdepth 2 -type f -print
fiRepository: ContextualWisdomLab/scopeweave
Length of output: 16304
π Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- index.html: structure and labels ---'
awk 'NR >= 1 && NR <= 90 { printf "%4d %s\n", NR, $0 }' index.html
printf '%s\n' '--- app.js: status rendering and table context ---'
awk 'NR >= 680 && NR <= 755 { printf "%4d %s\n", NR, $0 }' app.js
awk 'NR >= 970 && NR <= 1010 { printf "%4d %s\n", NR, $0 }' app.js
printf '%s\n' '--- progress-state definitions and consumers ---'
awk 'NR >= 1415 && NR <= 1485 { printf "%4d %s\n", NR, $0 }' app.js
rg -n -C 4 'createStatusCellContent|status-badge|meta-value-card|summary-total-days|summary-planned-progress|summary-actual-progress' styles.css tests .jules 2>/dev/null || true
printf '%s\n' '--- relevant learning documents ---'
for f in .jules/*.md; do
printf '%s\n' "--- $f ---"
rg -n -C 2 'accessib|aria|focus|semantic|role|badge|summary|static|renderAll' "$f" || true
done
printf '%s\n' '--- accessibility-related tests ---'
rg -n -i -C 3 'accessib|aria|tabindex|role|keyboard|focus|status-badge|meta-value-card' tests 2>/dev/null || trueRepository: ContextualWisdomLab/scopeweave
Length of output: 50386
π Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- focused learning entry ---'
awk 'NR >= 100 && NR <= 125 { printf "%4d %s\n", NR, $0 }' .jules/palette.md
printf '%s\n' '--- targeted E2E accessibility assertions ---'
awk 'NR >= 1288 && NR <= 1335 { printf "%4d %s\n", NR, $0 }' tests/e2e/scopeweave.spec.js
awk 'NR >= 660 && NR <= 690 { printf "%4d %s\n", NR, $0 }' tests/e2e/scopeweave.spec.js
printf '%s\n' '--- focused source diff, if available ---'
git diff --unified=8 -- index.html app.js | sed -n '1,220p'
printf '%s\n' '--- deterministic attribute/label checks ---'
python3 - <<'PY'
from html.parser import HTMLParser
from pathlib import Path
class Parser(HTMLParser):
def __init__(self):
super().__init__()
self.stack = []
self.cards = []
self.elements = []
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
item = (tag, attrs, self.getpos()[0])
self.elements.append(item)
if 'tabindex' in attrs or 'tabIndex' in attrs:
self.stack.append(item)
if 'meta-value-card' in attrs.get('class', '').split():
self.cards.append(item)
p = Parser()
p.feed(Path('index.html').read_text())
print('cards:')
for tag, attrs, line in p.cards:
print({'line': line, 'tag': tag, 'tabindex': attrs.get('tabindex'),
'role': attrs.get('role'), 'title': attrs.get('title'),
'aria-label': attrs.get('aria-label'),
'aria-labelledby': attrs.get('aria-labelledby'),
'aria-describedby': attrs.get('aria-describedby')})
print('focusable static elements in index.html:')
for tag, attrs, line in p.elements:
if 'tabindex' in attrs or 'tabIndex' in attrs:
print({'line': line, 'tag': tag, 'tabindex': attrs.get('tabindex'),
'role': attrs.get('role'), 'title': attrs.get('title'),
'aria-label': attrs.get('aria-label'),
'aria-labelledby': attrs.get('aria-labelledby'),
'aria-describedby': attrs.get('aria-describedby')})
PYRepository: ContextualWisdomLab/scopeweave
Length of output: 9206
π Web query:
MDN tabindex non-interactive elements ARIA role focusable element title aria-describedby screen reader
π‘ Result:
To ensure accessibility, developers should prioritize semantic HTML and follow established patterns for focus management. Tabindex and Interactive Elements The tabindex attribute allows authors to control the focusability of elements [1][2]. However, developers should avoid using tabindex to make non-interactive elements interactive [1][3]. Instead, use native interactive elements like button, a, or input, which have built-in keyboard support and ARIA semantics [1][2][3]. If a non-interactive element must be used for custom functionality, it should be made focusable by setting tabindex="0" [2][4][5]. Positive values for tabindex (e.g., tabindex="1") must be avoided, as they disrupt the logical navigation order [1][2][4]. A value of -1 makes an element focusable programmatically via scripting (e.g., using element.focus) but removes it from the sequential keyboard navigation flow [2][4][5]. ARIA Roles and Focus When using ARIA roles (such as role="button") on non-interactive elements, the element does not automatically gain keyboard interactivity or focus management [6][7]. Developers must manually implement the necessary event listeners for click and keydown events (including Enter and Space key support) and ensure the element is focusable via tabindex [6]. Browser support for ARIA roles is ignored on naturally focusable elements or elements with tabindex defined [8]. Aria-describedby and Screen Readers The aria-describedby attribute provides a way to associate additional text with an element, which is then communicated to screen reader users [9][10]. It is used to link an element to one or more descriptive elements by their IDs [9][10]. Unlike the title attribute, which may have limited or inconsistent support, aria-describedby is widely supported and intended for providing context or descriptions [9][11][10]. It is appropriate for plain text descriptions; for more complex or structured content, aria-details is recommended [9][10]. If both aria-describedby and aria-description are present, aria-describedby takes precedence [10].
Citations:
- 1: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/tabindex
- 2: https://developer.mozilla.org/en-US/docs/Web/Accessibility/Guides/Keyboard-navigable_JavaScript_widgets
- 3: https://web.dev/articles/control-focus-with-tabindex
- 4: https://webaim.org/techniques/keyboard/tabindex
- 5: https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Accessibility/WAI-ARIA_basics
- 6: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/button_role
- 7: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles
- 8: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/presentation_role
- 9: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-describedby
- 10: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-description
- 11: https://www.w3.org/WAI/ARIA/apg/practices/names-and-descriptions/
π Web query:
WAI-ARIA generic role aria-label prohibited accessible name focusable generic span role status static status badge
π‘ Result:
The WAI-ARIA specification explicitly prohibits the use of aria-label and aria-labelledby on elements with the generic role [1][2][3]. The generic role is intended to be used by user agents for containers that have no specific semantic meaning and should not be used by web authors [1][4]. Applying an accessible name (via aria-label or aria-labelledby) to a generic element is a violation of the ARIA specification [5][6]. The prohibition exists because the generic role does not have a semantic concept of a name [5]. When an author applies these attributes to a generic element, behavior across screen readers is inconsistent [5][7][6]. Some screen readers (such as VoiceOver) may announce the label [5][7][6], while others (such as NVDA or JAWS) ignore it completely [5][7], leading to unpredictable and non-standard accessibility experiences [8][6]. Regarding focusability: A standard span or div with a generic role is not focusable by default. If such an element is made focusable (e.g., via tabindex="0"), it should typically be given a specific, meaningful ARIA role (such as button or checkbox) rather than remaining generic, as users expect focusable elements to have a clear role and purpose [8]. There are narrow exceptions where an element's role may change, allowing for a label: 1. When a section element is given an aria-label, its role is implicitly elevated from generic to region, which is a named landmark [5][7]. 2. When a div has the popover attribute, its role is elevated to group, which is a role that supports naming [5][7]. Unless the element's role is programmatically changed to one that supports naming, authors should avoid attempting to label generic containers [5][8]. If an accessible name is required, the best practice is to use an element that inherently supports that role (e.g., using a button for an interactive action) [5][8].
Citations:
- 1: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/generic_role
- 2: https://www.w3.org/TR/wai-aria-1.3/
- 3: https://w3c.github.io/aria/
- 4: https://www.w3.org/TR/html-aria/
- 5: https://sitebrace.com/learn/aria-label-on-divs
- 6: https://benmyers.dev/blog/dont-use-aria-label-on-static-text-elements/
- 7: https://www.matuzo.at/blog/2026/aria-label-generic-elements
- 8: https://rocketvalidator.com/accessibility-validation/accesslint/0.17/aria/aria-prohibited-attr
π Web query:
W3C ARIA role status definition live region status badge role status accessibility
π‘ Result:
The ARIA role status is a defined landmark role used to create an assertive or polite live regionβspecifically for advisory informationβthat does not require immediate user interruption [1][2]. Definition and Purpose The status role is intended for content that provides advisory information regarding the state of an application or user activity [1][3]. It is not appropriate for critical errors or alerts that require immediate, interrupting attention; for those, the alert role is preferred [1][2]. Common use cases include success confirmations, loading messages, or updates to a shopping cart [3][2]. Key Technical Characteristics When an element is assigned role="status", it carries the following implicit ARIA properties: - aria-live="polite": This ensures that assistive technologies (AT), such as screen readers, announce the update only when the user is idle, rather than interrupting their current task [1][3][4]. - aria-atomic="true": This informs the AT that it should present the entire contents of the status container when an update occurs, rather than just the changed portion [1][3]. Best Practices for Accessibility - Implementation: To ensure reliability across various browsers and assistive technologies, it is often recommended to add an explicit aria-atomic="true" attribute, even though it is implicit, to ensure consistent behavior [3][5]. Similarly, some developers add redundant aria-live="polite" attributes to maximize compatibility [4]. - Container Presence: For the best results, the element designated as the status region should be present in the Document Object Model (DOM) when the page loads, and then updated dynamically with content [3][4][6]. - Content Context: Because status is often atomic, developers should ensure the container includes enough context so that the announcement is meaningful on its own [3]. If the status message relies on visual icons, ensure equivalent text (such as alt text or aria-label) is included within the status container [3]. - Avoid Focus: The status role is designed to inform users of changes without requiring them to move their focus; do not manually move focus to a status region [1].
Citations:
- 1: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/status_role
- 2: https://a11ypath.com/guides/live-regions/
- 3: https://www.w3.org/WAI/WCAG22/Techniques/aria/ARIA22
- 4: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Guides/Live_regions
- 5: https://www.w3.org/WAI/WCAG22/Techniques/aria/ARIA22.html
- 6: https://www.w3.org/WAI/WCAG22/Techniques/aria/ARIA19.html
π Web query:
WAI ARIA Authoring Practices informational card group aria-labelledby aria-describedby noninteractive focusable
π‘ Result:
There is no single, globally defined WAI-ARIA "card group" pattern [1]. Instead, accessibility for card groups is achieved by applying WAI-ARIA and HTML principles according to the specific interaction design (e.g., whether the group is static or interactive) [2][1]. Accessible Naming and Description To ensure assistive technologies identify and distinguish cards within a group: - Accessible Name: Use aria-labelledby to link the card to its primary heading (e.g., the card title) [3][4]. If no visible title exists, aria-label may be used as a fallback to provide a brief, descriptive name [2][3][4]. - Accessible Description: Use aria-describedby to associate the card with additional supporting information, such as body text or secondary details [2][5]. This provides context beyond the primary name [2]. Focusable vs. Non-interactive The interactivity of a card group determines its keyboard requirements: - Non-interactive Card Groups: If cards are primarily for information display, they generally do not need to be focusable [6]. Keyboard users navigate through the content naturally using standard page navigation (e.g., Tab key to reach links/buttons within cards) [6]. - Interactive/Selectable Card Groups: When cards act as components (e.g., selectable options or triggerable actions), they may be made focusable [7][5]. If a group contains multiple interactive elements, the WAI-ARIA Grid pattern or a roving tabindex approach is often used to manage focus, allowing users to navigate between cards using arrow keys while maintaining only one card in the page tab sequence [8][9][10]. Best Practices - Semantic HTML: Whenever possible, use native HTML elements (e.g., list items in an unordered list) to establish the group structure [5]. - Focus Management: If you choose to make cards focusable, ensure the focus indicator is clearly visible and that keyboard behavior (e.g., arrow key navigation) is consistent with familiar UI patterns [10][6]. - Avoid Redundancy: Do not use aria-labelledby or aria-describedby if the same information is already correctly identified by semantic structures (e.g., headings) that screen readers already announce [4]. Top results: [2][3][8][10][7]
Citations:
- 1: https://www.w3.org/WAI/ARIA/apg/
- 2: https://www.w3.org/WAI/ARIA/apg/practices/names-and-descriptions/
- 3: https://www.patternfly.org/components/card/accessibility/
- 4: https://pluma.customer.io/components/option-card/accessibility
- 5: https://www.telerik.com/kendo-react-ui/components/layout/card/accessibility/wai-aria-support
- 6: https://dap.berkeley.edu/accessible-card-ui-component-patterns
- 7: https://developers.arcgis.com/calcite-design-system/components/card-group/
- 8: https://www.w3.org/WAI/ARIA/apg/patterns/grid/
- 9: https://www.w3.org/WAI/ARIA/apg/patterns/grid/examples/layout-grids/
- 10: https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/
ν¬μ»€μ€ κ°λ₯ν λΉλνν μμμ μ κ·Όμ± μλ―Έλ₯Ό λΆμ¬νμΈμ.
νμ¬ divμ spanμ tabindex="0"μ΄ μμ΄λ generic μμλ‘ λ¨μ μμ΅λλ€. spanμ aria-labelμ μΌκ΄λκ² λ
ΈμΆλμ§ μμ μ μμ΅λλ€.
index.html:31-42: ν¬μ»€μ€λ₯Ό μ μ§νλ©΄ μ΄λ¦μ μ§μνλ μ μ ν μν μ μΆκ°νκ³ , νμ λ μ΄λΈκ³Ό λμ κ°μaria-labelledbyλ‘ μ°κ²°νμΈμ. μ€λͺ μaria-describedbyλ‘ μ°κ²°νμΈμ.app.js:999-1002: μν λ°°μ§μλ λμμ λ§λ λΉ-live μν κ³Ό μ€λͺ μ°κ²°μ μΆκ°νμΈμ. μ μ ν μ μλ λμ μλ¦Όμ λ§λλrole="status"λ₯Ό μ¬μ©νμ§ λ§μΈμ.
π Affects 2 files
index.html#L31-L42(this comment)app.js#L999-L1002
π€ Prompt for 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.
In `@index.html` around lines 31 - 42, Update the focusable summary cards in
index.html:31-42 to use an appropriate non-generic role, assign IDs to their
visible labels and descriptions, and connect each card with aria-labelledby and
aria-describedby while preserving tabindex. In app.js:999-1002, update the
status badge with an appropriate non-live role and description reference; do not
use role="status" for static table cells.
|
Closing this duplicate accessibility pattern. Adding every informational summary card and every described status badge to the sequential tab order creates potentially thousands of non-actionable keyboard stops in a large WBS. It also continues to rely on #481 and #485 proposed the same strategy with different ARIA roles. A future replacement must preserve a concise task-oriented tab order and provide the exact explanatory values through visible text or an explicit accessible-description relationship. |
Understood. Acknowledging that this work is now obsolete, and stopping work on this task. |
π‘ 무μμ
.meta-value-card) 3κ°μtabindex="0"μ μΆκ°νμ΅λλ€..status-badge) μ€ λΆκ° μ€λͺ (description)μ΄ μ‘΄μ¬νλ κ²½μ°μ νν΄ λμ μΌλ‘tabindex="0"μμ±μ μΆκ°νλλ‘ μλ°μ€ν¬λ¦½νΈλ₯Ό μμ νμ΅λλ€.styles.cssμ:focus-visibleμ νμ κ·μΉμ νμ₯νμ¬ λΈλΌμ°μ κΈ°λ³Έ μΈκ³½μ λμ μΌκ΄μ± μλ νλμ μ€κ³½μ μ΄ λνλλλ‘ μ²λ¦¬νμ΅λλ€.π― μ
divλspanλ± λΉλνν μμμtitleλλaria-labelμμ±μΌλ‘ λΆκ° μ 보λ ν΄νμ μ 곡νλλΌλ, λ§μ°μ€ νΈλ² κΈ°λ₯λ§ λμν λΏ ν€λ³΄λλ₯Ό μ¬μ©νλ μ¬μ©μλ νλ©΄ νλ κΈ° νκ²½μμλ μμλ‘ μ§μ ν λ°©λ²μ΄ μμ΄ μ 보λ₯Ό μ»μ μ μλ μ κ·Όμ± κ²°ν¨μ΄ μμμ΅λλ€.πΈ λ³κ²½ μ /ν
λ³κ²½ μ :
titleμμ± λ±)λ₯Ό νμΈν μ μμμ΅λλ€.λ³κ²½ ν:
focus-visible)κ° λνλ©λλ€. νλ©΄ νλ κΈ°κ° μ 보λ₯Ό μ μμ μΌλ‘ μ½μ΄λΌ μ μμ΅λλ€.βΏ μ κ·Όμ±
tabindex="0"λΆμ¬.box-shadow) μ 곡.PR created automatically by Jules for task 744094641182118282 started by @seonghobae
Summary by CodeRabbit