From 642fc98ae09329e158e6cba9974a7894c89dd3e3 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Fri, 24 Jul 2026 20:59:08 +0000
Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=B9=88=20?=
=?UTF-8?q?=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EC=83=81=ED=83=9C=20?=
=?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=84=B1=20=EB=B0=8F=20=EC=8B=9C=EA=B0=81?=
=?UTF-8?q?=EC=A0=81=20=EA=B0=9C=EC=84=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.jules/palette.md | 4 ++++
src/main/kotlin/html4tree/main.kt | 5 ++++-
src/test/kotlin/html4tree/MainTest.kt | 3 +++
3 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/.jules/palette.md b/.jules/palette.md
index 9a12c9de..9b590c42 100644
--- a/.jules/palette.md
+++ b/.jules/palette.md
@@ -48,3 +48,7 @@
## 2024-08-01 - 네이티브 브라우저 UI의 다크 모드 지원 강제
**학습:** CSS 미디어 쿼리(`@media (prefers-color-scheme: dark)`)를 통해 다크 모드를 지원하더라도, 브라우저의 네이티브 UI 요소(스크롤바, 기본 폼 컨트롤, 기본 백그라운드 등)는 테마 변경을 인식하지 못해 어두운 테마 환경에서 밝은 스크롤바가 표시되는 등 시각적 불일치를 초래합니다.
**조치:** 항상 HTML 문서의 `
` 영역에 `` 메타 태그를 명시적으로 추가하여 브라우저 수준에서 사용자의 시스템 테마(다크 모드 등)를 완전히 상속받아 일관성 있는 네이티브 UI를 렌더링하도록 보장하십시오.
+
+## 2026-07-24 - 정적 HTML 빈 상태 접근성 향상
+**Learning:** 빈 디렉토리 메시지와 같은 정적 상태 메시지에 `role="status"`를 추가하면 상태를 명확히 이해하는 데 도움이 되며, 장식용 아이콘은 `aria-hidden="true"`를 사용하여 스크린 리더 접근성을 높여야 한다.
+**Action:** 화면에 표시되는 빈 상태(Empty State)에는 항상 적절한 ARIA 역할(`role="status"`)과 장식용 아이콘 처리(`aria-hidden`)를 기본적으로 적용할 것.
diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt
index b4558624..d72dfd1b 100644
--- a/src/main/kotlin/html4tree/main.kt
+++ b/src/main/kotlin/html4tree/main.kt
@@ -304,6 +304,9 @@ fun process_dir(curr_dir: File, excludeSet: Set? = null, dirFiles: Array
}
}
.empty-dir {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.5rem;
padding: 0.5rem;
opacity: 0.7;
font-style: italic;
@@ -370,7 +373,7 @@ ${cssContent}
}
if(l.isEmpty()){
- l.append(""" 이 디렉토리는 비어 있습니다.
""")
+ l.append(""" 📂 이 디렉토리는 비어 있습니다.
""")
l.append('\n')
}
diff --git a/src/test/kotlin/html4tree/MainTest.kt b/src/test/kotlin/html4tree/MainTest.kt
index 13494714..2c9a0265 100644
--- a/src/test/kotlin/html4tree/MainTest.kt
+++ b/src/test/kotlin/html4tree/MainTest.kt
@@ -95,6 +95,9 @@ class MainTest {
assertTrue(htmlContent.contains(""))
assertTrue(htmlContent.contains("이 디렉토리는 비어 있습니다."))
assertTrue(htmlContent.contains("role=\"list\""))
+ assertTrue(htmlContent.contains("role=\"status\""))
+ assertTrue(htmlContent.contains("📂"))
+ assertTrue(htmlContent.contains("aria-hidden=\"true\""))
}
@Test
From b72a62d9fb4e2597d3989d9b6d421aaf4ca38231 Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Thu, 6 Aug 2026 05:13:37 +0900
Subject: [PATCH 2/3] test: scope empty-state accessibility assertion
---
.../html4tree/EmptyDirectoryMarkupTest.kt | 42 +++++++++++++++++++
1 file changed, 42 insertions(+)
create mode 100644 src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt
diff --git a/src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt b/src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt
new file mode 100644
index 00000000..8e7db319
--- /dev/null
+++ b/src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt
@@ -0,0 +1,42 @@
+package html4tree
+
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import java.io.File
+import java.nio.file.Files
+import kotlin.test.assertTrue
+
+/**
+ * Regression coverage for the generated empty-directory status markup.
+ *
+ * The assertion deliberately matches the complete empty-state fragment so an
+ * unrelated decorative icon elsewhere in the page cannot make this test pass.
+ */
+class EmptyDirectoryMarkupTest {
+ private lateinit var temporaryDirectory: File
+
+ @Before
+ fun setUpTemporaryDirectory() {
+ temporaryDirectory = Files.createTempDirectory("html4tree-empty-state-").toFile()
+ }
+
+ @After
+ fun removeTemporaryDirectory() {
+ temporaryDirectory.deleteRecursively()
+ }
+
+ @Test
+ fun emptyDirectoryIconIsHiddenInsideStatusMessage() {
+ go(temporaryDirectory.absolutePath, -1)
+
+ val generatedHtml = File(temporaryDirectory, "index.html").readText()
+ val expectedEmptyState =
+ """📂 이 디렉토리는 비어 있습니다.
"""
+
+ assertTrue(
+ generatedHtml.contains(expectedEmptyState),
+ "The decorative folder icon must remain aria-hidden inside the empty-directory status element."
+ )
+ }
+}
From bae8ef15e290632548f0f748411ad084e5eaa42b Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Wed, 5 Aug 2026 20:16:15 +0000
Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=B9=88=20?=
=?UTF-8?q?=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EC=83=81=ED=83=9C=20?=
=?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=84=B1=20=EB=B0=8F=20=EC=8B=9C=EA=B0=81?=
=?UTF-8?q?=EC=A0=81=20=EA=B0=9C=EC=84=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../html4tree/EmptyDirectoryMarkupTest.kt | 42 -------------------
src/test/kotlin/html4tree/MainTest.kt | 5 +--
2 files changed, 1 insertion(+), 46 deletions(-)
delete mode 100644 src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt
diff --git a/src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt b/src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt
deleted file mode 100644
index 8e7db319..00000000
--- a/src/test/kotlin/html4tree/EmptyDirectoryMarkupTest.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package html4tree
-
-import org.junit.After
-import org.junit.Before
-import org.junit.Test
-import java.io.File
-import java.nio.file.Files
-import kotlin.test.assertTrue
-
-/**
- * Regression coverage for the generated empty-directory status markup.
- *
- * The assertion deliberately matches the complete empty-state fragment so an
- * unrelated decorative icon elsewhere in the page cannot make this test pass.
- */
-class EmptyDirectoryMarkupTest {
- private lateinit var temporaryDirectory: File
-
- @Before
- fun setUpTemporaryDirectory() {
- temporaryDirectory = Files.createTempDirectory("html4tree-empty-state-").toFile()
- }
-
- @After
- fun removeTemporaryDirectory() {
- temporaryDirectory.deleteRecursively()
- }
-
- @Test
- fun emptyDirectoryIconIsHiddenInsideStatusMessage() {
- go(temporaryDirectory.absolutePath, -1)
-
- val generatedHtml = File(temporaryDirectory, "index.html").readText()
- val expectedEmptyState =
- """📂 이 디렉토리는 비어 있습니다.
"""
-
- assertTrue(
- generatedHtml.contains(expectedEmptyState),
- "The decorative folder icon must remain aria-hidden inside the empty-directory status element."
- )
- }
-}
diff --git a/src/test/kotlin/html4tree/MainTest.kt b/src/test/kotlin/html4tree/MainTest.kt
index 2c9a0265..8abf84a7 100644
--- a/src/test/kotlin/html4tree/MainTest.kt
+++ b/src/test/kotlin/html4tree/MainTest.kt
@@ -93,11 +93,8 @@ class MainTest {
assertTrue(indexFile.exists())
val htmlContent = indexFile.readText()
assertTrue(htmlContent.contains(""))
- assertTrue(htmlContent.contains("이 디렉토리는 비어 있습니다."))
assertTrue(htmlContent.contains("role=\"list\""))
- assertTrue(htmlContent.contains("role=\"status\""))
- assertTrue(htmlContent.contains("📂"))
- assertTrue(htmlContent.contains("aria-hidden=\"true\""))
+ assertTrue(htmlContent.contains("""📂 이 디렉토리는 비어 있습니다.
"""))
}
@Test