@everchron/ec-shards 6.2.2 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ec-shards.common.js +3154 -2114
- package/dist/ec-shards.common.js.map +1 -1
- package/dist/ec-shards.css +1 -1
- package/dist/ec-shards.umd.js +3154 -2114
- package/dist/ec-shards.umd.js.map +1 -1
- package/dist/ec-shards.umd.min.js +2 -2
- package/dist/ec-shards.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/action-toolbar/action-toolbar.vue +1 -1
- package/src/components/alert/alert.vue +27 -4
- package/src/components/avatar/avatar.vue +2 -1
- package/src/components/breadcrumb/breadcrumb.vue +2 -2
- package/src/components/breadcrumb-button/breadcrumb-button.vue +15 -3
- package/src/components/breadcrumb-title/breadcrumb-title.vue +1 -1
- package/src/components/button/button.vue +65 -54
- package/src/components/button-collapse/button-collapse.vue +49 -6
- package/src/components/button-context/button-context.vue +30 -1
- package/src/components/button-dialog/button-dialog.vue +22 -8
- package/src/components/button-more/button-more.vue +44 -4
- package/src/components/button-table/button-table.vue +13 -1
- package/src/components/button-toolbar/button-toolbar.vue +50 -19
- package/src/components/button-toolbar-icon/button-toolbar-icon.vue +23 -7
- package/src/components/checkbox/checkbox.vue +0 -1
- package/src/components/collapse/collapse.vue +28 -7
- package/src/components/collection-control/collection-control.vue +40 -7
- package/src/components/comment/comment.vue +1 -1
- package/src/components/context-menu/context-menu.vue +88 -5
- package/src/components/data-card/data-card.vue +52 -14
- package/src/components/data-card-list/data-card-list.vue +1 -1
- package/src/components/data-grid/data-grid-cell.vue +1 -1
- package/src/components/data-grid/data-grid-group.vue +6 -1
- package/src/components/data-grid/data-grid-head-cell.vue +32 -2
- package/src/components/data-grid/data-grid-row.vue +1 -1
- package/src/components/data-grid/data-grid.vue +2 -2
- package/src/components/data-list/data-list.vue +1 -1
- package/src/components/data-list-item/data-list-item.vue +28 -9
- package/src/components/directory-entry/directory-entry.vue +7 -4
- package/src/components/document-state/document-state.vue +1 -1
- package/src/components/dropdown/dropdown.vue +23 -1
- package/src/components/dropzone/dropzone.vue +21 -3
- package/src/components/empty-state/empty-state.vue +1 -1
- package/src/components/entry-link/entry-link.vue +16 -3
- package/src/components/favicon/favicon.vue +1 -1
- package/src/components/file-icon/file-icon.vue +1 -1
- package/src/components/file-list/file-list.vue +1 -1
- package/src/components/file-list-item/file-list-item.vue +79 -17
- package/src/components/flag/flag.vue +75 -1
- package/src/components/folder-selector/folder-selector.vue +1 -1
- package/src/components/form-check/form-check.vue +9 -2
- package/src/components/form-set/form-set.vue +4 -4
- package/src/components/index.js +2 -0
- package/src/components/input-clear/input-clear.vue +20 -3
- package/src/components/jumper-document/jumper-document.vue +16 -4
- package/src/components/jumper-index/jumper-index.vue +19 -4
- package/src/components/jumper-page/jumper-page.vue +3 -1
- package/src/components/layout-data-table/layout-data-table.vue +5 -5
- package/src/components/layout-directory/layout-directory.vue +4 -4
- package/src/components/layout-index/layout-index.vue +2 -2
- package/src/components/legend-item/legend-item.vue +15 -1
- package/src/components/log-message/log-message.vue +11 -1
- package/src/components/map/map.vue +20 -3
- package/src/components/mixins/focus-ring.vue +47 -0
- package/src/components/mixins/unique-id.js +17 -0
- package/src/components/modal/modal.vue +5 -2
- package/src/components/modal-header/modal-header.vue +43 -19
- package/src/components/multiselect-option/multiselect-option.vue +1 -1
- package/src/components/multiselect-search-token/multiselect-search-token.vue +33 -6
- package/src/components/multiselect-token/multiselect-token.vue +28 -3
- package/src/components/overlay/overlay.vue +6 -6
- package/src/components/pagination/pagination.vue +5 -5
- package/src/components/popover-list/popover-list.vue +5 -1
- package/src/components/popover-list-headline/popover-list-headline.vue +4 -1
- package/src/components/popover-list-item/popover-list-item.vue +27 -8
- package/src/components/progress/progress.vue +7 -1
- package/src/components/quicklink/quicklink.vue +29 -18
- package/src/components/radiobutton/radiobutton.vue +2 -2
- package/src/components/rating-favorability/rating-favorability.vue +5 -1
- package/src/components/rating-star-read/rating-star-read.vue +1 -1
- package/src/components/select/select.vue +12 -2
- package/src/components/select-text/select-text.vue +7 -2
- package/src/components/select-tile/select-tile.vue +26 -2
- package/src/components/separator/separator.vue +1 -1
- package/src/components/sequence-map/sequence-map.vue +1 -1
- package/src/components/sequence-map-button/sequence-map-button.vue +14 -2
- package/src/components/sidebar-footer/sidebar-footer.vue +2 -2
- package/src/components/sidebar-header/sidebar-header.vue +2 -2
- package/src/components/sortbutton/sortbutton.vue +22 -7
- package/src/components/sticker/sticker.vue +1 -1
- package/src/components/swatches-picker/swatches-picker.vue +28 -3
- package/src/components/switch/switch.vue +24 -8
- package/src/components/tab/tab.vue +16 -2
- package/src/components/tab-bar/tab-bar.vue +1 -1
- package/src/components/tab-button/tab-button.vue +61 -1
- package/src/components/tabs/tabs.vue +2 -1
- package/src/components/tag/tag.vue +17 -5
- package/src/components/tag-cloud/tag-cloud.vue +3 -1
- package/src/components/toast/toast.vue +18 -3
- package/src/components/toasts/toasts.vue +1 -1
- package/src/components/toolbar/toolbar.vue +1 -1
- package/src/components/transcript-state/transcript-state.vue +1 -1
- package/src/components/tree-list/tree-list-item.vue +77 -12
- package/src/components/tree-list/tree-list.vue +7 -1
- package/src/stories/Changelog.stories.mdx +8 -0
- package/src/stories/button/button.stories.js +7 -7
- package/src/stories/button-more/button-more.stories.js +8 -8
- package/src/stories/button-toolbar/button-toolbar.stories.js +5 -5
- package/src/stories/button-toolbar-icon/button-toolbar-icon.stories.js +6 -6
- package/src/stories/popover-list/popover-list.stories.js +7 -2
- package/src/stories/sortbutton/sortbutton.stories.js +4 -4
- package/src/stories/tag/tag.stories.js +7 -7
- package/src/stories/tree-list/tree-list.stories.js +3 -0
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
2
|
+
<div
|
|
3
|
+
class="ecs-tab-pane"
|
|
4
|
+
:class="[ show ? 'show' : '', flex ? 'ecs-tab-pane-flex' :'', directionClass ]"
|
|
5
|
+
role="tabpanel"
|
|
6
|
+
:aria-labelledby="ariaLabeledBy">
|
|
3
7
|
<slot></slot>
|
|
4
8
|
</div>
|
|
5
9
|
</template>
|
|
@@ -22,6 +26,10 @@
|
|
|
22
26
|
type: String,
|
|
23
27
|
validator: v => ['row', 'row-reverse', 'column', 'column-reverse'].includes(v),
|
|
24
28
|
default: "row"
|
|
29
|
+
},
|
|
30
|
+
/** Sets the aria-labeled-by attribute, which should match the ID of the tab button that controls this tab panel. */
|
|
31
|
+
ariaLabeledBy: {
|
|
32
|
+
type: String
|
|
25
33
|
}
|
|
26
34
|
},
|
|
27
35
|
|
|
@@ -29,7 +37,13 @@
|
|
|
29
37
|
directionClass() {
|
|
30
38
|
if (this.flex)
|
|
31
39
|
return `ecs-tab-pane-flex-${this.flexDirection}`
|
|
32
|
-
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
mounted() {
|
|
44
|
+
if (!this.ariaLabeledBy || this.ariaLabeledBy.trim() === '') {
|
|
45
|
+
console.warn('Warning: ariaLabeledBy must be provided on tab panels, to improve accessibility.');
|
|
46
|
+
}
|
|
33
47
|
}
|
|
34
48
|
}
|
|
35
49
|
</script>
|
|
@@ -5,22 +5,29 @@
|
|
|
5
5
|
show ? `show` : '',
|
|
6
6
|
badge ? `ecs-tab-button-badge` : '']"
|
|
7
7
|
:disabled="disabled"
|
|
8
|
+
:aria-selected="show ? 'true' : 'false'"
|
|
9
|
+
:aria-controls="ariaControls"
|
|
10
|
+
role="tab"
|
|
11
|
+
ref="tabButton"
|
|
8
12
|
@click="handleClick">
|
|
9
13
|
|
|
10
14
|
<ecs-icon v-if="icon" :type="icon" />
|
|
11
15
|
<ecs-icon v-if="icon && sticker" :type="`sticker-${sticker}`" class="sticker" size="16" />
|
|
12
16
|
<slot></slot>
|
|
13
17
|
<span v-if="shortcut" class="shortcut">{{ shortcut }}</span>
|
|
18
|
+
<ecs-focus-ring :inset="0" />
|
|
14
19
|
<span class="hover" />
|
|
15
20
|
</button>
|
|
16
21
|
</template>
|
|
17
22
|
|
|
18
23
|
<script>
|
|
19
24
|
import EcsIcon from '../icon/icon'
|
|
25
|
+
import EcsFocusRing from '../mixins/focus-ring'
|
|
20
26
|
|
|
21
27
|
export default {
|
|
22
28
|
components: {
|
|
23
|
-
EcsIcon
|
|
29
|
+
EcsIcon,
|
|
30
|
+
EcsFocusRing
|
|
24
31
|
},
|
|
25
32
|
|
|
26
33
|
props: {
|
|
@@ -55,6 +62,10 @@
|
|
|
55
62
|
/** Adds a shortcut label to the tab button. Should only be used with `modal` tab bar variant. */
|
|
56
63
|
shortcut: {
|
|
57
64
|
type: String
|
|
65
|
+
},
|
|
66
|
+
/** The ID of the tab panel that is controlled by this button. Always pass an ID to improve accessibility. */
|
|
67
|
+
ariaControls: {
|
|
68
|
+
type: String
|
|
58
69
|
}
|
|
59
70
|
},
|
|
60
71
|
|
|
@@ -62,9 +73,49 @@
|
|
|
62
73
|
|
|
63
74
|
},
|
|
64
75
|
|
|
76
|
+
mounted() {
|
|
77
|
+
const button = this.$refs.tabButton;
|
|
78
|
+
button.addEventListener('keydown', this.handleKeyDown)
|
|
79
|
+
|
|
80
|
+
if (!this.ariaControls || this.ariaControls.trim() === '') {
|
|
81
|
+
console.warn('Warning: ariaControls must be provided on tab buttons, to improve accessibility.');
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
beforeUnmount() {
|
|
86
|
+
const button = this.$refs.tabButton;
|
|
87
|
+
button.removeEventListener('keydown', this.handleKeyDown)
|
|
88
|
+
},
|
|
89
|
+
|
|
65
90
|
methods: {
|
|
66
91
|
handleClick (e) {
|
|
67
92
|
this.$emit('click', e)
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
handleKeyDown(e) {
|
|
96
|
+
const code = e.keyCode;
|
|
97
|
+
|
|
98
|
+
if (code === 37 || code === 38) { // left or up arrow
|
|
99
|
+
e.preventDefault();
|
|
100
|
+
const parent = this.$el.parentNode;
|
|
101
|
+
const children = parent.children;
|
|
102
|
+
const index = Array.prototype.indexOf.call(children, this.$el);
|
|
103
|
+
const prevButton = children[index - 1];
|
|
104
|
+
if (prevButton) {
|
|
105
|
+
prevButton.focus();
|
|
106
|
+
prevButton.click();
|
|
107
|
+
}
|
|
108
|
+
} else if (code === 39 || code === 40) { // right or down arrow
|
|
109
|
+
e.preventDefault();
|
|
110
|
+
const parent = this.$el.parentNode;
|
|
111
|
+
const children = parent.children;
|
|
112
|
+
const index = Array.prototype.indexOf.call(children, this.$el);
|
|
113
|
+
const nextButton = children[index + 1];
|
|
114
|
+
if (nextButton) {
|
|
115
|
+
nextButton.focus();
|
|
116
|
+
nextButton.click();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
68
119
|
}
|
|
69
120
|
}
|
|
70
121
|
}
|
|
@@ -79,6 +130,15 @@
|
|
|
79
130
|
position: relative;
|
|
80
131
|
cursor: pointer;
|
|
81
132
|
|
|
133
|
+
&:focus-visible{
|
|
134
|
+
z-index: 1;
|
|
135
|
+
outline: none;
|
|
136
|
+
|
|
137
|
+
.ecs-focus-ring{
|
|
138
|
+
display: block;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
82
142
|
&:after{
|
|
83
143
|
content: "";
|
|
84
144
|
width: 6px;
|
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<span class="ecs-tag"
|
|
3
|
+
@click="handleClick"
|
|
3
4
|
:class="[
|
|
4
5
|
typeClass,
|
|
5
6
|
active ? `active` : '',
|
|
6
7
|
hover ? `hover` : '',
|
|
7
8
|
loading ? `loading` : ''
|
|
8
9
|
]"
|
|
9
|
-
|
|
10
|
+
:role="hover ? 'button' : false"
|
|
11
|
+
:tabindex="hover ? '0' : '-1'"
|
|
12
|
+
:aria-busy="loading"
|
|
13
|
+
>
|
|
10
14
|
|
|
11
15
|
<slot></slot>
|
|
12
16
|
<span class="count" v-if="count">{{count}}</span>
|
|
13
17
|
<ecs-skeleton-loader v-if="loading" type="single" :width="100" style="width: calc(100% - 20px)" />
|
|
18
|
+
<ecs-focus-ring />
|
|
14
19
|
</span>
|
|
15
20
|
</template>
|
|
16
21
|
|
|
17
22
|
<script>
|
|
18
23
|
import EcsSkeletonLoader from '../skeleton-loader/skeleton-loader'
|
|
24
|
+
import EcsFocusRing from '../mixins/focus-ring'
|
|
19
25
|
|
|
20
26
|
export default {
|
|
21
|
-
components: { EcsSkeletonLoader },
|
|
27
|
+
components: { EcsSkeletonLoader, EcsFocusRing },
|
|
22
28
|
|
|
23
29
|
props: {
|
|
24
30
|
/** Determines the visual style of the tag. */
|
|
@@ -87,11 +93,17 @@
|
|
|
87
93
|
transition: .2s;
|
|
88
94
|
display: inline-block;
|
|
89
95
|
position: relative;
|
|
90
|
-
-webkit-user-select: none;
|
|
91
|
-
-moz-user-select: none;
|
|
92
|
-
-ms-user-select: none;
|
|
93
96
|
user-select: none;
|
|
94
97
|
|
|
98
|
+
&:focus-visible{
|
|
99
|
+
outline: none;
|
|
100
|
+
z-index: 1;
|
|
101
|
+
|
|
102
|
+
.ecs-focus-ring{
|
|
103
|
+
display: block;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
95
107
|
&.hover,
|
|
96
108
|
&.active{
|
|
97
109
|
cursor: pointer;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="ecs-tag-cloud
|
|
2
|
+
<div class="ecs-tag-cloud" role="list">
|
|
3
3
|
<slot></slot>
|
|
4
4
|
</div>
|
|
5
5
|
</template>
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
<style lang="scss" scoped>
|
|
8
8
|
.ecs-tag-cloud{
|
|
9
9
|
margin-bottom: -6px;
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-wrap: wrap;
|
|
10
12
|
|
|
11
13
|
.ecs-tag{
|
|
12
14
|
margin: 0 6px 6px 0;
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="ecs-toast" :class="typeClass">
|
|
2
|
+
<div class="ecs-toast" :class="typeClass" aria-atomic="true" role="alert" aria-live="assertive">
|
|
3
3
|
<slot></slot>
|
|
4
4
|
<button @click="$emit('action')" class="ecs-toast-action" v-if="button">
|
|
5
5
|
{{button}}
|
|
6
|
+
<ecs-focus-ring :inset="0" :radius="6" />
|
|
6
7
|
</button>
|
|
7
8
|
</div>
|
|
8
9
|
</template>
|
|
9
10
|
|
|
10
11
|
<script>
|
|
12
|
+
import EcsFocusRing from '../mixins/focus-ring'
|
|
13
|
+
|
|
11
14
|
export default {
|
|
15
|
+
components: { EcsFocusRing },
|
|
16
|
+
|
|
12
17
|
props: {
|
|
13
18
|
/** Determines the visual theme of the toast message. */
|
|
14
19
|
theme: {
|
|
@@ -44,7 +49,7 @@
|
|
|
44
49
|
background: rgba($color-gray-13, .94);
|
|
45
50
|
color: #FFF;
|
|
46
51
|
box-shadow: 0 1px 3px rgba($color-gray-13, .2);
|
|
47
|
-
border-radius: $border-radius-
|
|
52
|
+
border-radius: $border-radius-medium;
|
|
48
53
|
padding: 14px 16px;
|
|
49
54
|
font-size: $type-scale-3-font-size;
|
|
50
55
|
margin-bottom: 10px;
|
|
@@ -60,9 +65,10 @@
|
|
|
60
65
|
color: $color-blue-3;
|
|
61
66
|
text-transform: uppercase;
|
|
62
67
|
margin: -10px -10px -10px 30px;
|
|
63
|
-
border-radius: $border-radius-
|
|
68
|
+
border-radius: $border-radius-small;
|
|
64
69
|
transition: .2s;
|
|
65
70
|
padding: 10px;
|
|
71
|
+
position: relative;
|
|
66
72
|
|
|
67
73
|
&:hover{
|
|
68
74
|
color: $color-blue-2;
|
|
@@ -72,6 +78,15 @@
|
|
|
72
78
|
color: $color-blue-2;
|
|
73
79
|
background: rgba(#FFF, .1);
|
|
74
80
|
}
|
|
81
|
+
|
|
82
|
+
&:focus-visible{
|
|
83
|
+
z-index: 1;
|
|
84
|
+
outline: none;
|
|
85
|
+
|
|
86
|
+
.ecs-focus-ring{
|
|
87
|
+
display: block;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
75
90
|
}
|
|
76
91
|
|
|
77
92
|
&.success{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div @click="$emit('click', $event)" class="ecs-transcript-state" :class="[interactive ? 'interactive' : '']">
|
|
2
|
+
<div @click="$emit('click', $event)" class="ecs-transcript-state" :class="[interactive ? 'interactive' : '']" :aria-busy="state == 'loading'">
|
|
3
3
|
<ecs-icon type="toolbar-transcript" color="#929AA9" />
|
|
4
4
|
<div v-if="state =='healthy'" class="healthy" />
|
|
5
5
|
<div v-if="state =='repairing'" class="repairing" />
|
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
|
-
<div
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
<div
|
|
4
|
+
class="ecs-tree-view-entry"
|
|
5
|
+
role="treeitem"
|
|
6
|
+
:tabindex="isSelectable ? '0' : '-1'"
|
|
7
|
+
@keydown.up.prevent="focusPrevious"
|
|
8
|
+
@keydown.down.prevent="focusNext"
|
|
9
|
+
:class="[
|
|
10
|
+
selectable ? 'selectable' : '',
|
|
11
|
+
draggable ? 'draggable' : '',
|
|
12
|
+
large ? 'ecs-tree-view-entry-lg' : '',
|
|
13
|
+
actionsOnHover ? 'actions-hover' : '',
|
|
14
|
+
stateClass
|
|
15
|
+
]">
|
|
16
|
+
<ecs-focus-ring v-if="isSelectable" />
|
|
11
17
|
|
|
12
18
|
<ecs-button-collapse
|
|
13
19
|
v-if="$slots.collapse"
|
|
14
20
|
:type="collapseButton"
|
|
15
21
|
:collapsed="!isVisible"
|
|
22
|
+
:aria-controls="expandId"
|
|
23
|
+
:aria-expanded="isVisible ? 'true' : 'false'"
|
|
24
|
+
:aria-label="isVisible ? 'Collapse' : 'Expand'"
|
|
16
25
|
@click="toggleCollapse" />
|
|
17
26
|
|
|
18
27
|
<ecs-icon v-if="icon" :type="icon" :color="iconColor" :size="iconSize" />
|
|
@@ -33,7 +42,10 @@
|
|
|
33
42
|
<slot name="actions"></slot>
|
|
34
43
|
</div>
|
|
35
44
|
</div>
|
|
36
|
-
<div v-if="$slots.collapse"
|
|
45
|
+
<div v-if="$slots.collapse"
|
|
46
|
+
:class="isVisible ? 'collapse-show' : 'collapse-hide'"
|
|
47
|
+
:id="expandId"
|
|
48
|
+
:aria-hidden="isVisible ? 'false' : 'true'">
|
|
37
49
|
<!-- @slot Slot for expandable content. -->
|
|
38
50
|
<slot name="collapse"></slot>
|
|
39
51
|
</div>
|
|
@@ -44,9 +56,12 @@
|
|
|
44
56
|
import EcsIcon from '../icon/icon'
|
|
45
57
|
import EcsStates from '../states/states'
|
|
46
58
|
import EcsButtonCollapse from '../button-collapse/button-collapse'
|
|
59
|
+
import EcsFocusRing from '../mixins/focus-ring'
|
|
60
|
+
import { uniqueIdMixin } from '../mixins/unique-id'
|
|
47
61
|
|
|
48
62
|
export default {
|
|
49
|
-
components: { EcsIcon, EcsStates, EcsButtonCollapse },
|
|
63
|
+
components: { EcsIcon, EcsStates, EcsButtonCollapse, EcsFocusRing },
|
|
64
|
+
mixins: [uniqueIdMixin],
|
|
50
65
|
|
|
51
66
|
props: {
|
|
52
67
|
id: String,
|
|
@@ -100,7 +115,8 @@
|
|
|
100
115
|
|
|
101
116
|
data () {
|
|
102
117
|
return {
|
|
103
|
-
isVisible: this.visible
|
|
118
|
+
isVisible: this.visible,
|
|
119
|
+
expandId: ''
|
|
104
120
|
}
|
|
105
121
|
},
|
|
106
122
|
|
|
@@ -125,6 +141,10 @@
|
|
|
125
141
|
if (this.state && this.state !== '')
|
|
126
142
|
return `ecs-state-${this.state}`
|
|
127
143
|
return this.state
|
|
144
|
+
},
|
|
145
|
+
isSelectable(){
|
|
146
|
+
if(this.state == 'hover' || this.selectable || this.draggable)
|
|
147
|
+
return true
|
|
128
148
|
}
|
|
129
149
|
},
|
|
130
150
|
|
|
@@ -132,6 +152,38 @@
|
|
|
132
152
|
toggleCollapse(){
|
|
133
153
|
this.isVisible = !this.isVisible
|
|
134
154
|
this.$emit('toggled', { id: this.id, isExpanded: this.isVisible })
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
focusNext() {
|
|
158
|
+
const element = this.$el;
|
|
159
|
+
let nextElement = element.nextElementSibling;
|
|
160
|
+
|
|
161
|
+
while (nextElement) {
|
|
162
|
+
const child = nextElement.querySelector('.ecs-tree-view-entry');
|
|
163
|
+
|
|
164
|
+
if (child) {
|
|
165
|
+
child.focus();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
nextElement = nextElement.nextElementSibling;
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
focusPrevious() {
|
|
174
|
+
const element = this.$el;
|
|
175
|
+
let prevElement = element.previousElementSibling;
|
|
176
|
+
|
|
177
|
+
while (prevElement) {
|
|
178
|
+
const child = prevElement.querySelector('.ecs-tree-view-entry');
|
|
179
|
+
|
|
180
|
+
if (child) {
|
|
181
|
+
child.focus();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
prevElement = prevElement.previousElementSibling;
|
|
186
|
+
}
|
|
135
187
|
}
|
|
136
188
|
},
|
|
137
189
|
|
|
@@ -139,6 +191,10 @@
|
|
|
139
191
|
visible(){
|
|
140
192
|
this.isVisible = this.visible
|
|
141
193
|
}
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
created() {
|
|
197
|
+
this.expandId = this.generateUniqueId()
|
|
142
198
|
}
|
|
143
199
|
}
|
|
144
200
|
</script>
|
|
@@ -160,6 +216,15 @@
|
|
|
160
216
|
transition: .1s;
|
|
161
217
|
position: relative;
|
|
162
218
|
|
|
219
|
+
&:focus-visible{
|
|
220
|
+
z-index: 1;
|
|
221
|
+
outline: none;
|
|
222
|
+
|
|
223
|
+
.ecs-focus-ring{
|
|
224
|
+
display: block;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
163
228
|
&-lg{
|
|
164
229
|
padding-top: 3px;
|
|
165
230
|
padding-bottom: 3px;
|
|
@@ -219,7 +284,7 @@
|
|
|
219
284
|
|
|
220
285
|
.ecs-form-check{
|
|
221
286
|
margin-bottom: 0;
|
|
222
|
-
|
|
287
|
+
margin-left: 2px;
|
|
223
288
|
flex: 1;
|
|
224
289
|
|
|
225
290
|
&-label{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="ecs-tree-view-list" :id="id">
|
|
2
|
+
<div class="ecs-tree-view-list" :id="id" :role="role">
|
|
3
3
|
<slot></slot>
|
|
4
4
|
</div>
|
|
5
5
|
</template>
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
/** Optional unique ID for the list. */
|
|
11
11
|
id: {
|
|
12
12
|
type: String
|
|
13
|
+
},
|
|
14
|
+
/** Sets the role */
|
|
15
|
+
role: {
|
|
16
|
+
type: String,
|
|
17
|
+
validator: v => ['tree', 'group'].includes(v),
|
|
18
|
+
default: 'tree'
|
|
13
19
|
}
|
|
14
20
|
}
|
|
15
21
|
}
|
|
@@ -6,6 +6,14 @@ import { Meta } from '@storybook/addon-docs/blocks';
|
|
|
6
6
|
Changelog
|
|
7
7
|
</h1>
|
|
8
8
|
|
|
9
|
+
## Version 7.0.0 (15 May 2023)
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
- All color contrasts are now fully ay11 compliant
|
|
14
|
+
- All interactive components are accessible by keyboard
|
|
15
|
+
- All components have ay11 compliant focus states, roles, and aria attributes
|
|
16
|
+
|
|
9
17
|
## Version 6.2.2 (15 May 2023)
|
|
10
18
|
|
|
11
19
|
### Features
|
|
@@ -50,13 +50,13 @@ export const iconOnly = () => ({
|
|
|
50
50
|
methods: { action: action('clicked') },
|
|
51
51
|
template: `
|
|
52
52
|
<main>
|
|
53
|
-
<ecs-button @click="action" icon-only icon="add-plus" type="primary"></ecs-button>
|
|
54
|
-
<ecs-button @click="action" icon-only icon="add-plus" type="secondary"></ecs-button>
|
|
55
|
-
<ecs-button @click="action" icon-only icon="add-plus" type="danger"></ecs-button>
|
|
56
|
-
<ecs-button @click="action" icon-only icon="add-plus" type="danger-vibrant"></ecs-button>
|
|
57
|
-
<ecs-button @click="action" icon-only icon="add-plus" type="warning"></ecs-button>
|
|
58
|
-
<ecs-button @click="action" icon-only icon="add-plus" type="create"></ecs-button>
|
|
59
|
-
<ecs-button @click="action" icon-only icon="add-plus" type="vibrant"></ecs-button>
|
|
53
|
+
<ecs-button @click="action" icon-only icon="add-plus" aria-label="Add" type="primary"></ecs-button>
|
|
54
|
+
<ecs-button @click="action" icon-only icon="add-plus" aria-label="Add" type="secondary"></ecs-button>
|
|
55
|
+
<ecs-button @click="action" icon-only icon="add-plus" aria-label="Add" type="danger"></ecs-button>
|
|
56
|
+
<ecs-button @click="action" icon-only icon="add-plus" aria-label="Add" type="danger-vibrant"></ecs-button>
|
|
57
|
+
<ecs-button @click="action" icon-only icon="add-plus" aria-label="Add" type="warning"></ecs-button>
|
|
58
|
+
<ecs-button @click="action" icon-only icon="add-plus" aria-label="Add" type="create"></ecs-button>
|
|
59
|
+
<ecs-button @click="action" icon-only icon="add-plus" aria-label="Add" type="vibrant"></ecs-button>
|
|
60
60
|
</main>
|
|
61
61
|
`,
|
|
62
62
|
});
|
|
@@ -8,26 +8,26 @@ export default {
|
|
|
8
8
|
export const dropdown = () => ({
|
|
9
9
|
components: { EcsButtonMore },
|
|
10
10
|
template: `<main>
|
|
11
|
-
<ecs-button-more></ecs-button-more>
|
|
12
|
-
<ecs-button-more active></ecs-button-more>
|
|
13
|
-
<ecs-button-more disabled></ecs-button-more>
|
|
11
|
+
<ecs-button-more aria-label="Actions"></ecs-button-more>
|
|
12
|
+
<ecs-button-more aria-label="Actions" active></ecs-button-more>
|
|
13
|
+
<ecs-button-more aria-label="Actions" disabled></ecs-button-more>
|
|
14
14
|
</main>`,
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
export const ellipse = () => ({
|
|
18
18
|
components: { EcsButtonMore },
|
|
19
19
|
template: `<main>
|
|
20
|
-
<ecs-button-more type="ellipsis"></ecs-button-more>
|
|
21
|
-
<ecs-button-more type="ellipsis" active></ecs-button-more>
|
|
22
|
-
<ecs-button-more type="ellipsis" disabled></ecs-button-more>
|
|
20
|
+
<ecs-button-more aria-label="Expand" type="ellipsis"></ecs-button-more>
|
|
21
|
+
<ecs-button-more aria-label="Expand" type="ellipsis" active></ecs-button-more>
|
|
22
|
+
<ecs-button-more aria-label="Expand" type="ellipsis" disabled></ecs-button-more>
|
|
23
23
|
</main>`,
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
export const expand = () => ({
|
|
27
27
|
components: { EcsButtonMore },
|
|
28
28
|
template: `<main>
|
|
29
|
-
<ecs-button-more type="expand" class="mb-2"></ecs-button-more>
|
|
30
|
-
<ecs-button-more type="expand" class="mb-2" active></ecs-button-more>
|
|
29
|
+
<ecs-button-more type="expand" aria-label="Show more" class="mb-2"></ecs-button-more>
|
|
30
|
+
<ecs-button-more type="expand" aria-label="Show more" class="mb-2" active></ecs-button-more>
|
|
31
31
|
<ecs-button-more type="expand" class="mb-2">Show More</ecs-button-more>
|
|
32
32
|
<ecs-button-more type="expand" class="mb-2" active>Show Less</ecs-button-more>
|
|
33
33
|
</main>`,
|
|
@@ -8,7 +8,7 @@ export default {
|
|
|
8
8
|
|
|
9
9
|
export const regular = () => ({
|
|
10
10
|
components: { EcsButtonToolbar },
|
|
11
|
-
template: `<ecs-button-toolbar icon="marker"></ecs-button-toolbar>`,
|
|
11
|
+
template: `<ecs-button-toolbar icon="marker" aria-label="Mark Text"></ecs-button-toolbar>`,
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
export const regularText = () => ({
|
|
@@ -30,9 +30,9 @@ export const dropdown = () => ({
|
|
|
30
30
|
export const group = () => ({
|
|
31
31
|
components: { EcsButtonToolbar, EcsButtonToolbarGroup },
|
|
32
32
|
template: `<ecs-button-toolbar-group>
|
|
33
|
-
<ecs-button-toolbar icon="marker" active />
|
|
34
|
-
<ecs-button-toolbar icon="rectangle" />
|
|
35
|
-
<ecs-button-toolbar icon="rectangle" active-highlight />
|
|
36
|
-
<ecs-button-toolbar href="https://google.com" target="_blank" icon="delete" badge />
|
|
33
|
+
<ecs-button-toolbar icon="marker" active aria-label="Mark Text" />
|
|
34
|
+
<ecs-button-toolbar icon="rectangle" aria-label="Mark Rectangle" />
|
|
35
|
+
<ecs-button-toolbar icon="rectangle" active-highlight aria-label="Mark Rectangle" />
|
|
36
|
+
<ecs-button-toolbar href="https://google.com" target="_blank" icon="delete" badge aria-label="Delete" />
|
|
37
37
|
</ecs-button-toolbar-group>`,
|
|
38
38
|
});
|
|
@@ -8,17 +8,17 @@ export default {
|
|
|
8
8
|
export const regular = () => ({
|
|
9
9
|
components: { EcsButtonToolbarIcon },
|
|
10
10
|
template: `<main>
|
|
11
|
-
<ecs-button-toolbar-icon icon="toolbar-sort" />
|
|
12
|
-
<ecs-button-toolbar-icon active icon="toolbar-sort" />
|
|
13
|
-
<ecs-button-toolbar-icon loading icon="toolbar-sort" />
|
|
14
|
-
<ecs-button-toolbar-icon disabled icon="toolbar-sort" />
|
|
15
|
-
<ecs-button-toolbar-icon icon="toolbar-cards" has-badge />
|
|
11
|
+
<ecs-button-toolbar-icon aria-label="Sort" icon="toolbar-sort" />
|
|
12
|
+
<ecs-button-toolbar-icon aria-label="Sort" active icon="toolbar-sort" />
|
|
13
|
+
<ecs-button-toolbar-icon aria-label="Sort" loading icon="toolbar-sort" />
|
|
14
|
+
<ecs-button-toolbar-icon aria-label="Sort" disabled icon="toolbar-sort" />
|
|
15
|
+
<ecs-button-toolbar-icon aria-label="Sort" icon="toolbar-cards" has-badge />
|
|
16
16
|
</main>`,
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
export const subIcon = () => ({
|
|
20
20
|
components: { EcsButtonToolbarIcon },
|
|
21
21
|
template: `<main>
|
|
22
|
-
<ecs-button-toolbar-icon icon="toolbar-refresh" sub-icon="mail" />
|
|
22
|
+
<ecs-button-toolbar-icon aria-label="Refresh" icon="toolbar-refresh" sub-icon="mail" />
|
|
23
23
|
</main>`,
|
|
24
24
|
});
|
|
@@ -8,10 +8,15 @@ export default {
|
|
|
8
8
|
|
|
9
9
|
export const popoverList = () => ({
|
|
10
10
|
components: { EcsPopoverList, EcsPopoverListItem },
|
|
11
|
-
template: `<ecs-popover-list>
|
|
11
|
+
template: `<div><ecs-popover-list>
|
|
12
12
|
<ecs-popover-list-item>Label</ecs-popover-list-item>
|
|
13
13
|
<ecs-popover-list-item>Label</ecs-popover-list-item>
|
|
14
|
-
</ecs-popover-list
|
|
14
|
+
</ecs-popover-list><ecs-popover-list>
|
|
15
|
+
<ecs-popover-list-item>Label</ecs-popover-list-item>
|
|
16
|
+
<ecs-popover-list-item>Label</ecs-popover-list-item>
|
|
17
|
+
<ecs-popover-list-item>Label</ecs-popover-list-item>
|
|
18
|
+
<ecs-popover-list-item>Label</ecs-popover-list-item>
|
|
19
|
+
</ecs-popover-list></div>`,
|
|
15
20
|
});
|
|
16
21
|
|
|
17
22
|
export const popoverListInner = () => ({
|
|
@@ -9,8 +9,8 @@ export const sortbutton = () => ({
|
|
|
9
9
|
components: { EcsSortbutton },
|
|
10
10
|
template: `<div>
|
|
11
11
|
<ecs-sortbutton>Null</ecs-sortbutton>
|
|
12
|
-
<ecs-sortbutton sort="
|
|
13
|
-
<ecs-sortbutton sort="
|
|
12
|
+
<ecs-sortbutton sort="descending">Descending</ecs-sortbutton>
|
|
13
|
+
<ecs-sortbutton sort="ascending">Ascending</ecs-sortbutton>
|
|
14
14
|
</div>`,
|
|
15
15
|
});
|
|
16
16
|
|
|
@@ -18,7 +18,7 @@ export const sortbuttonInline = () => ({
|
|
|
18
18
|
components: { EcsSortbutton },
|
|
19
19
|
template: `<main>
|
|
20
20
|
<ecs-sortbutton inline>Null</ecs-sortbutton>
|
|
21
|
-
<ecs-sortbutton inline sort="
|
|
22
|
-
<ecs-sortbutton inline sort="
|
|
21
|
+
<ecs-sortbutton inline sort="descending">Descending</ecs-sortbutton>
|
|
22
|
+
<ecs-sortbutton inline sort="ascending">Ascending</ecs-sortbutton>
|
|
23
23
|
</main>`,
|
|
24
24
|
});
|