foundation-rails 5.5.1.2 → 5.5.2.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 (65) hide show
  1. data/bower.json +2 -2
  2. data/lib/foundation/rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/foundation.js +1 -1
  4. data/vendor/assets/javascripts/foundation/foundation.abide.js +96 -28
  5. data/vendor/assets/javascripts/foundation/foundation.accordion.js +28 -7
  6. data/vendor/assets/javascripts/foundation/foundation.alert.js +3 -3
  7. data/vendor/assets/javascripts/foundation/foundation.clearing.js +50 -20
  8. data/vendor/assets/javascripts/foundation/foundation.dropdown.js +26 -11
  9. data/vendor/assets/javascripts/foundation/foundation.equalizer.js +43 -16
  10. data/vendor/assets/javascripts/foundation/foundation.interchange.js +19 -14
  11. data/vendor/assets/javascripts/foundation/foundation.joyride.js +1 -1
  12. data/vendor/assets/javascripts/foundation/foundation.js +51 -29
  13. data/vendor/assets/javascripts/foundation/foundation.magellan.js +40 -28
  14. data/vendor/assets/javascripts/foundation/foundation.offcanvas.js +3 -3
  15. data/vendor/assets/javascripts/foundation/foundation.orbit.js +1 -1
  16. data/vendor/assets/javascripts/foundation/foundation.reveal.js +70 -43
  17. data/vendor/assets/javascripts/foundation/foundation.slider.js +23 -5
  18. data/vendor/assets/javascripts/foundation/foundation.tab.js +30 -18
  19. data/vendor/assets/javascripts/foundation/foundation.tooltip.js +47 -15
  20. data/vendor/assets/javascripts/foundation/foundation.topbar.js +31 -25
  21. data/vendor/assets/stylesheets/foundation.scss +37 -38
  22. data/vendor/assets/stylesheets/foundation/_functions.scss +52 -42
  23. data/vendor/assets/stylesheets/foundation/_settings.scss +53 -34
  24. data/vendor/assets/stylesheets/foundation/components/_accordion.scss +7 -7
  25. data/vendor/assets/stylesheets/foundation/components/_alert-boxes.scss +11 -11
  26. data/vendor/assets/stylesheets/foundation/components/_block-grid.scss +13 -13
  27. data/vendor/assets/stylesheets/foundation/components/_breadcrumbs.scss +17 -18
  28. data/vendor/assets/stylesheets/foundation/components/_button-groups.scss +29 -22
  29. data/vendor/assets/stylesheets/foundation/components/_buttons.scss +13 -17
  30. data/vendor/assets/stylesheets/foundation/components/_clearing.scss +51 -47
  31. data/vendor/assets/stylesheets/foundation/components/_dropdown-buttons.scss +10 -11
  32. data/vendor/assets/stylesheets/foundation/components/_dropdown.scss +42 -36
  33. data/vendor/assets/stylesheets/foundation/components/_flex-video.scss +7 -7
  34. data/vendor/assets/stylesheets/foundation/components/_forms.scss +82 -50
  35. data/vendor/assets/stylesheets/foundation/components/_global.scss +86 -64
  36. data/vendor/assets/stylesheets/foundation/components/_grid.scss +24 -21
  37. data/vendor/assets/stylesheets/foundation/components/_icon-bar.scss +335 -234
  38. data/vendor/assets/stylesheets/foundation/components/_inline-lists.scss +8 -8
  39. data/vendor/assets/stylesheets/foundation/components/_joyride.scss +40 -42
  40. data/vendor/assets/stylesheets/foundation/components/_keystrokes.scss +2 -3
  41. data/vendor/assets/stylesheets/foundation/components/_labels.scss +6 -6
  42. data/vendor/assets/stylesheets/foundation/components/_magellan.scss +2 -2
  43. data/vendor/assets/stylesheets/foundation/components/_offcanvas.scss +178 -175
  44. data/vendor/assets/stylesheets/foundation/components/_orbit.scss +82 -62
  45. data/vendor/assets/stylesheets/foundation/components/_pagination.scss +15 -15
  46. data/vendor/assets/stylesheets/foundation/components/_panels.scss +21 -15
  47. data/vendor/assets/stylesheets/foundation/components/_pricing-tables.scss +16 -16
  48. data/vendor/assets/stylesheets/foundation/components/_progress-bars.scss +4 -4
  49. data/vendor/assets/stylesheets/foundation/components/_range-slider.scss +23 -16
  50. data/vendor/assets/stylesheets/foundation/components/_reveal.scss +27 -27
  51. data/vendor/assets/stylesheets/foundation/components/_side-nav.scss +15 -11
  52. data/vendor/assets/stylesheets/foundation/components/_split-buttons.scss +16 -16
  53. data/vendor/assets/stylesheets/foundation/components/_sub-nav.scss +14 -11
  54. data/vendor/assets/stylesheets/foundation/components/_switches.scss +22 -19
  55. data/vendor/assets/stylesheets/foundation/components/_tables.scss +8 -8
  56. data/vendor/assets/stylesheets/foundation/components/_tabs.scss +49 -32
  57. data/vendor/assets/stylesheets/foundation/components/_thumbs.scss +8 -8
  58. data/vendor/assets/stylesheets/foundation/components/_tooltips.scss +25 -25
  59. data/vendor/assets/stylesheets/foundation/components/_top-bar.scss +163 -122
  60. data/vendor/assets/stylesheets/foundation/components/_type.scss +19 -19
  61. data/vendor/assets/stylesheets/foundation/components/_visibility.scss +23 -5
  62. data/vendor/assets/stylesheets/normalize.scss +8 -11
  63. metadata +28 -20
  64. checksums.yaml +0 -7
  65. data/vendor/assets/stylesheets/foundation/components/_toolbar.scss +0 -72
@@ -4,7 +4,7 @@
4
4
  Foundation.libs.offcanvas = {
5
5
  name : 'offcanvas',
6
6
 
7
- version : '5.5.1',
7
+ version : '5.5.2',
8
8
 
9
9
  settings : {
10
10
  open_method : 'move',
@@ -111,13 +111,13 @@
111
111
 
112
112
  show : function (class_name, $off_canvas) {
113
113
  $off_canvas = $off_canvas || this.get_wrapper();
114
- $off_canvas.trigger('open').trigger('open.fndtn.offcanvas');
114
+ $off_canvas.trigger('open.fndtn.offcanvas');
115
115
  $off_canvas.addClass(class_name);
116
116
  },
117
117
 
118
118
  hide : function (class_name, $off_canvas) {
119
119
  $off_canvas = $off_canvas || this.get_wrapper();
120
- $off_canvas.trigger('close').trigger('close.fndtn.offcanvas');
120
+ $off_canvas.trigger('close.fndtn.offcanvas');
121
121
  $off_canvas.removeClass(class_name);
122
122
  },
123
123
 
@@ -407,7 +407,7 @@
407
407
  Foundation.libs.orbit = {
408
408
  name : 'orbit',
409
409
 
410
- version : '5.5.1',
410
+ version : '5.5.2',
411
411
 
412
412
  settings : {
413
413
  animation : 'slide',
@@ -4,7 +4,7 @@
4
4
  Foundation.libs.reveal = {
5
5
  name : 'reveal',
6
6
 
7
- version : '5.5.1',
7
+ version : '5.5.2',
8
8
 
9
9
  locked : false,
10
10
 
@@ -21,6 +21,7 @@
21
21
  opened : function(){},
22
22
  close : function(){},
23
23
  closed : function(){},
24
+ on_ajax_error: $.noop,
24
25
  bg : $('.reveal-modal-bg'),
25
26
  css : {
26
27
  open : {
@@ -52,7 +53,8 @@
52
53
 
53
54
  if (!self.locked) {
54
55
  var element = S(this),
55
- ajax = element.data(self.data_attr('reveal-ajax'));
56
+ ajax = element.data(self.data_attr('reveal-ajax')),
57
+ replaceContentSel = element.data(self.data_attr('reveal-replace-content'));
56
58
 
57
59
  self.locked = true;
58
60
 
@@ -60,8 +62,7 @@
60
62
  self.open.call(self, element);
61
63
  } else {
62
64
  var url = ajax === true ? element.attr('href') : ajax;
63
-
64
- self.open.call(self, element, {url : url});
65
+ self.open.call(self, element, {url : url}, { replaceContentSel : replaceContentSel });
65
66
  }
66
67
  }
67
68
  });
@@ -82,7 +83,7 @@
82
83
  }
83
84
 
84
85
  self.locked = true;
85
- self.close.call(self, bg_clicked ? S('[' + self.attr_name() + '].open') : S(this).closest('[' + self.attr_name() + ']'));
86
+ self.close.call(self, bg_clicked ? S('[' + self.attr_name() + '].open:not(.toback)') : S(this).closest('[' + self.attr_name() + ']'));
86
87
  }
87
88
  });
88
89
 
@@ -153,6 +154,7 @@
153
154
  var settings = modal.data(self.attr_name(true) + '-init');
154
155
  settings = settings || this.settings;
155
156
 
157
+
156
158
  if (modal.hasClass('open') && target.attr('data-reveal-id') == modal.attr('id')) {
157
159
  return self.close(modal);
158
160
  }
@@ -165,8 +167,15 @@
165
167
  .data('offset', this.cache_offset(modal));
166
168
  }
167
169
 
170
+ modal.attr('tabindex','0').attr('aria-hidden','false');
171
+
168
172
  this.key_up_on(modal); // PATCH #3: turning on key up capture only when a reveal window is open
169
173
 
174
+ // Prevent namespace event from triggering twice
175
+ modal.on('open.fndtn.reveal', function(e) {
176
+ if (e.namespace !== 'fndtn.reveal') return;
177
+ });
178
+
170
179
  modal.on('open.fndtn.reveal').trigger('open.fndtn.reveal');
171
180
 
172
181
  if (open_modal.length < 1) {
@@ -182,16 +191,15 @@
182
191
  if (typeof ajax_settings === 'undefined' || !ajax_settings.url) {
183
192
  if (open_modal.length > 0) {
184
193
  if (settings.multiple_opened) {
185
- this.to_back(open_modal);
194
+ self.to_back(open_modal);
186
195
  } else {
187
- this.hide(open_modal, settings.css.close);
196
+ self.hide(open_modal, settings.css.close);
188
197
  }
189
198
  }
190
199
 
191
200
  this.show(modal, settings.css.open);
192
201
  } else {
193
202
  var old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null;
194
-
195
203
  $.extend(ajax_settings, {
196
204
  success : function (data, textStatus, jqXHR) {
197
205
  if ( $.isFunction(old_success) ) {
@@ -201,21 +209,33 @@
201
209
  }
202
210
  }
203
211
 
204
- modal.html(data);
212
+ if (typeof options !== 'undefined' && typeof options.replaceContentSel !== 'undefined') {
213
+ modal.find(options.replaceContentSel).html(data);
214
+ } else {
215
+ modal.html(data);
216
+ }
217
+
205
218
  self.S(modal).foundation('section', 'reflow');
206
219
  self.S(modal).children().foundation();
207
220
 
208
221
  if (open_modal.length > 0) {
209
222
  if (settings.multiple_opened) {
210
- this.to_back(open_modal);
223
+ self.to_back(open_modal);
211
224
  } else {
212
- this.hide(open_modal, settings.css.close);
225
+ self.hide(open_modal, settings.css.close);
213
226
  }
214
227
  }
215
228
  self.show(modal, settings.css.open);
216
229
  }
217
230
  });
218
231
 
232
+ // check for if user initalized with error callback
233
+ if (settings.on_ajax_error !== $.noop) {
234
+ $.extend(ajax_settings, {
235
+ error : settings.on_ajax_error
236
+ });
237
+ }
238
+
219
239
  $.ajax(ajax_settings);
220
240
  }
221
241
  }
@@ -225,23 +245,28 @@
225
245
  close : function (modal) {
226
246
  var modal = modal && modal.length ? modal : this.S(this.scope),
227
247
  open_modals = this.S('[' + this.attr_name() + '].open'),
228
- settings = modal.data(this.attr_name(true) + '-init') || this.settings;
248
+ settings = modal.data(this.attr_name(true) + '-init') || this.settings,
249
+ self = this;
229
250
 
230
251
  if (open_modals.length > 0) {
252
+
253
+ modal.removeAttr('tabindex','0').attr('aria-hidden','true');
254
+
231
255
  this.locked = true;
232
256
  this.key_up_off(modal); // PATCH #3: turning on key up capture only when a reveal window is open
233
- modal.trigger('close').trigger('close.fndtn.reveal');
234
-
257
+
258
+ modal.trigger('close.fndtn.reveal');
259
+
235
260
  if ((settings.multiple_opened && open_modals.length === 1) || !settings.multiple_opened || modal.length > 1) {
236
- this.toggle_bg(modal, false);
237
- this.to_front(modal);
261
+ self.toggle_bg(modal, false);
262
+ self.to_front(modal);
238
263
  }
239
-
264
+
240
265
  if (settings.multiple_opened) {
241
- this.hide(modal, settings.css.close, settings);
242
- this.to_front($($.makeArray(open_modals).reverse()[1]));
266
+ self.hide(modal, settings.css.close, settings);
267
+ self.to_front($($.makeArray(open_modals).reverse()[1]));
243
268
  } else {
244
- this.hide(open_modals, settings.css.close, settings);
269
+ self.hide(open_modals, settings.css.close, settings);
245
270
  }
246
271
  }
247
272
  },
@@ -276,7 +301,8 @@
276
301
  // is modal
277
302
  if (css) {
278
303
  var settings = el.data(this.attr_name(true) + '-init') || this.settings,
279
- root_element = settings.root_element;
304
+ root_element = settings.root_element,
305
+ context = this;
280
306
 
281
307
  if (el.parent(root_element).length === 0) {
282
308
  var placeholder = el.wrap('<div style="display: none;" />').parent();
@@ -304,11 +330,11 @@
304
330
  return el
305
331
  .css(css)
306
332
  .animate(end_css, settings.animation_speed, 'linear', function () {
307
- this.locked = false;
308
- el.trigger('opened').trigger('opened.fndtn.reveal');
309
- }.bind(this))
333
+ context.locked = false;
334
+ el.trigger('opened.fndtn.reveal');
335
+ })
310
336
  .addClass('open');
311
- }.bind(this), settings.animation_speed / 2);
337
+ }, settings.animation_speed / 2);
312
338
  }
313
339
 
314
340
  if (animData.fade) {
@@ -319,14 +345,14 @@
319
345
  return el
320
346
  .css(css)
321
347
  .animate(end_css, settings.animation_speed, 'linear', function () {
322
- this.locked = false;
323
- el.trigger('opened').trigger('opened.fndtn.reveal');
324
- }.bind(this))
348
+ context.locked = false;
349
+ el.trigger('opened.fndtn.reveal');
350
+ })
325
351
  .addClass('open');
326
- }.bind(this), settings.animation_speed / 2);
352
+ }, settings.animation_speed / 2);
327
353
  }
328
354
 
329
- return el.css(css).show().css({opacity : 1}).addClass('open').trigger('opened').trigger('opened.fndtn.reveal');
355
+ return el.css(css).show().css({opacity : 1}).addClass('open').trigger('opened.fndtn.reveal');
330
356
  }
331
357
 
332
358
  var settings = this.settings;
@@ -340,11 +366,11 @@
340
366
 
341
367
  return el.show();
342
368
  },
343
-
369
+
344
370
  to_back : function(el) {
345
371
  el.addClass('toback');
346
372
  },
347
-
373
+
348
374
  to_front : function(el) {
349
375
  el.removeClass('toback');
350
376
  },
@@ -352,7 +378,8 @@
352
378
  hide : function (el, css) {
353
379
  // is modal
354
380
  if (css) {
355
- var settings = el.data(this.attr_name(true) + '-init');
381
+ var settings = el.data(this.attr_name(true) + '-init'),
382
+ context = this;
356
383
  settings = settings || this.settings;
357
384
 
358
385
  var animData = getAnimationData(settings.animation);
@@ -368,11 +395,11 @@
368
395
  return setTimeout(function () {
369
396
  return el
370
397
  .animate(end_css, settings.animation_speed, 'linear', function () {
371
- this.locked = false;
372
- el.css(css).trigger('closed').trigger('closed.fndtn.reveal');
373
- }.bind(this))
398
+ context.locked = false;
399
+ el.css(css).trigger('closed.fndtn.reveal');
400
+ })
374
401
  .removeClass('open');
375
- }.bind(this), settings.animation_speed / 2);
402
+ }, settings.animation_speed / 2);
376
403
  }
377
404
 
378
405
  if (animData.fade) {
@@ -381,14 +408,14 @@
381
408
  return setTimeout(function () {
382
409
  return el
383
410
  .animate(end_css, settings.animation_speed, 'linear', function () {
384
- this.locked = false;
385
- el.css(css).trigger('closed').trigger('closed.fndtn.reveal');
386
- }.bind(this))
411
+ context.locked = false;
412
+ el.css(css).trigger('closed.fndtn.reveal');
413
+ })
387
414
  .removeClass('open');
388
- }.bind(this), settings.animation_speed / 2);
415
+ }, settings.animation_speed / 2);
389
416
  }
390
417
 
391
- return el.hide().css(css).removeClass('open').trigger('closed').trigger('closed.fndtn.reveal');
418
+ return el.hide().css(css).removeClass('open').trigger('closed.fndtn.reveal');
392
419
  }
393
420
 
394
421
  var settings = this.settings;
@@ -438,7 +465,7 @@
438
465
  },
439
466
 
440
467
  cache_offset : function (modal) {
441
- var offset = modal.show().height() + parseInt(modal.css('top'), 10);
468
+ var offset = modal.show().height() + parseInt(modal.css('top'), 10) + modal.scrollY;
442
469
 
443
470
  modal.hide();
444
471
 
@@ -4,7 +4,7 @@
4
4
  Foundation.libs.slider = {
5
5
  name : 'slider',
6
6
 
7
- version : '5.5.1',
7
+ version : '5.5.2',
8
8
 
9
9
  settings : {
10
10
  start : 0,
@@ -63,6 +63,24 @@
63
63
  .on('resize.fndtn.slider', self.throttle(function (e) {
64
64
  self.reflow();
65
65
  }, 300));
66
+
67
+ // update slider value as users change input value
68
+ this.S('[' + this.attr_name() + ']').each(function () {
69
+ var slider = $(this),
70
+ handle = slider.children('.range-slider-handle')[0],
71
+ settings = self.initialize_settings(handle);
72
+
73
+ if (settings.display_selector != '') {
74
+ $(settings.display_selector).each(function(){
75
+ if (this.hasOwnProperty('value')) {
76
+ $(this).change(function(){
77
+ // is there a better way to do this?
78
+ slider.foundation("slider", "set_value", $(this).val());
79
+ });
80
+ }
81
+ });
82
+ }
83
+ });
66
84
  },
67
85
 
68
86
  get_cursor_position : function (e, xy) {
@@ -139,11 +157,11 @@
139
157
  $handle.siblings('.range-slider-active-segment').css('width', progress_bar_length + '%');
140
158
  }
141
159
 
142
- $handle_parent.attr(this.attr_name(), value).trigger('change').trigger('change.fndtn.slider');
160
+ $handle_parent.attr(this.attr_name(), value).trigger('change.fndtn.slider');
143
161
 
144
162
  $hidden_inputs.val(value);
145
163
  if (settings.trigger_input_change) {
146
- $hidden_inputs.trigger('change');
164
+ $hidden_inputs.trigger('change.fndtn.slider');
147
165
  }
148
166
 
149
167
  if (!$handle[0].hasAttribute('aria-valuemin')) {
@@ -156,7 +174,7 @@
156
174
 
157
175
  if (settings.display_selector != '') {
158
176
  $(settings.display_selector).each(function () {
159
- if (this.hasOwnProperty('value')) {
177
+ if (this.hasAttribute('value')) {
160
178
  $(this).val(value);
161
179
  } else {
162
180
  $(this).text(value);
@@ -223,7 +241,7 @@
223
241
  }
224
242
 
225
243
  $.data(handle, 'bar', $(handle).parent());
226
- $.data(handle, 'settings', settings);
244
+ return $.data(handle, 'settings', settings);
227
245
  },
228
246
 
229
247
  set_initial_position : function ($ele) {
@@ -4,7 +4,7 @@
4
4
  Foundation.libs.tab = {
5
5
  name : 'tab',
6
6
 
7
- version : '5.5.1',
7
+ version : '5.5.2',
8
8
 
9
9
  settings : {
10
10
  active_class : 'active',
@@ -20,40 +20,52 @@
20
20
  var self = this,
21
21
  S = this.S;
22
22
 
23
- this.bindings(method, options);
23
+ // Store the default active tabs which will be referenced when the
24
+ // location hash is absent, as in the case of navigating the tabs and
25
+ // returning to the first viewing via the browser Back button.
26
+ S('[' + this.attr_name() + '] > .active > a', this.scope).each(function () {
27
+ self.default_tab_hashes.push(this.hash);
28
+ });
24
29
 
25
30
  // store the initial href, which is used to allow correct behaviour of the
26
31
  // browser back button when deep linking is turned on.
27
32
  self.entry_location = window.location.href;
28
33
 
34
+ this.bindings(method, options);
29
35
  this.handle_location_hash_change();
30
-
31
- // Store the default active tabs which will be referenced when the
32
- // location hash is absent, as in the case of navigating the tabs and
33
- // returning to the first viewing via the browser Back button.
34
- S('[' + this.attr_name() + '] > .active > a', this.scope).each(function () {
35
- self.default_tab_hashes.push(this.hash);
36
- });
37
36
  },
38
37
 
39
38
  events : function () {
40
39
  var self = this,
41
40
  S = this.S;
42
41
 
43
- var usual_tab_behavior = function (e) {
44
- var settings = S(this).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
42
+ var usual_tab_behavior = function (e, target) {
43
+ var settings = S(target).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
45
44
  if (!settings.is_hover || Modernizr.touch) {
46
45
  e.preventDefault();
47
46
  e.stopPropagation();
48
- self.toggle_active_tab(S(this).parent());
47
+ self.toggle_active_tab(S(target).parent());
49
48
  }
50
49
  };
51
50
 
52
51
  S(this.scope)
53
52
  .off('.tab')
53
+ // Key event: focus/tab key
54
+ .on('keydown.fndtn.tab', '[' + this.attr_name() + '] > * > a', function(e) {
55
+ var el = this;
56
+ var keyCode = e.keyCode || e.which;
57
+ // if user pressed tab key
58
+ if (keyCode == 9) {
59
+ e.preventDefault();
60
+ // TODO: Change usual_tab_behavior into accessibility function?
61
+ usual_tab_behavior(e, el);
62
+ }
63
+ })
54
64
  // Click event: tab title
55
- .on('focus.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior )
56
- .on('click.fndtn.tab', '[' + this.attr_name() + '] > * > a', usual_tab_behavior )
65
+ .on('click.fndtn.tab', '[' + this.attr_name() + '] > * > a', function(e) {
66
+ var el = this;
67
+ usual_tab_behavior(e, el);
68
+ })
57
69
  // Hover event: tab title
58
70
  .on('mouseenter.fndtn.tab', '[' + this.attr_name() + '] > * > a', function (e) {
59
71
  var settings = S(this).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');
@@ -178,8 +190,8 @@
178
190
  };
179
191
 
180
192
  // allow usage of data-tab-content attribute instead of href
181
- if (S(this).data(this.data_attr('tab-content'))) {
182
- target_hash = '#' + S(this).data(this.data_attr('tab-content')).split('#')[1];
193
+ if (anchor.data('tab-content')) {
194
+ target_hash = '#' + anchor.data('tab-content').split('#')[1];
183
195
  target = S(target_hash);
184
196
  }
185
197
 
@@ -216,8 +228,8 @@
216
228
  target.siblings().removeClass(settings.active_class).attr({'aria-hidden' : 'true', tabindex : -1});
217
229
  target.addClass(settings.active_class).attr('aria-hidden', 'false').removeAttr('tabindex');
218
230
  settings.callback(tab);
219
- target.triggerHandler('toggled', [tab]);
220
- tabs.triggerHandler('toggled', [target]);
231
+ target.triggerHandler('toggled', [target]);
232
+ tabs.triggerHandler('toggled', [tab]);
221
233
 
222
234
  tab_link.off('keydown').on('keydown', interpret_keyup_action );
223
235
  },