Skip to content

Commit 0fc853e

Browse files
authored
Merge pull request #175 from krsy0411/fix/ui/css
[fix/ui/css] breacrumb, content내 code 섹션, nav/aside 스타일링 수정
2 parents 3bc4c6b + 2f74c28 commit 0fc853e

5 files changed

Lines changed: 307 additions & 91 deletions

File tree

index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,21 @@
2424
<nav
2525
id="sidebar"
2626
style="scroll-behavior: smooth"
27-
class="dark:bg-gray-dark-100 fixed top-0 z-40 hidden h-full w-full flex-none overflow-x-hidden overflow-y-auto bg-[#f9f9fa] md:sticky md:top-12 md:z-auto md:block md:h-[calc(100vh-64px)] md:w-[320px]"
27+
class="dark:bg-gray-dark-100 fixed top-0 z-40 hidden h-full w-full flex-none overflow-x-hidden overflow-y-auto bg-[#f9f9fa] md:sticky md:top-16 md:z-auto md:block md:h-[calc(100vh-64px)] md:w-[320px]"
2828
>
2929
<nav-component></nav-component>
3030
</nav>
3131

3232
<!-- content: (마크다운 파일) 표시 공간 : 중간 부분 -->
3333
<div
3434
id="content"
35-
class="dark:bg-background-dark w-full min-w-0 bg-white p-10"
35+
class="markdown-content dark:bg-background-dark w-full min-w-0 bg-white p-10"
3636
></div>
3737

3838
<!-- aside: 오른쪽 부분 사이드 -->
3939
<aside
4040
id="aside-toc"
41-
class="sticky top-12 h-full overflow-y-auto px-2 py-5 hidden lg:block min-w-60"
41+
class="sticky top-16 h-full overflow-y-auto px-2 py-5 hidden lg:block min-w-60"
4242
>
4343
<div id="toc" class="text-[14px] text-black font-bold w-full"></div>
4444
</aside>

src/scripts/breadcrumb.ts

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -107,29 +107,60 @@ async function generateBreadcrumbItems(): Promise<BreadcrumbItem[]> {
107107
return breadcrumbItems;
108108
}
109109

110+
/**
111+
* XSS 방지를 위한 HTML escape
112+
*/
113+
function escapeHtml(text: string): string {
114+
const div = document.createElement('div');
115+
div.textContent = text;
116+
return div.innerHTML;
117+
}
118+
119+
/**
120+
* href 속성값을 안전하게 escape
121+
* 따옴표, 꺾쇠괄호 등을 HTML 엔티티로 변환
122+
*/
123+
function escapeHtmlAttribute(value: string): string {
124+
return value
125+
.replace(/&/g, '&amp;')
126+
.replace(/"/g, '&quot;')
127+
.replace(/'/g, '&#39;')
128+
.replace(/</g, '&lt;')
129+
.replace(/>/g, '&gt;');
130+
}
131+
132+
/**
133+
* Breadcrumb 아이템을 HTML 문자열로 변환
134+
*/
135+
function renderBreadcrumbItem(item: BreadcrumbItem, isLast: boolean): string {
136+
const escapedName = escapeHtml(item.name);
137+
const escapedPath = escapeHtmlAttribute(item.path);
138+
139+
if (isLast) {
140+
return `<span class="truncate text-gray-400 dark:text-gray-300">${escapedName}</span>`;
141+
}
142+
143+
if (item.linkable) {
144+
return `<a href="${escapedPath}" class="truncate text-blue-500 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors">${escapedName}</a> / `;
145+
}
146+
147+
// linkable=false인 항목은 회색으로 표시 (클릭 불가 시각 표시)
148+
return `<span class="truncate text-gray-500 dark:text-gray-400">${escapedName}</span> / `;
149+
}
150+
110151
/**
111152
* Breadcrumb HTML 요소를 생성합니다.
112153
*/
113154
function createBreadcrumbElement(items: BreadcrumbItem[]): HTMLElement {
114155
const breadcrumbNav = document.createElement('nav');
115156
breadcrumbNav.id = 'breadcrumbs';
116-
breadcrumbNav.className =
117-
'pb-3 flex min-w-0 items-center gap-2 text-gray-400 dark:text-gray-300';
157+
// nav 요소에서 색상 클래스 제거 (자식 요소에서 색상 관리)
158+
breadcrumbNav.className = 'pb-3 flex min-w-0 items-center gap-2';
118159

119160
const breadcrumbHTML = items
120-
.map((item, index) => {
121-
const isLast = index === items.length - 1;
122-
123-
if (isLast) {
124-
return `<span class="truncate">${item.name}</span>`;
125-
}
126-
127-
if (!item.linkable) {
128-
return `<span class="truncate text-blue-500">${item.name}</span> / `;
129-
} else {
130-
return `<a href="${item.path}" class="link truncate">${item.name}</a> / `;
131-
}
132-
})
161+
.map((item, index) =>
162+
renderBreadcrumbItem(item, index === items.length - 1)
163+
)
133164
.join('');
134165

135166
breadcrumbNav.innerHTML = breadcrumbHTML;

0 commit comments

Comments
 (0)