Skip to content
Open
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
27 changes: 16 additions & 11 deletions .jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,25 +26,30 @@
**ํ•™์Šต:** ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ธ๋ผ์ธ ์ƒ‰์ƒ(์˜ˆ: `color: #666`)์€ CSS ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์šฐํšŒํ•˜๋ฉฐ `!important` ์—†์ด๋Š” ์‰ฝ๊ฒŒ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹คํฌ ๋ชจ๋“œ์—์„œ ์ ์‘ํ•˜์ง€ ๋ชปํ•˜๊ณ , ์–ด๋‘์šด ๋ฐฐ๊ฒฝ์—์„œ ํ…์ŠคํŠธ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.
**์กฐ์น˜:** ์–ด๋‘์šด ํ…์ŠคํŠธ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ 16์ง„์ˆ˜ ๊ฐ’ ๋Œ€์‹  `opacity: 0.7`์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ๋™์ ์œผ๋กœ ์ƒ์†๋ฐ›๊ณ  ๋ชจ๋“  ์ƒ‰์ƒ ๊ตฌ์„ฑํ‘œ์—์„œ ๊ฐ€๋…์„ฑ์„ ๋ณด์žฅํ•˜์‹ญ์‹œ์˜ค.

## 2024-07-12 - Prevent icon misalignment on long file names
**Learning:** Very long file names in a fluid layout without explicit flexbox wrapping can cause text to wrap below preceding inline icons, breaking the visual hierarchy and alignment.
**Action:** Always wrap file/directory listings in a flex container with `align-items: flex-start` and isolate icons with `flex-shrink: 0` alongside text content wrapped in a `<span style="overflow-wrap: anywhere;">` (or a global `overflow-wrap` on the container) to ensure text wraps cleanly next to fixed-width icons on mobile devices.
## 2024-07-12 - ๊ธด ํŒŒ์ผ ์ด๋ฆ„์—์„œ์˜ ์•„์ด์ฝ˜ ์˜ค์ •๋ ฌ ๋ฐฉ์ง€
**ํ•™์Šต:** ์œ ๋™์  ๋ ˆ์ด์•„์›ƒ์—์„œ ๋ช…์‹œ์ ์ธ flexbox ๋ž˜ํ•‘ ์—†์ด ๋งค์šฐ ๊ธด ํŒŒ์ผ ์ด๋ฆ„์€ ์•ž์„  ์ธ๋ผ์ธ ์•„์ด์ฝ˜ ์•„๋ž˜๋กœ ํ…์ŠคํŠธ๊ฐ€ ์ค„๋ฐ”๊ฟˆ๋˜์–ด ์‹œ๊ฐ์  ๊ณ„์ธต ๋ฐ ์ •๋ ฌ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**์กฐ์น˜:** ๋ชจ๋ฐ”์ผ ์žฅ์น˜์—์„œ ํ…์ŠคํŠธ๊ฐ€ ๊ณ ์ • ๋„ˆ๋น„ ์•„์ด์ฝ˜ ์˜†์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ค„๋ฐ”๊ฟˆ๋˜๋„๋ก ํ•ญ์ƒ ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก์„ `align-items: flex-start`๊ฐ€ ์žˆ๋Š” flex ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ์‹ธ๊ณ  `<span style="overflow-wrap: anywhere;">`(๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ „์—ญ `overflow-wrap`)์— ๊ฐ์‹ธ์ง„ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ์˜†์— `flex-shrink: 0`์œผ๋กœ ์•„์ด์ฝ˜์„ ๋ถ„๋ฆฌํ•˜์‹ญ์‹œ์˜ค.

## 2024-08-01 - ํŒŒ์ผ ์•„์ด์ฝ˜ ๋ฉ”ํƒ€ํฌ
**ํ•™์Šต:** ์ผ๋ฐ˜ ํŒŒ์ผ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ๋ฐฉํ–ฅ ์ง€์‹œ ์•„์ด์ฝ˜(์šฐ์ธก ์‚ผ๊ฐํ˜• ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋”๋‚˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์–ด ์‹œ๊ฐ์ ์ธ ๋ชจํ˜ธํ•จ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋‚˜ ํŽ˜์ด์ง€ ํ˜•ํƒœ์˜ ์•„์ด์ฝ˜์ด ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
**์กฐ์น˜:** ์ผ๋ฐ˜ ํŒŒ์ผ ์˜†์— ํ‘œ์‹œ๋˜๋Š” ์žฅ์‹์šฉ ์•„์ด์ฝ˜์„ ์šฐ์ธก ์‚ผ๊ฐํ˜• ๋“ฑ์—์„œ ํŽ˜์ด์ง€ ์•„์ด์ฝ˜(์˜ˆ: `&#128196;`)์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ์‹œ๊ฐ์  ๋ฉ”ํƒ€ํฌ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

## 2024-05-24 - [a ํƒœ๊ทธ์— ๋ถ€๋“œ๋Ÿฌ์šด ํŠธ๋žœ์ง€์…˜ ์ถ”๊ฐ€ ๋ฐ ์‚ฌ์šฉ์ž์˜ ๋ชจ์…˜ ์„ค์ • ์กด์ค‘]
**Learning:** CSS ํŠธ๋žœ์ง€์…˜(`transition: all`)์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜๋„์น˜ ์•Š์€ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์ „์ • ์šด๋™ ์žฅ์• ๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**Action:** CSS ํŠธ๋žœ์ง€์…˜์„ ์ถ”๊ฐ€ํ•  ๋•Œ `transition: all` ๋Œ€์‹  ์†์„ฑ(`background-color`, `outline-color` ๋“ฑ)์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ํ•ญ์ƒ `@media (prefers-reduced-motion: reduce)` ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ `transition: none`์œผ๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.
## 2024-05-24 - a ํƒœ๊ทธ์— ๋ถ€๋“œ๋Ÿฌ์šด ํŠธ๋žœ์ง€์…˜ ์ถ”๊ฐ€ ๋ฐ ์‚ฌ์šฉ์ž์˜ ๋ชจ์…˜ ์„ค์ • ์กด์ค‘
**ํ•™์Šต:** CSS ํŠธ๋žœ์ง€์…˜(`transition: all`)์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜๋„์น˜ ์•Š์€ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์ „์ • ์šด๋™ ์žฅ์• ๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**์กฐ์น˜:** CSS ํŠธ๋žœ์ง€์…˜์„ ์ถ”๊ฐ€ํ•  ๋•Œ `transition: all` ๋Œ€์‹  ์†์„ฑ(`background-color`, `outline-color` ๋“ฑ)์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ํ•ญ์ƒ `@media (prefers-reduced-motion: reduce)` ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ `transition: none`์œผ๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

## 2024-07-10 - ๋‹คํฌ ๋ชจ๋“œ ์ง€์› ๋ฐ ์ง€์—ญํ™” ์ผ๊ด€์„ฑ ํ™•๋ณด
**Learning:** `html4tree` CLI๋กœ ์ƒ์„ฑ๋˜๋Š” ์ •์  HTML์—์„œ ์‚ฌ์šฉ์ž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋ฉฐ(์ ‘๊ทผ์„ฑ, ๊ฐ€๋…์„ฑ ๋ฌธ์ œ), `<nav>` ๋ ˆ์ด๋ธ”("Directory listing")์ด ๋‹ค๋ฅธ UI์™€ ๋‹ค๋ฅด๊ฒŒ ์˜๋ฌธ์œผ๋กœ ๋˜์–ด ์žˆ์–ด ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ํ™˜๊ฒฝ ๋“ฑ์—์„œ ์ง€์—ญํ™”(Localization) ์ผ๊ด€์„ฑ์„ ํ•ด์นฉ๋‹ˆ๋‹ค.
**Action:** `prefers-color-scheme: dark` ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ CSS์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๊ณ , `<nav aria-label="Directory listing">`์„ `<nav aria-label="๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก">`์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ UI๋ฅผ ํ•œ๊ตญ์–ด๋กœ ํ†ต์ผํ–ˆ์Šต๋‹ˆ๋‹ค.
## 2026-07-13 - Add title attributes for parity with aria-labels
**Learning:** Relying solely on icons or technical symbols (like `..`) without native tooltips can confuse sighted users who don't use screen readers. `title` attributes matching `aria-label` provide parity.
**Action:** Add `title` attributes to icon-only links to ensure visual tooltips match screen reader text.
**ํ•™์Šต:** `html4tree` CLI๋กœ ์ƒ์„ฑ๋˜๋Š” ์ •์  HTML์—์„œ ์‚ฌ์šฉ์ž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋ฉฐ(์ ‘๊ทผ์„ฑ, ๊ฐ€๋…์„ฑ ๋ฌธ์ œ), `<nav>` ๋ ˆ์ด๋ธ”("Directory listing")์ด ๋‹ค๋ฅธ UI์™€ ๋‹ค๋ฅด๊ฒŒ ์˜๋ฌธ์œผ๋กœ ๋˜์–ด ์žˆ์–ด ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ํ™˜๊ฒฝ ๋“ฑ์—์„œ ์ง€์—ญํ™”(Localization) ์ผ๊ด€์„ฑ์„ ํ•ด์นฉ๋‹ˆ๋‹ค.
**์กฐ์น˜:** `prefers-color-scheme: dark` ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ CSS์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๊ณ , `<nav aria-label="Directory listing">`์„ `<nav aria-label="๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก">`์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ UI๋ฅผ ํ•œ๊ตญ์–ด๋กœ ํ†ต์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

## 2026-07-13 - aria-labels์™€ ๋™์ผ์„ฑ์„ ์œ„ํ•œ title ์†์„ฑ ์ถ”๊ฐ€
**ํ•™์Šต:** ๋„ค์ดํ‹ฐ๋ธŒ ํˆดํŒ ์—†์ด ์•„์ด์ฝ˜์ด๋‚˜ ๊ธฐ์ˆ ์ ์ธ ๊ธฐํ˜ธ(์˜ˆ: `..`)์—๋งŒ ์˜์กดํ•˜๋ฉด ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‹œ๋ ฅ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `aria-label`๊ณผ ์ผ์น˜ํ•˜๋Š” `title` ์†์„ฑ์€ ๋™์ผ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
**์กฐ์น˜:** ์•„์ด์ฝ˜ ์ „์šฉ ๋งํฌ์— `title` ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ๊ฐ์  ํˆดํŒ์ด ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ํ…์ŠคํŠธ์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ณด์žฅํ•˜์‹ญ์‹œ์˜ค.

## 2024-08-01 - ๋„ค์ดํ‹ฐ๋ธŒ ๋ธŒ๋ผ์šฐ์ € UI์˜ ๋‹คํฌ ๋ชจ๋“œ ์ง€์› ๊ฐ•์ œ
**ํ•™์Šต:** CSS ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ(`@media (prefers-color-scheme: dark)`)๋ฅผ ํ†ตํ•ด ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๋”๋ผ๋„, ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ UI ์š”์†Œ(์Šคํฌ๋กค๋ฐ”, ๊ธฐ๋ณธ ํผ ์ปจํŠธ๋กค, ๊ธฐ๋ณธ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋“ฑ)๋Š” ํ…Œ๋งˆ ๋ณ€๊ฒฝ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด ์–ด๋‘์šด ํ…Œ๋งˆ ํ™˜๊ฒฝ์—์„œ ๋ฐ์€ ์Šคํฌ๋กค๋ฐ”๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋“ฑ ์‹œ๊ฐ์  ๋ถˆ์ผ์น˜๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.
**์กฐ์น˜:** ํ•ญ์ƒ HTML ๋ฌธ์„œ์˜ `<head>` ์˜์—ญ์— `<meta name="color-scheme" content="light dark">` ๋ฉ”ํƒ€ ํƒœ๊ทธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉ์ž์˜ ์‹œ์Šคํ…œ ํ…Œ๋งˆ(๋‹คํฌ ๋ชจ๋“œ ๋“ฑ)๋ฅผ ์™„์ „ํžˆ ์ƒ์†๋ฐ›์•„ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ UI๋ฅผ ๋ Œ๋”๋งํ•˜๋„๋ก ๋ณด์žฅํ•˜์‹ญ์‹œ์˜ค.

## 2024-05-24 - ๋นˆ ๋””๋ ‰ํ† ๋ฆฌ UI ์‹œ๊ฐ์  ์ผ๊ด€์„ฑ ๊ฐ•ํ™”
**ํ•™์Šต:** ๋นˆ ๋””๋ ‰ํ† ๋ฆฌ ์ƒํƒœ์™€ ๊ฐ™์ด ์ฝ˜ํ…์ธ ๊ฐ€ ์—†๋Š” "๋นˆ ์ƒํƒœ(empty state)"์—์„œ๋„ ์ฃผ๋ณ€ ์š”์†Œ(๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก, ํŒŒ์ผ ๋ชฉ๋ก ๋“ฑ)์™€ ๋ ˆ์ด์•„์›ƒ(flexbox, ๊ฐ„๊ฒฉ ๋“ฑ) ๋ฐ ์‹œ๊ฐ์  ์š”์†Œ(์•„์ด์ฝ˜ ๋“ฑ)์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์˜ค๋ฅ˜ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ ์˜๋„๋œ ๋นˆ ์ƒํƒœ์ž„์„ ๋” ์‰ฝ๊ฒŒ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**์กฐ์น˜:** ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ฃผ๋ณ€ ์š”์†Œ์˜ ๋””์ž์ธ ํŒจํ„ด(์•„์ด์ฝ˜ ๋ฐฐ์น˜, CSS ๋ ˆ์ด์•„์›ƒ ๋“ฑ)์„ ๋ฐ˜์˜ํ•˜์—ฌ ์ผ๊ด€๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ๊ฒƒ.
5 changes: 4 additions & 1 deletion src/main/kotlin/html4tree/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,9 @@ fun process_dir(curr_dir: File, excludeSet: Set<String>? = null, dirFiles: Array
}
}
.empty-dir {
display: flex;
align-items: flex-start;
gap: 0.5rem;
padding: 0.5rem;
opacity: 0.7;
font-style: italic;
Expand Down Expand Up @@ -370,7 +373,7 @@ ${cssContent} </style>
}

if(l.isEmpty()){
l.append(""" <li><div class="empty-dir">์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.</div></li>""")
l.append(""" <li><div class="empty-dir"><span class="icon" aria-hidden="true">&#128194;</span> <span>์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.</span></div></li>""")
l.append('\n')
}

Expand Down
1 change: 1 addition & 0 deletions src/test/kotlin/html4tree/MainTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ class MainTest {
val htmlContent = indexFile.readText()
assertTrue(htmlContent.contains("<html lang=\"ko\">"))
assertTrue(htmlContent.contains("์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค."))
assertTrue(htmlContent.contains("&#128194;"))
assertTrue(htmlContent.contains("role=\"list\""))
}

Expand Down
Loading