Skip to content

Commit 83ccffa

Browse files
committed
Create vue-skip-to-list component
1 parent 337451d commit 83ccffa

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

src/VueSkipTo.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
class="vue-skip-to"
44
:href="to"
55
@click.prevent="handleFocusElement"
6+
@focus="$emit('focus')"
7+
@blur="$emit('blur')"
68
>
79
<slot>{{ text }}</slot>
810
</a>

src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import VueSkipTo from './VueSkipTo.vue'
2+
import VueSkipToList from './skip-to-list.vue'
23

34
export default function install (Vue) {
45
if (install.installed) return
56
install.installed = true
67
Vue.component('VueSkipTo', VueSkipTo)
8+
Vue.component('VueSkipToList', VueSkipToList)
79
}
810

911
// auto install

src/skip-to-list.vue

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<template>
2+
<div :class="containerClassNames">
3+
4+
<!-- TODO: fix label to handle multiple instances of nav list -->
5+
<p class="vue-skip-to__label" id="vue-skip-to__label">
6+
<slot>Skip to</slot>
7+
</p>
8+
9+
<nav
10+
class="vue-skip-to__nav"
11+
aria-labelledby="vue-skip-to__label"
12+
>
13+
<ul class="vue-skip-to__nav-list">
14+
<li
15+
v-for="el in to"
16+
:key="el.anchor"
17+
class="vue-skip-to__nav-list-item"
18+
>
19+
<vue-skip-to
20+
:to="el.anchor"
21+
@focus="labelVisible = true"
22+
@blur="labelVisible = false"
23+
class="vue-skip-to vue-skip-to--relative"
24+
>
25+
{{ el.label }}
26+
</vue-skip-to>
27+
</li>
28+
</ul>
29+
</nav>
30+
31+
</div>
32+
</template>
33+
34+
<script>
35+
export default {
36+
name: 'VueSkipToList',
37+
38+
props: {
39+
to: {
40+
type: Array
41+
/* TODO: add validator */
42+
}
43+
},
44+
45+
data () {
46+
return {
47+
labelVisible: false
48+
}
49+
},
50+
51+
computed: {
52+
containerClassNames: function () {
53+
return {
54+
'vue-skip-to__list-container': true,
55+
'vue-skip-to__list-container--focus': this.labelVisible
56+
}
57+
}
58+
}
59+
60+
}
61+
</script>
62+
63+
<style scoped>
64+
.vue-skip-to__list-container {
65+
position: absolute;
66+
left: -10000px;
67+
top: 0;
68+
border: 1px solid #000;
69+
}
70+
71+
.vue-skip-to__list-container--focus {
72+
background-color: #fff;
73+
left: 0;
74+
}
75+
76+
.vue-skip-to__label {
77+
font-weight: 800;
78+
margin: 8px 0 0 0;
79+
padding: 8px 24px 8px 10px;
80+
border-bottom: 1px solid #000;
81+
}
82+
83+
.vue-skip-to__nav-list {
84+
display: flex;
85+
flex-direction: column;
86+
padding: 0;
87+
margin: 0 0 10px 0;
88+
list-style-type: none;
89+
}
90+
91+
.vue-skip-to__nav-list-item {
92+
position: relative;
93+
}
94+
95+
/* override `<vue-skip-to>` styles */
96+
.vue-skip-to.vue-skip-to--relative {
97+
position: relative;
98+
left: unset;
99+
top: unset;
100+
display: block;
101+
padding: 8px 24px 8px 10px;
102+
color: #000;
103+
text-decoration: none;
104+
}
105+
106+
.vue-skip-to.vue-skip-to--relative:focus {
107+
color: #fff;
108+
}
109+
</style>

0 commit comments

Comments
 (0)