Skip to content

Commit

Permalink
perf(a11y): change copy code span to button (#1056)
Browse files Browse the repository at this point in the history
Co-authored-by: Divyansh Singh <[email protected]>
  • Loading branch information
azat-io and brc-dd authored Jul 29, 2022
1 parent 867f305 commit fb9cee9
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 14 deletions.
8 changes: 5 additions & 3 deletions src/client/theme-default/composables/copy-code.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export function useCopyCode() {
nextTick(() => {
document
.querySelectorAll<HTMLSpanElement>(
'.vp-doc div[class*="language-"] > span.copy'
'.vp-doc div[class*="language-"] > button.copy'
)
.forEach(handleElement)
})
Expand Down Expand Up @@ -67,7 +67,8 @@ async function copyToClipboard(text: string) {
function handleElement(el: HTMLElement) {
el.onclick = () => {
const parent = el.parentElement
const sibling = el.nextElementSibling as HTMLPreElement | null
const sibling = el.nextElementSibling
?.nextElementSibling as HTMLPreElement | null
if (!parent || !sibling) {
return
}
Expand All @@ -86,7 +87,8 @@ function handleElement(el: HTMLElement) {
el.classList.add('copied')
setTimeout(() => {
el.classList.remove('copied')
}, 3000)
el.blur()
}, 2000)
})
}
}
20 changes: 11 additions & 9 deletions src/client/theme-default/styles/components/vp-doc.css
Original file line number Diff line number Diff line change
Expand Up @@ -363,11 +363,11 @@
transition: border-color 0.5s, color 0.5s;
}

.vp-doc [class*='language-'] > span.copy {
.vp-doc [class*='language-'] > button.copy {
position: absolute;
top: 8px;
right: 8px;
z-index: 2;
z-index: 3;
display: block;
justify-content: center;
align-items: center;
Expand All @@ -384,23 +384,24 @@
transition: opacity 0.4s;
}

.vp-doc [class*='language-']:hover > span.copy {
.vp-doc [class*='language-']:hover > button.copy,
.vp-doc [class*='language-'] > button.copy:focus {
opacity: 1;
}

.vp-doc [class*='language-'] > span.copy:hover {
.vp-doc [class*='language-'] > button.copy:hover {
background-color: var(--vp-code-copy-code-hover-bg);
}

.vp-doc [class*='language-'] > span.copy.copied,
.vp-doc [class*='language-'] > span.copy:hover.copied {
.vp-doc [class*='language-'] > button.copy.copied,
.vp-doc [class*='language-'] > button.copy:hover.copied {
border-radius: 0 4px 4px 0;
background-color: var(--vp-code-copy-code-hover-bg);
background-image: var(--vp-icon-copied);
}

.vp-doc [class*='language-'] > span.copy.copied::before,
.vp-doc [class*='language-'] > span.copy:hover.copied::before {
.vp-doc [class*='language-'] > button.copy.copied::before,
.vp-doc [class*='language-'] > button.copy:hover.copied::before {
position: relative;
left: -65px;
display: block;
Expand Down Expand Up @@ -428,7 +429,8 @@
transition: color 0.4s, opacity 0.4s;
}

.vp-doc [class*='language-']:hover > span.lang {
.vp-doc [class*='language-']:hover > button.copy + span.lang,
.vp-doc [class*='language-'] > button.copy:focus + span.lang {
opacity: 0;
}

Expand Down
4 changes: 2 additions & 2 deletions src/node/markdown/plugins/preWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ export const preWrapperPlugin = (md: MarkdownIt) => {
const [tokens, idx] = args
const lang = tokens[idx].info.trim().replace(/-vue$/, '')
const rawCode = fence(...args)
return `<div class="language-${lang}"><span class="lang">${
return `<div class="language-${lang}"><button class="copy"></button><span class="lang">${
lang === 'vue-html' ? 'template' : lang
}</span><span class="copy"></span>${rawCode}</div>`
}</span>${rawCode}</div>`
}
}

0 comments on commit fb9cee9

Please sign in to comment.