Skip to content

Commit e493fbf

Browse files
committed
fix: restore markdown viewer file input
1 parent c4e01e1 commit e493fbf

3 files changed

Lines changed: 43 additions & 10 deletions

File tree

‎src/domains/blog/styles/blog.css‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@
234234
word-break: break-word;
235235
}
236236

237-
.markdown-viewer__header { margin-bottom: 2rem; }
237+
.markdown-viewer__header { margin-bottom: 2rem; text-align: center; }
238+
.markdown-viewer__header h1 { margin-bottom: 0; }
238239
.markdown-viewer[data-toc-empty] > .article {
239240
width: min(var(--content-width), calc(100% - 2rem));
240241
margin-inline: auto;
@@ -256,6 +257,16 @@
256257
color: var(--color-text-muted);
257258
text-align: center;
258259
}
260+
.markdown-viewer__file-input {
261+
position: absolute;
262+
width: 1px;
263+
height: 1px;
264+
overflow: hidden;
265+
clip: rect(0 0 0 0);
266+
clip-path: inset(50%);
267+
white-space: nowrap;
268+
}
269+
.markdown-viewer__help { max-width: 34rem; margin: 0 0 .4rem; color: var(--color-text); line-height: 1.7; text-align: center; }
259270
.markdown-viewer[data-dragging] .markdown-viewer__dropzone,
260271
.markdown-viewer__dropzone:hover,
261272
.markdown-viewer__dropzone:focus-within {

‎src/pages/blog/tools/markdown-viewer/index.astro‎

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { readFileSync } from 'node:fs';
2+
import { describe, expect, it } from 'vitest';
3+
4+
const source = readFileSync('src/pages/blog/tools/markdown-viewer/index.astro', 'utf8');
5+
6+
describe('Markdown Viewer input surface', () => {
7+
it('keeps the file input available to browser picker APIs', () => {
8+
expect(source).toContain('class="markdown-viewer__file-input"');
9+
expect(source).toContain("input.showPicker()");
10+
expect(source).toContain("else input.click()");
11+
});
12+
13+
it('uses the dropzone as the drag target and keeps the heading clean', () => {
14+
expect(source).toContain('data-dropzone aria-label="Markdown 파일 놓기"');
15+
expect(source).not.toContain('<p class="eyebrow">Tools</p>');
16+
expect(source).toContain('<h1>Markdown Viewer</h1>');
17+
});
18+
});

0 commit comments

Comments
 (0)