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.
- 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
|
+
}
|