@oat-sa/tao-core-ui 1.46.0 → 1.49.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 (216) hide show
  1. package/dist/actionbar.js +5 -11
  2. package/dist/adder.js +34 -6
  3. package/dist/animable/absorbable/absorbable.js +5 -11
  4. package/dist/animable/absorbable/css/absorb.css.map +1 -1
  5. package/dist/animable/pulsable/css/pulse.css.map +1 -1
  6. package/dist/animable/pulsable/pulsable.js +5 -11
  7. package/dist/autocomplete/css/autocomplete.css.map +1 -1
  8. package/dist/badge/badge.js +5 -11
  9. package/dist/badge/css/badge.css.map +1 -1
  10. package/dist/breadcrumbs/css/breadcrumbs.css +2 -2
  11. package/dist/breadcrumbs/css/breadcrumbs.css.map +1 -1
  12. package/dist/breadcrumbs.js +5 -11
  13. package/dist/bulkActionPopup/css/bulkActionPopup.css.map +1 -1
  14. package/dist/bulkActionPopup.js +5 -11
  15. package/dist/button.js +5 -11
  16. package/dist/calculator/css/calculator.css.map +1 -1
  17. package/dist/cascadingComboBox.js +5 -11
  18. package/dist/ckeditor/ckConfigurator.js +22 -6
  19. package/dist/class/css/selector.css +2 -2
  20. package/dist/class/css/selector.css.map +1 -1
  21. package/dist/class/selector.js +5 -11
  22. package/dist/component/css/components.css +7 -7
  23. package/dist/component/css/components.css.map +1 -1
  24. package/dist/component/css/windowComponent.css.map +1 -1
  25. package/dist/component/windowed.js +5 -11
  26. package/dist/component.js +5 -11
  27. package/dist/contextualPopup/css/contextualPopup.css.map +1 -1
  28. package/dist/contextualPopup.js +5 -11
  29. package/dist/dashboard/css/dashboard.css.map +1 -1
  30. package/dist/dashboard.js +5 -11
  31. package/dist/datalist/css/datalist.css +2 -2
  32. package/dist/datalist/css/datalist.css.map +1 -1
  33. package/dist/datalist.js +5 -11
  34. package/dist/datatable/css/datatable.css +1 -1
  35. package/dist/datatable/css/datatable.css.map +1 -1
  36. package/dist/datatable.js +5 -11
  37. package/dist/dateRange/css/dateRange.css.map +1 -1
  38. package/dist/dateRange/dateRange.js +5 -11
  39. package/dist/datetime/css/picker.css.map +1 -1
  40. package/dist/datetime/picker.js +5 -11
  41. package/dist/deleter.js +5 -11
  42. package/dist/destination/css/selector.css.map +1 -1
  43. package/dist/destination/selector.js +5 -11
  44. package/dist/dialog/confirmDelete.js +5 -11
  45. package/dist/dialog.js +5 -11
  46. package/dist/documentViewer/css/documentViewer.css.map +1 -1
  47. package/dist/documentViewer/providers/pdfViewer/fallback/viewer.js +5 -11
  48. package/dist/documentViewer/providers/pdfViewer/pdfjs/findBar.js +5 -11
  49. package/dist/documentViewer/providers/pdfViewer/pdfjs/pageView.js +5 -11
  50. package/dist/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +5 -11
  51. package/dist/documentViewer/providers/pdfViewer/pdfjs/viewer.js +5 -11
  52. package/dist/documentViewer/providers/pdfViewer.js +5 -11
  53. package/dist/documentViewer.js +5 -11
  54. package/dist/dropdown/css/dropdown.css.map +1 -1
  55. package/dist/dropdown.js +5 -11
  56. package/dist/dynamicComponent/css/dynamicComponent.css +1 -1
  57. package/dist/dynamicComponent/css/dynamicComponent.css.map +1 -1
  58. package/dist/dynamicComponent.js +5 -11
  59. package/dist/feedback.js +5 -11
  60. package/dist/filter.js +5 -11
  61. package/dist/form/css/dropdownForm.css +1 -1
  62. package/dist/form/css/dropdownForm.css.map +1 -1
  63. package/dist/form/css/form.css.map +1 -1
  64. package/dist/form/dropdownForm.js +5 -11
  65. package/dist/form/form.js +5 -11
  66. package/dist/form/validator/css/validator.css.map +1 -1
  67. package/dist/form/validator/renderer.js +5 -11
  68. package/dist/form/widget/css/widget.css.map +1 -1
  69. package/dist/form/widget/providers/checkBox.js +5 -11
  70. package/dist/form/widget/providers/comboBox.js +5 -11
  71. package/dist/form/widget/providers/hidden.js +5 -11
  72. package/dist/form/widget/providers/hiddenBox.js +5 -11
  73. package/dist/form/widget/providers/radioBox.js +5 -11
  74. package/dist/form/widget/providers/textArea.js +5 -11
  75. package/dist/form/widget/widget.js +5 -11
  76. package/dist/generis/form/css/form.css.map +1 -1
  77. package/dist/generis/form/form.js +5 -11
  78. package/dist/generis/validator/css/validator.css.map +1 -1
  79. package/dist/generis/validator/validator.js +5 -11
  80. package/dist/generis/widget/checkBox/checkBox.js +5 -11
  81. package/dist/generis/widget/comboBox/comboBox.js +5 -11
  82. package/dist/generis/widget/css/widget.css.map +1 -1
  83. package/dist/generis/widget/hiddenBox/hiddenBox.js +5 -11
  84. package/dist/generis/widget/textBox/textBox.js +5 -11
  85. package/dist/generis/widget/widget.js +5 -11
  86. package/dist/groupedComboBox.js +5 -11
  87. package/dist/highlighter.js +5 -11
  88. package/dist/itemButtonList/css/item-button-list.css +225 -0
  89. package/dist/itemButtonList/css/item-button-list.css.map +1 -0
  90. package/dist/itemButtonList.js +451 -0
  91. package/dist/listbox/css/listbox.css.map +1 -1
  92. package/dist/listbox.js +5 -11
  93. package/dist/loadingButton/css/button.css.map +1 -1
  94. package/dist/loadingButton/loadingButton.js +5 -11
  95. package/dist/lock.js +5 -11
  96. package/dist/login/login.js +5 -11
  97. package/dist/maths/calculator/basicCalculator.js +5 -11
  98. package/dist/maths/calculator/core/board.js +5 -11
  99. package/dist/maths/calculator/core/expression.js +5 -11
  100. package/dist/maths/calculator/core/labels.js +5 -11
  101. package/dist/maths/calculator/core/tokens.js +5 -11
  102. package/dist/maths/calculator/css/calculator.css.map +1 -1
  103. package/dist/maths/calculator/plugins/keyboard/templateKeyboard/templateKeyboard.js +5 -11
  104. package/dist/maths/calculator/plugins/screen/simpleScreen/simpleScreen.js +5 -11
  105. package/dist/maths/calculator/scientificCalculator.js +5 -11
  106. package/dist/mediaEditor/mediaEditorComponent.js +5 -11
  107. package/dist/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +5 -11
  108. package/dist/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +5 -11
  109. package/dist/mediaplayer/css/player.css.map +1 -1
  110. package/dist/mediaplayer/players/html5.js +5 -11
  111. package/dist/mediaplayer/players/youtube.js +5 -11
  112. package/dist/mediaplayer.js +5 -11
  113. package/dist/mediasizer.js +5 -11
  114. package/dist/pageSizeSelector.js +5 -11
  115. package/dist/pagination/css/pagination.css.map +1 -1
  116. package/dist/pagination/providers/pages.js +5 -11
  117. package/dist/pagination/providers/simple.js +5 -11
  118. package/dist/report.js +5 -11
  119. package/dist/resource/css/selector.css +4 -4
  120. package/dist/resource/css/selector.css.map +1 -1
  121. package/dist/resource/filters.js +5 -11
  122. package/dist/resource/list.js +5 -11
  123. package/dist/resource/selector.js +5 -11
  124. package/dist/resource/tree.js +5 -11
  125. package/dist/resourcemgr/css/resourcemgr.css +3 -3
  126. package/dist/resourcemgr/css/resourcemgr.css.map +1 -1
  127. package/dist/resourcemgr/fileBrowser.js +5 -11
  128. package/dist/resourcemgr/fileSelector.js +5 -11
  129. package/dist/resourcemgr.js +5 -11
  130. package/dist/searchModal/advancedSearch.js +5 -11
  131. package/dist/searchModal/css/advancedSearch.css.map +1 -1
  132. package/dist/searchModal/css/searchModal.css.map +1 -1
  133. package/dist/searchModal.js +14 -32
  134. package/dist/switch/css/switch.css.map +1 -1
  135. package/dist/switch/switch.js +5 -11
  136. package/dist/tabs/css/tabs.css.map +1 -1
  137. package/dist/tabs.js +5 -11
  138. package/dist/taskQueue/css/taskQueue.css.map +1 -1
  139. package/dist/taskQueue/status.js +5 -11
  140. package/dist/taskQueue/table.js +5 -11
  141. package/dist/taskQueueButton/css/taskable.css.map +1 -1
  142. package/dist/taskQueueButton/css/treeButton.css.map +1 -1
  143. package/dist/taskQueueButton/taskable.js +5 -11
  144. package/dist/taskQueueButton/treeButton.js +5 -11
  145. package/dist/tooltip.js +5 -11
  146. package/dist/tristateCheckboxGroup/css/tristateCheckboxGroup.css.map +1 -1
  147. package/dist/tristateCheckboxGroup.js +5 -11
  148. package/dist/uploader.js +5 -11
  149. package/dist/validator.js +5 -11
  150. package/dist/waitingDialog/css/waitingDialog.css.map +1 -1
  151. package/package.json +3 -4
  152. package/scss/font/tao/tao.svg +5 -4
  153. package/scss/font/tao/tao.ttf +0 -0
  154. package/scss/font/tao/tao.woff +0 -0
  155. package/scss/inc/fonts/_tao-icon-classes.scss +8 -7
  156. package/scss/inc/fonts/_tao-icon-def.scss +3 -3
  157. package/scss/inc/fonts/_tao-icon-vars.scss +9 -8
  158. package/src/adder.js +42 -17
  159. package/src/animable/absorbable/css/absorb.css.map +1 -1
  160. package/src/animable/pulsable/css/pulse.css.map +1 -1
  161. package/src/autocomplete/css/autocomplete.css.map +1 -1
  162. package/src/badge/css/badge.css.map +1 -1
  163. package/src/breadcrumbs/css/breadcrumbs.css +2 -2
  164. package/src/breadcrumbs/css/breadcrumbs.css.map +1 -1
  165. package/src/bulkActionPopup/css/bulkActionPopup.css.map +1 -1
  166. package/src/calculator/css/calculator.css.map +1 -1
  167. package/src/ckeditor/ckConfigurator.js +46 -26
  168. package/src/class/css/selector.css +2 -2
  169. package/src/class/css/selector.css.map +1 -1
  170. package/src/component/css/components.css +7 -7
  171. package/src/component/css/components.css.map +1 -1
  172. package/src/component/css/windowComponent.css.map +1 -1
  173. package/src/contextualPopup/css/contextualPopup.css.map +1 -1
  174. package/src/dashboard/css/dashboard.css.map +1 -1
  175. package/src/datalist/css/datalist.css +2 -2
  176. package/src/datalist/css/datalist.css.map +1 -1
  177. package/src/datatable/css/datatable.css +1 -1
  178. package/src/datatable/css/datatable.css.map +1 -1
  179. package/src/dateRange/css/dateRange.css.map +1 -1
  180. package/src/datetime/css/picker.css.map +1 -1
  181. package/src/destination/css/selector.css.map +1 -1
  182. package/src/documentViewer/css/documentViewer.css.map +1 -1
  183. package/src/dropdown/css/dropdown.css.map +1 -1
  184. package/src/dynamicComponent/css/dynamicComponent.css +1 -1
  185. package/src/dynamicComponent/css/dynamicComponent.css.map +1 -1
  186. package/src/form/css/dropdownForm.css +1 -1
  187. package/src/form/css/dropdownForm.css.map +1 -1
  188. package/src/form/css/form.css.map +1 -1
  189. package/src/form/validator/css/validator.css.map +1 -1
  190. package/src/form/widget/css/widget.css.map +1 -1
  191. package/src/generis/form/css/form.css.map +1 -1
  192. package/src/generis/validator/css/validator.css.map +1 -1
  193. package/src/generis/widget/css/widget.css.map +1 -1
  194. package/src/itemButtonList/css/item-button-list.css +225 -0
  195. package/src/itemButtonList/css/item-button-list.css.map +1 -0
  196. package/src/itemButtonList/scss/item-button-list.scss +232 -0
  197. package/src/itemButtonList/tpl/itemButtonList.tpl +23 -0
  198. package/src/itemButtonList.js +220 -0
  199. package/src/listbox/css/listbox.css.map +1 -1
  200. package/src/loadingButton/css/button.css.map +1 -1
  201. package/src/maths/calculator/css/calculator.css.map +1 -1
  202. package/src/mediaplayer/css/player.css.map +1 -1
  203. package/src/pagination/css/pagination.css.map +1 -1
  204. package/src/resource/css/selector.css +4 -4
  205. package/src/resource/css/selector.css.map +1 -1
  206. package/src/resourcemgr/css/resourcemgr.css +3 -3
  207. package/src/resourcemgr/css/resourcemgr.css.map +1 -1
  208. package/src/searchModal/css/advancedSearch.css.map +1 -1
  209. package/src/searchModal/css/searchModal.css.map +1 -1
  210. package/src/switch/css/switch.css.map +1 -1
  211. package/src/tabs/css/tabs.css.map +1 -1
  212. package/src/taskQueue/css/taskQueue.css.map +1 -1
  213. package/src/taskQueueButton/css/taskable.css.map +1 -1
  214. package/src/taskQueueButton/css/treeButton.css.map +1 -1
  215. package/src/tristateCheckboxGroup/css/tristateCheckboxGroup.css.map +1 -1
  216. package/src/waitingDialog/css/waitingDialog.css.map +1 -1
@@ -0,0 +1,232 @@
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
+ @import "inc/bootstrap";
19
+
20
+ $correctColor: $success;
21
+ $incorrectColor: $error;
22
+ $hoverBgColor: hsl(208, 100%, 95%);
23
+
24
+ $radiusCircular: 50%;
25
+ $sizeDefault: 4rem;
26
+ $hitboxSize: 6.25rem;
27
+ $borderThin: 0.125rem;
28
+ $borderMedium: 0.25rem;
29
+
30
+ .buttonlist-items {
31
+ display: flex;
32
+ flex-wrap: wrap;
33
+ justify-content: start;
34
+ padding: 0;
35
+
36
+ /****** base styles *******/
37
+ .buttonlist-item {
38
+ height: $hitboxSize;
39
+ width: $hitboxSize;
40
+ display: flex;
41
+ justify-content: center; /* aligning left - cut focusing board for keyboard interacting */
42
+ align-items: center;
43
+ /* reset parent styles */
44
+ padding: 0;
45
+ border: none;
46
+ }
47
+
48
+ .buttonlist-btn {
49
+ position: relative;
50
+ display: flex;
51
+ justify-content: center;
52
+ align-items: center;
53
+ height: $sizeDefault;
54
+ width: $sizeDefault;
55
+ border-style: solid;
56
+ border-radius: $radiusCircular;
57
+ border-width: $borderThin;
58
+ border-color: $uiReviewPanelTextDisabled;
59
+ margin: 1.3rem 0.75rem 1rem 0.75rem;
60
+ padding: 0; /*Fixes firefox button jumps*/
61
+ font-weight: bold;
62
+ font-size: 1.6rem;
63
+ background-color: $uiReviewPanelBgDefault;
64
+ color: $uiReviewPanelTextDisabled;
65
+ text-shadow: none;
66
+ cursor: pointer;
67
+ }
68
+
69
+ .buttonlist-label {
70
+ font-family: 'Nunito Sans', 'Source Sans Pro', Arial, sans-serif;
71
+ max-width: 3.75rem;
72
+ overflow: hidden;
73
+ white-space: nowrap;
74
+ line-height: initial;
75
+ }
76
+
77
+ .buttonlist-icon {
78
+ padding: 0;
79
+ top: 0;
80
+ left: 0;
81
+ }
82
+
83
+ .indicator {
84
+ display: none;
85
+ }
86
+
87
+ .buttonlist-score-badge {
88
+ position: absolute;
89
+ top: -0.9rem;
90
+ right: -0.9rem;
91
+ width: 2rem;
92
+ height: 2rem;
93
+ border-radius: 100%;
94
+ color: $uiReviewPanelTextInverted;
95
+ border: 0.1rem solid $uiReviewPanelTextInverted;
96
+ display: flex;
97
+ justify-content: center;
98
+ align-items: center;
99
+ }
100
+
101
+ .buttonlist-score-icon {
102
+ font-size: 1.2rem;
103
+ padding: 0;
104
+ top: 0;
105
+ left: 0;
106
+ }
107
+
108
+ .icon-info::before {
109
+ @include icon-info-bare;
110
+ }
111
+ .icon-flagged::before {
112
+ @include icon-bookmark;
113
+ }
114
+ .icon-correct::before {
115
+ @include icon-result-ok;
116
+ }
117
+ .icon-incorrect::before {
118
+ @include icon-result-nok;
119
+ }
120
+
121
+
122
+ /****** step state styles *******/
123
+ .buttonlist-item {
124
+ @include disableSelect();
125
+
126
+ &.viewed {
127
+ .buttonlist-btn {
128
+ border-width: $borderMedium;
129
+ color: $uiReviewPanelTextDefault;
130
+ border-color: $uiReviewPanelTextDefault;
131
+ }
132
+ }
133
+ &.answered {
134
+ .buttonlist-btn {
135
+ border-width: $borderMedium;
136
+ background-color: $uiReviewPanelBgInverted;
137
+ color: $uiReviewPanelTextInverted;
138
+ border-color: $uiReviewPanelBgInverted;
139
+ }
140
+ }
141
+ &.buttonlist-item-active {
142
+ .indicator {
143
+ position: absolute;
144
+ display: block;
145
+ z-index: 1;
146
+ color: $uiReviewPanelTextDefault;
147
+ height: 1.4rem;
148
+ min-width: 1.6rem;
149
+ top: unset;
150
+ bottom: -1.7rem;
151
+ padding: 0;
152
+ /* centering horizontally */
153
+ left: 50%;
154
+ transform: translateX(-50%);
155
+ }
156
+ }
157
+
158
+ &.correct {
159
+ .buttonlist-score-badge {
160
+ background-color: $correctColor;
161
+ }
162
+ }
163
+
164
+ &.incorrect {
165
+ .buttonlist-score-badge {
166
+ background-color: $incorrectColor;
167
+ }
168
+ }
169
+
170
+ }
171
+
172
+ /* disabling is applied at the buttonlist-items level */
173
+ &:not(.disabled) {
174
+ .buttonlist-btn:hover {
175
+ background-color: $hoverBgColor;
176
+ color: $uiReviewPanelPrimaryHighlight;
177
+ border-color: $uiReviewPanelPrimaryHighlight;
178
+ }
179
+ }
180
+ &.disabled {
181
+ /* reset global styles */
182
+ background-color: unset !important;
183
+ opacity: 1 !important;
184
+ text-shadow: none !important;
185
+
186
+ .buttonlist-btn {
187
+ cursor: not-allowed;
188
+ /* reset global styles */
189
+ opacity: 0.5;
190
+ text-shadow: none;
191
+ }
192
+ }
193
+
194
+ /****** keyboard focus styles *******/
195
+ .buttonlist-item {
196
+ &.key-navigation-highlight .buttonlist-btn::before,
197
+ .buttonlist-btn.buttonlist-btn-focus:focus::before {
198
+ content: '';
199
+ display: block;
200
+ position: absolute;
201
+ width: 5.2rem;
202
+ height: 5.2rem;
203
+ left: 50%;
204
+ top: 50%;
205
+ transform: translate(-50%, -50%);
206
+ border-width: $borderMedium;
207
+ border-color: $uiReviewPanelPrimaryHighlight;
208
+ border-style: dotted;
209
+ border-radius: $radiusCircular;
210
+ }
211
+
212
+ &.key-navigation-highlight.buttonlist-item-active .buttonlist-btn .indicator,
213
+ &.buttonlist-item-active .buttonlist-btn.buttonlist-btn-focus:focus .indicator,
214
+ &.buttonlist-item-active .buttonlist-btn:focus-visible .indicator {
215
+ color: $uiReviewPanelPrimaryHighlight;
216
+ }
217
+
218
+ &.key-navigation-highlight.viewed .buttonlist-btn,
219
+ &.viewed .buttonlist-btn.buttonlist-btn-focus:focus {
220
+ background-color: $uiReviewPanelBgDefault;
221
+ color: $uiReviewPanelPrimaryHighlight;
222
+ border-color: $uiReviewPanelPrimaryHighlight;
223
+ }
224
+
225
+ &.key-navigation-highlight.answered .buttonlist-btn,
226
+ &.answered .buttonlist-btn.buttonlist-btn-focus:focus {
227
+ background-color: $uiReviewPanelPrimaryHighlight;
228
+ color: $uiReviewPanelTextInverted;
229
+ border-color: $uiReviewPanelPrimaryHighlight;
230
+ }
231
+ }
232
+ }
@@ -0,0 +1,23 @@
1
+ <ol class="buttonlist-items">
2
+ {{#each items}}
3
+ <li class="buttonlist-item {{status}} {{#if scoreType}}{{scoreType}}{{/if}} {{#if ../disabled}}disabled{{/if}}" data-id="{{id}}">
4
+ <button class="buttonlist-btn"
5
+ role="link"
6
+ aria-label="{{ariaLabel}}"
7
+ {{#if ../disabled}}aria-disabled="true"{{/if}}
8
+ data-id="{{id}}">
9
+ <span class="icon-indicator indicator" aria-hidden="true"></span>
10
+ {{#if scoreType}}
11
+ <span class="buttonlist-score-badge">
12
+ <span class="buttonlist-score-icon icon-{{scoreType}}" aria-hidden="true"></span>
13
+ </span>
14
+ {{/if}}
15
+ {{#if icon}}
16
+ <span class="buttonlist-icon icon-{{icon}}" aria-hidden="true"></span>
17
+ {{else}}
18
+ <span class="buttonlist-label" aria-hidden="true">{{numericLabel}}</span>
19
+ {{/if}}
20
+ </button>
21
+ </li>
22
+ {{/each}}
23
+ </ol>
@@ -0,0 +1,220 @@
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
+ import $ from 'jquery';
19
+ import autoscroll from 'ui/autoscroll';
20
+ import componentFactory from 'ui/component';
21
+ import itemButtonListTpl from 'ui/itemButtonList/tpl/itemButtonList';
22
+ import 'ui/itemButtonList/css/item-button-list.css';
23
+
24
+ /**
25
+ * CSS classes involved in the component
26
+ * @type {Object}
27
+ */
28
+ const cssClasses = {
29
+ active: 'buttonlist-item-active',
30
+ keyfocused: 'buttonlist-btn-focus'
31
+ };
32
+
33
+ /**
34
+ * CSS selectors that match some particular elements
35
+ * @type {Object}
36
+ */
37
+ const cssSelectors = {
38
+ active: `.${cssClasses.active}`,
39
+ keyfocused: `.${cssClasses.keyfocused}`,
40
+ navigable: '.buttonlist-btn',
41
+ itemById: (id) => `.buttonlist-item[data-id="${id}"]`,
42
+ navigableById: (id) => `.buttonlist-btn[data-id="${id}"]`
43
+ };
44
+
45
+ /**
46
+ * @typedef {Object} ItemButton
47
+ * @property {String} id - item id
48
+ * @property {Number} position - 0-based list index
49
+ * @property {String} numericLabel - displayed number
50
+ * @property {String} ariaLabel
51
+ * @property {String} status - 'answered'/'viewed'/'unseen'
52
+ * @property {String} scoreType - 'correct'/'incorrect'/null
53
+ * @property {String} icon - 'info' or null
54
+ */
55
+ /**
56
+ * Item Button List
57
+ * Ordered list of buttons representing items from a testMap section
58
+ * Mostly presentational component
59
+ *
60
+ * @param {Object} config
61
+ * @param {ItemButton[]} [config.items] - The list of entries to display
62
+ * @returns {component}
63
+ * @fires ready - When the component is ready to work
64
+ * @fires click When an item is selected by the user
65
+ */
66
+ function itemButtonListFactory(config = {}) {
67
+ let component;
68
+ let activeItemId = null;
69
+
70
+ /**
71
+ * Selects the active item
72
+ * @param {String|null} itemId
73
+ */
74
+ const selectItem = itemId => {
75
+ // first deactivate already active elements
76
+ component.getElement().find(cssSelectors.active)
77
+ .removeClass(cssClasses.active);
78
+ component.getElement().find(cssSelectors.navigable)
79
+ .removeAttr('aria-current');
80
+
81
+ // activate element
82
+ if (itemId) {
83
+ const $target = component.getElement().find(cssSelectors.itemById(itemId));
84
+ if ($target.length) {
85
+ $target.addClass(cssClasses.active);
86
+ // finally make sure the item is visible
87
+ autoscroll($target, component.getElement());
88
+ }
89
+ const $ariaTarget = component.getElement().find(cssSelectors.navigableById(itemId));
90
+ if ($ariaTarget.length) {
91
+ $ariaTarget.attr('aria-current', 'location');
92
+ }
93
+ }
94
+ };
95
+
96
+ /**
97
+ * 'tabfocus' styling, for Safari until :focus-visible supported
98
+ * @param {jQuery|null} $target
99
+ */
100
+ const setFocusStyle = $target => {
101
+ component.getElement()
102
+ .find(cssSelectors.keyfocused)
103
+ .removeClass(cssClasses.keyfocused);
104
+
105
+ if ($target && $target.length) {
106
+ $target.addClass(cssClasses.keyfocused);
107
+ }
108
+ };
109
+
110
+ /**
111
+ * Apply a callback on each navigable element
112
+ * @param {*} callback
113
+ */
114
+ const eachNavigable = callback => {
115
+ component.getElement()
116
+ .find(cssSelectors.navigable)
117
+ .each(callback);
118
+ };
119
+
120
+ /**
121
+ * Enables the keyboard navigation using 'tab' keys
122
+ */
123
+ const enableKeyboard = () => {
124
+ eachNavigable((index, el) => el.removeAttribute('tabindex'));
125
+ };
126
+
127
+ /**
128
+ * Disables the keyboard navigation using 'tab' keys
129
+ */
130
+ const disableKeyboard = () => {
131
+ eachNavigable((index, el) => el.setAttribute('tabindex', -1));
132
+ setFocusStyle(null);
133
+ };
134
+
135
+ /**
136
+ * Emits the click event detailing the clicked item
137
+ * The active item change should be handled by the consumer through the API, in case it is conditional or asynchronous
138
+ * @param {String} itemId
139
+ */
140
+ const onClick = (itemId) => {
141
+ /**
142
+ * @event click
143
+ * @param {String} itemId
144
+ * @param {Number} position
145
+ */
146
+ component.trigger('click', { id: itemId });
147
+ };
148
+
149
+ /**
150
+ * Defines the buttonList API
151
+ * @type {buttonList}
152
+ */
153
+ const api = {
154
+ /**
155
+ * Sets the active item
156
+ * @param {String} itemId
157
+ * @returns {buttonList}
158
+ */
159
+ setActiveItem(itemId) {
160
+ activeItemId = itemId;
161
+ if (this.is('rendered')) {
162
+ selectItem(itemId);
163
+ }
164
+ return this;
165
+ }
166
+ };
167
+
168
+ /**
169
+ * @typedef {component} buttonList
170
+ */
171
+ component = componentFactory(api, {})
172
+ // set the component's layout
173
+ .setTemplate(itemButtonListTpl)
174
+ // renders the component
175
+ .on('render', function onItemButtonListRender() {
176
+ // 'tabfocus' detection, for Safari until :focus-visible supported
177
+ this.getElement().on('keydown', cssSelectors.navigable, e => {
178
+ if (e.key === 'Tab') {
179
+ setFocusStyle(null);
180
+ }
181
+ });
182
+ this.getElement().on('keyup', cssSelectors.navigable, e => {
183
+ if (e.key === 'Tab') {
184
+ setFocusStyle($(e.target));
185
+ }
186
+ });
187
+
188
+ component.getElement().on('click', cssSelectors.navigable, e => {
189
+ if (!this.is('disabled')) {
190
+ onClick(e.currentTarget.dataset.id);
191
+ }
192
+ });
193
+
194
+ selectItem(activeItemId);
195
+
196
+ if (!this.is('disabled')) {
197
+ enableKeyboard();
198
+ } else {
199
+ disableKeyboard();
200
+ }
201
+
202
+ /**
203
+ * @event ready
204
+ */
205
+ this.setState('ready', true)
206
+ .trigger('ready');
207
+ })
208
+
209
+ // reflect enable/disabled state
210
+ .on('enable', () => enableKeyboard)
211
+ .on('disable', () => disableKeyboard);
212
+
213
+ // initialize the component with the provided config:
214
+ // config also contains data passed to template when rendering
215
+ component.init(config);
216
+
217
+ return component;
218
+ }
219
+
220
+ export default itemButtonListFactory;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../scss/inc/_functions.scss","../scss/listbox.scss","../../../scss/inc/fonts/_tao-icon-vars.scss","../../../scss/inc/_variables.scss","../../../scss/inc/_colors.scss"],"names":[],"mappings":"AAaA;;;;;;CCPC;ACND,gBAAA;ADMA;IACE,iBAAiB;IACjB,YAAY;AAGd;;AALA;IAKI,0CEFuC;IH+MnC,eAAyB;IACzB,iBAA+B;IC5MnC,mBAAmB;AAKvB;;AAZA;IAUI,0CEPuC;IH+MnC,eAAyB;IACzB,iBAA+B;ICvMnC,mBAAmB;AAOvB;;AAnBA;IAgBI,WAAW;AAOf;;AAvBA;IDuGI,sBAD6B;IAE7B,kBAAkB;IAClB,0BAA0B;ICpF1B,mBGE0B;IHD1B,mBAAmB;IACnB,aAAa;IACb,kBAAkB;AAStB;;AAjCA;IDkNQ,eAAyB;IACzB,eAA+B;ICrLjC,kBAAkB;IAClB,cGnCiB;IHoCjB,6BAA6B;AASnC;;AAzCA;IAmCM,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,2BAA2B;IAC3B,iBAAiB;IACjB,gBAAgB;IAChB,wBAAwB;IACxB,cD2I4C;IC1I5C,UAAU;AAUhB;;AArDA;IA6CQ,cGjDe;AH6DvB;;AAzDA;IAgDU,kBAAkB;AAa5B;;AA7DA;IAoDM,iBAAmC;AAazC;;AAjEA;IAuDM,kBAAkB;AAcxB;;AArEA;IA0DQ,WAAW;IACX,cAAqC;IACrC,yBAAyB;IACzB,yBAAqD;IACrD,4BAAwD;IACxD,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,UAAU;AAelB;;AAjFA;IAsEQ,uBGnDqB;IHoDrB,WAAmC;IACnC,wBAAsD;IACtD,uBAAqD;IACrD,SAAS;AAejB;;AAzFA;IA8EQ,wBAAwB;IACxB,WAAkC;IAClC,wBAAqD;IACrD,uBAAoD;AAe5D;;AAhGA;IAwFM,qBAAqB;AAY3B;;AApGA;IA2FM,aAAa;AAanB;;AAxGA;IAgGM,qBAAqB;AAY3B;;AA5GA;IAmGM,aAAa;AAanB;;AAhHA;IAwGM,qBAAqB;AAY3B;;AApHA;IA2GM,aAAa;AAanB","file":"listbox.css","sourcesContent":["@mixin iterate-sprite($iconList, $x, $y, $direction, $prefix:'') {\n @each $icon in $iconList {\n #{$prefix}#{$icon} {\n background-position: $x * 1px $y * 1px;\n }\n @if $direction == 'x' {\n $x: $x - 16;\n } @else {\n $y: $y - 16;\n }\n }\n}\n\n/*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n@mixin linear-gradient($colorList, $direction: 'to right') {\n $percentage: 0;\n $units: '%';\n $count: length($colorList);\n $increment: 100 / ($count - 1);\n $css: #{$direction + ', '};\n $sep: ', ';\n @each $colorItem in $colorList {\n $color: $colorItem;\n @if (length($colorItem) > 1) {\n $color: nth($colorItem, 1);\n $percentage: nth($colorItem, 2);\n $units: '';\n }\n @if ($percentage >= 100 or index($colorList, $colorItem) == $count) {\n $sep: '';\n }\n $css: #{$css + $color + ' ' + $percentage + $units + $sep};\n $percentage: $percentage + $increment;\n }\n background: linear-gradient( #{$css} );\n}\n\n@mixin grid-unit($span, $numCols: 12, $gutter: 0) {\n $gridPx: 840;\n $rawSpanPx: (($gridPx - ($numCols * $gutter)) / $numCols);\n $spanPx: $rawSpanPx * $span + (($span - 1) * $gutter);\n $spanPercent: widthPerc($spanPx, $gridPx);\n $marginPercent: widthPerc($gutter, $gridPx);\n margin-left: $marginPercent;\n width: $spanPercent;\n}\n\n\n@mixin vendor-prefix($property, $value, $whatToPrefix: property, $prefixes: (-webkit-, -moz-, -ms-, -o-, '')) {\n @if $whatToPrefix == 'property' {\n @each $prefix in $prefixes {\n #{$prefix + $property}: #{$value};\n }\n }\n @else if $whatToPrefix == 'value' {\n @each $prefix in $prefixes {\n #{$property}: #{$prefix + $value};\n }\n }\n}\n@mixin flex-container($wrapBehavior: nowrap, $direction : row) {\n @include vendor-prefix(display, flex, value, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(flex-direction, $direction, property, (-ms-, -webkit-, ''));\n @include vendor-prefix(flex-wrap, $wrapBehavior, property, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(justify-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-items, stretch, property, (-webkit-, ''));\n}\n\n@mixin simple-flex-box($width: auto, $minWidth: 1) {\n\n @include vendor-prefix(order, 0, property, (-ms-, -webkit-, ''));\n flex-item-align: stretch;\n -ms-flex-item-align: stretch;\n @include vendor-prefix(align-self, stretch, property, (-webkit-, ''));\n\n // if both, min width and width are set, width will win this conflict\n @if ($width == auto) {\n @if ($minWidth != 1) {\n @include vendor-prefix(flex, 1 1 $minWidth, property, (-ms-, -webkit-, ''));\n }\n @else {\n @include vendor-prefix(flex, 1 1 auto, property, (-ms-, -webkit-, ''));\n // @see https://developer.mozilla.org/en-US/docs/Web/CSS/flex-basis#Values\n // for a discussion auto vs. main-size\n @include vendor-prefix(flex, 1 1, property, (-ms-, -webkit-, ''));\n }\n }\n @else {\n @include vendor-prefix(flex, 0 0 $width, property, (-ms-, -webkit-, ''));\n }\n}\n\n\n@mixin box-shadow($horiz: 1px, $vert: 1px, $blur: 2px, $spread: 0, $color: rgba(0, 0, 0, .2)) {\n @include vendor-prefix(box-shadow, $horiz $vert $blur $spread $color, property);\n}\n\n@mixin simple-border($color: #ddd) {\n border: 1px solid $color;\n border-radius: 2px;\n -webkit-border-radius: 2px;\n}\n\n@mixin border-radius($radius: 2) {\n -moz-border-radius: $radius * 1px;\n -webkit-border-radius: $radius * 1px;\n border-radius: $radius * 1px;\n}\n\n@mixin border-radius-top($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-right($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-left($radius: 2) {\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-box() {\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n@function whiten($color, $white: 0.3) {\n @return mix(#fff, $color, ($white * 100) * 1%);\n}\n\n@function blacken($color, $black: 0.3) {\n @return mix(#000, $color, ($black * 100) * 1%);\n}\n\n@function widthPerc($colWidth, $context) {\n @return ($colWidth * 100 / $context) * 1%\n}\n\n@function remDist($fontSizePx) {\n @return ($fontSizePx / 10) * 1rem\n}\n\n@function black($alpha: 1) {\n @return (rgba(0, 0, 0, $alpha))\n}\n\n@function white($alpha: 1) {\n @return (rgba(255, 255, 255, $alpha))\n}\n\n@mixin font-size($remPx, $important: false) {\n @if $important == true {\n font-size: ($remPx) * 1px !important;\n font-size: ($remPx / 10) * 1rem !important;\n }\n @else {\n font-size: ($remPx) * 1px;\n font-size: ($remPx / 10) * 1rem;\n }\n}\n\n\n@mixin keyframes($name) {\n @-o-keyframes #{$name} { @content };\n @-moz-keyframes #{$name} { @content };\n @-webkit-keyframes #{$name} { @content };\n @keyframes #{$name} { @content };\n}\n\n\n@mixin animation($value, $type:'') {\n $animation: animation;\n @if $type != '' {\n $animation: $animation + '-' + $type;\n }\n @include vendor-prefix($animation, $value, property);\n}\n\n/// CSS transition mixin to the current selection (apply also vendor prefixes).\n/// See <https://developer.mozilla.org/en-US/docs/Web/CSS/transition> for the values\n///\n/// @param {property} [$type = all] the CSS property to apply the transition to\n/// @param {time} [$duration = .5s] the transition property\n/// @param {timing-function} [$effect = ease-out] the transition property\n@mixin transition($type : all, $duration : 0.5s, $effect : ease-out, $delay : 0s){\n @include vendor-prefix(transition, $type + ', ' + $duration + ', ' + $effect + ', ' + $delay, property);\n}\n\n@mixin fade($duration: 1s){\n\n @include keyframes(fade) {\n 0% {opacity:0;}\n 50% {opacity:1;}\n 100% {opacity:0;}\n }\n\n @include vendor-prefix(animation, fade 1s forwards, property);\n}\n\n@mixin repeat(){\n @include animation(infinite, iteration-count);\n}\n\n@mixin largeHeading() {\n @include font-size(20);\n font-family: $headingFont;\n font-style: normal;\n}\n\n@mixin disableSelect() {\n @include vendor-prefix(user-select, none, property);\n}\n","@import \"inc/bootstrap\";\n\n$entryArrowWidthBefore: 20;\n$entryArrowWidthAfter: 20;\n$entryArrowHeight: 150;\n\n.listbox {\n max-width: 1024px;\n margin: auto;\n\n h1 {\n font-family: $headingFont;\n @include font-size(22);\n font-weight: normal;\n }\n h2 {\n font-family: $headingFont;\n @include font-size(18);\n margin: 30px 0 10px;\n }\n\n .list {\n width: 100%;\n }\n\n .box {\n @include simple-border();\n background: $uiClickableDefaultBg;\n margin-bottom: 20px;\n padding: 20px;\n position: relative;\n }\n\n .list-box {\n h1, h3 {\n @include font-size(20);\n margin-bottom: 7px;\n color: $info;\n text-shadow: 1px 1px 1px #fff;\n }\n .text-link {\n position: absolute;\n right: -1px;\n bottom: -1px;\n padding: 20px 20px 8px 20px;\n text-align: right;\n min-width: 100px;\n border-bottom: 3px solid;\n color: $uiClickableHoverBg;\n outline: 0;\n &:hover {\n color: $info;\n }\n [class*=\" icon-\"], [class^=\"icon-\"] {\n margin-right: 10px;\n }\n }\n a {\n min-height: $entryArrowHeight * 1px;\n }\n .box {\n padding-left: 40px;\n\n &:before, &:after {\n content: '';\n height: ($entryArrowHeight / 4) * 1px;\n border: solid transparent;\n border-top-width: (($entryArrowHeight / 4) / 2) * 1px;\n border-bottom-width: (($entryArrowHeight / 4) / 2) * 1px;\n position: absolute;\n left: -1px;\n top: 54px;\n z-index: 2;\n }\n\n &:before {\n border-left-color: $uiGeneralContentBorder;\n width: $entryArrowWidthBefore * 1px;\n border-right-width: ($entryArrowWidthBefore / 2) * 1px;\n border-left-width: ($entryArrowWidthBefore / 2) * 1px;\n left: 0px;\n }\n\n &:after {\n border-left-color: white;\n width: $entryArrowWidthAfter * 1px;\n border-right-width: ($entryArrowWidthAfter / 2) * 1px;\n border-left-width: ($entryArrowWidthAfter / 2) * 1px;\n }\n }\n }\n\n &.loading {\n .loading {\n display: inline-block;\n }\n .list, .empty-list, .available-list {\n display: none;\n }\n }\n &.loaded {\n .list, .available-list {\n display: inline-block;\n }\n .loading, .empty-list {\n display: none;\n }\n }\n &.empty {\n .empty-list {\n display: inline-block;\n }\n .loading, .list, .available-list {\n display: none;\n }\n }\n}\n/*# sourceMappingURL=listbox.css.map */","/* Do not edit */@mixin tao-icon-setup {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'tao' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n@mixin icon-offline { content: \"\\e913\"; }\n@mixin icon-online { content: \"\\e914\"; }\n@mixin icon-tab { content: \"\\e90d\"; }\n@mixin icon-untab { content: \"\\e90e\"; }\n@mixin icon-multi-select { content: \"\\e90b\"; }\n@mixin icon-clipboard { content: \"\\e90a\"; }\n@mixin icon-filebox { content: \"\\e909\"; }\n@mixin icon-click-to-speak { content: \"\\e907\"; }\n@mixin icon-speech-bubble { content: \"\\f0e5\"; }\n@mixin icon-microphone { content: \"\\f130\"; }\n@mixin icon-microphone-off { content: \"\\f131\"; }\n@mixin icon-disconnect { content: \"\\e905\"; }\n@mixin icon-connect { content: \"\\e906\"; }\n@mixin icon-eliminate { content: \"\\e904\"; }\n@mixin icon-wheelchair { content: \"\\e903\"; }\n@mixin icon-text-marker { content: \"\\e902\"; }\n@mixin icon-unshield { content: \"\\e32a\"; }\n@mixin icon-shield { content: \"\\e8e8\"; }\n@mixin icon-tree { content: \"\\e6b4\"; }\n@mixin icon-home { content: \"\\e6b3\"; }\n@mixin icon-shared-file { content: \"\\e6b2\"; }\n@mixin icon-end-attempt { content: \"\\e603\"; }\n@mixin icon-icon { content: \"\\f1c5\"; }\n@mixin icon-radio-bg { content: \"\\e600\"; }\n@mixin icon-checkbox-bg { content: \"\\e601\"; }\n@mixin icon-tag { content: \"\\e602\"; }\n@mixin icon-style { content: \"\\e604\"; }\n@mixin icon-ownership-transfer { content: \"\\e605\"; }\n@mixin icon-property-advanced { content: \"\\e606\"; }\n@mixin icon-property-add { content: \"\\e607\"; }\n@mixin icon-repository-add { content: \"\\e608\"; }\n@mixin icon-repository-remove { content: \"\\e609\"; }\n@mixin icon-repository { content: \"\\e60a\"; }\n@mixin icon-result-server { content: \"\\e60b\"; }\n@mixin icon-folder { content: \"\\e60c\"; }\n@mixin icon-folder-open { content: \"\\e60d\"; }\n@mixin icon-left { content: \"\\e60e\"; }\n@mixin icon-right { content: \"\\e60f\"; }\n@mixin icon-up { content: \"\\e610\"; }\n@mixin icon-down { content: \"\\e611\"; }\n@mixin icon-undo { content: \"\\e612\"; }\n@mixin icon-redo { content: \"\\e613\"; }\n@mixin icon-screen { content: \"\\e614\"; }\n@mixin icon-laptop { content: \"\\e615\"; }\n@mixin icon-tablet { content: \"\\e616\"; }\n@mixin icon-phone { content: \"\\e617\"; }\n@mixin icon-move { content: \"\\e618\"; }\n@mixin icon-bin { content: \"\\e619\"; }\n@mixin icon-shuffle { content: \"\\e61a\"; }\n@mixin icon-print { content: \"\\e61b\"; }\n@mixin icon-tools { content: \"\\e61c\"; }\n@mixin icon-settings { content: \"\\e61d\"; }\n@mixin icon-video { content: \"\\e61e\"; }\n@mixin icon-find { content: \"\\e61f\"; }\n@mixin icon-image { content: \"\\e620\"; }\n@mixin icon-edit { content: \"\\e621\"; }\n@mixin icon-document { content: \"\\e622\"; }\n@mixin icon-resize-grid { content: \"\\e623\"; }\n@mixin icon-resize { content: \"\\e624\"; }\n@mixin icon-help { content: \"\\e625\"; }\n@mixin icon-mobile-menu { content: \"\\e626\"; }\n@mixin icon-fix { content: \"\\e627\"; }\n@mixin icon-unlock { content: \"\\e628\"; }\n@mixin icon-lock { content: \"\\e629\"; }\n@mixin icon-ul { content: \"\\e62a\"; }\n@mixin icon-ol { content: \"\\e62b\"; }\n@mixin icon-email { content: \"\\e62c\"; }\n@mixin icon-download { content: \"\\e62d\"; }\n@mixin icon-logout { content: \"\\e62e\"; }\n@mixin icon-login { content: \"\\e62f\"; }\n@mixin icon-spinner { content: \"\\e630\"; }\n@mixin icon-preview { content: \"\\e631\"; }\n@mixin icon-external { content: \"\\e632\"; }\n@mixin icon-time { content: \"\\e633\"; }\n@mixin icon-save { content: \"\\e634\"; }\n@mixin icon-warning { content: \"\\e635\"; }\n@mixin icon-add { content: \"\\e636\"; }\n@mixin icon-error { content: \"\\e900\"; }\n@mixin icon-close { content: \"\\e637\"; }\n@mixin icon-success { content: \"\\e638\"; }\n@mixin icon-remove { content: \"\\e639\"; }\n@mixin icon-info { content: \"\\e63a\"; }\n@mixin icon-danger { content: \"\\e63b\"; }\n@mixin icon-users { content: \"\\e63c\"; }\n@mixin icon-user { content: \"\\e63d\"; }\n@mixin icon-test-taker { content: \"\\e63e\"; }\n@mixin icon-test-takers { content: \"\\e63f\"; }\n@mixin icon-item { content: \"\\e640\"; }\n@mixin icon-test { content: \"\\e641\"; }\n@mixin icon-delivery { content: \"\\e642\"; }\n@mixin icon-eye-slash { content: \"\\e643\"; }\n@mixin icon-result { content: \"\\e644\"; }\n@mixin icon-delivery-small { content: \"\\e645\"; }\n@mixin icon-upload { content: \"\\e646\"; }\n@mixin icon-result-small { content: \"\\e647\"; }\n@mixin icon-mobile-preview { content: \"\\e648\"; }\n@mixin icon-extension { content: \"\\e649\"; }\n@mixin icon-desktop-preview { content: \"\\e64a\"; }\n@mixin icon-tablet-preview { content: \"\\e64b\"; }\n@mixin icon-insert-horizontal-line { content: \"\\e64c\"; }\n@mixin icon-table { content: \"\\e64d\"; }\n@mixin icon-anchor { content: \"\\e64e\"; }\n@mixin icon-unlink { content: \"\\e64f\"; }\n@mixin icon-link { content: \"\\e650\"; }\n@mixin icon-right-left { content: \"\\e651\"; }\n@mixin icon-left-right { content: \"\\e652\"; }\n@mixin icon-special-character { content: \"\\e653\"; }\n@mixin icon-source { content: \"\\e654\"; }\n@mixin icon-new-page { content: \"\\e655\"; }\n@mixin icon-templates { content: \"\\e656\"; }\n@mixin icon-cut { content: \"\\e657\"; }\n@mixin icon-replace { content: \"\\e658\"; }\n@mixin icon-copy { content: \"\\e659\"; }\n@mixin icon-paste { content: \"\\e65a\"; }\n@mixin icon-select-all { content: \"\\e65b\"; }\n@mixin icon-paste-text { content: \"\\e65c\"; }\n@mixin icon-paste-word { content: \"\\e65d\"; }\n@mixin icon-bold { content: \"\\e65e\"; }\n@mixin icon-italic { content: \"\\e65f\"; }\n@mixin icon-underline { content: \"\\e660\"; }\n@mixin icon-subscript { content: \"\\e661\"; }\n@mixin icon-superscript { content: \"\\e662\"; }\n@mixin icon-strike-through { content: \"\\e663\"; }\n@mixin icon-decrease-indent { content: \"\\e664\"; }\n@mixin icon-increase-indent { content: \"\\e665\"; }\n@mixin icon-block-quote { content: \"\\e666\"; }\n@mixin icon-div-container { content: \"\\e667\"; }\n@mixin icon-align-left { content: \"\\e668\"; }\n@mixin icon-center { content: \"\\e669\"; }\n@mixin icon-align-right { content: \"\\e66a\"; }\n@mixin icon-justify { content: \"\\e66b\"; }\n@mixin icon-choice { content: \"\\e66c\"; }\n@mixin icon-inline-choice { content: \"\\e66d\"; }\n@mixin icon-match { content: \"\\e66e\"; }\n@mixin icon-associate { content: \"\\e66f\"; }\n@mixin icon-media { content: \"\\e670\"; }\n@mixin icon-graphic-order { content: \"\\e671\"; }\n@mixin icon-hotspot { content: \"\\e672\"; }\n@mixin icon-graphic-gap { content: \"\\e673\"; }\n@mixin icon-graphic-associate { content: \"\\e674\"; }\n@mixin icon-select-point { content: \"\\e675\"; }\n@mixin icon-pin { content: \"\\e676\"; }\n@mixin icon-import { content: \"\\e677\"; }\n@mixin icon-export { content: \"\\e678\"; }\n@mixin icon-move-item { content: \"\\e679\"; }\n@mixin icon-meta-data { content: \"\\e67a\"; }\n@mixin icon-slider { content: \"\\e67b\"; }\n@mixin icon-summary-report { content: \"\\e67c\"; }\n@mixin icon-text-entry { content: \"\\e67d\"; }\n@mixin icon-extended-text { content: \"\\e67e\"; }\n@mixin icon-eraser { content: \"\\e67f\"; }\n@mixin icon-row { content: \"\\e680\"; }\n@mixin icon-column { content: \"\\e681\"; }\n@mixin icon-text-color { content: \"\\e682\"; }\n@mixin icon-background-color { content: \"\\e683\"; }\n@mixin icon-spell-check { content: \"\\e684\"; }\n@mixin icon-polygon { content: \"\\e685\"; }\n@mixin icon-rectangle { content: \"\\e686\"; }\n@mixin icon-gap-match { content: \"\\e687\"; }\n@mixin icon-order { content: \"\\e688\"; }\n@mixin icon-hottext { content: \"\\e689\"; }\n@mixin icon-free-form { content: \"\\e68a\"; }\n@mixin icon-step-backward { content: \"\\e68b\"; }\n@mixin icon-fast-backward { content: \"\\e68c\"; }\n@mixin icon-backward { content: \"\\e68d\"; }\n@mixin icon-play { content: \"\\e68e\"; }\n@mixin icon-pause { content: \"\\e68f\"; }\n@mixin icon-stop { content: \"\\e690\"; }\n@mixin icon-forward { content: \"\\e691\"; }\n@mixin icon-fast-forward { content: \"\\e692\"; }\n@mixin icon-step-forward { content: \"\\e693\"; }\n@mixin icon-ellipsis { content: \"\\e694\"; }\n@mixin icon-circle { content: \"\\e695\"; }\n@mixin icon-target { content: \"\\e696\"; }\n@mixin icon-guide-arrow { content: \"\\e697\"; }\n@mixin icon-range-slider-right { content: \"\\e698\"; }\n@mixin icon-range-slider-left { content: \"\\e699\"; }\n@mixin icon-radio-checked { content: \"\\e69a\"; }\n@mixin icon-checkbox-indeterminate { content: \"\\e901\"; }\n@mixin icon-checkbox { content: \"\\e69b\"; }\n@mixin icon-checkbox-crossed { content: \"\\e69c\"; }\n@mixin icon-checkbox-checked { content: \"\\e69d\"; }\n@mixin icon-result-nok { content: \"\\e69e\"; }\n@mixin icon-result-ok { content: \"\\e69f\"; }\n@mixin icon-not-evaluated { content: \"\\e6a0\"; }\n@mixin icon-filter { content: \"\\e6a1\"; }\n@mixin icon-translate { content: \"\\e6a2\"; }\n@mixin icon-eject { content: \"\\e6a3\"; }\n@mixin icon-continue { content: \"\\e6a4\"; }\n@mixin icon-radio { content: \"\\e6a5\"; }\n@mixin icon-sphere { content: \"\\e6a6\"; }\n@mixin icon-reset { content: \"\\e6a7\"; }\n@mixin icon-smaller { content: \"\\e6a8\"; }\n@mixin icon-larger { content: \"\\e6a9\"; }\n@mixin icon-clock { content: \"\\e6aa\"; }\n@mixin icon-font { content: \"\\e6ab\"; }\n@mixin icon-maths { content: \"\\e6ac\"; }\n@mixin icon-grip { content: \"\\e6ad\"; }\n@mixin icon-rubric { content: \"\\e6ae\"; }\n@mixin icon-audio { content: \"\\e6af\"; }\n@mixin icon-grip-h { content: \"\\e6b0\"; }\n@mixin icon-magicwand { content: \"\\e6b1\"; }\n@mixin icon-loop { content: \"\\ea2e\"; }\n@mixin icon-calendar { content: \"\\e953\"; }\n@mixin icon-reload { content: \"\\e984\"; }\n@mixin icon-speed { content: \"\\e9a6\"; }\n@mixin icon-volume { content: \"\\ea27\"; }\n@mixin icon-contrast { content: \"\\e9d5\"; }\n@mixin icon-headphones { content: \"\\e910\"; }\n@mixin icon-compress { content: \"\\f066\"; }\n@mixin icon-map-o { content: \"\\f278\"; }\n@mixin icon-variable { content: \"\\e908\"; }\n@mixin icon-tooltip { content: \"\\e90c\"; }\n@mixin icon-globe { content: \"\\e9c9\"; }\n@mixin icon-highlighter { content: \"\\e90f\"; }\n@mixin icon-eliminate-crossed { content: \"\\e911\"; }\n@mixin icon-play-from-here { content: \"\\e912\"; }\n@mixin icon-wrap-inline { content: \"\\e917\"; }\n@mixin icon-wrap-right { content: \"\\e915\"; }\n@mixin icon-wrap-left { content: \"\\e916\"; }\n@mixin icon-indicator { content: \"\\e920\"; }\n@mixin icon-bookmark { content: \"\\e921\"; }\n@mixin icon-bookmark-outline { content: \"\\e922\"; }\n@mixin icon-info-bare { content: \"\\e923\"; }","$sidebarWidth: 180;\n$sidebarGutter: 0;\n$toolbarHeight: 50;\n$treeSidebar: 280;\n\n// fonts\n$fontPath : 'font/' !default;\n$monospaceFont: Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;\n$regularFont: 'Source Sans Pro', sans-serif;\n$headingFont: 'Source Sans Pro', sans-serif;\n\n\n%clearfix {\n &:before, &:after {\n content: \" \";\n display: table;\n }\n &:after {\n clear: both;\n }\n}\n","// buttons and alerts\n$success: rgb(14, 145, 75);\n$info: rgb(14, 93, 145);\n$warning: rgb(216, 174, 91);\n$danger: rgb(201, 96, 67);\n$error: rgb(186, 18, 43);\n$activeInteraction: rgb(195, 90, 19);\n\n// corporate identity\n$logoRed: rgb(186, 18, 43);\n$grey: rgb(173, 161, 148);\n$darkBlueGrey: rgb(164, 187, 197);\n$mediumBlueGrey: rgb(193, 212, 220);\n$lightBlueGrey: rgb(228, 236, 239);\n$brownRedGrey: rgb(154, 137, 123);\n$darkBrown: rgb(111, 99, 89);\n$websiteBorder: rgb(141, 148, 158);\n\n// ui elements, these should only variations of the above\n// naming convention: jQueryUi theme roller -> camelCase\n\n$textColor: #222;\n$textHighlight: white;\n\n$uiGeneralContentBg: white();\n$uiGeneralContentBorder: #ddd;\n\n$uiHeaderBg: #d4d5d7;\n\n$uiClickableDefaultBg: #f3f1ef;\n$uiClickableHoverBg: whiten($info, 0.2);\n//$uiClickableActiveBg: $uiHeaderBg;\n$uiClickableActiveBg: whiten($websiteBorder, 0.2);\n//$uiClickableActiveBg: #aaa;\n\n$uiSelectableSelectedBg: whiten($info, 0.2);\n$uiSelectableSelectedHoverBg: whiten($info, 0.1);\n$uiSelectableHoverBg: whiten($info, 0.9);\n\n$uiOverlay: $lightBlueGrey;\n\n// new layout. Implemented now only for review panel\n$uiReviewPanelBg: #f2f2f2;\n$uiReviewPanelTextDisabled: hsl(0, 0%, 45%);\n$uiReviewPanelTextDefault: hsl(0, 0%, 12%);\n$uiReviewPanelBgDefault: $uiGeneralContentBg;\n$uiReviewPanelPrimaryHighlight: hsl(208, 100%, 32%);\n$uiReviewPanelBgInverted: $uiReviewPanelTextDefault;\n$uiReviewPanelTextInverted: $uiGeneralContentBg;\n\n// sidebars etc.\n$canvas: mix(#fff, $grey, 85%);\n\n// colors taken from feedback.scss\n$successBgColor: whiten($success, 0.8);\n$successBorderColor: whiten($success, 0.1);\n\n$infoBgColor: whiten($info, 0.8);\n$infoBorderColor: whiten($info, 0.1);\n\n$warningBgColor: whiten($warning, 0.8);\n$warningBorderColor: whiten($warning, 0.1);\n\n$dangerBgColor: whiten($danger, 0.8);\n$dangerBorderColor: whiten($danger, 0.1);\n\n$errorBgColor: whiten($error, 0.8);\n$errorBorderColor: whiten($error, 0.1);\n\n$darkBar: rgb(51, 51, 51);\n$darkBarTxt: rgb(230, 230, 230);\n$darkBarIcon: rgb(220, 220, 220);\n\n$actionLinkColor: #276d9b;\n$actionLinkHoverColor: #4f83a7;\n\n$colorWheel-01: #c3ba13;\n$colorWheel-02: #84a610;\n$colorWheel-03: #2b8e0e;\n$colorWheel-04: #0f9787;\n$colorWheel-05: #0e5d91;\n$colorWheel-06: #0d2689;\n$colorWheel-07: #400d83;\n$colorWheel-08: #960e7d;\n$colorWheel-09: #ba122b;\n$colorWheel-10: #c34713;\n$colorWheel-11: #c36f13;\n$colorWheel-12: #c39413;\n"]}
1
+ {"version":3,"sources":["../../../scss/inc/_functions.scss","../scss/listbox.scss","../../../scss/inc/fonts/_tao-icon-vars.scss","../../../scss/inc/_variables.scss","../../../scss/inc/_colors.scss"],"names":[],"mappings":"AAaA;;;;;;CCPC;ACND,gBAAA;ADMA;IACE,iBAAiB;IACjB,YAAY;AAGd;;AALA;IAKI,0CEFuC;IH+MnC,eAAyB;IACzB,iBAA+B;IC5MnC,mBAAmB;AAKvB;;AAZA;IAUI,0CEPuC;IH+MnC,eAAyB;IACzB,iBAA+B;ICvMnC,mBAAmB;AAOvB;;AAnBA;IAgBI,WAAW;AAOf;;AAvBA;IDuGI,sBAD6B;IAE7B,kBAAkB;IAClB,0BAA0B;ICpF1B,mBGE0B;IHD1B,mBAAmB;IACnB,aAAa;IACb,kBAAkB;AAStB;;AAjCA;IDkNQ,eAAyB;IACzB,eAA+B;ICrLjC,kBAAkB;IAClB,cGnCiB;IHoCjB,6BAA6B;AASnC;;AAzCA;IAmCM,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,2BAA2B;IAC3B,iBAAiB;IACjB,gBAAgB;IAChB,wBAAwB;IACxB,cD2I4C;IC1I5C,UAAU;AAUhB;;AArDA;IA6CQ,cGjDe;AH6DvB;;AAzDA;IAgDU,kBAAkB;AAa5B;;AA7DA;IAoDM,iBAAmC;AAazC;;AAjEA;IAuDM,kBAAkB;AAcxB;;AArEA;IA0DQ,WAAW;IACX,cAAqC;IACrC,yBAAyB;IACzB,yBAAqD;IACrD,4BAAwD;IACxD,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,UAAU;AAelB;;AAjFA;IAsEQ,uBGnDqB;IHoDrB,WAAmC;IACnC,wBAAsD;IACtD,uBAAqD;IACrD,SAAS;AAejB;;AAzFA;IA8EQ,wBAAwB;IACxB,WAAkC;IAClC,wBAAqD;IACrD,uBAAoD;AAe5D;;AAhGA;IAwFM,qBAAqB;AAY3B;;AApGA;IA2FM,aAAa;AAanB;;AAxGA;IAgGM,qBAAqB;AAY3B;;AA5GA;IAmGM,aAAa;AAanB;;AAhHA;IAwGM,qBAAqB;AAY3B;;AApHA;IA2GM,aAAa;AAanB","file":"listbox.css","sourcesContent":["@mixin iterate-sprite($iconList, $x, $y, $direction, $prefix:'') {\n @each $icon in $iconList {\n #{$prefix}#{$icon} {\n background-position: $x * 1px $y * 1px;\n }\n @if $direction == 'x' {\n $x: $x - 16;\n } @else {\n $y: $y - 16;\n }\n }\n}\n\n/*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n@mixin linear-gradient($colorList, $direction: 'to right') {\n $percentage: 0;\n $units: '%';\n $count: length($colorList);\n $increment: 100 / ($count - 1);\n $css: #{$direction + ', '};\n $sep: ', ';\n @each $colorItem in $colorList {\n $color: $colorItem;\n @if (length($colorItem) > 1) {\n $color: nth($colorItem, 1);\n $percentage: nth($colorItem, 2);\n $units: '';\n }\n @if ($percentage >= 100 or index($colorList, $colorItem) == $count) {\n $sep: '';\n }\n $css: #{$css + $color + ' ' + $percentage + $units + $sep};\n $percentage: $percentage + $increment;\n }\n background: linear-gradient( #{$css} );\n}\n\n@mixin grid-unit($span, $numCols: 12, $gutter: 0) {\n $gridPx: 840;\n $rawSpanPx: (($gridPx - ($numCols * $gutter)) / $numCols);\n $spanPx: $rawSpanPx * $span + (($span - 1) * $gutter);\n $spanPercent: widthPerc($spanPx, $gridPx);\n $marginPercent: widthPerc($gutter, $gridPx);\n margin-left: $marginPercent;\n width: $spanPercent;\n}\n\n\n@mixin vendor-prefix($property, $value, $whatToPrefix: property, $prefixes: (-webkit-, -moz-, -ms-, -o-, '')) {\n @if $whatToPrefix == 'property' {\n @each $prefix in $prefixes {\n #{$prefix + $property}: #{$value};\n }\n }\n @else if $whatToPrefix == 'value' {\n @each $prefix in $prefixes {\n #{$property}: #{$prefix + $value};\n }\n }\n}\n@mixin flex-container($wrapBehavior: nowrap, $direction : row) {\n @include vendor-prefix(display, flex, value, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(flex-direction, $direction, property, (-ms-, -webkit-, ''));\n @include vendor-prefix(flex-wrap, $wrapBehavior, property, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(justify-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-items, stretch, property, (-webkit-, ''));\n}\n\n@mixin simple-flex-box($width: auto, $minWidth: 1) {\n\n @include vendor-prefix(order, 0, property, (-ms-, -webkit-, ''));\n flex-item-align: stretch;\n -ms-flex-item-align: stretch;\n @include vendor-prefix(align-self, stretch, property, (-webkit-, ''));\n\n // if both, min width and width are set, width will win this conflict\n @if ($width == auto) {\n @if ($minWidth != 1) {\n @include vendor-prefix(flex, 1 1 $minWidth, property, (-ms-, -webkit-, ''));\n }\n @else {\n @include vendor-prefix(flex, 1 1 auto, property, (-ms-, -webkit-, ''));\n // @see https://developer.mozilla.org/en-US/docs/Web/CSS/flex-basis#Values\n // for a discussion auto vs. main-size\n @include vendor-prefix(flex, 1 1, property, (-ms-, -webkit-, ''));\n }\n }\n @else {\n @include vendor-prefix(flex, 0 0 $width, property, (-ms-, -webkit-, ''));\n }\n}\n\n\n@mixin box-shadow($horiz: 1px, $vert: 1px, $blur: 2px, $spread: 0, $color: rgba(0, 0, 0, .2)) {\n @include vendor-prefix(box-shadow, $horiz $vert $blur $spread $color, property);\n}\n\n@mixin simple-border($color: #ddd) {\n border: 1px solid $color;\n border-radius: 2px;\n -webkit-border-radius: 2px;\n}\n\n@mixin border-radius($radius: 2) {\n -moz-border-radius: $radius * 1px;\n -webkit-border-radius: $radius * 1px;\n border-radius: $radius * 1px;\n}\n\n@mixin border-radius-top($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-right($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-left($radius: 2) {\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-box() {\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n@function whiten($color, $white: 0.3) {\n @return mix(#fff, $color, ($white * 100) * 1%);\n}\n\n@function blacken($color, $black: 0.3) {\n @return mix(#000, $color, ($black * 100) * 1%);\n}\n\n@function widthPerc($colWidth, $context) {\n @return ($colWidth * 100 / $context) * 1%\n}\n\n@function remDist($fontSizePx) {\n @return ($fontSizePx / 10) * 1rem\n}\n\n@function black($alpha: 1) {\n @return (rgba(0, 0, 0, $alpha))\n}\n\n@function white($alpha: 1) {\n @return (rgba(255, 255, 255, $alpha))\n}\n\n@mixin font-size($remPx, $important: false) {\n @if $important == true {\n font-size: ($remPx) * 1px !important;\n font-size: ($remPx / 10) * 1rem !important;\n }\n @else {\n font-size: ($remPx) * 1px;\n font-size: ($remPx / 10) * 1rem;\n }\n}\n\n\n@mixin keyframes($name) {\n @-o-keyframes #{$name} { @content };\n @-moz-keyframes #{$name} { @content };\n @-webkit-keyframes #{$name} { @content };\n @keyframes #{$name} { @content };\n}\n\n\n@mixin animation($value, $type:'') {\n $animation: animation;\n @if $type != '' {\n $animation: $animation + '-' + $type;\n }\n @include vendor-prefix($animation, $value, property);\n}\n\n/// CSS transition mixin to the current selection (apply also vendor prefixes).\n/// See <https://developer.mozilla.org/en-US/docs/Web/CSS/transition> for the values\n///\n/// @param {property} [$type = all] the CSS property to apply the transition to\n/// @param {time} [$duration = .5s] the transition property\n/// @param {timing-function} [$effect = ease-out] the transition property\n@mixin transition($type : all, $duration : 0.5s, $effect : ease-out, $delay : 0s){\n @include vendor-prefix(transition, $type + ', ' + $duration + ', ' + $effect + ', ' + $delay, property);\n}\n\n@mixin fade($duration: 1s){\n\n @include keyframes(fade) {\n 0% {opacity:0;}\n 50% {opacity:1;}\n 100% {opacity:0;}\n }\n\n @include vendor-prefix(animation, fade 1s forwards, property);\n}\n\n@mixin repeat(){\n @include animation(infinite, iteration-count);\n}\n\n@mixin largeHeading() {\n @include font-size(20);\n font-family: $headingFont;\n font-style: normal;\n}\n\n@mixin disableSelect() {\n @include vendor-prefix(user-select, none, property);\n}\n","@import \"inc/bootstrap\";\n\n$entryArrowWidthBefore: 20;\n$entryArrowWidthAfter: 20;\n$entryArrowHeight: 150;\n\n.listbox {\n max-width: 1024px;\n margin: auto;\n\n h1 {\n font-family: $headingFont;\n @include font-size(22);\n font-weight: normal;\n }\n h2 {\n font-family: $headingFont;\n @include font-size(18);\n margin: 30px 0 10px;\n }\n\n .list {\n width: 100%;\n }\n\n .box {\n @include simple-border();\n background: $uiClickableDefaultBg;\n margin-bottom: 20px;\n padding: 20px;\n position: relative;\n }\n\n .list-box {\n h1, h3 {\n @include font-size(20);\n margin-bottom: 7px;\n color: $info;\n text-shadow: 1px 1px 1px #fff;\n }\n .text-link {\n position: absolute;\n right: -1px;\n bottom: -1px;\n padding: 20px 20px 8px 20px;\n text-align: right;\n min-width: 100px;\n border-bottom: 3px solid;\n color: $uiClickableHoverBg;\n outline: 0;\n &:hover {\n color: $info;\n }\n [class*=\" icon-\"], [class^=\"icon-\"] {\n margin-right: 10px;\n }\n }\n a {\n min-height: $entryArrowHeight * 1px;\n }\n .box {\n padding-left: 40px;\n\n &:before, &:after {\n content: '';\n height: ($entryArrowHeight / 4) * 1px;\n border: solid transparent;\n border-top-width: (($entryArrowHeight / 4) / 2) * 1px;\n border-bottom-width: (($entryArrowHeight / 4) / 2) * 1px;\n position: absolute;\n left: -1px;\n top: 54px;\n z-index: 2;\n }\n\n &:before {\n border-left-color: $uiGeneralContentBorder;\n width: $entryArrowWidthBefore * 1px;\n border-right-width: ($entryArrowWidthBefore / 2) * 1px;\n border-left-width: ($entryArrowWidthBefore / 2) * 1px;\n left: 0px;\n }\n\n &:after {\n border-left-color: white;\n width: $entryArrowWidthAfter * 1px;\n border-right-width: ($entryArrowWidthAfter / 2) * 1px;\n border-left-width: ($entryArrowWidthAfter / 2) * 1px;\n }\n }\n }\n\n &.loading {\n .loading {\n display: inline-block;\n }\n .list, .empty-list, .available-list {\n display: none;\n }\n }\n &.loaded {\n .list, .available-list {\n display: inline-block;\n }\n .loading, .empty-list {\n display: none;\n }\n }\n &.empty {\n .empty-list {\n display: inline-block;\n }\n .loading, .list, .available-list {\n display: none;\n }\n }\n}\n/*# sourceMappingURL=listbox.css.map */","/* Do not edit */@mixin tao-icon-setup {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'tao' !important;\n speak: never;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n@mixin icon-info-bare { content: \"\\e923\"; }\n@mixin icon-bookmark-outline { content: \"\\e922\"; }\n@mixin icon-bookmark { content: \"\\e921\"; }\n@mixin icon-indicator { content: \"\\e920\"; }\n@mixin icon-add-subsection { content: \"\\e918\"; }\n@mixin icon-wrap-inline { content: \"\\e915\"; }\n@mixin icon-wrap-left { content: \"\\e916\"; }\n@mixin icon-wrap-right { content: \"\\e917\"; }\n@mixin icon-offline { content: \"\\e913\"; }\n@mixin icon-online { content: \"\\e914\"; }\n@mixin icon-tab { content: \"\\e90d\"; }\n@mixin icon-untab { content: \"\\e90e\"; }\n@mixin icon-multi-select { content: \"\\e90b\"; }\n@mixin icon-clipboard { content: \"\\e90a\"; }\n@mixin icon-filebox { content: \"\\e909\"; }\n@mixin icon-click-to-speak { content: \"\\e907\"; }\n@mixin icon-speech-bubble { content: \"\\f0e5\"; }\n@mixin icon-microphone { content: \"\\f130\"; }\n@mixin icon-microphone-off { content: \"\\f131\"; }\n@mixin icon-disconnect { content: \"\\e905\"; }\n@mixin icon-connect { content: \"\\e906\"; }\n@mixin icon-eliminate { content: \"\\e904\"; }\n@mixin icon-wheelchair { content: \"\\e903\"; }\n@mixin icon-text-marker { content: \"\\e902\"; }\n@mixin icon-unshield { content: \"\\e32a\"; }\n@mixin icon-shield { content: \"\\e8e8\"; }\n@mixin icon-tree { content: \"\\e6b4\"; }\n@mixin icon-home { content: \"\\e6b3\"; }\n@mixin icon-shared-file { content: \"\\e6b2\"; }\n@mixin icon-end-attempt { content: \"\\e603\"; }\n@mixin icon-icon { content: \"\\f1c5\"; }\n@mixin icon-radio-bg { content: \"\\e600\"; }\n@mixin icon-checkbox-bg { content: \"\\e601\"; }\n@mixin icon-tag { content: \"\\e602\"; }\n@mixin icon-style { content: \"\\e604\"; }\n@mixin icon-ownership-transfer { content: \"\\e605\"; }\n@mixin icon-property-advanced { content: \"\\e606\"; }\n@mixin icon-property-add { content: \"\\e607\"; }\n@mixin icon-repository-add { content: \"\\e608\"; }\n@mixin icon-repository-remove { content: \"\\e609\"; }\n@mixin icon-repository { content: \"\\e60a\"; }\n@mixin icon-result-server { content: \"\\e60b\"; }\n@mixin icon-folder { content: \"\\e60c\"; }\n@mixin icon-folder-open { content: \"\\e60d\"; }\n@mixin icon-left { content: \"\\e60e\"; }\n@mixin icon-right { content: \"\\e60f\"; }\n@mixin icon-up { content: \"\\e610\"; }\n@mixin icon-down { content: \"\\e611\"; }\n@mixin icon-undo { content: \"\\e612\"; }\n@mixin icon-redo { content: \"\\e613\"; }\n@mixin icon-screen { content: \"\\e614\"; }\n@mixin icon-laptop { content: \"\\e615\"; }\n@mixin icon-tablet { content: \"\\e616\"; }\n@mixin icon-phone { content: \"\\e617\"; }\n@mixin icon-move { content: \"\\e618\"; }\n@mixin icon-bin { content: \"\\e619\"; }\n@mixin icon-shuffle { content: \"\\e61a\"; }\n@mixin icon-print { content: \"\\e61b\"; }\n@mixin icon-tools { content: \"\\e61c\"; }\n@mixin icon-settings { content: \"\\e61d\"; }\n@mixin icon-video { content: \"\\e61e\"; }\n@mixin icon-find { content: \"\\e61f\"; }\n@mixin icon-image { content: \"\\e620\"; }\n@mixin icon-edit { content: \"\\e621\"; }\n@mixin icon-document { content: \"\\e622\"; }\n@mixin icon-resize-grid { content: \"\\e623\"; }\n@mixin icon-resize { content: \"\\e624\"; }\n@mixin icon-help { content: \"\\e625\"; }\n@mixin icon-mobile-menu { content: \"\\e626\"; }\n@mixin icon-fix { content: \"\\e627\"; }\n@mixin icon-unlock { content: \"\\e628\"; }\n@mixin icon-lock { content: \"\\e629\"; }\n@mixin icon-ul { content: \"\\e62a\"; }\n@mixin icon-ol { content: \"\\e62b\"; }\n@mixin icon-email { content: \"\\e62c\"; }\n@mixin icon-download { content: \"\\e62d\"; }\n@mixin icon-logout { content: \"\\e62e\"; }\n@mixin icon-login { content: \"\\e62f\"; }\n@mixin icon-spinner { content: \"\\e630\"; }\n@mixin icon-preview { content: \"\\e631\"; }\n@mixin icon-external { content: \"\\e632\"; }\n@mixin icon-time { content: \"\\e633\"; }\n@mixin icon-save { content: \"\\e634\"; }\n@mixin icon-warning { content: \"\\e635\"; }\n@mixin icon-add { content: \"\\e636\"; }\n@mixin icon-error { content: \"\\e900\"; }\n@mixin icon-close { content: \"\\e637\"; }\n@mixin icon-success { content: \"\\e638\"; }\n@mixin icon-remove { content: \"\\e639\"; }\n@mixin icon-info { content: \"\\e63a\"; }\n@mixin icon-danger { content: \"\\e63b\"; }\n@mixin icon-users { content: \"\\e63c\"; }\n@mixin icon-user { content: \"\\e63d\"; }\n@mixin icon-test-taker { content: \"\\e63e\"; }\n@mixin icon-test-takers { content: \"\\e63f\"; }\n@mixin icon-item { content: \"\\e640\"; }\n@mixin icon-test { content: \"\\e641\"; }\n@mixin icon-delivery { content: \"\\e642\"; }\n@mixin icon-eye-slash { content: \"\\e643\"; }\n@mixin icon-result { content: \"\\e644\"; }\n@mixin icon-delivery-small { content: \"\\e645\"; }\n@mixin icon-upload { content: \"\\e646\"; }\n@mixin icon-result-small { content: \"\\e647\"; }\n@mixin icon-mobile-preview { content: \"\\e648\"; }\n@mixin icon-extension { content: \"\\e649\"; }\n@mixin icon-desktop-preview { content: \"\\e64a\"; }\n@mixin icon-tablet-preview { content: \"\\e64b\"; }\n@mixin icon-insert-horizontal-line { content: \"\\e64c\"; }\n@mixin icon-table { content: \"\\e64d\"; }\n@mixin icon-anchor { content: \"\\e64e\"; }\n@mixin icon-unlink { content: \"\\e64f\"; }\n@mixin icon-link { content: \"\\e650\"; }\n@mixin icon-right-left { content: \"\\e651\"; }\n@mixin icon-left-right { content: \"\\e652\"; }\n@mixin icon-special-character { content: \"\\e653\"; }\n@mixin icon-source { content: \"\\e654\"; }\n@mixin icon-new-page { content: \"\\e655\"; }\n@mixin icon-templates { content: \"\\e656\"; }\n@mixin icon-cut { content: \"\\e657\"; }\n@mixin icon-replace { content: \"\\e658\"; }\n@mixin icon-copy { content: \"\\e659\"; }\n@mixin icon-paste { content: \"\\e65a\"; }\n@mixin icon-select-all { content: \"\\e65b\"; }\n@mixin icon-paste-text { content: \"\\e65c\"; }\n@mixin icon-paste-word { content: \"\\e65d\"; }\n@mixin icon-bold { content: \"\\e65e\"; }\n@mixin icon-italic { content: \"\\e65f\"; }\n@mixin icon-underline { content: \"\\e660\"; }\n@mixin icon-subscript { content: \"\\e661\"; }\n@mixin icon-superscript { content: \"\\e662\"; }\n@mixin icon-strike-through { content: \"\\e663\"; }\n@mixin icon-decrease-indent { content: \"\\e664\"; }\n@mixin icon-increase-indent { content: \"\\e665\"; }\n@mixin icon-block-quote { content: \"\\e666\"; }\n@mixin icon-div-container { content: \"\\e667\"; }\n@mixin icon-align-left { content: \"\\e668\"; }\n@mixin icon-center { content: \"\\e669\"; }\n@mixin icon-align-right { content: \"\\e66a\"; }\n@mixin icon-justify { content: \"\\e66b\"; }\n@mixin icon-choice { content: \"\\e66c\"; }\n@mixin icon-inline-choice { content: \"\\e66d\"; }\n@mixin icon-match { content: \"\\e66e\"; }\n@mixin icon-associate { content: \"\\e66f\"; }\n@mixin icon-media { content: \"\\e670\"; }\n@mixin icon-graphic-order { content: \"\\e671\"; }\n@mixin icon-hotspot { content: \"\\e672\"; }\n@mixin icon-graphic-gap { content: \"\\e673\"; }\n@mixin icon-graphic-associate { content: \"\\e674\"; }\n@mixin icon-select-point { content: \"\\e675\"; }\n@mixin icon-pin { content: \"\\e676\"; }\n@mixin icon-import { content: \"\\e677\"; }\n@mixin icon-export { content: \"\\e678\"; }\n@mixin icon-move-item { content: \"\\e679\"; }\n@mixin icon-meta-data { content: \"\\e67a\"; }\n@mixin icon-slider { content: \"\\e67b\"; }\n@mixin icon-summary-report { content: \"\\e67c\"; }\n@mixin icon-text-entry { content: \"\\e67d\"; }\n@mixin icon-extended-text { content: \"\\e67e\"; }\n@mixin icon-eraser { content: \"\\e67f\"; }\n@mixin icon-row { content: \"\\e680\"; }\n@mixin icon-column { content: \"\\e681\"; }\n@mixin icon-text-color { content: \"\\e682\"; }\n@mixin icon-background-color { content: \"\\e683\"; }\n@mixin icon-spell-check { content: \"\\e684\"; }\n@mixin icon-polygon { content: \"\\e685\"; }\n@mixin icon-rectangle { content: \"\\e686\"; }\n@mixin icon-gap-match { content: \"\\e687\"; }\n@mixin icon-order { content: \"\\e688\"; }\n@mixin icon-hottext { content: \"\\e689\"; }\n@mixin icon-free-form { content: \"\\e68a\"; }\n@mixin icon-step-backward { content: \"\\e68b\"; }\n@mixin icon-fast-backward { content: \"\\e68c\"; }\n@mixin icon-backward { content: \"\\e68d\"; }\n@mixin icon-play { content: \"\\e68e\"; }\n@mixin icon-pause { content: \"\\e68f\"; }\n@mixin icon-stop { content: \"\\e690\"; }\n@mixin icon-forward { content: \"\\e691\"; }\n@mixin icon-fast-forward { content: \"\\e692\"; }\n@mixin icon-step-forward { content: \"\\e693\"; }\n@mixin icon-ellipsis { content: \"\\e694\"; }\n@mixin icon-circle { content: \"\\e695\"; }\n@mixin icon-target { content: \"\\e696\"; }\n@mixin icon-guide-arrow { content: \"\\e697\"; }\n@mixin icon-range-slider-right { content: \"\\e698\"; }\n@mixin icon-range-slider-left { content: \"\\e699\"; }\n@mixin icon-radio-checked { content: \"\\e69a\"; }\n@mixin icon-checkbox-indeterminate { content: \"\\e901\"; }\n@mixin icon-checkbox { content: \"\\e69b\"; }\n@mixin icon-checkbox-crossed { content: \"\\e69c\"; }\n@mixin icon-checkbox-checked { content: \"\\e69d\"; }\n@mixin icon-result-nok { content: \"\\e69e\"; }\n@mixin icon-result-ok { content: \"\\e69f\"; }\n@mixin icon-not-evaluated { content: \"\\e6a0\"; }\n@mixin icon-filter { content: \"\\e6a1\"; }\n@mixin icon-translate { content: \"\\e6a2\"; }\n@mixin icon-eject { content: \"\\e6a3\"; }\n@mixin icon-continue { content: \"\\e6a4\"; }\n@mixin icon-radio { content: \"\\e6a5\"; }\n@mixin icon-sphere { content: \"\\e6a6\"; }\n@mixin icon-reset { content: \"\\e6a7\"; }\n@mixin icon-smaller { content: \"\\e6a8\"; }\n@mixin icon-larger { content: \"\\e6a9\"; }\n@mixin icon-clock { content: \"\\e6aa\"; }\n@mixin icon-font { content: \"\\e6ab\"; }\n@mixin icon-maths { content: \"\\e6ac\"; }\n@mixin icon-grip { content: \"\\e6ad\"; }\n@mixin icon-rubric { content: \"\\e6ae\"; }\n@mixin icon-audio { content: \"\\e6af\"; }\n@mixin icon-grip-h { content: \"\\e6b0\"; }\n@mixin icon-magicwand { content: \"\\e6b1\"; }\n@mixin icon-loop { content: \"\\ea2e\"; }\n@mixin icon-calendar { content: \"\\e953\"; }\n@mixin icon-reload { content: \"\\e984\"; }\n@mixin icon-speed { content: \"\\e9a6\"; }\n@mixin icon-volume { content: \"\\ea27\"; }\n@mixin icon-contrast { content: \"\\e9d5\"; }\n@mixin icon-headphones { content: \"\\e910\"; }\n@mixin icon-compress { content: \"\\f066\"; }\n@mixin icon-map-o { content: \"\\f278\"; }\n@mixin icon-variable { content: \"\\e908\"; }\n@mixin icon-tooltip { content: \"\\e90c\"; }\n@mixin icon-globe { content: \"\\e9c9\"; }\n@mixin icon-highlighter { content: \"\\e90f\"; }\n@mixin icon-eliminate-crossed { content: \"\\e911\"; }\n@mixin icon-play-from-here { content: \"\\e912\"; }\n","$sidebarWidth: 180;\n$sidebarGutter: 0;\n$toolbarHeight: 50;\n$treeSidebar: 280;\n\n// fonts\n$fontPath : 'font/' !default;\n$monospaceFont: Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;\n$regularFont: 'Source Sans Pro', sans-serif;\n$headingFont: 'Source Sans Pro', sans-serif;\n\n\n%clearfix {\n &:before, &:after {\n content: \" \";\n display: table;\n }\n &:after {\n clear: both;\n }\n}\n","// buttons and alerts\n$success: rgb(14, 145, 75);\n$info: rgb(14, 93, 145);\n$warning: rgb(216, 174, 91);\n$danger: rgb(201, 96, 67);\n$error: rgb(186, 18, 43);\n$activeInteraction: rgb(195, 90, 19);\n\n// corporate identity\n$logoRed: rgb(186, 18, 43);\n$grey: rgb(173, 161, 148);\n$darkBlueGrey: rgb(164, 187, 197);\n$mediumBlueGrey: rgb(193, 212, 220);\n$lightBlueGrey: rgb(228, 236, 239);\n$brownRedGrey: rgb(154, 137, 123);\n$darkBrown: rgb(111, 99, 89);\n$websiteBorder: rgb(141, 148, 158);\n\n// ui elements, these should only variations of the above\n// naming convention: jQueryUi theme roller -> camelCase\n\n$textColor: #222;\n$textHighlight: white;\n\n$uiGeneralContentBg: white();\n$uiGeneralContentBorder: #ddd;\n\n$uiHeaderBg: #d4d5d7;\n\n$uiClickableDefaultBg: #f3f1ef;\n$uiClickableHoverBg: whiten($info, 0.2);\n//$uiClickableActiveBg: $uiHeaderBg;\n$uiClickableActiveBg: whiten($websiteBorder, 0.2);\n//$uiClickableActiveBg: #aaa;\n\n$uiSelectableSelectedBg: whiten($info, 0.2);\n$uiSelectableSelectedHoverBg: whiten($info, 0.1);\n$uiSelectableHoverBg: whiten($info, 0.9);\n\n$uiOverlay: $lightBlueGrey;\n\n// new layout. Implemented now only for review panel\n$uiReviewPanelBg: #f2f2f2;\n$uiReviewPanelTextDisabled: hsl(0, 0%, 45%);\n$uiReviewPanelTextDefault: hsl(0, 0%, 12%);\n$uiReviewPanelBgDefault: $uiGeneralContentBg;\n$uiReviewPanelPrimaryHighlight: hsl(208, 100%, 32%);\n$uiReviewPanelBgInverted: $uiReviewPanelTextDefault;\n$uiReviewPanelTextInverted: $uiGeneralContentBg;\n\n// sidebars etc.\n$canvas: mix(#fff, $grey, 85%);\n\n// colors taken from feedback.scss\n$successBgColor: whiten($success, 0.8);\n$successBorderColor: whiten($success, 0.1);\n\n$infoBgColor: whiten($info, 0.8);\n$infoBorderColor: whiten($info, 0.1);\n\n$warningBgColor: whiten($warning, 0.8);\n$warningBorderColor: whiten($warning, 0.1);\n\n$dangerBgColor: whiten($danger, 0.8);\n$dangerBorderColor: whiten($danger, 0.1);\n\n$errorBgColor: whiten($error, 0.8);\n$errorBorderColor: whiten($error, 0.1);\n\n$darkBar: rgb(51, 51, 51);\n$darkBarTxt: rgb(230, 230, 230);\n$darkBarIcon: rgb(220, 220, 220);\n\n$actionLinkColor: #276d9b;\n$actionLinkHoverColor: #4f83a7;\n\n$colorWheel-01: #c3ba13;\n$colorWheel-02: #84a610;\n$colorWheel-03: #2b8e0e;\n$colorWheel-04: #0f9787;\n$colorWheel-05: #0e5d91;\n$colorWheel-06: #0d2689;\n$colorWheel-07: #400d83;\n$colorWheel-08: #960e7d;\n$colorWheel-09: #ba122b;\n$colorWheel-10: #c34713;\n$colorWheel-11: #c36f13;\n$colorWheel-12: #c39413;\n"]}