beyond-rails 0.0.139

Sign up to get free protection for your applications and to get access to all the features.
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
+ }