@@ -15,12 +15,11 @@ import CodeShellEnhancer from '../../../../domains/blog/components/CodeShellEnha
1515 </div >
1616 <article class =" article" >
1717 <header class =" article__header markdown-viewer__header" >
18- <p class =" eyebrow" >Tools</p >
1918 <h1 >Markdown Viewer</h1 >
20- <p class =" article__description" >Markdown 파일을 이곳에 끌어다 놓으면 블로그 스타일로 펼쳐집니다.</p >
2119 </header >
22- <input type =" file" accept =" .md,.markdown,text/markdown" data-file-input hidden />
23- <section class =" markdown-viewer__dropzone" data-dropzone aria-label =" Markdown 파일 놓기" >
20+ <input id =" markdown-file-input" class =" markdown-viewer__file-input" type =" file" accept =" .md,.markdown,text/markdown" data-file-input />
21+ <section class =" markdown-viewer__dropzone" data-dropzone aria-label =" Markdown 파일 놓기" aria-describedby =" markdown-viewer-help" >
22+ <p id =" markdown-viewer-help" class =" markdown-viewer__help" >Markdown 파일을 이곳에 끌어다 놓으면 블로그 스타일로 펼쳐집니다.</p >
2423 <p >Markdown 파일을 끌어다 놓으세요</p >
2524 <span >또는</span >
2625 <button type =" button" class =" markdown-viewer__choose" data-choose-file >파일 선택</button >
@@ -224,12 +223,17 @@ import CodeShellEnhancer from '../../../../domains/blog/components/CodeShellEnha
224223 }
225224 };
226225
226+ const openFilePicker = () => {
227+ if (!input) return;
228+ if ('showPicker' in input && typeof input.showPicker === 'function') input.showPicker();
229+ else input.click();
230+ };
227231 input?.addEventListener('change', () => {
228232 void renderFile(input.files?.[0]);
229233 input.value = '';
230234 });
231235 viewer?.querySelectorAll<HTMLButtonElement>('[data-choose-file]').forEach(button => {
232- button.addEventListener('click', () => input?.click() );
236+ button.addEventListener('click', openFilePicker );
233237 });
234238 let dragDepth = 0;
235239 const resetViewer = (navigate = true) => {
@@ -268,19 +272,19 @@ import CodeShellEnhancer from '../../../../domains/blog/components/CodeShellEnha
268272 tocTopToggle?.setAttribute('aria-expanded', 'false');
269273 }
270274 });
271- viewer ?.addEventListener('dragenter', (event) => {
275+ dropzone ?.addEventListener('dragenter', (event) => {
272276 if (!event.dataTransfer?.types.includes('Files')) return;
273277 event.preventDefault();
274278 dragDepth++;
275279 viewer.dataset.dragging = 'true';
276280 });
277- viewer ?.addEventListener('dragover', (event) => {
281+ dropzone ?.addEventListener('dragover', (event) => {
278282 if (event.dataTransfer?.types.includes('Files')) event.preventDefault();
279283 });
280- viewer ?.addEventListener('dragleave', () => {
284+ dropzone ?.addEventListener('dragleave', () => {
281285 if (--dragDepth <= 0) { dragDepth = 0; delete viewer.dataset.dragging; }
282286 });
283- viewer ?.addEventListener('drop', (event) => {
287+ dropzone ?.addEventListener('drop', (event) => {
284288 if (!event.dataTransfer?.types.includes('Files')) return;
285289 event.preventDefault();
286290 dragDepth = 0;
0 commit comments