fix(site): resolve axe defects in showcase pages

This commit is contained in:
Yun Chan 2026-09-24 13:26:05 +09:00
parent c4aade92fc
commit c86271286d
3 changed files with 202 additions and 17 deletions

View file

@ -1,21 +1,204 @@
# 게이트 리포트 — 2026-08-29 12:12 # 게이트 리포트 — 2026-09-24 03:17
**전 항목 통과 — 배포 가능** **전 항목 통과 — 배포 가능**
``` ```
PASS L0 정적 — SKIP — checks.static=false PASS L0 정적 — SKIP — checks.static=false
PASS 죽은 선택자 — SKIP — checks.deadCss=false PASS gaon-lms 죽은 선택자 — 2개 CSS × 2개 HTML·JS 문서(무시 2접두사)
PASS twentyoz-products 토큰 위생 — 색 0/0건(0종)·radius 1종·토큰 1파일/73개 PASS dure-enrollment 죽은 선택자 — 2개 CSS × 2개 HTML·JS 문서(무시 2접두사)
PASS twentyoz-products SEO/meta — title 17자·desc 85자·OG✓·alt 0결 PASS twentyoz-corp 죽은 선택자 — 2개 CSS × 2개 HTML·JS 문서(무시 2접두사)
PASS twentyoz-products/single 오버플로 — 320/375/390/768/1440 PASS hannam-jari 죽은 선택자 — 1개 CSS × 2개 HTML·JS 문서(무시 2접두사)
PASS twentyoz-products/single h1 1줄 PASS hannam-jari-admin 죽은 선택자 — 1개 CSS × 2개 HTML·JS 문서(무시 2접두사)
PASS twentyoz-products/single 수축 없음 PASS griddle-club 죽은 선택자 — 1개 CSS × 4개 HTML·JS 문서(무시 2접두사)
PASS twentyoz-products/single 리듬·트랙 PASS griddle-club-franchise 죽은 선택자 — 1개 CSS × 2개 HTML·JS 문서(무시 2접두사)
PASS twentyoz-products/single 대비 AA PASS gaon-lms 토큰 위생 — 색 0/0건(0종)·radius 1종·토큰 1파일/76개
PASS twentyoz-products 스케일×폭 h1 — 최대 1줄 · scales 1/1.3 PASS dure-enrollment 토큰 위생 — 색 0/0건(0종)·radius 2종·토큰 1파일/73개
PASS twentyoz-products 브랜드 1줄 PASS twentyoz-corp 토큰 위생 — 색 0/0건(0종)·radius 1종·토큰 1파일/73개
PASS twentyoz-products/single 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px PASS hannam-jari 토큰 위생 — 색 64/64건(49종)·radius 2/2종·토큰 2파일/64개
PASS twentyoz-products/single 왼쪽 인셋 — 최소 텍스트 시작 20px PASS hannam-jari-admin 토큰 위생 — 색 254/256건(114종)·radius 14/15종·토큰 1파일/56개
PASS griddle-club 토큰 위생 — 색 35/41건(28종)·radius 3/6종·토큰 1파일/39개
PASS griddle-club-franchise 토큰 위생 — 색 21/26건(17종)·radius 0/0종·토큰 1파일/39개
PASS gaon-lms SEO/meta — title 18자·desc 65자·OG✓·alt 누락 0 · 장식(alt="") 0
PASS gaon-lms/dashboard 오버플로 — 320/375/390/768/1440
PASS gaon-lms/dashboard h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/dashboard 수축 없음
PASS gaon-lms/dashboard 리듬·트랙
PASS gaon-lms/dashboard 대비 AA
PASS gaon-lms/students 오버플로 — 320/375/390/768/1440
PASS gaon-lms/students h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/students 수축 없음
PASS gaon-lms/students 리듬·트랙
PASS gaon-lms/students 대비 AA
PASS gaon-lms/attendance 오버플로 — 320/375/390/768/1440
PASS gaon-lms/attendance h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/attendance 수축 없음
PASS gaon-lms/attendance 리듬·트랙
PASS gaon-lms/attendance 대비 AA
PASS gaon-lms/grades 오버플로 — 320/375/390/768/1440
PASS gaon-lms/grades h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/grades 수축 없음
PASS gaon-lms/grades 리듬·트랙
PASS gaon-lms/grades 대비 AA
PASS gaon-lms/files 오버플로 — 320/375/390/768/1440
PASS gaon-lms/files h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/files 수축 없음
PASS gaon-lms/files 리듬·트랙
PASS gaon-lms/files 대비 AA
PASS gaon-lms/calendar 오버플로 — 320/375/390/768/1440
PASS gaon-lms/calendar h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/calendar 수축 없음
PASS gaon-lms/calendar 리듬·트랙
PASS gaon-lms/calendar 대비 AA
PASS gaon-lms/counsel 오버플로 — 320/375/390/768/1440
PASS gaon-lms/counsel h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/counsel 수축 없음
PASS gaon-lms/counsel 리듬·트랙
PASS gaon-lms/counsel 대비 AA
PASS gaon-lms/report 오버플로 — 320/375/390/768/1440
PASS gaon-lms/report h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/report 수축 없음
PASS gaon-lms/report 리듬·트랙
PASS gaon-lms/report 대비 AA
PASS gaon-lms/notice 오버플로 — 320/375/390/768/1440
PASS gaon-lms/notice h1 보임 — 1줄(줄수 계약 없음)
PASS gaon-lms/notice 수축 없음
PASS gaon-lms/notice 리듬·트랙
PASS gaon-lms/notice 대비 AA
PASS gaon-lms 스케일×폭 h1 — 줄수 정보 375@1x:1줄, 375@1.3x:1줄, 390@1x:1줄, 390@1.3x:1줄
PASS gaon-lms 브랜드 줄바꿈 없음 — 텍스트 블록 1개, 각 1줄
PASS gaon-lms/dashboard 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/students 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/attendance 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/grades 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/files 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/calendar 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/counsel 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/report 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/notice 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS gaon-lms/dashboard axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/students axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/attendance axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/grades axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/files axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/calendar axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/counsel axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/report axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/notice axe — WCAG 2.x AA 위반 0건
PASS gaon-lms/dashboard 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS gaon-lms/students 왼쪽 인셋 — 최소 텍스트 시작 15px
PASS gaon-lms/attendance 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS gaon-lms/grades 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS gaon-lms/files 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS gaon-lms/calendar 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS gaon-lms/counsel 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS gaon-lms/report 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS gaon-lms/notice 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS dure-enrollment SEO/meta — title 15자·desc 71자·OG✓·alt 누락 0 · 장식(alt="") 0
PASS dure-enrollment/catalog 오버플로 — 320/375/390/768/1440
PASS dure-enrollment/catalog h1 보임 — 1줄(줄수 계약 없음)
PASS dure-enrollment/catalog 수축 없음
PASS dure-enrollment/catalog 리듬·트랙
PASS dure-enrollment/catalog 대비 AA
PASS dure-enrollment/starred 오버플로 — 320/375/390/768/1440
PASS dure-enrollment/starred h1 보임 — 1줄(줄수 계약 없음)
PASS dure-enrollment/starred 수축 없음
PASS dure-enrollment/starred 리듬·트랙
PASS dure-enrollment/starred 대비 AA
PASS dure-enrollment/enrollments 오버플로 — 320/375/390/768/1440
PASS dure-enrollment/enrollments h1 보임 — 1줄(줄수 계약 없음)
PASS dure-enrollment/enrollments 수축 없음
PASS dure-enrollment/enrollments 리듬·트랙
PASS dure-enrollment/enrollments 대비 AA
PASS dure-enrollment/credits 오버플로 — 320/375/390/768/1440
PASS dure-enrollment/credits h1 보임 — 1줄(줄수 계약 없음)
PASS dure-enrollment/credits 수축 없음
PASS dure-enrollment/credits 리듬·트랙
PASS dure-enrollment/credits 대비 AA
PASS dure-enrollment/archive 오버플로 — 320/375/390/768/1440
PASS dure-enrollment/archive h1 보임 — 1줄(줄수 계약 없음)
PASS dure-enrollment/archive 수축 없음
PASS dure-enrollment/archive 리듬·트랙
PASS dure-enrollment/archive 대비 AA
PASS dure-enrollment/notices 오버플로 — 320/375/390/768/1440
PASS dure-enrollment/notices h1 보임 — 1줄(줄수 계약 없음)
PASS dure-enrollment/notices 수축 없음
PASS dure-enrollment/notices 리듬·트랙
PASS dure-enrollment/notices 대비 AA
PASS dure-enrollment 스케일×폭 h1 — 줄수 정보 375@1x:1줄, 375@1.3x:1줄, 390@1x:1줄, 390@1.3x:1줄
PASS dure-enrollment 브랜드 줄바꿈 없음 — 텍스트 블록 1개, 각 1줄
PASS dure-enrollment/catalog 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS dure-enrollment/starred 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS dure-enrollment/enrollments 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS dure-enrollment/credits 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS dure-enrollment/archive 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS dure-enrollment/notices 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS dure-enrollment/catalog axe — WCAG 2.x AA 위반 0건
PASS dure-enrollment/starred axe — WCAG 2.x AA 위반 0건
PASS dure-enrollment/enrollments axe — WCAG 2.x AA 위반 0건
PASS dure-enrollment/credits axe — WCAG 2.x AA 위반 0건
PASS dure-enrollment/archive axe — WCAG 2.x AA 위반 0건
PASS dure-enrollment/notices axe — WCAG 2.x AA 위반 0건
PASS dure-enrollment/catalog 왼쪽 인셋 — 최소 텍스트 시작 24px
PASS dure-enrollment/starred 왼쪽 인셋 — 최소 텍스트 시작 24px
PASS dure-enrollment/enrollments 왼쪽 인셋 — 최소 텍스트 시작 24px
PASS dure-enrollment/credits 왼쪽 인셋 — 최소 텍스트 시작 24px
PASS dure-enrollment/archive 왼쪽 인셋 — 최소 텍스트 시작 24px
PASS dure-enrollment/notices 왼쪽 인셋 — 최소 텍스트 시작 24px
PASS twentyoz-corp SEO/meta — title 17자·desc 80자·OG✓·alt 누락 0 · 장식(alt="") 0
PASS twentyoz-corp/single 오버플로 — 320/375/390/768/1440
PASS twentyoz-corp/single h1 보임 — 1줄(줄수 계약 없음)
PASS twentyoz-corp/single 수축 없음
PASS twentyoz-corp/single 리듬·트랙
PASS twentyoz-corp/single 대비 AA
PASS twentyoz-corp 스케일×폭 h1 — 줄수 정보 375@1x:1줄, 375@1.3x:1줄, 390@1x:1줄, 390@1.3x:1줄
PASS twentyoz-corp 브랜드 줄바꿈 없음 — 텍스트 블록 1개, 각 1줄
PASS twentyoz-corp/single 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS twentyoz-corp/single axe — WCAG 2.x AA 위반 0건
PASS twentyoz-corp/single 왼쪽 인셋 — 최소 텍스트 시작 20px
PASS hannam-jari SEO/meta — title 19자·desc 75자·OG✓·alt 누락 0 · 장식(alt="") 0
PASS hannam-jari/single 오버플로 — 320/375/390/768/1440
PASS hannam-jari/single h1 최대 2줄 — 2줄
PASS hannam-jari/single 수축 없음
PASS hannam-jari/single 리듬·트랙
PASS hannam-jari/single 대비 AA
PASS hannam-jari 스케일×폭 h1 — 줄수 정보 375@1x:2줄, 375@1.3x:2줄, 390@1x:2줄, 390@1.3x:2줄
PASS hannam-jari 브랜드 줄바꿈 없음 — 텍스트 블록 1개, 각 1줄
PASS hannam-jari/single 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS hannam-jari/single axe — WCAG 2.x AA 위반 0건
PASS hannam-jari/single 왼쪽 인셋 — 최소 텍스트 시작 16px
PASS hannam-jari-admin SEO/meta — title 18자·desc 67자·OG✓·alt 누락 0 · 장식(alt="") 0
PASS hannam-jari-admin/single 오버플로 — 320/375/390/768/1440
PASS hannam-jari-admin/single h1 보임 — 1줄(줄수 계약 없음)
PASS hannam-jari-admin/single 수축 없음
PASS hannam-jari-admin/single 리듬·트랙
PASS hannam-jari-admin/single 대비 AA
PASS hannam-jari-admin 스케일×폭 h1 — 줄수 정보 375@1x:1줄, 375@1.3x:1줄, 390@1x:1줄, 390@1.3x:1줄
PASS hannam-jari-admin 브랜드 줄바꿈 없음 — 텍스트 블록 1개, 각 1줄
PASS hannam-jari-admin/single 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS hannam-jari-admin/single axe — WCAG 2.x AA 위반 0건
PASS hannam-jari-admin/single 왼쪽 인셋 — 최소 텍스트 시작 12px
PASS griddle-club SEO/meta — title 20자·desc 85자·OG✓·alt 누락 0 · 장식(alt="") 0
PASS griddle-club/single 오버플로 — 320/375/390/768/1440
PASS griddle-club/single h1 최대 2줄 — 2줄
PASS griddle-club/single 수축 없음
PASS griddle-club/single 리듬·트랙
PASS griddle-club/single 대비 AA
PASS griddle-club 스케일×폭 h1 — 줄수 정보 375@1x:2줄, 375@1.3x:2줄, 390@1x:2줄, 390@1.3x:2줄
PASS griddle-club 브랜드 줄바꿈 없음 — 텍스트 블록 1개, 각 1줄
PASS griddle-club/single 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS griddle-club/single axe — WCAG 2.x AA 위반 0건
PASS griddle-club/single 왼쪽 인셋 — 최소 텍스트 시작 18px
PASS griddle-club-franchise SEO/meta — title 25자·desc 95자·OG✓·alt 누락 0 · 장식(alt="") 0
PASS griddle-club-franchise/single 오버플로 — 320/375/390/768/1440
PASS griddle-club-franchise/single h1 최대 2줄 — 2줄
PASS griddle-club-franchise/single 수축 없음
PASS griddle-club-franchise/single 리듬·트랙
PASS griddle-club-franchise/single 대비 AA
PASS griddle-club-franchise 스케일×폭 h1 — 줄수 정보 375@1x:2줄, 375@1.3x:2줄, 390@1x:2줄, 390@1.3x:2줄
PASS griddle-club-franchise 브랜드 줄바꿈 없음 — 텍스트 블록 1개, 각 1줄
PASS griddle-club-franchise/single 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px
PASS griddle-club-franchise/single axe — WCAG 2.x AA 위반 0건
PASS griddle-club-franchise/single 왼쪽 인셋 — 최소 텍스트 시작 17px
PASS L3 시각 회귀 — SKIP — checks.visual=false PASS L3 시각 회귀 — SKIP — checks.visual=false
PASS L4 WebKit — SKIP — checks.webkit=false PASS L4 WebKit — SKIP — checks.webkit=false
``` ```

View file

@ -149,7 +149,7 @@
<div class="statline" id="en-stats"></div> <div class="statline" id="en-stats"></div>
<div class="sheet"> <div class="sheet">
<p class="en-sum mono">합계 <strong id="en-credits">0</strong>학점 / 18</p> <p class="en-sum mono">합계 <strong id="en-credits">0</strong>학점 / 18</p>
<div class="credit-gauge" role="img"> <div class="credit-gauge" id="en-gauge-wrap" role="img" aria-label="신청 학점 진행률, 최대 18학점 중 0%">
<i id="en-gauge" style="width: 0%"></i> <i id="en-gauge" style="width: 0%"></i>
</div> </div>
<p class="panel-note muted">정정 기간은 3/9–3/13입니다. 18학점 초과 신청은 학부 사무실 승인이 필요하고, 두 번 결석하면 탈강 처리됩니다 — 변경은 이 화면에서 할 수 있습니다.</p> <p class="panel-note muted">정정 기간은 3/9–3/13입니다. 18학점 초과 신청은 학부 사무실 승인이 필요하고, 두 번 결석하면 탈강 처리됩니다 — 변경은 이 화면에서 할 수 있습니다.</p>
@ -586,7 +586,9 @@
const renderEnrollments = () => { const renderEnrollments = () => {
{ {
const list = COURSES.filter((c) => enrolled.has(c.id)); const list = COURSES.filter((c) => enrolled.has(c.id));
$("en-gauge").style.width = Math.round((list.reduce((a, c) => a + c.credits, 0) / MAX_CREDITS) * 100) + "%"; const gaugePct = Math.round((list.reduce((a, c) => a + c.credits, 0) / MAX_CREDITS) * 100);
$("en-gauge").style.width = gaugePct + "%";
$("en-gauge-wrap").setAttribute("aria-label", `신청 학점 진행률, 최대 ${MAX_CREDITS}학점 중 ${gaugePct}%`);
const credits = list.reduce((a, c) => a + c.credits, 0); const credits = list.reduce((a, c) => a + c.credits, 0);
$("en-stats").innerHTML = $("en-stats").innerHTML =
`<div>신청 <strong>${list.length}과목</strong></div>` + `<div>신청 <strong>${list.length}과목</strong></div>` +
@ -655,7 +657,7 @@
`<td class="num mono">${r.done || "—"}</td><td class="num mono">${r.now ? "+ " + r.now : "—"}</td>` + `<td class="num mono">${r.done || "—"}</td><td class="num mono">${r.now ? "+ " + r.now : "—"}</td>` +
`<td class="num mono">${r.need ? total : total || "—"}</td>` + `<td class="num mono">${r.need ? total : total || "—"}</td>` +
`<td class="num mono">${r.need ? (left> 0 ? left : left === 0 ? "0" : "초과") : "—"}</td>` + `<td class="num mono">${r.need ? (left> 0 ? left : left === 0 ? "0" : "초과") : "—"}</td>` +
`<td><div class="cr-bar" role="img"><i style="width: ${pct}%"></i></div></td>`; `<td><div class="cr-bar" role="img" aria-label="이수 진행률 ${pct}%"><i style="width: ${pct}%"></i></div></td>`;
return tr; return tr;
}), }),
(() => { (() => {

View file

@ -643,7 +643,7 @@
</div> </div>
</header> </header>
<div class="headline headline-4" id="rep-stats"><!-- JS --></div> <dl class="headline headline-4" id="rep-stats"><!-- JS --></dl>
<div class="panel table-wrap"> <div class="panel table-wrap">
<table id="report-table"> <table id="report-table">