@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.
Files changed (111) hide show
  1. package/dist/ec-shards.common.js +3154 -2114
  2. package/dist/ec-shards.common.js.map +1 -1
  3. package/dist/ec-shards.css +1 -1
  4. package/dist/ec-shards.umd.js +3154 -2114
  5. package/dist/ec-shards.umd.js.map +1 -1
  6. package/dist/ec-shards.umd.min.js +2 -2
  7. package/dist/ec-shards.umd.min.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/components/action-toolbar/action-toolbar.vue +1 -1
  10. package/src/components/alert/alert.vue +27 -4
  11. package/src/components/avatar/avatar.vue +2 -1
  12. package/src/components/breadcrumb/breadcrumb.vue +2 -2
  13. package/src/components/breadcrumb-button/breadcrumb-button.vue +15 -3
  14. package/src/components/breadcrumb-title/breadcrumb-title.vue +1 -1
  15. package/src/components/button/button.vue +65 -54
  16. package/src/components/button-collapse/button-collapse.vue +49 -6
  17. package/src/components/button-context/button-context.vue +30 -1
  18. package/src/components/button-dialog/button-dialog.vue +22 -8
  19. package/src/components/button-more/button-more.vue +44 -4
  20. package/src/components/button-table/button-table.vue +13 -1
  21. package/src/components/button-toolbar/button-toolbar.vue +50 -19
  22. package/src/components/button-toolbar-icon/button-toolbar-icon.vue +23 -7
  23. package/src/components/checkbox/checkbox.vue +0 -1
  24. package/src/components/collapse/collapse.vue +28 -7
  25. package/src/components/collection-control/collection-control.vue +40 -7
  26. package/src/components/comment/comment.vue +1 -1
  27. package/src/components/context-menu/context-menu.vue +88 -5
  28. package/src/components/data-card/data-card.vue +52 -14
  29. package/src/components/data-card-list/data-card-list.vue +1 -1
  30. package/src/components/data-grid/data-grid-cell.vue +1 -1
  31. package/src/components/data-grid/data-grid-group.vue +6 -1
  32. package/src/components/data-grid/data-grid-head-cell.vue +32 -2
  33. package/src/components/data-grid/data-grid-row.vue +1 -1
  34. package/src/components/data-grid/data-grid.vue +2 -2
  35. package/src/components/data-list/data-list.vue +1 -1
  36. package/src/components/data-list-item/data-list-item.vue +28 -9
  37. package/src/components/directory-entry/directory-entry.vue +7 -4
  38. package/src/components/document-state/document-state.vue +1 -1
  39. package/src/components/dropdown/dropdown.vue +23 -1
  40. package/src/components/dropzone/dropzone.vue +21 -3
  41. package/src/components/empty-state/empty-state.vue +1 -1
  42. package/src/components/entry-link/entry-link.vue +16 -3
  43. package/src/components/favicon/favicon.vue +1 -1
  44. package/src/components/file-icon/file-icon.vue +1 -1
  45. package/src/components/file-list/file-list.vue +1 -1
  46. package/src/components/file-list-item/file-list-item.vue +79 -17
  47. package/src/components/flag/flag.vue +75 -1
  48. package/src/components/folder-selector/folder-selector.vue +1 -1
  49. package/src/components/form-check/form-check.vue +9 -2
  50. package/src/components/form-set/form-set.vue +4 -4
  51. package/src/components/index.js +2 -0
  52. package/src/components/input-clear/input-clear.vue +20 -3
  53. package/src/components/jumper-document/jumper-document.vue +16 -4
  54. package/src/components/jumper-index/jumper-index.vue +19 -4
  55. package/src/components/jumper-page/jumper-page.vue +3 -1
  56. package/src/components/layout-data-table/layout-data-table.vue +5 -5
  57. package/src/components/layout-directory/layout-directory.vue +4 -4
  58. package/src/components/layout-index/layout-index.vue +2 -2
  59. package/src/components/legend-item/legend-item.vue +15 -1
  60. package/src/components/log-message/log-message.vue +11 -1
  61. package/src/components/map/map.vue +20 -3
  62. package/src/components/mixins/focus-ring.vue +47 -0
  63. package/src/components/mixins/unique-id.js +17 -0
  64. package/src/components/modal/modal.vue +5 -2
  65. package/src/components/modal-header/modal-header.vue +43 -19
  66. package/src/components/multiselect-option/multiselect-option.vue +1 -1
  67. package/src/components/multiselect-search-token/multiselect-search-token.vue +33 -6
  68. package/src/components/multiselect-token/multiselect-token.vue +28 -3
  69. package/src/components/overlay/overlay.vue +6 -6
  70. package/src/components/pagination/pagination.vue +5 -5
  71. package/src/components/popover-list/popover-list.vue +5 -1
  72. package/src/components/popover-list-headline/popover-list-headline.vue +4 -1
  73. package/src/components/popover-list-item/popover-list-item.vue +27 -8
  74. package/src/components/progress/progress.vue +7 -1
  75. package/src/components/quicklink/quicklink.vue +29 -18
  76. package/src/components/radiobutton/radiobutton.vue +2 -2
  77. package/src/components/rating-favorability/rating-favorability.vue +5 -1
  78. package/src/components/rating-star-read/rating-star-read.vue +1 -1
  79. package/src/components/select/select.vue +12 -2
  80. package/src/components/select-text/select-text.vue +7 -2
  81. package/src/components/select-tile/select-tile.vue +26 -2
  82. package/src/components/separator/separator.vue +1 -1
  83. package/src/components/sequence-map/sequence-map.vue +1 -1
  84. package/src/components/sequence-map-button/sequence-map-button.vue +14 -2
  85. package/src/components/sidebar-footer/sidebar-footer.vue +2 -2
  86. package/src/components/sidebar-header/sidebar-header.vue +2 -2
  87. package/src/components/sortbutton/sortbutton.vue +22 -7
  88. package/src/components/sticker/sticker.vue +1 -1
  89. package/src/components/swatches-picker/swatches-picker.vue +28 -3
  90. package/src/components/switch/switch.vue +24 -8
  91. package/src/components/tab/tab.vue +16 -2
  92. package/src/components/tab-bar/tab-bar.vue +1 -1
  93. package/src/components/tab-button/tab-button.vue +61 -1
  94. package/src/components/tabs/tabs.vue +2 -1
  95. package/src/components/tag/tag.vue +17 -5
  96. package/src/components/tag-cloud/tag-cloud.vue +3 -1
  97. package/src/components/toast/toast.vue +18 -3
  98. package/src/components/toasts/toasts.vue +1 -1
  99. package/src/components/toolbar/toolbar.vue +1 -1
  100. package/src/components/transcript-state/transcript-state.vue +1 -1
  101. package/src/components/tree-list/tree-list-item.vue +77 -12
  102. package/src/components/tree-list/tree-list.vue +7 -1
  103. package/src/stories/Changelog.stories.mdx +8 -0
  104. package/src/stories/button/button.stories.js +7 -7
  105. package/src/stories/button-more/button-more.stories.js +8 -8
  106. package/src/stories/button-toolbar/button-toolbar.stories.js +5 -5
  107. package/src/stories/button-toolbar-icon/button-toolbar-icon.stories.js +6 -6
  108. package/src/stories/popover-list/popover-list.stories.js +7 -2
  109. package/src/stories/sortbutton/sortbutton.stories.js +4 -4
  110. package/src/stories/tag/tag.stories.js +7 -7
  111. package/src/stories/tree-list/tree-list.stories.js +3 -0
@@ -7,7 +7,7 @@
7
7
  <slot name="action-toolbar"></slot>
8
8
 
9
9
  <div class="ecs-index-layout-wrap" :class="[indent ? 'indent' : '']">
10
- <div class="ecs-index-layout-contents">
10
+ <main class="ecs-index-layout-contents">
11
11
  <div class="ecs-index-layout-table scrollbar">
12
12
  <slot></slot>
13
13
  </div>
@@ -15,7 +15,7 @@
15
15
  <!-- @slot Slot for the pagination control. -->
16
16
  <slot name="pagination"></slot>
17
17
  </div>
18
- </div>
18
+ </main>
19
19
 
20
20
  <div v-if="$slots.sidebar" class="ecs-index-layout-sidebar" :class="[overlaySidebar ? 'overlay' : '']" :style="sidebarPosition">
21
21
  <!-- @slot Slot for the sidebar. -->
@@ -1,5 +1,8 @@
1
1
  <template>
2
2
  <ecs-flex-row
3
+ @click="$emit('click', $event)"
4
+ :role="hover ? 'button' : false"
5
+ :tabindex="hover ? '0' : '-1'"
3
6
  class="ecs-legend-item"
4
7
  :gap="8"
5
8
  :class="[
@@ -12,15 +15,18 @@
12
15
  <div v-if="count" class="ecs-legend-item-count">{{ count }}</div>
13
16
  <div v-if="percentage" class="ecs-legend-item-percentage">{{ percentageLabel }}</div>
14
17
  <div v-if="highlight || hover" class="ecs-legend-item-highlight" :style="{backgroundColor: validColor}" />
18
+ <ecs-focus-ring v-if="hover" />
15
19
  </ecs-flex-row>
16
20
  </template>
17
21
 
18
22
  <script>
19
23
  import EcsFlexRow from '../flex/flex-row'
24
+ import EcsFocusRing from '../mixins/focus-ring'
20
25
 
21
26
  export default {
22
27
  components: {
23
- EcsFlexRow
28
+ EcsFlexRow,
29
+ EcsFocusRing
24
30
  },
25
31
 
26
32
  props: {
@@ -102,6 +108,14 @@ export default {
102
108
  z-index: 1;
103
109
  cursor: default;
104
110
 
111
+ &:focus-visible{
112
+ outline: none;
113
+
114
+ .ecs-focus-ring{
115
+ display: block;
116
+ }
117
+ }
118
+
105
119
  &-sml{
106
120
  font-size: $type-scale-2-font-size;
107
121
  line-height: $type-scale-2-line-height;
@@ -1,5 +1,11 @@
1
1
  <template>
2
- <ecs-flex-row class="ecs-log-message" :class="[type, highlight ? 'highlighted' : '']" align="start" :style="padding">
2
+ <ecs-flex-row
3
+ class="ecs-log-message"
4
+ :class="[type, highlight ? 'highlighted' : '']"
5
+ :role="alertRole"
6
+ :aria-busy="loading"
7
+ align="start"
8
+ :style="padding">
3
9
  <ecs-skeleton-loader v-if="loading && type != 'blank'" type="rect" :width="16" :height="16" />
4
10
  <ecs-sticker v-else-if="type != 'blank'" :type="type" />
5
11
  <div class="ecs-log-message-content">
@@ -53,6 +59,10 @@ export default {
53
59
  computed: {
54
60
  padding() {
55
61
  return 'padding-left: ' + this.verticalPadding + '; padding-right: ' + this.verticalPadding + ';'
62
+ },
63
+
64
+ alertRole() {
65
+ return ['warning', 'error'].includes(this.type) ? 'alert' : null;
56
66
  }
57
67
  }
58
68
  }
@@ -1,13 +1,18 @@
1
1
  <template>
2
- <div class="ecs-map" :class="[marker ? `ecs-map-marker` : '']">
3
- <a target="_blank" :href="mapUrl">
4
- <img :src="mapImageUrl">
2
+ <div class="ecs-map" :class="[marker ? 'ecs-map-marker' : '']">
3
+ <a target="_blank" :href="mapUrl" title="View on Google Maps">
4
+ <img :src="mapImageUrl" :alt="'Map of ' + address">
5
+ <ecs-focus-ring :inset="0" :radius="4"/>
5
6
  </a>
6
7
  </div>
7
8
  </template>
8
9
 
9
10
  <script>
11
+ import EcsFocusRing from '../mixins/focus-ring'
12
+
10
13
  export default {
14
+ components: { EcsFocusRing },
15
+
11
16
  props: {
12
17
  /** Address of the location, needs to be known by Google Maps. */
13
18
  address: {
@@ -25,6 +30,7 @@
25
30
  mapUrl() {
26
31
  return `https://www.google.com/maps/place/${this.address}`
27
32
  },
33
+
28
34
  mapImageUrl() {
29
35
  return `https://maps.googleapis.com/maps/api/staticmap?maptype=terrain&sensor=false&format=png&zoom=13&key=AIzaSyBEv9bJVd1MU5zSs_Ezxkvc8FOfIO7Q1Fk&visual_refresh=true&scale=2&size=320x220&style=feature:poi|visibility:off&center=${this.address}`
30
36
  }
@@ -48,6 +54,17 @@
48
54
  display: block;
49
55
  }
50
56
 
57
+ a{
58
+ &:focus-visible{
59
+ z-index: 1;
60
+ outline: none;
61
+
62
+ .ecs-focus-ring{
63
+ display: block;
64
+ }
65
+ }
66
+ }
67
+
51
68
  &-marker{
52
69
  &:before{
53
70
  content: "";
@@ -0,0 +1,47 @@
1
+ <template>
2
+ <span class="ecs-focus-ring" :style="styles" :class="danger ? 'ecs-focus-ring-danger' : ''" />
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ props: {
8
+ /** Defines the distance of the focus ring from it focusable element. Should be smaller than `0` (negative) in almost all cases. */
9
+ inset: {
10
+ type: Number,
11
+ default: -4
12
+ },
13
+ /** Defines the border radius of the focus ring. The radius depends on the inset and the radius of the focused element. A general rule of the radius to be applied is: `radius` = `element radius` - (-`inset`/2). */
14
+ radius: {
15
+ type: Number,
16
+ default: 8
17
+ },
18
+ /** Sets the focus ring color to red, which should be used for destructive actions. */
19
+ danger: {
20
+ type: Boolean,
21
+ default: false
22
+ }
23
+ },
24
+
25
+ computed: {
26
+ styles(){
27
+ return `inset: ${this.inset}px; border-radius: ${this.radius}px;`;
28
+ }
29
+ }
30
+ }
31
+ </script>
32
+
33
+ <style lang="scss" scoped>
34
+ @import "../../tokens/build/scss/tokens.scss";
35
+
36
+ .ecs-focus-ring{
37
+ position: absolute;
38
+ pointer-events: none;
39
+ z-index: 1;
40
+ display: none;
41
+ border: 2px solid $color-blue-9;
42
+
43
+ &-danger{
44
+ border-color: $color-red-10;
45
+ }
46
+ }
47
+ </style>
@@ -0,0 +1,17 @@
1
+ export const uniqueIdMixin = {
2
+ data() {
3
+ return {
4
+ uniqueId: '',
5
+ }
6
+ },
7
+ created() {
8
+ this.uniqueId = this.generateUniqueId()
9
+ },
10
+ methods: {
11
+ generateUniqueId() {
12
+ const timestamp = new Date().getTime()
13
+ const random = Math.floor(Math.random() * 100000)
14
+ return `uid_${timestamp}_${random}`
15
+ },
16
+ },
17
+ }
@@ -1,6 +1,9 @@
1
1
  <template>
2
2
  <transition name="dialog-fade">
3
- <div v-if="isShown" class="ecs-modal" :class="[typeClass, clickthrough ? 'ecs-modal-click-through' : '']">
3
+ <div
4
+ v-if="isShown"
5
+ class="ecs-modal"
6
+ :class="[typeClass, clickthrough ? 'ecs-modal-click-through' : '']">
4
7
 
5
8
  <div class="ecs-modal-dialog ecs-modal-sheet" :style="fixedHeightStyle">
6
9
  <div v-if="$slots.header" class="ecs-modal-header-wrap">
@@ -173,7 +176,7 @@
173
176
  }
174
177
  }
175
178
 
176
- .ecs-dialog{
179
+ &-inner-dialog .ecs-dialog{
177
180
  position: absolute;
178
181
  top: 0;
179
182
  z-index: 1;
@@ -1,10 +1,20 @@
1
1
  <template>
2
2
  <div class="ecs-modal-header" :class="typeClass">
3
- <div class="ecs-modal-header-main">
3
+ <div class="ecs-modal-header-main" ref="firstFocusable" tabindex="0">
4
4
  <div class="ecs-modal-header-main-inner">
5
5
  <slot></slot>
6
6
  </div>
7
- <button @click="$emit('close')" title="Close" class="ecs-modal-header-close"></button>
7
+ <ecs-button
8
+ @click="$emit('close')"
9
+ title="Close"
10
+ aria-label="Close"
11
+ icon="close"
12
+ icon-only
13
+ type="secondary"
14
+ size="lg"
15
+ :focus-inset="-1"
16
+ data-close-button
17
+ data-test="close-modal-button" />
8
18
  </div>
9
19
  <div v-if="$slots.extension" class="ecs-modal-header-extended">
10
20
  <!-- @slot Slot for a header extension row that appears underneath the main header. Can be used for tabs, sequence maps, etc. -->
@@ -14,7 +24,15 @@
14
24
  </template>
15
25
 
16
26
  <script>
27
+ import EcsFocusRing from '../mixins/focus-ring'
28
+ import EcsButton from '../button/button'
29
+
17
30
  export default {
31
+ components: {
32
+ EcsButton,
33
+ EcsFocusRing
34
+ },
35
+
18
36
  props: {
19
37
  /** Sets the visual style of the modal header. Tabs should always be used when the modal tab header contains a tab bar, while Scroll can be used as an optional indicator for scrollable modals with long contents. */
20
38
  type: {
@@ -30,6 +48,29 @@
30
48
  return `ecs-modal-header-${this.type}`
31
49
  return this.type
32
50
  }
51
+ },
52
+
53
+ mounted() {
54
+ document.addEventListener('keydown', this.handleKeyDown);
55
+
56
+ this.$nextTick(() => {
57
+ this.$refs.firstFocusable.focus();
58
+ });
59
+ },
60
+
61
+ beforeUnmount() {
62
+ document.removeEventListener('keydown', this.handleKeyDown);
63
+ },
64
+
65
+ methods: {
66
+ handleKeyDown(event) {
67
+ if (event.keyCode === 27) { // Esc
68
+ const closeButton = document.querySelector('[data-close-button]');
69
+ if (closeButton) {
70
+ closeButton.focus();
71
+ }
72
+ }
73
+ }
33
74
  }
34
75
  }
35
76
  </script>
@@ -76,23 +117,6 @@
76
117
  &-extended{
77
118
  padding: 5px 0 0 0;
78
119
  }
79
-
80
- &-close{
81
- cursor: pointer;
82
- width: 40px;
83
- height: 40px;
84
- border-radius: $border-radius-small;
85
- padding: 0;
86
- transition: .2s;
87
- opacity: .7;
88
- flex-shrink: 0;
89
- background-image: svg-uri('<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40"><g fill="none" fill-rule="evenodd" stroke="#929AA9" stroke-linecap="round" stroke-width="1.8" transform="translate(14 14)"><line x2="12" y2="12" transform="matrix(-1 0 0 1 12 0)"/><line x2="12" y2="12"/></g></svg>');
90
-
91
- &:hover{
92
- opacity: 1;
93
- background-color: rgba(#000, .05);
94
- }
95
- }
96
120
  }
97
121
  </style>
98
122
 
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="ecs-multiselect-option" :class="typeClass">
2
+ <div class="ecs-multiselect-option" :class="typeClass" :role="type == 'key' ? 'menuitem' : false">
3
3
  <ecs-icon v-if="icon" :type="icon" size="20" />
4
4
  <slot></slot>
5
5
  </div>
@@ -1,5 +1,9 @@
1
1
  <template>
2
- <div class="ecs-multiselect-search-token" :class="typeClass">
2
+ <div
3
+ class="ecs-multiselect-search-token"
4
+ :class="typeClass" tabindex="0"
5
+ @keydown.delete="$emit('remove', $event)">
6
+
3
7
  <div v-if="icon || operator" class="symbol">
4
8
  <ecs-icon :type="icon" size="20" color="#FFF" />
5
9
  <div v-if="operator && !operatorSelect" class="operator">{{ operator }}</div>
@@ -10,8 +14,9 @@
10
14
  <div class="query">
11
15
  <div v-if="descriptor" class="descriptor">{{ descriptor }}</div>
12
16
  <slot></slot>
13
- <button @click="$emit('remove', $event)" class="remove" title="Remove">
17
+ <button @click="$emit('remove', $event)" @keyup.enter="$emit('remove', $event)" class="remove" title="Remove" aria-label="Remove">
14
18
  <ecs-icon type="close" size="14" color="#FFF" />
19
+ <ecs-focus-ring :radius="12" />
15
20
  </button>
16
21
  </div>
17
22
  </div>
@@ -19,13 +24,16 @@
19
24
 
20
25
  <script>
21
26
  import EcsIcon from '../icon/icon'
27
+ import EcsFocusRing from '../mixins/focus-ring'
22
28
  import EcsSelectText from '../select-text/select-text'
23
29
 
24
30
  export default {
25
31
  components: {
26
32
  EcsIcon,
33
+ EcsFocusRing,
27
34
  EcsSelectText
28
35
  },
36
+
29
37
  props: {
30
38
  /** Sets the type of the search token: default should be used for any search query that is not a NOT query. */
31
39
  type: {
@@ -81,18 +89,23 @@
81
89
  @import "../../tokens/build/scss/tokens.scss";
82
90
 
83
91
  .ecs-multiselect-search-token{
84
- border-radius: $border-radius-x-small;
92
+ border-radius: $border-radius-small;
85
93
  display: flex;
86
94
  height: 24px;
87
95
  z-index: 1;
88
96
  position: relative;
97
+ overflow: hidden;
98
+
99
+ &:focus-visible{
100
+ outline: 2px solid $color-blue-9;
101
+ }
89
102
 
90
103
  > div:first-child{
91
- border-radius: 3px 0 0 3px;
104
+ border-radius: $border-radius-small 0 0 $border-radius-small;
92
105
  }
93
106
 
94
107
  > div:last-child{
95
- border-radius: 0 3px 3px 0;
108
+ border-radius: 0 $border-radius-small $border-radius-small 0;
96
109
  }
97
110
 
98
111
  &-default{
@@ -186,12 +199,26 @@
186
199
  top: 0;
187
200
  cursor: pointer;
188
201
 
202
+ &:focus-visible{
203
+ outline: none;
204
+
205
+ .ecs-focus-ring{
206
+ display: block;
207
+ left: 14px !important;
208
+ top: 1px !important;
209
+ bottom: 1px !important;
210
+ right: 0 !important;
211
+ }
212
+ }
213
+
189
214
  .icon{
190
215
  border-radius: 100%;
191
216
  }
192
217
  }
193
218
 
194
- &:hover{
219
+ &:hover,
220
+ &:focus-visible,
221
+ &:focus-within{
195
222
  .remove{
196
223
  transform: translateX(-36px);
197
224
  }
@@ -1,18 +1,25 @@
1
1
  <template>
2
- <div class="ecs-multiselect-token">
2
+ <div
3
+ class="ecs-multiselect-token"
4
+ tabindex="0"
5
+ @keydown.delete="$emit('remove', $event)">
6
+
3
7
  <slot></slot>
4
8
  <button @click="$emit('remove', $event)" class="remove">
5
9
  <ecs-icon type="close" size="14" color="#FFF" />
10
+ <ecs-focus-ring :radius="12" />
6
11
  </button>
7
12
  </div>
8
13
  </template>
9
14
 
10
15
  <script>
11
16
  import EcsIcon from '../icon/icon'
17
+ import EcsFocusRing from '../mixins/focus-ring'
12
18
 
13
19
  export default {
14
20
  components: {
15
- EcsIcon
21
+ EcsIcon,
22
+ EcsFocusRing
16
23
  }
17
24
  }
18
25
  </script>
@@ -33,6 +40,10 @@
33
40
  color: rgba($color-blue-14, .8);
34
41
  display: inline-block;
35
42
 
43
+ &:focus-visible{
44
+ outline: 2px solid $color-blue-9;
45
+ }
46
+
36
47
  .remove{
37
48
  padding: 0 4px 0 0;
38
49
  background-image: linear-gradient(90deg, rgba(206,220,235,0.00) 0%, $color-blue-2 50%);
@@ -47,6 +58,18 @@
47
58
  top: 0;
48
59
  cursor: pointer;
49
60
 
61
+ &:focus-visible{
62
+ outline: none;
63
+
64
+ .ecs-focus-ring{
65
+ display: block;
66
+ left: 14px !important;
67
+ top: 3px !important;
68
+ bottom: 3px !important;
69
+ right: 0px !important;
70
+ }
71
+ }
72
+
50
73
  .icon{
51
74
  border-radius: 100%;
52
75
  background: $color-blue-11;
@@ -54,7 +77,9 @@
54
77
  }
55
78
  }
56
79
 
57
- &:hover{
80
+ &:hover,
81
+ &:focus-visible,
82
+ &:focus-within{
58
83
  .remove{
59
84
  transform: translateX(-36px);
60
85
  }
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <transition name="fade">
3
3
  <div v-if="isShown" class="ecs-overlay" :style="{ top: offsetTop + 'px', height: 'calc(100vh - '+ offsetTop +'px' }">
4
- <div class="ecs-overlay-header">
4
+ <header class="ecs-overlay-header">
5
5
  <div class="ecs-overlay-titles">
6
6
  <ecs-icon v-if="icon" :type="icon" size="40" color="#B9BCC2" />
7
7
  <div>
@@ -25,8 +25,8 @@
25
25
  class="sidebar-button"
26
26
  />
27
27
  <ecs-button-toolbar @click="$emit('close')" :disabled="closeDisabled" icon="close">{{ closeText }}</ecs-button-toolbar>
28
- </div>
29
- <div ref="content" class="ecs-overlay-content scrollbar">
28
+ </header>
29
+ <main ref="content" class="ecs-overlay-content scrollbar" :aria-busy="blockContent">
30
30
  <div v-if="$slots.tabs" class="ecs-overlay-tabs scrollbar scrollbar-sml">
31
31
  <!-- @slot Slot for a tab bar. -->
32
32
  <slot name="tabs"></slot>
@@ -47,8 +47,8 @@
47
47
  </transition>
48
48
  </div>
49
49
  <div v-if="blockContent" class="ecs-overlay-content-block" />
50
- </div>
51
- <div v-if="$slots.footer" class="ecs-overlay-footer">
50
+ </main>
51
+ <footer v-if="$slots.footer" class="ecs-overlay-footer">
52
52
  <div v-if="$slots.tabs" class="spacer-tabs" />
53
53
  <div class="ecs-overlay-footer-content">
54
54
  <div class="ecs-overlay-footer-content-inner" :style="{ width: contentWidth, maxWidth: contentMaxWidth, minWidth: contentMinWidth, paddingLeft: contentPadding, paddingRight: contentPadding }">
@@ -58,7 +58,7 @@
58
58
  <div v-if="$slots.sidebar && width > 1500" class="spacer-sidebar" />
59
59
  <div v-if="footerScrollSpacer" class="spacer-scrollbar" />
60
60
  </div>
61
- </div>
61
+ </footer>
62
62
  </div>
63
63
  </transition>
64
64
  </template>
@@ -1,10 +1,10 @@
1
1
  <template>
2
- <div class="ecs-pagination" :class="[ floating ? 'ecs-pagination-floating' : '' ]">
2
+ <div class="ecs-pagination" :class="[ floating ? 'ecs-pagination-floating' : '' ]" role="navigation" aria-label="Index">
3
3
  <ecs-flex-row :gap="8" class="ecs-pagination-nav" :style="{minWidth: tabsSpacing - 4 + 'px'}">
4
4
  <template v-if="type == 'paginated'">
5
5
  <ecs-flex-row>
6
- <ecs-button @click="$emit('firstPage', $event)" :disabled="loading || currentPage === 1" icon="chevron-double-left" icon-only type="secondary" title="First Page" data-test="pagination-first-button" />
7
- <ecs-button @click="$emit('prevPage', $event)" :disabled="loading || currentPage === 1" icon="chevron-left" icon-only type="secondary" title="Previous Page" data-test="pagination-previous-button" />
6
+ <ecs-button @click="$emit('firstPage', $event)" :disabled="loading || currentPage === 1" icon="chevron-double-left" icon-only type="secondary" title="First Page" aria-label="First Page" data-test="pagination-first-button" />
7
+ <ecs-button @click="$emit('prevPage', $event)" :disabled="loading || currentPage === 1" icon="chevron-left" icon-only type="secondary" title="Previous Page" aria-label="Previous Page" data-test="pagination-previous-button" />
8
8
  </ecs-flex-row>
9
9
  <ecs-flex-row :gap="4">
10
10
  <span>Page</span>
@@ -14,8 +14,8 @@
14
14
  <span v-if="totalPages" class="total">of {{ totalPages }}</span>
15
15
  </ecs-flex-row>
16
16
  <ecs-flex-row>
17
- <ecs-button @click="$emit('nextPage', $event)" :disabled="loading || currentPage === totalPages || totalPages === 0" icon="chevron-right" icon-only type="secondary" title="Next Page" data-test="pagination-next-button" />
18
- <ecs-button @click="$emit('lastPage', $event)" :disabled="loading || currentPage === totalPages || totalPages === 0" icon="chevron-double-right" icon-only type="secondary" title="Last Page" data-test="pagination-last-button" />
17
+ <ecs-button @click="$emit('nextPage', $event)" :disabled="loading || currentPage === totalPages || totalPages === 0" icon="chevron-right" icon-only type="secondary" title="Next Page" aria-label="Next Page" data-test="pagination-next-button" />
18
+ <ecs-button @click="$emit('lastPage', $event)" :disabled="loading || currentPage === totalPages || totalPages === 0" icon="chevron-double-right" icon-only type="secondary" title="Last Page" aria-label="Last Page" data-test="pagination-last-button" />
19
19
  </ecs-flex-row>
20
20
  </template>
21
21
  <template v-else-if="hasRange">
@@ -1,5 +1,9 @@
1
1
  <template>
2
- <ul class="ecs-popover-list" :class="inner ? 'ecs-popover-list-inner' : ''">
2
+ <ul
3
+ class="ecs-popover-list"
4
+ :class="inner ? 'ecs-popover-list-inner' : ''"
5
+ role="menu"
6
+ aria-orientation="vertical">
3
7
  <slot></slot>
4
8
  </ul>
5
9
  </template>
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <li class="ecs-popover-list-title" :class="[sticky ? 'ecs-popover-list-title-sticky' : 'ecs-popover-list-title-default', sticky && $slots.controls ? 'has-controls' : '']">
2
+ <li
3
+ class="ecs-popover-list-title"
4
+ :class="[sticky ? 'ecs-popover-list-title-sticky' : 'ecs-popover-list-title-default', sticky && $slots.controls ? 'has-controls' : '']"
5
+ role="heading">
3
6
  <span>
4
7
  <slot></slot>
5
8
  </span>