beyond-rails 0.0.139

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 (138) hide show
  1. checksums.yaml +7 -0
  2. data/src/font/icomoon.eot +0 -0
  3. data/src/font/icomoon.svg +125 -0
  4. data/src/font/icomoon.ttf +0 -0
  5. data/src/font/icomoon.woff +0 -0
  6. data/src/img/black-cat.svg +15 -0
  7. data/src/img/cart.svg +16 -0
  8. data/src/img/china-flag.svg +16 -0
  9. data/src/img/ecpay.svg +12 -0
  10. data/src/img/family-mart.svg +13 -0
  11. data/src/img/fb-messenger.svg +12 -0
  12. data/src/img/fb.svg +10 -0
  13. data/src/img/hct.svg +16 -0
  14. data/src/img/hi-life.svg +23 -0
  15. data/src/img/line.svg +14 -0
  16. data/src/img/ok-mart.svg +9 -0
  17. data/src/img/pelican.svg +33 -0
  18. data/src/img/seven-eleven.svg +13 -0
  19. data/src/img/smilepay.svg +13 -0
  20. data/src/img/taiwan-flag.svg +17 -0
  21. data/src/js/components/Alert.js +23 -0
  22. data/src/js/components/Autocomplete.js +110 -0
  23. data/src/js/components/AutocompleteMenu.js +88 -0
  24. data/src/js/components/Btn.js +41 -0
  25. data/src/js/components/Checkbox.js +24 -0
  26. data/src/js/components/DateInput.js +74 -0
  27. data/src/js/components/DateMenu.js +370 -0
  28. data/src/js/components/DateTimeRanger.js +436 -0
  29. data/src/js/components/Datepicker.js +250 -0
  30. data/src/js/components/DatepickerBtnArrow.js +18 -0
  31. data/src/js/components/Dropdown.js +137 -0
  32. data/src/js/components/Menu.js +43 -0
  33. data/src/js/components/Modal.js +76 -0
  34. data/src/js/components/Navbar.js +47 -0
  35. data/src/js/components/Radio.js +24 -0
  36. data/src/js/components/SearchDropdown.js +339 -0
  37. data/src/js/components/Sidebar.js +56 -0
  38. data/src/js/components/Tabbox.js +229 -0
  39. data/src/js/components/TimeInput.js +71 -0
  40. data/src/js/components/TimeMenu.js +117 -0
  41. data/src/js/components/Toast.js +47 -0
  42. data/src/js/components/ToastItem.js +62 -0
  43. data/src/js/components/Tooltip.js +94 -0
  44. data/src/js/consts/createdComponents.js +1 -0
  45. data/src/js/consts/index.js +5 -0
  46. data/src/js/helpers/bind.js +53 -0
  47. data/src/js/helpers/dateEq.js +5 -0
  48. data/src/js/helpers/dateGt.js +5 -0
  49. data/src/js/helpers/dateLt.js +5 -0
  50. data/src/js/helpers/docReady.js +10 -0
  51. data/src/js/helpers/getFloatedTargetPos.js +250 -0
  52. data/src/js/helpers/getKey.js +14 -0
  53. data/src/js/helpers/isTouchDevice.js +3 -0
  54. data/src/js/helpers/msToS.js +3 -0
  55. data/src/js/helpers/promisify.js +9 -0
  56. data/src/js/helpers/range.js +7 -0
  57. data/src/js/helpers/supportDom.js +46 -0
  58. data/src/js/helpers/toPixel.js +3 -0
  59. data/src/js/helpers/unbindAll.js +6 -0
  60. data/src/js/index.js +47 -0
  61. data/src/js/jquery/bindAlertFn.js +13 -0
  62. data/src/js/jquery/bindAutocompleteFn.js +13 -0
  63. data/src/js/jquery/bindBtnFn.js +17 -0
  64. data/src/js/jquery/bindCheckboxFn.js +13 -0
  65. data/src/js/jquery/bindDateTimeRangerFn.js +14 -0
  66. data/src/js/jquery/bindDatepickerFn.js +14 -0
  67. data/src/js/jquery/bindDropdownFn.js +14 -0
  68. data/src/js/jquery/bindMenuFn.js +13 -0
  69. data/src/js/jquery/bindModalFn.js +14 -0
  70. data/src/js/jquery/bindNavbarFn.js +13 -0
  71. data/src/js/jquery/bindRadioFn.js +13 -0
  72. data/src/js/jquery/bindSearchDropdownFn.js +14 -0
  73. data/src/js/jquery/bindSidebarFn.js +13 -0
  74. data/src/js/jquery/bindTabboxFn.js +13 -0
  75. data/src/js/jquery/bindToastFn.js +6 -0
  76. data/src/js/jquery/bindTooltipFn.js +13 -0
  77. data/src/js/jquery/index.js +52 -0
  78. data/src/js/polyfills/classList.js +263 -0
  79. data/src/js/polyfills/elementDataset.js +3 -0
  80. data/src/js/polyfills/nodeContains.js +17 -0
  81. data/src/js/polyfills/nodeHasAttribute.js +5 -0
  82. data/src/js/polyfills/nodeRemove.js +19 -0
  83. data/src/sass/_beyond-sprockets.scss +1 -0
  84. data/src/sass/_beyond.scss +50 -0
  85. data/src/sass/_main.scss +141 -0
  86. data/src/sass/abstracts/_mixins.scss +129 -0
  87. data/src/sass/abstracts/_placeholders.scss +43 -0
  88. data/src/sass/abstracts/_variables.scss +355 -0
  89. data/src/sass/base/_background.scss +10 -0
  90. data/src/sass/base/_typography.scss +183 -0
  91. data/src/sass/components/_alert.scss +50 -0
  92. data/src/sass/components/_autocomplete.scss +29 -0
  93. data/src/sass/components/_avatar.scss +28 -0
  94. data/src/sass/components/_badge.scss +29 -0
  95. data/src/sass/components/_breadcrumb.scss +17 -0
  96. data/src/sass/components/_btn-group.scss +19 -0
  97. data/src/sass/components/_btn.scss +172 -0
  98. data/src/sass/components/_card.scss +183 -0
  99. data/src/sass/components/_checkbox.scss +99 -0
  100. data/src/sass/components/_date-input.scss +28 -0
  101. data/src/sass/components/_date-menu.scss +85 -0
  102. data/src/sass/components/_date-time-ranger.scss +21 -0
  103. data/src/sass/components/_datepicker.scss +3 -0
  104. data/src/sass/components/_dropdown.scss +144 -0
  105. data/src/sass/components/_form.scss +383 -0
  106. data/src/sass/components/_icon.scss +371 -0
  107. data/src/sass/components/_input.scss +48 -0
  108. data/src/sass/components/_list.scss +23 -0
  109. data/src/sass/components/_modal.scss +72 -0
  110. data/src/sass/components/_nav.scss +75 -0
  111. data/src/sass/components/_navbar.scss +211 -0
  112. data/src/sass/components/_pagination.scss +64 -0
  113. data/src/sass/components/_radio.scss +71 -0
  114. data/src/sass/components/_search-dropdown.scss +28 -0
  115. data/src/sass/components/_select.scss +54 -0
  116. data/src/sass/components/_sidebar.scss +35 -0
  117. data/src/sass/components/_spinner.scss +79 -0
  118. data/src/sass/components/_tabbox.scss +83 -0
  119. data/src/sass/components/_table.scss +65 -0
  120. data/src/sass/components/_tag.scss +43 -0
  121. data/src/sass/components/_time-input.scss +28 -0
  122. data/src/sass/components/_time-menu.scss +24 -0
  123. data/src/sass/components/_toast.scss +51 -0
  124. data/src/sass/components/_tooltip.scss +10 -0
  125. data/src/sass/img/arrow-dropdown.svg +4 -0
  126. data/src/sass/img/arrow-select-ex.svg +18 -0
  127. data/src/sass/img/arrow-select.svg +18 -0
  128. data/src/sass/layout/_border-util.scss +36 -0
  129. data/src/sass/layout/_col.scss +90 -0
  130. data/src/sass/layout/_container.scss +44 -0
  131. data/src/sass/layout/_flex-util.scss +18 -0
  132. data/src/sass/layout/_offset-util.scss +20 -0
  133. data/src/sass/layout/_sizing-util.scss +14 -0
  134. data/src/sass/layout/_spacing-util.scss +9 -0
  135. data/src/sass/layout/_visibility-util.scss +25 -0
  136. data/src/sass/vendor/_normalize.scss +578 -0
  137. data/src/sass/vendor/_turbolink.scss +5 -0
  138. metadata +235 -0
@@ -0,0 +1,14 @@
1
+ const keyMap = {
2
+ 13: 'enter',
3
+ 17: 'ctrl',
4
+ 27: 'esc',
5
+ 38: 'up',
6
+ 40: 'down',
7
+ 70: 'f',
8
+ 91: 'left-meta',
9
+ 93: 'right-meta'
10
+ }
11
+
12
+ export default function getKey(event) {
13
+ return keyMap[event.keyCode] || ''
14
+ }
@@ -0,0 +1,3 @@
1
+ export default function isTouchDevice() {
2
+ return ('ontouchstart' in window)
3
+ }
@@ -0,0 +1,3 @@
1
+ export default function msToS(ms) {
2
+ return parseInt(ms / 1000, 10)
3
+ }
@@ -0,0 +1,9 @@
1
+ export default function promisify(func) {
2
+ return (...args) => {
3
+ const res = func(...args)
4
+ if (res instanceof Promise) {
5
+ return res
6
+ }
7
+ return Promise.resolve(res)
8
+ }
9
+ }
@@ -0,0 +1,7 @@
1
+ export default function range(start, end) {
2
+ const arr = []
3
+ for (let i = start; i <= end; i++) {
4
+ arr.push(i)
5
+ }
6
+ return arr
7
+ }
@@ -0,0 +1,46 @@
1
+ import isFunction from 'lodash.isfunction'
2
+ import createdComponents from '../consts/createdComponents'
3
+
4
+ export default function supportDom(target) {
5
+
6
+ return class extends target {
7
+
8
+ init() {
9
+ this._listeners = []
10
+ this._externalListeners = []
11
+ if (isFunction(super.init)) {
12
+ super.init()
13
+ }
14
+ createdComponents.push(this)
15
+ }
16
+
17
+ on(name, func) {
18
+ this._externalListeners.push({ name, func })
19
+ }
20
+
21
+ fire(name, ...args) {
22
+ this._externalListeners.filter(row => row.name === name)
23
+ .forEach(row => row.func.apply(this, args))
24
+ }
25
+
26
+ addEvent(dom, name, func) {
27
+ dom.addEventListener(name, func)
28
+ this._listeners.push({ dom, name, func })
29
+ }
30
+
31
+ removeEvents() {
32
+ this._listeners.forEach(({ dom, name, func }) => {
33
+ dom.removeEventListener(name, func)
34
+ })
35
+ this._listeners.length = 0
36
+ }
37
+
38
+ destroy() {
39
+ this._externalListeners.length = 0
40
+ this.removeEvents()
41
+ if (isFunction(super.destroy)) {
42
+ super.destroy()
43
+ }
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,3 @@
1
+ export default function toPixel(num) {
2
+ return parseInt(num, 10) + 'px'
3
+ }
@@ -0,0 +1,6 @@
1
+ import createdComponents from '../consts/createdComponents'
2
+
3
+ export default function unbindAll() {
4
+ createdComponents.forEach(component => component.destroy())
5
+ createdComponents.length = 0
6
+ }
@@ -0,0 +1,47 @@
1
+ import './../sass/_beyond.scss'
2
+ import 'core-js/stable'
3
+ import 'regenerator-runtime/runtime'
4
+ import './polyfills/classList'
5
+ import './polyfills/nodeRemove'
6
+ import './polyfills/elementDataset'
7
+ import Alert from './components/Alert'
8
+ import Autocomplete from './components/Autocomplete'
9
+ import Btn from './components/Btn'
10
+ import Checkbox from './components/Checkbox'
11
+ import DateTimeRanger from './components/DateTimeRanger'
12
+ import Datepicker from './components/Datepicker'
13
+ import Dropdown from './components/Dropdown'
14
+ import Menu from './components/Menu'
15
+ import Modal from './components/Modal'
16
+ import Navbar from './components/Navbar'
17
+ import Radio from './components/Radio'
18
+ import SearchDropdown from './components/SearchDropdown'
19
+ import Sidebar from './components/Sidebar'
20
+ import Tabbox from './components/Tabbox'
21
+ import Toast from './components/Toast'
22
+ import Tooltip from './components/Tooltip'
23
+ import bind from './helpers/bind'
24
+ import docReady from './helpers/docReady'
25
+ import unbindAll from './helpers/unbindAll'
26
+
27
+ export {
28
+ Alert,
29
+ Autocomplete,
30
+ Btn,
31
+ Checkbox,
32
+ DateTimeRanger,
33
+ Datepicker,
34
+ Dropdown,
35
+ Menu,
36
+ Modal,
37
+ Navbar,
38
+ Radio,
39
+ SearchDropdown,
40
+ Sidebar,
41
+ Tabbox,
42
+ Toast,
43
+ Tooltip,
44
+ bind,
45
+ docReady,
46
+ unbindAll
47
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindAlertFn(beyond, $) {
2
+
3
+ const { Alert } = beyond
4
+
5
+ $.fn.alert = function() {
6
+
7
+ const alerts = this.map((i, dom) => new Alert(dom))
8
+
9
+ this.destroy = () => alerts.each((i, a) => a.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindAutocompleteFn(beyond, $) {
2
+
3
+ const { Autocomplete } = beyond
4
+
5
+ $.fn.autocomplete = function(options) {
6
+
7
+ const autocompletes = this.map((i, dom) => new Autocomplete(dom, options))
8
+
9
+ this.destroy = () => autocompletes.each((i, a) => a.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,17 @@
1
+ export default function bindBtnFn(beyond, $) {
2
+
3
+ const { Btn } = beyond
4
+
5
+ $.fn.btn = function() {
6
+
7
+ const btns = this.map((i, dom) => new Btn(dom))
8
+
9
+ this.showLoader = btns.each((i, a) => a.showLoader())
10
+
11
+ this.hideLoader = btns.each((i, a) => a.hideLoader())
12
+
13
+ this.destroy = () => btns.each((i, a) => a.destroy())
14
+
15
+ return this
16
+ }
17
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindCheckboxFn(beyond, $) {
2
+
3
+ const { Checkbox } = beyond
4
+
5
+ $.fn.checkbox = function() {
6
+
7
+ const checkboxes = this.map((i, dom) => new Checkbox(dom))
8
+
9
+ this.destroy = () => checkboxes.each((i, c) => c.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,14 @@
1
+ export default function bindDateTimeRangerFn(beyond, $) {
2
+
3
+ const { DateTimeRanger } = beyond
4
+
5
+ $.fn.dateTimeRanger = function(settings) {
6
+
7
+ const options = $.extend({}, $.fn.dateTimeRanger.defaults, settings)
8
+ const dateTimeRangers = this.map((i, dom) => new DateTimeRanger(dom, options))
9
+
10
+ this.destroy = () => dateTimeRangers.each((i, d) => d.destroy())
11
+
12
+ return this
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ export default function bindDatepickerFn(beyond, $) {
2
+
3
+ const { Datepicker } = beyond
4
+
5
+ $.fn.datepicker = function(timestamp, settings) {
6
+
7
+ const options = $.extend({}, $.fn.datepicker.defaults, settings)
8
+ const datepickers = this.map((i, dom) => new Datepicker(dom, timestamp, options))
9
+
10
+ this.destroy = () => datepickers.each((i, d) => d.destroy())
11
+
12
+ return this
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ export default function bindDropdownFn(beyond, $) {
2
+
3
+ const { Dropdown } = beyond
4
+
5
+ $.fn.dropdown = function(settings) {
6
+
7
+ const options = $.extend({}, $.fn.dropdown.defaults, settings)
8
+ const dropdowns = this.map((i, dom) => new Dropdown(dom, options))
9
+
10
+ this.destroy = () => dropdowns.each((i, d) => d.destroy())
11
+
12
+ return this
13
+ }
14
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindMenuFn(beyond, $) {
2
+
3
+ const { Menu } = beyond
4
+
5
+ $.fn.menu = function() {
6
+
7
+ const menus = this.map((i, dom) => new Menu(dom))
8
+
9
+ this.destroy = () => menus.each((i, m) => m.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,14 @@
1
+ export default function bindModalFn(beyond, $) {
2
+
3
+ const { Modal } = beyond
4
+
5
+ $.fn.modal = function(settings) {
6
+
7
+ const options = $.extend({}, $.fn.modal.defaults, settings)
8
+ const modals = this.map((i, dom) => new Modal(dom, options))
9
+
10
+ this.destroy = () => modals.each((i, m) => m.destroy())
11
+
12
+ return this
13
+ }
14
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindNavbarFn(beyond, $) {
2
+
3
+ const { Navbar } = beyond
4
+
5
+ $.fn.navbar = function() {
6
+
7
+ const navbars = this.map((i, dom) => new Navbar(dom))
8
+
9
+ this.destroy = () => navbars.each((i, n) => n.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindRadioFn(beyond, $) {
2
+
3
+ const { Radio } = beyond
4
+
5
+ $.fn.radio = function() {
6
+
7
+ const radios = this.map((i, dom) => new Radio(dom))
8
+
9
+ this.destroy = () => radios.each((i, r) => r.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,14 @@
1
+ export default function bindSearchDropdownFn(beyond, $) {
2
+
3
+ const { SearchDropdown } = beyond
4
+
5
+ $.fn.searchDropdown = function(settings) {
6
+
7
+ const options = $.extend({}, $.fn.searchDropdown.defaults, settings)
8
+ const searchDropdowns = this.map((i, dom) => new SearchDropdown(dom, options))
9
+
10
+ this.destroy = () => searchDropdowns.each((i, s) => s.destroy())
11
+
12
+ return this
13
+ }
14
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindSidebarFn(beyond, $) {
2
+
3
+ const { Sidebar } = beyond
4
+
5
+ $.fn.sidebar = function() {
6
+
7
+ const sidebars = this.map((i, dom) => new Sidebar(dom))
8
+
9
+ this.destroy = () => sidebars.each((i, s) => s.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindTabboxFn(beyond, $) {
2
+
3
+ const { Tabbox } = beyond
4
+
5
+ $.fn.tabbox = function() {
6
+
7
+ const tabboxes = this.map((i, dom) => new Tabbox(dom))
8
+
9
+ this.destroy = () => tabboxes.each((i, t) => t.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,6 @@
1
+ export default function bindToastFn(beyond, $) {
2
+
3
+ const { Toast } = beyond
4
+
5
+ $.fn.toast = options => new Toast(options)
6
+ }
@@ -0,0 +1,13 @@
1
+ export default function bindTooltipFn(beyond, $) {
2
+
3
+ const { Tooltip } = beyond
4
+
5
+ $.fn.tooltip = function() {
6
+
7
+ const tooltips = this.map((i, dom) => new Tooltip(dom))
8
+
9
+ this.destroy = () => tooltips.each((i, t) => t.destroy())
10
+
11
+ return this
12
+ }
13
+ }
@@ -0,0 +1,52 @@
1
+ import bindAutocompleteFn from './bindAutocompleteFn'
2
+ import bindAlertFn from './bindAlertFn'
3
+ import bindBtnFn from './bindBtnFn'
4
+ import bindDateTimeRangerFn from './bindDateTimeRangerFn'
5
+ import bindDatepickerFn from './bindDatepickerFn'
6
+ import bindCheckboxFn from './bindCheckboxFn'
7
+ import bindDropdownFn from './bindDropdownFn'
8
+ import bindMenuFn from './bindMenuFn'
9
+ import bindModalFn from './bindModalFn'
10
+ import bindNavbarFn from './bindNavbarFn'
11
+ import bindRadioFn from './bindRadioFn'
12
+ import bindSearchDropdownFn from './bindSearchDropdownFn'
13
+ import bindSidebarFn from './bindSidebarFn'
14
+ import bindTabboxFn from './bindTabboxFn'
15
+ import bindToastFn from './bindToastFn'
16
+ import bindTooltipFn from './bindTooltipFn'
17
+
18
+ export default function bindJQuery(beyond, jQuery) {
19
+
20
+ if (typeof window === 'undefined') {
21
+ return
22
+ }
23
+ const $ = jQuery || (window.jQuery)
24
+
25
+ if (typeof $ === 'undefined') {
26
+ return
27
+ }
28
+
29
+ // avoid duplicated jquery bindings
30
+ if (beyond._boundJQuery) {
31
+ return
32
+ }
33
+
34
+ bindAutocompleteFn(beyond, $)
35
+ bindAlertFn(beyond, $)
36
+ bindBtnFn(beyond, $)
37
+ bindCheckboxFn(beyond, $)
38
+ bindDateTimeRangerFn(beyond, $)
39
+ bindDatepickerFn(beyond, $)
40
+ bindDropdownFn(beyond, $)
41
+ bindModalFn(beyond, $)
42
+ bindMenuFn(beyond, $)
43
+ bindNavbarFn(beyond, $)
44
+ bindRadioFn(beyond, $)
45
+ bindSearchDropdownFn(beyond, $)
46
+ bindSidebarFn(beyond, $)
47
+ bindTabboxFn(beyond, $)
48
+ bindToastFn(beyond, $)
49
+ bindTooltipFn(beyond, $)
50
+
51
+ beyond._boundJQuery = true
52
+ }
@@ -0,0 +1,263 @@
1
+ /* eslint-disable */
2
+ /*
3
+ * classList.js: Cross-browser full element.classList implementation.
4
+ * 1.2.20171210
5
+ *
6
+ * By Eli Grey, http://eligrey.com
7
+ * License: Dedicated to the public domain.
8
+ * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md
9
+ */
10
+
11
+ /*global self, document, DOMException */
12
+
13
+ /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */
14
+
15
+ if ("document" in self) {
16
+
17
+ // Full polyfill for browsers with no classList support
18
+ // Including IE < Edge missing SVGElement.classList
19
+ if (
20
+ !("classList" in document.createElement("_"))
21
+ || document.createElementNS
22
+ && !("classList" in document.createElementNS("http://www.w3.org/2000/svg","g"))
23
+ ) {
24
+
25
+ (function (view) {
26
+
27
+ "use strict";
28
+
29
+ if (!('Element' in view)) return;
30
+
31
+ var
32
+ classListProp = "classList"
33
+ , protoProp = "prototype"
34
+ , elemCtrProto = view.Element[protoProp]
35
+ , objCtr = Object
36
+ , strTrim = String[protoProp].trim || function () {
37
+ return this.replace(/^\s+|\s+$/g, "");
38
+ }
39
+ , arrIndexOf = Array[protoProp].indexOf || function (item) {
40
+ var
41
+ i = 0
42
+ , len = this.length
43
+ ;
44
+ for (; i < len; i++) {
45
+ if (i in this && this[i] === item) {
46
+ return i;
47
+ }
48
+ }
49
+ return -1;
50
+ }
51
+ // Vendors: please allow content code to instantiate DOMExceptions
52
+ , DOMEx = function (type, message) {
53
+ this.name = type;
54
+ this.code = DOMException[type];
55
+ this.message = message;
56
+ }
57
+ , checkTokenAndGetIndex = function (classList, token) {
58
+ if (token === "") {
59
+ throw new DOMEx(
60
+ "SYNTAX_ERR"
61
+ , "The token must not be empty."
62
+ );
63
+ }
64
+ if (/\s/.test(token)) {
65
+ throw new DOMEx(
66
+ "INVALID_CHARACTER_ERR"
67
+ , "The token must not contain space characters."
68
+ );
69
+ }
70
+ return arrIndexOf.call(classList, token);
71
+ }
72
+ , ClassList = function (elem) {
73
+ var
74
+ trimmedClasses = strTrim.call(elem.getAttribute("class") || "")
75
+ , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
76
+ , i = 0
77
+ , len = classes.length
78
+ ;
79
+ for (; i < len; i++) {
80
+ this.push(classes[i]);
81
+ }
82
+ this._updateClassName = function () {
83
+ elem.setAttribute("class", this.toString());
84
+ };
85
+ }
86
+ , classListProto = ClassList[protoProp] = []
87
+ , classListGetter = function () {
88
+ return new ClassList(this);
89
+ }
90
+ ;
91
+ // Most DOMException implementations don't allow calling DOMException's toString()
92
+ // on non-DOMExceptions. Error's toString() is sufficient here.
93
+ DOMEx[protoProp] = Error[protoProp];
94
+ classListProto.item = function (i) {
95
+ return this[i] || null;
96
+ };
97
+ classListProto.contains = function (token) {
98
+ return ~checkTokenAndGetIndex(this, token + "");
99
+ };
100
+ classListProto.add = function () {
101
+ var
102
+ tokens = arguments
103
+ , i = 0
104
+ , l = tokens.length
105
+ , token
106
+ , updated = false
107
+ ;
108
+ do {
109
+ token = tokens[i] + "";
110
+ if (!~checkTokenAndGetIndex(this, token)) {
111
+ this.push(token);
112
+ updated = true;
113
+ }
114
+ }
115
+ while (++i < l);
116
+
117
+ if (updated) {
118
+ this._updateClassName();
119
+ }
120
+ };
121
+ classListProto.remove = function () {
122
+ var
123
+ tokens = arguments
124
+ , i = 0
125
+ , l = tokens.length
126
+ , token
127
+ , updated = false
128
+ , index
129
+ ;
130
+ do {
131
+ token = tokens[i] + "";
132
+ index = checkTokenAndGetIndex(this, token);
133
+ while (~index) {
134
+ this.splice(index, 1);
135
+ updated = true;
136
+ index = checkTokenAndGetIndex(this, token);
137
+ }
138
+ }
139
+ while (++i < l);
140
+
141
+ if (updated) {
142
+ this._updateClassName();
143
+ }
144
+ };
145
+ classListProto.toggle = function (token, force) {
146
+ var
147
+ result = this.contains(token)
148
+ , method = result ?
149
+ force !== true && "remove"
150
+ :
151
+ force !== false && "add"
152
+ ;
153
+
154
+ if (method) {
155
+ this[method](token);
156
+ }
157
+
158
+ if (force === true || force === false) {
159
+ return force;
160
+ } else {
161
+ return !result;
162
+ }
163
+ };
164
+ classListProto.replace = function (token, replacement_token) {
165
+ var index = checkTokenAndGetIndex(token + "");
166
+ if (~index) {
167
+ this.splice(index, 1, replacement_token);
168
+ this._updateClassName();
169
+ }
170
+ }
171
+ classListProto.toString = function () {
172
+ return this.join(" ");
173
+ };
174
+
175
+ if (objCtr.defineProperty) {
176
+ var classListPropDesc = {
177
+ get: classListGetter
178
+ , enumerable: true
179
+ , configurable: true
180
+ };
181
+ try {
182
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
183
+ } catch (ex) { // IE 8 doesn't support enumerable:true
184
+ // adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36
185
+ // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected
186
+ if (ex.number === undefined || ex.number === -0x7FF5EC54) {
187
+ classListPropDesc.enumerable = false;
188
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
189
+ }
190
+ }
191
+ } else if (objCtr[protoProp].__defineGetter__) {
192
+ elemCtrProto.__defineGetter__(classListProp, classListGetter);
193
+ }
194
+
195
+ }(self));
196
+
197
+ }
198
+
199
+ // There is full or partial native classList support, so just check if we need
200
+ // to normalize the add/remove and toggle APIs.
201
+
202
+ (function () {
203
+ "use strict";
204
+
205
+ var testElement = document.createElement("_");
206
+
207
+ testElement.classList.add("c1", "c2");
208
+
209
+ // Polyfill for IE 10/11 and Firefox <26, where classList.add and
210
+ // classList.remove exist but support only one argument at a time.
211
+ if (!testElement.classList.contains("c2")) {
212
+ var createMethod = function(method) {
213
+ var original = DOMTokenList.prototype[method];
214
+
215
+ DOMTokenList.prototype[method] = function(token) {
216
+ var i, len = arguments.length;
217
+
218
+ for (i = 0; i < len; i++) {
219
+ token = arguments[i];
220
+ original.call(this, token);
221
+ }
222
+ };
223
+ };
224
+ createMethod('add');
225
+ createMethod('remove');
226
+ }
227
+
228
+ testElement.classList.toggle("c3", false);
229
+
230
+ // Polyfill for IE 10 and Firefox <24, where classList.toggle does not
231
+ // support the second argument.
232
+ if (testElement.classList.contains("c3")) {
233
+ var _toggle = DOMTokenList.prototype.toggle;
234
+
235
+ DOMTokenList.prototype.toggle = function(token, force) {
236
+ if (1 in arguments && !this.contains(token) === !force) {
237
+ return force;
238
+ } else {
239
+ return _toggle.call(this, token);
240
+ }
241
+ };
242
+
243
+ }
244
+
245
+ // replace() polyfill
246
+ if (!("replace" in document.createElement("_").classList)) {
247
+ DOMTokenList.prototype.replace = function (token, replacement_token) {
248
+ var
249
+ tokens = this.toString().split(" ")
250
+ , index = tokens.indexOf(token + "")
251
+ ;
252
+ if (~index) {
253
+ tokens = tokens.slice(index);
254
+ this.remove.apply(this, tokens);
255
+ this.add(replacement_token);
256
+ this.add.apply(this, tokens.slice(1));
257
+ }
258
+ }
259
+ }
260
+
261
+ testElement = null;
262
+ }());
263
+ }