@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
@@ -1,5 +1,9 @@
1
1
  <template>
2
- <div class="ecs-tab-pane" :class="[ show ? 'show' : '', flex ? 'ecs-tab-pane-flex' :'', directionClass ]">
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>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="ecs-tab-bar" :class="[
2
+ <div class="ecs-tab-bar" role="tablist" :class="[
3
3
  typeClass,
4
4
  directionClass
5
5
  ]"
@@ -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,5 +1,6 @@
1
1
  <template>
2
- <div class="ecs-tab-content" :class="[fill ? 'ecs-tab-content-fill' : '']">
2
+ <div class="ecs-tab-content"
3
+ :class="[fill ? 'ecs-tab-content-fill' : '']">
3
4
  <slot></slot>
4
5
  </div>
5
6
  </template>
@@ -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
- @click="handleClick">
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 d-flex flex-wrap">
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-small;
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-x-small;
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 class="ecs-toasts">
2
+ <div class="ecs-toasts" aria-live="polite">
3
3
  <transition-group name="transition-toast">
4
4
  <slot></slot>
5
5
  </transition-group>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="ecs-toolbar">
2
+ <div class="ecs-toolbar" role="toolbar" aria-label="Main">
3
3
  <slot></slot>
4
4
  </div>
5
5
  </template>
@@ -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 class="ecs-tree-view-entry"
4
- :class="[
5
- selectable ? 'selectable' : '',
6
- draggable ? 'draggable' : '',
7
- large ? 'ecs-tree-view-entry-lg' : '',
8
- actionsOnHover ? 'actions-hover' : '',
9
- stateClass
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" :class="isVisible ? 'collapse-show' : 'collapse-hide'">
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
- padding-left: 2px;
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="desc">Descending</ecs-sortbutton>
13
- <ecs-sortbutton sort="asc">Ascending</ecs-sortbutton>
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="desc">Descending</ecs-sortbutton>
22
- <ecs-sortbutton inline sort="asc">Ascending</ecs-sortbutton>
21
+ <ecs-sortbutton inline sort="descending">Descending</ecs-sortbutton>
22
+ <ecs-sortbutton inline sort="ascending">Ascending</ecs-sortbutton>
23
23
  </main>`,
24
24
  });