maidr 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/.Rbuildignore +1 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.json +6 -0
  4. package/.github/workflows/build.yml +20 -0
  5. package/.prettierignore +3 -0
  6. package/.prettierrc.json +7 -0
  7. package/.vscode/extensions.json +25 -0
  8. package/.vscode/settings.json +30 -0
  9. package/.vscode/tasks.json +57 -0
  10. package/CHANGELOG.md +7 -0
  11. package/CITATION.cff +21 -0
  12. package/CONTRIBUTING.md +87 -0
  13. package/LICENSE.md +595 -0
  14. package/README.md +341 -0
  15. package/dist/maidr.js +8851 -0
  16. package/dist/maidr.min.js +1 -0
  17. package/dist/styles.css +244 -0
  18. package/dist/styles.min.css +1 -0
  19. package/docs/Audio.html +1398 -0
  20. package/docs/Constants.html +256 -0
  21. package/docs/Description.html +582 -0
  22. package/docs/Helper.html +364 -0
  23. package/docs/LogError.html +905 -0
  24. package/docs/Menu.html +665 -0
  25. package/docs/Position.html +174 -0
  26. package/docs/Resources.html +338 -0
  27. package/docs/Review.html +333 -0
  28. package/docs/Tracker.html +965 -0
  29. package/docs/audio.js.html +635 -0
  30. package/docs/constants.js.html +1242 -0
  31. package/docs/display.js.html +1184 -0
  32. package/docs/fonts/OpenSans-Bold-webfont.eot +0 -0
  33. package/docs/fonts/OpenSans-Bold-webfont.svg +1830 -0
  34. package/docs/fonts/OpenSans-Bold-webfont.woff +0 -0
  35. package/docs/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  36. package/docs/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
  37. package/docs/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  38. package/docs/fonts/OpenSans-Italic-webfont.eot +0 -0
  39. package/docs/fonts/OpenSans-Italic-webfont.svg +1830 -0
  40. package/docs/fonts/OpenSans-Italic-webfont.woff +0 -0
  41. package/docs/fonts/OpenSans-Light-webfont.eot +0 -0
  42. package/docs/fonts/OpenSans-Light-webfont.svg +1831 -0
  43. package/docs/fonts/OpenSans-Light-webfont.woff +0 -0
  44. package/docs/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  45. package/docs/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
  46. package/docs/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  47. package/docs/fonts/OpenSans-Regular-webfont.eot +0 -0
  48. package/docs/fonts/OpenSans-Regular-webfont.svg +1831 -0
  49. package/docs/fonts/OpenSans-Regular-webfont.woff +0 -0
  50. package/docs/fonts/OpenSans-Semibold-webfont.eot +0 -0
  51. package/docs/fonts/OpenSans-Semibold-webfont.svg +1830 -0
  52. package/docs/fonts/OpenSans-Semibold-webfont.ttf +0 -0
  53. package/docs/fonts/OpenSans-Semibold-webfont.woff +0 -0
  54. package/docs/fonts/OpenSans-SemiboldItalic-webfont.eot +0 -0
  55. package/docs/fonts/OpenSans-SemiboldItalic-webfont.svg +1830 -0
  56. package/docs/fonts/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  57. package/docs/fonts/OpenSans-SemiboldItalic-webfont.woff +0 -0
  58. package/docs/index.html +66 -0
  59. package/docs/scripts/linenumber.js +25 -0
  60. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  61. package/docs/scripts/prettify/lang-css.js +2 -0
  62. package/docs/scripts/prettify/prettify.js +28 -0
  63. package/docs/styles/jsdoc-default.css +692 -0
  64. package/docs/styles/prettify-jsdoc.css +111 -0
  65. package/docs/styles/prettify-tomorrow.css +132 -0
  66. package/examples/dev_charts/barplot.html +1056 -0
  67. package/examples/dev_charts/boxplot.html +1856 -0
  68. package/examples/dev_charts/boxplot_flipped.svg +727 -0
  69. package/examples/dev_charts/heatmap.html +1217 -0
  70. package/examples/dev_charts/scatterplot/displ.js +18 -0
  71. package/examples/dev_charts/scatterplot/histogram_for_residual.svg +595 -0
  72. package/examples/dev_charts/scatterplot/hwy.js +15 -0
  73. package/examples/dev_charts/scatterplot/layers/point_layer.json +938 -0
  74. package/examples/dev_charts/scatterplot/layers/smooth_layer.json +322 -0
  75. package/examples/dev_charts/scatterplot/point_layer.js +938 -0
  76. package/examples/dev_charts/scatterplot/prediction_array.js +31 -0
  77. package/examples/dev_charts/scatterplot/prediction_array.json +31 -0
  78. package/examples/dev_charts/scatterplot/residual_array.js +29 -0
  79. package/examples/dev_charts/scatterplot/residual_array.json +29 -0
  80. package/examples/dev_charts/scatterplot/scatterplot.svg +1428 -0
  81. package/examples/dev_charts/scatterplot/scatterplot_data.html +2838 -0
  82. package/examples/dev_charts/scatterplot/scatterplot_no_jitter_point_only.svg +1393 -0
  83. package/examples/dev_charts/scatterplot/scatterplot_no_jitter_with_bestfit.svg +1424 -0
  84. package/examples/dev_charts/scatterplot/scatterplot_no_jitter_with_loess_curve.svg +1402 -0
  85. package/examples/dev_charts/scatterplot/smooth_layer.js +322 -0
  86. package/examples/dev_charts/scatterplot.html +4560 -0
  87. package/examples/dodged_bar/dodged_bar.png +0 -0
  88. package/examples/dodged_bar/dodged_bar.svg +198 -0
  89. package/examples/dodged_bar/schema.json +41 -0
  90. package/examples/histogram/histogram_tutorial.svg +482 -0
  91. package/examples/histogram/histogram_tutorial_raw_data.json +362 -0
  92. package/examples/histogram/histogram_user_study.svg +578 -0
  93. package/examples/histogram/histogram_user_study_raw_data.json +362 -0
  94. package/examples/lineplot/lineplot_sample.svg +126 -0
  95. package/examples/lineplot/lineplot_sample_raw_data.json +1 -0
  96. package/examples/lineplot/point+lineplot_sample.svg +700 -0
  97. package/examples/other/audio_oscillator_boxplot.js +95 -0
  98. package/examples/other/barplot_labels.svg +314 -0
  99. package/examples/other/barplot_user_study.svg +313 -0
  100. package/examples/other/boxplot.html +927 -0
  101. package/examples/other/boxplot_data_frame.html +568 -0
  102. package/examples/other/boxplot_label.svg +751 -0
  103. package/examples/other/braille-display_boxplot.js +79 -0
  104. package/examples/other/control_boxplot.js +55 -0
  105. package/examples/other/draft.js +56 -0
  106. package/examples/other/getData.html +400 -0
  107. package/examples/other/getData.js +41 -0
  108. package/examples/other/ggplot_to_svg.R +371 -0
  109. package/examples/other/heatmap.svg +582 -0
  110. package/examples/other/heatmap_label.svg +608 -0
  111. package/examples/other/multiple_barplot.html +2250 -0
  112. package/examples/other/new_scatterplot_user_study_point_layer.json +122 -0
  113. package/examples/other/py_binder_output.html +1167 -0
  114. package/examples/other/scatterplot_label.svg +1429 -0
  115. package/examples/other/seaborn_plot.py +9 -0
  116. package/examples/other/svglite_bar.svg +136 -0
  117. package/examples/other/tutorial_boxplot.svg +727 -0
  118. package/examples/other/tutorial_boxplot_data.json +72 -0
  119. package/examples/other/user_study_boxplot.svg +676 -0
  120. package/examples/stacked_bar/schema.json +41 -0
  121. package/examples/stacked_bar/stack_bar.png +0 -0
  122. package/examples/stacked_bar/stacked_bar.svg +180 -0
  123. package/examples/stacked_normalized_bar/stacked_normalized_bar.png +0 -0
  124. package/examples/stacked_normalized_bar/stacked_normalized_bar.svg +189 -0
  125. package/examples/static/barplot.svg +263 -0
  126. package/examples/static/barplot_diamonds_gridSVG.svg +254 -0
  127. package/examples/static/boxplot.svg +424 -0
  128. package/examples/static/heatmap.svg +373 -0
  129. package/examples/static/heatmap_penguins_table.html +486 -0
  130. package/examples/static/scatterplot.svg +530 -0
  131. package/examples/svglite/task_heatmap.html +802 -0
  132. package/examples/svglite/task_heatmap.svg +111 -0
  133. package/examples/svglite/tutorial_bar.svg +136 -0
  134. package/examples/svglite/tutorial_bar_plot.html +504 -0
  135. package/examples/svglite/tutorial_boxplot.html +1850 -0
  136. package/examples/svglite/tutorial_boxplot.svg +727 -0
  137. package/examples/svglite/tutorial_scatterplot.html +3135 -0
  138. package/examples/svglite/tutorial_scatterplot.svg +311 -0
  139. package/gulpfile.js +49 -0
  140. package/index.html +40 -0
  141. package/jsconfig.json +10 -0
  142. package/jsdoc.json +19 -0
  143. package/package.json +47 -0
  144. package/src/css/styles.css +241 -0
  145. package/src/js/__tests__/audio.test.js +49 -0
  146. package/src/js/__tests__/constants.test.js +622 -0
  147. package/src/js/audio.js +575 -0
  148. package/src/js/barplot.js +254 -0
  149. package/src/js/boxplot.js +682 -0
  150. package/src/js/constants.js +1182 -0
  151. package/src/js/controls.js +3182 -0
  152. package/src/js/display.js +1124 -0
  153. package/src/js/heatmap.js +411 -0
  154. package/src/js/histogram.js +134 -0
  155. package/src/js/init.js +427 -0
  156. package/src/js/lineplot.js +219 -0
  157. package/src/js/scatterplot.js +619 -0
  158. package/src/js/segmented.js +268 -0
  159. package/user_study_pilot/binder_test.html +526 -0
  160. package/user_study_pilot/data/barplot_user_study.svg +492 -0
  161. package/user_study_pilot/data/barplot_user_study_raw_data.json +22 -0
  162. package/user_study_pilot/data/boxplot_tutorial.json +72 -0
  163. package/user_study_pilot/data/boxplot_tutorial_horizontal.svg +727 -0
  164. package/user_study_pilot/data/boxplot_user_study.json +52 -0
  165. package/user_study_pilot/data/boxplot_user_study_vertical.svg +675 -0
  166. package/user_study_pilot/data/boxplot_user_study_vertical_horizontal.svg +676 -0
  167. package/user_study_pilot/data/heatmap_user_study.svg +719 -0
  168. package/user_study_pilot/data/heatmap_user_study_raw_data.json +127 -0
  169. package/user_study_pilot/data/new_barplot_user_study.svg +269 -0
  170. package/user_study_pilot/data/new_heatmap_user_study.svg +367 -0
  171. package/user_study_pilot/data/new_scatterplot_user_study.svg +603 -0
  172. package/user_study_pilot/data/new_scatterplot_user_study_point_layer.json +122 -0
  173. package/user_study_pilot/data/scatterplot_user_study (1).svg +321 -0
  174. package/user_study_pilot/data/scatterplot_user_study.svg +603 -0
  175. package/user_study_pilot/data/scatterplot_user_study_point_layer.json +122 -0
  176. package/user_study_pilot/data/scatterplot_user_study_smooth_layer.json +322 -0
  177. package/user_study_pilot/intro.html +215 -0
  178. package/user_study_pilot/jaws_settings/Chrome.JDF +10 -0
  179. package/user_study_pilot/jaws_settings/Firefox.JDF +10 -0
  180. package/user_study_pilot/jaws_settings/backup_utf8/Chrome.JDF +10 -0
  181. package/user_study_pilot/jaws_settings/backup_utf8/Firefox.JDF +10 -0
  182. package/user_study_pilot/jaws_settings/backup_utf8/msedge.JDF +10 -0
  183. package/user_study_pilot/jaws_settings/msedge.JDF +10 -0
  184. package/user_study_pilot/nvda_settings/chrome.dic +10 -0
  185. package/user_study_pilot/nvda_settings/default.dic +10 -0
  186. package/user_study_pilot/nvda_settings/firefox.dic +10 -0
  187. package/user_study_pilot/nvda_settings/msedge.dic +10 -0
  188. package/user_study_pilot/scatterplot.html +4560 -0
  189. package/user_study_pilot/seaborn_test.html +1059 -0
  190. package/user_study_pilot/svglite_test.html +534 -0
  191. package/user_study_pilot/task1_bar_plot.html +1111 -0
  192. package/user_study_pilot/task2_heatmap.html +1661 -0
  193. package/user_study_pilot/task3_boxplot_horizontal.html +1690 -0
  194. package/user_study_pilot/task3_boxplot_vertical.html +1689 -0
  195. package/user_study_pilot/task4_scatterplot.html +2091 -0
  196. package/user_study_pilot/tutorial1_bar_plot.html +1159 -0
  197. package/user_study_pilot/tutorial2_heatmap.html +1276 -0
  198. package/user_study_pilot/tutorial3_boxplot_horizontal.html +1861 -0
  199. package/user_study_pilot/tutorial3_boxplot_vertical.html +1807 -0
  200. package/user_study_pilot/tutorial4_scatterplot.html +5893 -0
  201. package/user_study_pilot/tutorial5_histogram.html +1553 -0
  202. package/user_study_pilot/tutorial6_lineplot.html +1011 -0
  203. package/user_study_pilot/tutorial7_stacked.html +763 -0
  204. package/user_study_pilot/tutorial8_stacked_normalized.html +796 -0
  205. package/user_study_pilot/tutorial9_dodged_bar.html +831 -0
  206. package/user_study_pilot/voiceover_settings/user_study_VoiceOver Archive.voprefs +573 -0
@@ -0,0 +1,254 @@
1
+ class BarChart {
2
+ constructor() {
3
+ // initialize variables xlevel, data, and elements
4
+ let xlevel = null;
5
+ if ('axes' in singleMaidr) {
6
+ if (singleMaidr.axes.x) {
7
+ if (singleMaidr.axes.x.level) {
8
+ xlevel = singleMaidr.axes.x.level;
9
+ }
10
+ }
11
+ // todo: handle y for vertical bar charts
12
+ }
13
+ let data = null;
14
+ if ('data' in singleMaidr) {
15
+ data = singleMaidr.data;
16
+ }
17
+ let elements = null;
18
+ if ('elements' in singleMaidr) {
19
+ elements = singleMaidr.elements;
20
+ }
21
+
22
+ if (xlevel && data && elements) {
23
+ if (elements.length != data.length) {
24
+ // I didn't throw an error but give a warning
25
+ constants.hasRect = 0;
26
+ logError.logDifferentLengths('elements', 'data');
27
+ } else if (xlevel.length != elements.length) {
28
+ constants.hasRect = 0;
29
+ logError.logDifferentLengths('x level', 'elements');
30
+ } else if (data.length != xlevel.length) {
31
+ constants.hasRect = 0;
32
+ logError.logDifferentLengths('x level', 'data');
33
+ } else {
34
+ this.bars = elements;
35
+ constants.hasRect = 1;
36
+ }
37
+ } else if (data && elements) {
38
+ if (data.length != elements.length) {
39
+ constants.hasRect = 0;
40
+ logError.logDifferentLengths('data', 'elements');
41
+ } else {
42
+ this.bars = elements;
43
+ constants.hasRect = 1;
44
+ }
45
+ } else if (xlevel && data) {
46
+ if (xlevel.length != data.length) {
47
+ constants.hasRect = 0;
48
+ logError.logDifferentLengths('x level', 'data');
49
+ }
50
+ logError.LogAbsentElement('elements');
51
+ } else if (data) {
52
+ logError.LogAbsentElement('x level');
53
+ logError.LogAbsentElement('elements');
54
+ }
55
+
56
+ // bars. The actual bar elements in the SVG. Used to highlight visually
57
+ // if ('elements' in singleMaidr) {
58
+ // this.bars = singleMaidr.elements;
59
+ // constants.hasRect = 1;
60
+ // } else {
61
+ // // this.bars = constants.chart.querySelectorAll('g[id^="geom_rect"] > rect'); // if we use plot.plotData.length instead of plot.bars.length, we don't have to include this
62
+ // constants.hasRect = 0;
63
+ // }
64
+
65
+ // column labels, both legend and tick
66
+ this.columnLabels = [];
67
+ let legendX = '';
68
+ let legendY = '';
69
+ if ('labels' in singleMaidr) {
70
+ if ('x' in singleMaidr.labels) {
71
+ legendX = singleMaidr.labels.x;
72
+ }
73
+ if ('y' in singleMaidr.labels) {
74
+ legendY = singleMaidr.labels.y;
75
+ }
76
+ }
77
+ if ('axes' in singleMaidr) {
78
+ // legend labels
79
+ if (singleMaidr.axes.x) {
80
+ if (singleMaidr.axes.x.label) {
81
+ if (legendX == '') {
82
+ legendX = singleMaidr.axes.x.label;
83
+ }
84
+ }
85
+ }
86
+ if (singleMaidr.axes.y) {
87
+ if (singleMaidr.axes.y.label) {
88
+ if (legendY == '') {
89
+ legendY = singleMaidr.axes.y.label;
90
+ }
91
+ }
92
+ }
93
+
94
+ // tick labels
95
+ if (singleMaidr.axes.x) {
96
+ if (singleMaidr.axes.x.level) {
97
+ this.columnLabels = singleMaidr.axes.x.level;
98
+ }
99
+ }
100
+ if (singleMaidr.axes.y) {
101
+ if (singleMaidr.axes.y.level) {
102
+ this.columnLabels = singleMaidr.axes.y.level;
103
+ }
104
+ }
105
+ }
106
+
107
+ this.plotLegend = {
108
+ x: legendX,
109
+ y: legendY,
110
+ };
111
+
112
+ // title
113
+ this.title = '';
114
+ if ('labels' in singleMaidr) {
115
+ if ('title' in singleMaidr.labels) {
116
+ this.title = singleMaidr.labels.title;
117
+ }
118
+ }
119
+ if (this.title == '') {
120
+ if ('title' in singleMaidr) {
121
+ this.title = singleMaidr.title;
122
+ }
123
+ }
124
+
125
+ // subtitle
126
+ if ('labels' in singleMaidr) {
127
+ if ('subtitle' in singleMaidr.labels) {
128
+ this.subtitle = singleMaidr.labels.subtitle;
129
+ }
130
+ }
131
+ // caption
132
+ if ('labels' in singleMaidr) {
133
+ if ('caption' in singleMaidr.labels) {
134
+ this.caption = singleMaidr.labels.caption;
135
+ }
136
+ }
137
+
138
+ if (Array.isArray(singleMaidr)) {
139
+ this.plotData = singleMaidr;
140
+ } else {
141
+ if ('data' in singleMaidr) {
142
+ this.plotData = singleMaidr.data;
143
+ }
144
+ }
145
+
146
+ // set the max and min values for the plot
147
+ this.SetMaxMin();
148
+
149
+ this.autoplay = null;
150
+ }
151
+
152
+ SetMaxMin() {
153
+ for (let i = 0; i < this.plotData.length; i++) {
154
+ if (i == 0) {
155
+ constants.maxY = this.plotData[i];
156
+ constants.minY = this.plotData[i];
157
+ } else {
158
+ if (this.plotData[i] > constants.maxY) {
159
+ constants.maxY = this.plotData[i];
160
+ }
161
+ if (this.plotData[i] < constants.minY) {
162
+ constants.minY = this.plotData[i];
163
+ }
164
+ }
165
+ }
166
+ constants.maxX = this.columnLabels.length;
167
+ constants.autoPlayRate = Math.min(
168
+ Math.ceil(constants.AUTOPLAY_DURATION / (constants.maxX + 1)),
169
+ constants.MAX_SPEED
170
+ );
171
+ constants.DEFAULT_SPEED = constants.autoPlayRate;
172
+ if (constants.autoPlayRate < constants.MIN_SPEED) {
173
+ constants.MIN_SPEED = constants.autoPlayRate;
174
+ }
175
+ }
176
+
177
+ PlayTones() {
178
+ audio.playTone();
179
+ }
180
+
181
+ GetLegendFromManualData() {
182
+ let legend = {};
183
+
184
+ legend.x = barplotLegend.x;
185
+ legend.y = barplotLegend.y;
186
+
187
+ return legend;
188
+ }
189
+
190
+ GetData() {
191
+ // set height for each bar
192
+
193
+ let plotData = [];
194
+
195
+ if (this.bars) {
196
+ for (let i = 0; i < this.bars.length; i++) {
197
+ plotData.push(this.bars[i].getAttribute('height'));
198
+ }
199
+ }
200
+
201
+ return plotData;
202
+ }
203
+
204
+ GetColumns() {
205
+ // get column names
206
+ // the pattern seems to be a <tspan> with dy="10", but check this for future output (todo)
207
+
208
+ let columnLabels = [];
209
+ let els = constants.chart.querySelectorAll('tspan[dy="10"]'); // todo, generalize this selector
210
+ for (var i = 0; i < els.length; i++) {
211
+ columnLabels.push(els[i].innerHTML);
212
+ }
213
+
214
+ return columnLabels;
215
+ }
216
+
217
+ GetLegend() {
218
+ let legend = {};
219
+ let els = constants.chart.querySelectorAll('tspan[dy="12"]'); // todo, generalize this selector
220
+ legend.x = els[1].innerHTML;
221
+ legend.y = els[0].innerHTML;
222
+
223
+ return legend;
224
+ }
225
+
226
+ ParseInnerHTML(els) {
227
+ // parse innerHTML of elements
228
+ let parsed = [];
229
+ for (var i = 0; i < els.length; i++) {
230
+ parsed.push(els[i].innerHTML);
231
+ }
232
+ return parsed;
233
+ }
234
+
235
+ Select() {
236
+ this.UnSelectPrevious();
237
+ if (this.bars) {
238
+ this.activeElement = this.bars[position.x];
239
+ if (this.activeElement) {
240
+ this.activeElementColor = this.activeElement.getAttribute('fill');
241
+ let newColor = constants.GetBetterColor(this.activeElementColor);
242
+ this.activeElement.setAttribute('fill', newColor);
243
+ }
244
+ }
245
+ }
246
+
247
+ UnSelectPrevious() {
248
+ if (this.activeElement) {
249
+ // set fill attribute to the original color
250
+ this.activeElement.setAttribute('fill', this.activeElementColor);
251
+ this.activeElement = null;
252
+ }
253
+ }
254
+ }