@oat-sa/tao-core-ui 1.5.4 → 1.6.3

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 (43) hide show
  1. package/dist/ckeditor/ckConfigurator.js +9 -1
  2. package/dist/mediaEditor/mediaEditorComponent.js +5 -3
  3. package/dist/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +46 -25
  4. package/dist/mediaplayer/css/player.css +104 -14
  5. package/dist/mediaplayer/css/player.css.map +1 -1
  6. package/dist/mediaplayer/players/html5.js +767 -0
  7. package/dist/mediaplayer/players/youtube.js +470 -0
  8. package/dist/mediaplayer/players.js +35 -0
  9. package/dist/mediaplayer/support.js +134 -0
  10. package/dist/mediaplayer/utils/reminder.js +198 -0
  11. package/dist/mediaplayer/utils/timeObserver.js +149 -0
  12. package/dist/mediaplayer/youtubeManager.js +177 -0
  13. package/dist/mediaplayer.js +1251 -1912
  14. package/dist/previewer.js +25 -19
  15. package/package.json +1 -1
  16. package/scss/basic.scss +1 -0
  17. package/scss/inc/_jquery.nouislider.scss +254 -0
  18. package/src/ckeditor/ckConfigurator.js +10 -1
  19. package/src/itemButtonList/css/item-button-list.css +225 -0
  20. package/src/itemButtonList/css/item-button-list.css.map +1 -0
  21. package/src/mediaEditor/mediaEditorComponent.js +25 -26
  22. package/src/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +83 -63
  23. package/src/mediaplayer/css/player.css +104 -14
  24. package/src/mediaplayer/css/player.css.map +1 -1
  25. package/src/mediaplayer/players/html5.js +564 -0
  26. package/src/mediaplayer/players/youtube.js +323 -0
  27. package/src/mediaplayer/players.js +29 -0
  28. package/src/mediaplayer/scss/player.scss +125 -16
  29. package/src/mediaplayer/support.js +126 -0
  30. package/src/mediaplayer/tpl/audio.tpl +6 -0
  31. package/src/mediaplayer/tpl/player.tpl +11 -32
  32. package/src/mediaplayer/tpl/source.tpl +1 -0
  33. package/src/mediaplayer/tpl/video.tpl +6 -0
  34. package/src/mediaplayer/tpl/youtube.tpl +1 -0
  35. package/src/mediaplayer/utils/reminder.js +184 -0
  36. package/src/mediaplayer/utils/timeObserver.js +143 -0
  37. package/src/mediaplayer/youtubeManager.js +161 -0
  38. package/src/mediaplayer.js +1217 -1901
  39. package/src/previewer.js +40 -33
  40. package/src/searchModal/css/advancedSearch.css +190 -0
  41. package/src/searchModal/css/advancedSearch.css.map +1 -0
  42. package/src/searchModal/css/searchModal.css +506 -0
  43. package/src/searchModal/css/searchModal.css.map +1 -0
package/dist/previewer.js CHANGED
@@ -14,7 +14,7 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
14
14
  * @author Bertrand Chevrier <bertrand@taotesting.com>
15
15
  */
16
16
  var ns = 'previewer';
17
- var dataNs = 'ui.' + ns; //the plugin defaults
17
+ var dataNs = "ui.".concat(ns); //the plugin defaults
18
18
 
19
19
  var defaults = {
20
20
  containerClass: 'previewer'
@@ -59,7 +59,7 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
59
59
  * @returns {String} the tags
60
60
  */
61
61
  generate: function generate(type, data) {
62
- var tmpl = this[type + 'Template'];
62
+ var tmpl = this["".concat(type, "Template")];
63
63
  data.jsonurl = JSON.stringify(data.url);
64
64
 
65
65
  if (_.isFunction(tmpl)) {
@@ -83,10 +83,10 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
83
83
  * @constructor
84
84
  * @param {Object} [options] - the plugin options
85
85
  * @returns {jQueryElement} for chaining
86
+ * @fires playerready when the mediaplayer (video) is sucessfully loaded and configured
86
87
  */
87
88
  init: function init(options) {
88
- var self = previewer; //get options using default
89
-
89
+ //get options using default
90
90
  options = _.defaults(options || {}, defaults);
91
91
  return this.each(function () {
92
92
  var $elt = $(this);
@@ -98,14 +98,14 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
98
98
 
99
99
  $elt.data(dataNs, options);
100
100
 
101
- self._update($elt);
101
+ previewer._update($elt);
102
102
  /**
103
103
  * The plugin has been created.
104
104
  * @event previewer#create.previewer
105
105
  */
106
106
 
107
107
 
108
- $elt.trigger('create.' + ns);
108
+ $elt.trigger("create.".concat(ns));
109
109
  } else {
110
110
  $elt.previewer('update', options);
111
111
  }
@@ -131,6 +131,8 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
131
131
 
132
132
  /**
133
133
  * Set the player
134
+ * @param {JQueryElement} $elt
135
+ * @param {Object} player
134
136
  * @private
135
137
  */
136
138
  _setPlayer: function _setPlayer($elt, player) {
@@ -139,6 +141,7 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
139
141
 
140
142
  /**
141
143
  * Uninstalls the player if any
144
+ * @param {JQueryElement} $elt
142
145
  * @private
143
146
  */
144
147
  _clearPlayer: function _clearPlayer($elt) {
@@ -154,13 +157,12 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
154
157
  * @param {jQueryElement} $elt - the current element
155
158
  */
156
159
  _update: function _update($elt) {
157
- var self = previewer;
158
160
  var player;
159
161
  var $content, $controls;
160
162
  var options = $elt.data(dataNs);
161
163
  var content, type;
162
164
 
163
- self._clearPlayer($elt);
165
+ previewer._clearPlayer($elt);
164
166
 
165
167
  if (options) {
166
168
  type = options.type || mimeType.getFileType({
@@ -200,24 +202,28 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
200
202
 
201
203
  if (options.url) {
202
204
  if (type === 'audio' || type === 'video') {
205
+ var defSize = _defaultSize[type] || _defaultSize.video;
206
+ var width = options.width || defSize.width;
207
+ var height = options.height || defSize.height;
203
208
  player = mediaplayer({
204
209
  url: options.url,
205
210
  type: options.mime,
206
- renderTo: $content
211
+ renderTo: $content,
212
+ width: width,
213
+ height: height
207
214
  }).on('ready', function () {
208
- var defSize = _defaultSize[this.getType()] || _defaultSize.video;
209
-
210
- var width = options.width || defSize.width;
211
- var height = options.height || defSize.height;
212
- this.resize(width, height);
215
+ /**
216
+ * @event playerready
217
+ */
218
+ $elt.trigger('playerready');
213
219
  });
214
220
 
215
- self._setPlayer($elt, player); // stop video and free the socket on escape keypress(modal window hides)
221
+ previewer._setPlayer($elt, player); // stop video and free the socket on escape keypress(modal window hides)
216
222
 
217
223
 
218
224
  $('body').off('keydown.mediaelement').on('keydown.mediaelement', function (event) {
219
225
  if (event.keyCode === 27) {
220
- self._clearPlayer($elt);
226
+ previewer._clearPlayer($elt);
221
227
  }
222
228
  }); // stop the video and free the socket on file select from the action icons
223
229
  // stop video, free the socket and remove player interface on video deletion
@@ -230,7 +236,7 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
230
236
  if (!$(this).closest('.mediaplayer').length) {
231
237
  $controls.off('mousedown.mediaelement');
232
238
 
233
- self._clearPlayer($elt);
239
+ previewer._clearPlayer($elt);
234
240
  }
235
241
  });
236
242
  } else if (type === 'pdf') {
@@ -254,7 +260,7 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
254
260
  */
255
261
 
256
262
 
257
- $elt.trigger('update.' + ns);
263
+ $elt.trigger("update.".concat(ns));
258
264
  }
259
265
  },
260
266
 
@@ -276,7 +282,7 @@ define(['jquery', 'lodash', 'i18n', 'core/mimetype', 'core/pluginifier', 'ui/med
276
282
  */
277
283
 
278
284
 
279
- $elt.trigger('destroy.' + ns);
285
+ $elt.trigger("destroy.".concat(ns));
280
286
  });
281
287
  }
282
288
  }; //Register the incrementer to behave as a jQuery plugin.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oat-sa/tao-core-ui",
3
- "version": "1.5.4",
3
+ "version": "1.6.3",
4
4
  "displayName": "TAO Core UI",
5
5
  "description": "UI libraries of TAO",
6
6
  "scripts": {
package/scss/basic.scss CHANGED
@@ -12,3 +12,4 @@
12
12
  @import "inc/forms";
13
13
  @import "inc/flex-grid";
14
14
  @import "inc/report";
15
+ @import "inc/jquery.nouislider";
@@ -0,0 +1,254 @@
1
+ /* Functional styling;
2
+ * These styles are required for noUiSlider to function.
3
+ * You don't need to change these rules to apply your design.
4
+ */
5
+
6
+ .noUi-target,
7
+ .noUi-target * {
8
+ -webkit-touch-callout: none;
9
+ -webkit-user-select: none;
10
+ -ms-touch-action: none;
11
+ -ms-user-select: none;
12
+ -moz-user-select: none;
13
+ -moz-box-sizing: border-box;
14
+ box-sizing: border-box;
15
+ }
16
+ .noUi-base {
17
+ width: 100%;
18
+ height: 100%;
19
+ position: relative;
20
+ }
21
+ .noUi-origin {
22
+ position: absolute;
23
+ right: 0;
24
+ top: 0;
25
+ left: 0;
26
+ bottom: 0;
27
+ }
28
+ .noUi-handle {
29
+ position: relative;
30
+ z-index: 1;
31
+ }
32
+ .noUi-stacking .noUi-handle {
33
+ /* This class is applied to the lower origin when
34
+ its values is > 50%. */
35
+ z-index: 10;
36
+ }
37
+ .noUi-stacking + .noUi-origin {
38
+ /* Fix stacking order in IE7, which incorrectly
39
+ creates a new context for the origins. */
40
+ *z-index: -1;
41
+ }
42
+ .noUi-state-tap .noUi-origin {
43
+ }
44
+ .noUi-state-drag * {
45
+ cursor: inherit !important;
46
+ }
47
+
48
+ /* Slider size and handle placement;
49
+ */
50
+ .noUi-horizontal {
51
+ height: 11px;
52
+ }
53
+ .noUi-horizontal .noUi-handle {
54
+ width: 10px;
55
+ height: 17px;
56
+ left: -5px;
57
+ top: -4px;
58
+ }
59
+
60
+ .noUi-horizontal .noUi-handle:after {
61
+ border-top: 3px solid $uiClickableActiveBg;
62
+ border-left: 5px solid transparent;
63
+ border-right: 5px solid transparent;
64
+ content: "";
65
+ left: 0;
66
+ position: absolute;
67
+ bottom: -3px;
68
+ width: 0;
69
+ }
70
+
71
+ .qti-slider-values{
72
+ margin-top: 6px !important;
73
+ }
74
+
75
+ .noUi-horizontal .noUi-handle {
76
+ &:hover:after {
77
+ border-top: 3px solid $uiClickableHoverBg;
78
+ }
79
+ &.noUi-active {
80
+ &:after {
81
+ border-top-color: $uiClickableHoverBg;
82
+ }
83
+ }
84
+ }
85
+
86
+ .noUi-horizontal.noUi-extended {
87
+ padding: 0 15px;
88
+ }
89
+ .noUi-horizontal.noUi-extended .noUi-origin {
90
+ right: -15px;
91
+ }
92
+ .noUi-vertical {
93
+ width: 11px;
94
+ height: 200px;
95
+ display: inline-block;
96
+ }
97
+ .noUi-vertical .noUi-handle {
98
+ width: 17px;
99
+ height: 10px;
100
+ left: -4px;
101
+ top: -5px;
102
+ }
103
+ .noUi-vertical.noUi-extended {
104
+ padding: 15px 0;
105
+ }
106
+ .noUi-vertical.noUi-extended .noUi-origin {
107
+ bottom: -15px;
108
+ }
109
+
110
+ /* Styling;
111
+ */
112
+ .noUi-background {
113
+ background: $uiGeneralContentBg;
114
+ }
115
+ .noUi-connect {
116
+ background: $uiClickableDefaultBg;
117
+ }
118
+ .noUi-origin {
119
+ }
120
+ .noUi-target {
121
+ @include simple-border()
122
+ }
123
+
124
+ /* Handles and cursors;
125
+ */
126
+ .noUi-dragable {
127
+ cursor: w-resize;
128
+ }
129
+ .noUi-vertical .noUi-dragable {
130
+ cursor: n-resize;
131
+ }
132
+ .noUi-handle {
133
+ background: $uiClickableActiveBg;
134
+ color: $uiClickableActiveBg;
135
+ cursor: default;
136
+ }
137
+
138
+ .noUi-active, .noUi-handle:hover{
139
+ background:$uiClickableHoverBg;
140
+ color: $uiClickableHoverBg;
141
+ }
142
+
143
+ .noUi-handle:after {
144
+ left: 17px;
145
+ }
146
+ .noUi-vertical .noUi-handle:before,
147
+ .noUi-vertical .noUi-handle:after {
148
+ width: 14px;
149
+ height: 1px;
150
+ left: 6px;
151
+ top: 14px;
152
+ }
153
+ .noUi-vertical .noUi-handle:after {
154
+ top: 17px;
155
+ }
156
+
157
+ /* Disabled state;
158
+ */
159
+ [disabled].noUi-connect,
160
+ [disabled] .noUi-connect {
161
+ background: #B8B8B8;
162
+ }
163
+ [disabled] .noUi-handle {
164
+ cursor: not-allowed;
165
+ }
166
+
167
+ .noUi-horizontal {
168
+
169
+ .step-marker {
170
+ position:relative;
171
+ //margin-bottom: 10px;
172
+ span {
173
+ font-size: 10px;
174
+ position: relative;
175
+ display:block;
176
+ float:left;
177
+ text-align:center;
178
+ min-height: 10px;
179
+ &:before {
180
+ width: 1px;
181
+ height: 5px;
182
+ position: absolute;
183
+ content: '';
184
+ background: whiten($textColor, .15);
185
+ left: 50%;
186
+ }
187
+ }
188
+ &:before {
189
+ }
190
+ &.after {
191
+ top: 5px;
192
+ span {
193
+ &:before {
194
+ top: -4px;
195
+ }
196
+ }
197
+ }
198
+ &.before {
199
+ top: -28px;
200
+ span {
201
+ &:before {
202
+ top: 13px;
203
+ }
204
+ }
205
+ }
206
+ }
207
+ }
208
+
209
+ .item-editor-sidebar .noUi-target {
210
+ margin-left: 4px;
211
+ margin-right: 4px;
212
+ }
213
+
214
+ .noUi-vertical-wrapper {
215
+ position: relative;
216
+ display: inline-block;
217
+ .step-marker {
218
+ position:absolute;
219
+ height: 100%;
220
+ top: 0;
221
+ span {
222
+ font-size: 10px;
223
+ position: relative;
224
+ display: block;
225
+ &:before {
226
+ width: 5px;
227
+ height: 1px;
228
+ position: absolute;
229
+ content: '';
230
+ background: whiten($textColor, .15);
231
+ top: 50%;
232
+ }
233
+ }
234
+ &:before {
235
+ }
236
+
237
+ &.after {
238
+ left: 20px;
239
+ span {
240
+ &:before {
241
+ left: -9px;
242
+ }
243
+ }
244
+ }
245
+ &.before {
246
+ span {
247
+ &:before {
248
+ left: -40%;
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+
@@ -25,6 +25,15 @@ import 'ckeditor';
25
25
  */
26
26
  var originalConfig = _.cloneDeep(window.CKEDITOR.config);
27
27
 
28
+ function getUserLanguage() {
29
+ var documentLang = window.document.documentElement.getAttribute('lang');
30
+ var documentLocale = documentLang && documentLang.split('-')[0];
31
+
32
+ return documentLocale;
33
+ }
34
+
35
+ var lang = getUserLanguage();
36
+
28
37
  var ckConfigurator = (function() {
29
38
  /**
30
39
  * Toolbar presets that you normally never would need to change, they can however be overridden with options.toolbar.
@@ -172,7 +181,7 @@ var ckConfigurator = (function() {
172
181
  floatSpaceDockedOffsetY: 0,
173
182
  forcePasteAsPlainText: true,
174
183
  skin: 'tao',
175
- language: 'en',
184
+ language: lang,
176
185
  removePlugins: '',
177
186
  linkShowAdvancedTab: false,
178
187
  justifyClasses: ['txt-lft', 'txt-ctr', 'txt-rgt', 'txt-jty'],
@@ -0,0 +1,225 @@
1
+ /**
2
+ * This program is free software; you can redistribute it and/or
3
+ * modify it under the terms of the GNU General Public License
4
+ * as published by the Free Software Foundation; under version 2
5
+ * of the License (non-upgradable).
6
+ *
7
+ * This program is distributed in the hope that it will be useful,
8
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ * GNU General Public License for more details.
11
+ *
12
+ * You should have received a copy of the GNU General Public License
13
+ * along with this program; if not, write to the Free Software
14
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15
+ *
16
+ * Copyright (c) 2022 Open Assessment Technologies SA ;
17
+ */
18
+ /*
19
+ Usage:
20
+ - linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,
21
+ if 3 colors used then the position of each will be 33,33%
22
+ - linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,
23
+ first param - color, second - position. Also you can use px or other valid units for set position.
24
+ */
25
+ /* Do not edit */
26
+ .buttonlist-items {
27
+ display: flex;
28
+ flex-wrap: wrap;
29
+ justify-content: start;
30
+ padding: 0;
31
+ /****** base styles *******/
32
+ /****** step state styles *******/
33
+ /* disabling is applied at the buttonlist-items level */
34
+ /****** keyboard focus styles *******/
35
+ }
36
+
37
+ .buttonlist-items .buttonlist-item {
38
+ height: 6.25rem;
39
+ width: 6.25rem;
40
+ display: flex;
41
+ justify-content: center;
42
+ /* aligning left - cut focusing board for keyboard interacting */
43
+ align-items: center;
44
+ /* reset parent styles */
45
+ padding: 0;
46
+ border: none;
47
+ }
48
+
49
+ .buttonlist-items .buttonlist-btn {
50
+ position: relative;
51
+ display: flex;
52
+ justify-content: center;
53
+ align-items: center;
54
+ height: 4rem;
55
+ width: 4rem;
56
+ border-style: solid;
57
+ border-radius: 50%;
58
+ border-width: 0.125rem;
59
+ border-color: #737373;
60
+ margin: 1.3rem 0.75rem 1rem 0.75rem;
61
+ padding: 0;
62
+ /*Fixes firefox button jumps*/
63
+ font-weight: bold;
64
+ font-size: 1.6rem;
65
+ background-color: white;
66
+ color: #737373;
67
+ text-shadow: none;
68
+ cursor: pointer;
69
+ }
70
+
71
+ .buttonlist-items .buttonlist-label {
72
+ font-family: 'Nunito Sans', 'Source Sans Pro', Arial, sans-serif;
73
+ max-width: 3.75rem;
74
+ overflow: hidden;
75
+ white-space: nowrap;
76
+ line-height: initial;
77
+ }
78
+
79
+ .buttonlist-items .buttonlist-icon {
80
+ padding: 0;
81
+ top: 0;
82
+ left: 0;
83
+ }
84
+
85
+ .buttonlist-items .indicator {
86
+ display: none;
87
+ }
88
+
89
+ .buttonlist-items .buttonlist-score-badge {
90
+ position: absolute;
91
+ top: -0.9rem;
92
+ right: -0.9rem;
93
+ width: 2rem;
94
+ height: 2rem;
95
+ border-radius: 100%;
96
+ color: white;
97
+ border: 0.1rem solid white;
98
+ display: flex;
99
+ justify-content: center;
100
+ align-items: center;
101
+ }
102
+
103
+ .buttonlist-items .buttonlist-score-icon {
104
+ font-size: 1.2rem;
105
+ padding: 0;
106
+ top: 0;
107
+ left: 0;
108
+ }
109
+
110
+ .buttonlist-items .icon-info::before {
111
+ content: "\e923";
112
+ }
113
+
114
+ .buttonlist-items .icon-flagged::before {
115
+ content: "\e921";
116
+ }
117
+
118
+ .buttonlist-items .icon-correct::before {
119
+ content: "\e69f";
120
+ }
121
+
122
+ .buttonlist-items .icon-incorrect::before {
123
+ content: "\e69e";
124
+ }
125
+
126
+ .buttonlist-items .buttonlist-item {
127
+ -webkit-user-select: none;
128
+ -ms-user-select: none;
129
+ -o-user-select: none;
130
+ user-select: none;
131
+ }
132
+
133
+ .buttonlist-items .buttonlist-item.viewed .buttonlist-btn {
134
+ border-width: 0.25rem;
135
+ color: #1f1f1f;
136
+ border-color: #1f1f1f;
137
+ }
138
+
139
+ .buttonlist-items .buttonlist-item.answered .buttonlist-btn {
140
+ border-width: 0.25rem;
141
+ background-color: #1f1f1f;
142
+ color: white;
143
+ border-color: #1f1f1f;
144
+ }
145
+
146
+ .buttonlist-items .buttonlist-item.buttonlist-item-active .indicator {
147
+ position: absolute;
148
+ display: block;
149
+ z-index: 1;
150
+ color: #1f1f1f;
151
+ height: 1.4rem;
152
+ min-width: 1.6rem;
153
+ top: unset;
154
+ bottom: -1.7rem;
155
+ padding: 0;
156
+ /* centering horizontally */
157
+ left: 50%;
158
+ transform: translateX(-50%);
159
+ }
160
+
161
+ .buttonlist-items .buttonlist-item.correct .buttonlist-score-badge {
162
+ background-color: #0e914b;
163
+ }
164
+
165
+ .buttonlist-items .buttonlist-item.incorrect .buttonlist-score-badge {
166
+ background-color: #ba122b;
167
+ }
168
+
169
+ .buttonlist-items:not(.disabled) .buttonlist-btn:hover {
170
+ background-color: #e6f3ff;
171
+ color: #0057a3;
172
+ border-color: #0057a3;
173
+ }
174
+
175
+ .buttonlist-items.disabled {
176
+ /* reset global styles */
177
+ background-color: unset !important;
178
+ opacity: 1 !important;
179
+ text-shadow: none !important;
180
+ }
181
+
182
+ .buttonlist-items.disabled .buttonlist-btn {
183
+ cursor: not-allowed;
184
+ /* reset global styles */
185
+ opacity: 0.5;
186
+ text-shadow: none;
187
+ }
188
+
189
+ .buttonlist-items .buttonlist-item.key-navigation-highlight .buttonlist-btn::before,
190
+ .buttonlist-items .buttonlist-item .buttonlist-btn.buttonlist-btn-focus:focus::before {
191
+ content: '';
192
+ display: block;
193
+ position: absolute;
194
+ width: 5.2rem;
195
+ height: 5.2rem;
196
+ left: 50%;
197
+ top: 50%;
198
+ transform: translate(-50%, -50%);
199
+ border-width: 0.25rem;
200
+ border-color: #0057a3;
201
+ border-style: dotted;
202
+ border-radius: 50%;
203
+ }
204
+
205
+ .buttonlist-items .buttonlist-item.key-navigation-highlight.buttonlist-item-active .buttonlist-btn .indicator,
206
+ .buttonlist-items .buttonlist-item.buttonlist-item-active .buttonlist-btn.buttonlist-btn-focus:focus .indicator,
207
+ .buttonlist-items .buttonlist-item.buttonlist-item-active .buttonlist-btn:focus-visible .indicator {
208
+ color: #0057a3;
209
+ }
210
+
211
+ .buttonlist-items .buttonlist-item.key-navigation-highlight.viewed .buttonlist-btn,
212
+ .buttonlist-items .buttonlist-item.viewed .buttonlist-btn.buttonlist-btn-focus:focus {
213
+ background-color: white;
214
+ color: #0057a3;
215
+ border-color: #0057a3;
216
+ }
217
+
218
+ .buttonlist-items .buttonlist-item.key-navigation-highlight.answered .buttonlist-btn,
219
+ .buttonlist-items .buttonlist-item.answered .buttonlist-btn.buttonlist-btn-focus:focus {
220
+ background-color: #0057a3;
221
+ color: white;
222
+ border-color: #0057a3;
223
+ }
224
+
225
+ /*# sourceMappingURL=item-button-list.css.map */