beyond-rails 0.0.139
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/src/font/icomoon.eot +0 -0
- data/src/font/icomoon.svg +125 -0
- data/src/font/icomoon.ttf +0 -0
- data/src/font/icomoon.woff +0 -0
- data/src/img/black-cat.svg +15 -0
- data/src/img/cart.svg +16 -0
- data/src/img/china-flag.svg +16 -0
- data/src/img/ecpay.svg +12 -0
- data/src/img/family-mart.svg +13 -0
- data/src/img/fb-messenger.svg +12 -0
- data/src/img/fb.svg +10 -0
- data/src/img/hct.svg +16 -0
- data/src/img/hi-life.svg +23 -0
- data/src/img/line.svg +14 -0
- data/src/img/ok-mart.svg +9 -0
- data/src/img/pelican.svg +33 -0
- data/src/img/seven-eleven.svg +13 -0
- data/src/img/smilepay.svg +13 -0
- data/src/img/taiwan-flag.svg +17 -0
- data/src/js/components/Alert.js +23 -0
- data/src/js/components/Autocomplete.js +110 -0
- data/src/js/components/AutocompleteMenu.js +88 -0
- data/src/js/components/Btn.js +41 -0
- data/src/js/components/Checkbox.js +24 -0
- data/src/js/components/DateInput.js +74 -0
- data/src/js/components/DateMenu.js +370 -0
- data/src/js/components/DateTimeRanger.js +436 -0
- data/src/js/components/Datepicker.js +250 -0
- data/src/js/components/DatepickerBtnArrow.js +18 -0
- data/src/js/components/Dropdown.js +137 -0
- data/src/js/components/Menu.js +43 -0
- data/src/js/components/Modal.js +76 -0
- data/src/js/components/Navbar.js +47 -0
- data/src/js/components/Radio.js +24 -0
- data/src/js/components/SearchDropdown.js +339 -0
- data/src/js/components/Sidebar.js +56 -0
- data/src/js/components/Tabbox.js +229 -0
- data/src/js/components/TimeInput.js +71 -0
- data/src/js/components/TimeMenu.js +117 -0
- data/src/js/components/Toast.js +47 -0
- data/src/js/components/ToastItem.js +62 -0
- data/src/js/components/Tooltip.js +94 -0
- data/src/js/consts/createdComponents.js +1 -0
- data/src/js/consts/index.js +5 -0
- data/src/js/helpers/bind.js +53 -0
- data/src/js/helpers/dateEq.js +5 -0
- data/src/js/helpers/dateGt.js +5 -0
- data/src/js/helpers/dateLt.js +5 -0
- data/src/js/helpers/docReady.js +10 -0
- data/src/js/helpers/getFloatedTargetPos.js +250 -0
- data/src/js/helpers/getKey.js +14 -0
- data/src/js/helpers/isTouchDevice.js +3 -0
- data/src/js/helpers/msToS.js +3 -0
- data/src/js/helpers/promisify.js +9 -0
- data/src/js/helpers/range.js +7 -0
- data/src/js/helpers/supportDom.js +46 -0
- data/src/js/helpers/toPixel.js +3 -0
- data/src/js/helpers/unbindAll.js +6 -0
- data/src/js/index.js +47 -0
- data/src/js/jquery/bindAlertFn.js +13 -0
- data/src/js/jquery/bindAutocompleteFn.js +13 -0
- data/src/js/jquery/bindBtnFn.js +17 -0
- data/src/js/jquery/bindCheckboxFn.js +13 -0
- data/src/js/jquery/bindDateTimeRangerFn.js +14 -0
- data/src/js/jquery/bindDatepickerFn.js +14 -0
- data/src/js/jquery/bindDropdownFn.js +14 -0
- data/src/js/jquery/bindMenuFn.js +13 -0
- data/src/js/jquery/bindModalFn.js +14 -0
- data/src/js/jquery/bindNavbarFn.js +13 -0
- data/src/js/jquery/bindRadioFn.js +13 -0
- data/src/js/jquery/bindSearchDropdownFn.js +14 -0
- data/src/js/jquery/bindSidebarFn.js +13 -0
- data/src/js/jquery/bindTabboxFn.js +13 -0
- data/src/js/jquery/bindToastFn.js +6 -0
- data/src/js/jquery/bindTooltipFn.js +13 -0
- data/src/js/jquery/index.js +52 -0
- data/src/js/polyfills/classList.js +263 -0
- data/src/js/polyfills/elementDataset.js +3 -0
- data/src/js/polyfills/nodeContains.js +17 -0
- data/src/js/polyfills/nodeHasAttribute.js +5 -0
- data/src/js/polyfills/nodeRemove.js +19 -0
- data/src/sass/_beyond-sprockets.scss +1 -0
- data/src/sass/_beyond.scss +50 -0
- data/src/sass/_main.scss +141 -0
- data/src/sass/abstracts/_mixins.scss +129 -0
- data/src/sass/abstracts/_placeholders.scss +43 -0
- data/src/sass/abstracts/_variables.scss +355 -0
- data/src/sass/base/_background.scss +10 -0
- data/src/sass/base/_typography.scss +183 -0
- data/src/sass/components/_alert.scss +50 -0
- data/src/sass/components/_autocomplete.scss +29 -0
- data/src/sass/components/_avatar.scss +28 -0
- data/src/sass/components/_badge.scss +29 -0
- data/src/sass/components/_breadcrumb.scss +17 -0
- data/src/sass/components/_btn-group.scss +19 -0
- data/src/sass/components/_btn.scss +172 -0
- data/src/sass/components/_card.scss +183 -0
- data/src/sass/components/_checkbox.scss +99 -0
- data/src/sass/components/_date-input.scss +28 -0
- data/src/sass/components/_date-menu.scss +85 -0
- data/src/sass/components/_date-time-ranger.scss +21 -0
- data/src/sass/components/_datepicker.scss +3 -0
- data/src/sass/components/_dropdown.scss +144 -0
- data/src/sass/components/_form.scss +383 -0
- data/src/sass/components/_icon.scss +371 -0
- data/src/sass/components/_input.scss +48 -0
- data/src/sass/components/_list.scss +23 -0
- data/src/sass/components/_modal.scss +72 -0
- data/src/sass/components/_nav.scss +75 -0
- data/src/sass/components/_navbar.scss +211 -0
- data/src/sass/components/_pagination.scss +64 -0
- data/src/sass/components/_radio.scss +71 -0
- data/src/sass/components/_search-dropdown.scss +28 -0
- data/src/sass/components/_select.scss +54 -0
- data/src/sass/components/_sidebar.scss +35 -0
- data/src/sass/components/_spinner.scss +79 -0
- data/src/sass/components/_tabbox.scss +83 -0
- data/src/sass/components/_table.scss +65 -0
- data/src/sass/components/_tag.scss +43 -0
- data/src/sass/components/_time-input.scss +28 -0
- data/src/sass/components/_time-menu.scss +24 -0
- data/src/sass/components/_toast.scss +51 -0
- data/src/sass/components/_tooltip.scss +10 -0
- data/src/sass/img/arrow-dropdown.svg +4 -0
- data/src/sass/img/arrow-select-ex.svg +18 -0
- data/src/sass/img/arrow-select.svg +18 -0
- data/src/sass/layout/_border-util.scss +36 -0
- data/src/sass/layout/_col.scss +90 -0
- data/src/sass/layout/_container.scss +44 -0
- data/src/sass/layout/_flex-util.scss +18 -0
- data/src/sass/layout/_offset-util.scss +20 -0
- data/src/sass/layout/_sizing-util.scss +14 -0
- data/src/sass/layout/_spacing-util.scss +9 -0
- data/src/sass/layout/_visibility-util.scss +25 -0
- data/src/sass/vendor/_normalize.scss +578 -0
- data/src/sass/vendor/_turbolink.scss +5 -0
- metadata +235 -0
@@ -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
|
+
}
|
data/src/js/index.js
ADDED
@@ -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 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,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,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,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
|
+
}
|