megatron 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +43 -2
- data/app/assets/javascripts/megatron/form.js +36 -0
- data/app/assets/javascripts/megatron/index.js +93 -0
- data/app/assets/javascripts/megatron/link.js +58 -0
- data/app/assets/javascripts/megatron/utils/auto-navigate.js +24 -0
- data/app/assets/javascripts/megatron/utils/form-notify.js +39 -0
- data/app/assets/javascripts/megatron/utils/index.js +112 -0
- data/app/assets/javascripts/megatron/utils/messages.js +97 -0
- data/app/assets/javascripts/megatron/utils/time/date-to-html.js +59 -0
- data/app/assets/javascripts/megatron/utils/time/time-switch.js +87 -0
- data/app/assets/javascripts/megatron/utils/time/timeago.js +95 -0
- data/app/assets/javascripts/megatron/utils/toggler.js +163 -0
- data/app/assets/stylesheets/_example.scss +76 -0
- data/app/assets/stylesheets/_grid.scss +41 -0
- data/app/assets/stylesheets/_typography.scss +38 -0
- data/app/assets/stylesheets/application.scss +19 -0
- data/app/assets/stylesheets/megatron/error-pages.scss +164 -0
- data/app/assets/stylesheets/megatron/error-pages/_animations.scss +96 -0
- data/app/assets/stylesheets/megatron/error-pages/_csi.scss +41 -0
- data/app/assets/stylesheets/megatron/error-pages/_waves.scss +36 -0
- data/app/assets/stylesheets/megatron/megatron.scss +3 -0
- data/app/assets/stylesheets/megatron/modules/_crop-height.scss +5 -0
- data/app/assets/stylesheets/megatron/modules/_index.scss +22 -0
- data/app/assets/stylesheets/megatron/modules/_logo.scss +67 -0
- data/app/assets/stylesheets/megatron/modules/_new-tag.scss +11 -0
- data/app/assets/stylesheets/megatron/modules/_progress.scss +80 -0
- data/app/assets/stylesheets/megatron/modules/app/_animation-classes.scss +3 -0
- data/app/assets/stylesheets/megatron/modules/app/_animations.scss +62 -0
- data/app/assets/stylesheets/megatron/modules/app/_index.scss +5 -0
- data/app/assets/stylesheets/megatron/modules/app/_layout.scss +261 -0
- data/app/assets/stylesheets/megatron/modules/app/_sizes.scss +28 -0
- data/app/assets/stylesheets/megatron/modules/app/_typography.scss +111 -0
- data/app/assets/stylesheets/megatron/modules/box/_base.scss +94 -0
- data/app/assets/stylesheets/megatron/modules/box/_color-box.scss +33 -0
- data/app/assets/stylesheets/megatron/modules/box/_deployment_box.scss +37 -0
- data/app/assets/stylesheets/megatron/modules/box/_index.scss +4 -0
- data/app/assets/stylesheets/megatron/modules/box/_placeholder.scss +6 -0
- data/app/assets/stylesheets/megatron/modules/buttons/_animations.scss +35 -0
- data/app/assets/stylesheets/megatron/modules/buttons/_buttons.scss +266 -0
- data/app/assets/stylesheets/megatron/modules/buttons/_index.scss +4 -0
- data/app/assets/stylesheets/megatron/modules/buttons/_mixins.scss +108 -0
- data/app/assets/stylesheets/megatron/modules/buttons/_pills.scss +44 -0
- data/app/assets/stylesheets/megatron/modules/code/_codemirror.scss +98 -0
- data/app/assets/stylesheets/megatron/modules/code/_highlighted.scss +65 -0
- data/app/assets/stylesheets/megatron/modules/code/_index.scss +3 -0
- data/app/assets/stylesheets/megatron/modules/code/_syntax.scss +18 -0
- data/app/assets/stylesheets/megatron/modules/core/_colored-items.scss +22 -0
- data/app/assets/stylesheets/megatron/modules/core/_colors.scss +163 -0
- data/app/assets/stylesheets/megatron/modules/core/_index.scss +3 -0
- data/app/assets/stylesheets/megatron/modules/core/_mixins.scss +262 -0
- data/app/assets/stylesheets/megatron/modules/core/_vars.scss +30 -0
- data/app/assets/stylesheets/megatron/modules/core/_z-index.scss +3 -0
- data/app/assets/stylesheets/megatron/modules/dialog/_animations.scss +48 -0
- data/app/assets/stylesheets/megatron/modules/dialog/_dialog.scss +81 -0
- data/app/assets/stylesheets/megatron/modules/dialog/_index.scss +2 -0
- data/app/assets/stylesheets/megatron/modules/forms/_base.scss +31 -0
- data/app/assets/stylesheets/megatron/modules/forms/_check-radio.scss +99 -0
- data/app/assets/stylesheets/megatron/modules/forms/_check-switch.scss +88 -0
- data/app/assets/stylesheets/megatron/modules/forms/_footer.scss +13 -0
- data/app/assets/stylesheets/megatron/modules/forms/_index.scss +10 -0
- data/app/assets/stylesheets/megatron/modules/forms/_login.scss +92 -0
- data/app/assets/stylesheets/megatron/modules/forms/_radio-nav.scss +62 -0
- data/app/assets/stylesheets/megatron/modules/forms/_select.scss +37 -0
- data/app/assets/stylesheets/megatron/modules/forms/_stacked-form.scss +29 -0
- data/app/assets/stylesheets/megatron/modules/forms/_table-form.scss +53 -0
- data/app/assets/stylesheets/megatron/modules/forms/_text-input.scss +118 -0
- data/app/assets/stylesheets/megatron/modules/grids/_alignment.scss +39 -0
- data/app/assets/stylesheets/megatron/modules/grids/_grid.scss +144 -0
- data/app/assets/stylesheets/megatron/modules/grids/_index.scss +2 -0
- data/app/assets/stylesheets/megatron/modules/headers/_actions.scss +10 -0
- data/app/assets/stylesheets/megatron/modules/headers/_base.scss +67 -0
- data/app/assets/stylesheets/megatron/modules/headers/_index.scss +4 -0
- data/app/assets/stylesheets/megatron/modules/headers/_meta.scss +10 -0
- data/app/assets/stylesheets/megatron/modules/headers/_site-header.scss +8 -0
- data/app/assets/stylesheets/megatron/modules/lib/_codemirror.scss +301 -0
- data/app/assets/stylesheets/megatron/modules/lists/_base.scss +13 -0
- data/app/assets/stylesheets/megatron/modules/lists/_box-list.scss +53 -0
- data/app/assets/stylesheets/megatron/modules/lists/_index.scss +2 -0
- data/app/assets/stylesheets/megatron/modules/messages/_index.scss +3 -0
- data/app/assets/stylesheets/megatron/modules/messages/_notice.scss +57 -0
- data/app/assets/stylesheets/megatron/modules/messages/_notifications.scss +126 -0
- data/app/assets/stylesheets/megatron/modules/messages/_pop-message.scss +157 -0
- data/app/assets/stylesheets/megatron/modules/nav/_auto-navigate.scss +7 -0
- data/app/assets/stylesheets/megatron/modules/nav/_breadcrumbs.scss +35 -0
- data/app/assets/stylesheets/megatron/modules/nav/_index.scss +8 -0
- data/app/assets/stylesheets/megatron/modules/nav/_main-sidebar.scss +21 -0
- data/app/assets/stylesheets/megatron/modules/nav/_mixins.scss +53 -0
- data/app/assets/stylesheets/megatron/modules/nav/_nav-toggle.scss +61 -0
- data/app/assets/stylesheets/megatron/modules/nav/_primary-nav.scss +120 -0
- data/app/assets/stylesheets/megatron/modules/nav/_secondary-nav.scss +105 -0
- data/app/assets/stylesheets/megatron/modules/nav/_tabs.scss +87 -0
- data/app/assets/stylesheets/megatron/modules/roboticons/_font.scss +62 -0
- data/app/assets/stylesheets/megatron/modules/roboticons/_icons.scss +219 -0
- data/app/assets/stylesheets/megatron/modules/roboticons/_index.scss +2 -0
- data/app/assets/stylesheets/megatron/modules/slider/_base.scss +49 -0
- data/app/assets/stylesheets/megatron/modules/slider/_index.scss +4 -0
- data/app/assets/stylesheets/megatron/modules/slider/_slider.scss +282 -0
- data/app/assets/stylesheets/megatron/modules/slider/_switch.scss +75 -0
- data/app/assets/stylesheets/megatron/modules/slider/_themes.scss +42 -0
- data/app/assets/stylesheets/megatron/modules/tables/_base.scss +170 -0
- data/app/assets/stylesheets/megatron/modules/tables/_border-table.scss +28 -0
- data/app/assets/stylesheets/megatron/modules/tables/_box-table.scss +36 -0
- data/app/assets/stylesheets/megatron/modules/tables/_columns.scss +8 -0
- data/app/assets/stylesheets/megatron/modules/tables/_doc-table.scss +22 -0
- data/app/assets/stylesheets/megatron/modules/tables/_icon-cell.scss +9 -0
- data/app/assets/stylesheets/megatron/modules/tables/_index.scss +7 -0
- data/app/assets/stylesheets/megatron/modules/tables/_link-cell.scss +8 -0
- data/app/assets/stylesheets/megatron/modules/tables/_responsive-table.scss +13 -0
- data/app/assets/stylesheets/megatron/modules/widgets/_index.scss +1 -0
- data/app/assets/stylesheets/megatron/modules/widgets/_time-switch.scss +24 -0
- data/lib/megatron.rb +1 -1
- data/lib/megatron/engine.rb +5 -0
- data/lib/megatron/version.rb +1 -1
- data/lib/tasks/megatron_tasks.rake +4 -4
- data/public/assets/megatron/megatron-0.0.4.css +3 -0
- data/public/assets/megatron/{megatron-0.0.3.css.map → megatron-0.0.4.css.map} +3 -3
- data/public/assets/megatron/{megatron-0.0.3.js → megatron-0.0.4.js} +1 -1
- data/public/assets/megatron/megatron-0.0.4.map.json +1 -0
- metadata +115 -6
- data/public/assets/megatron/megatron-0.0.3.css +0 -2
- data/public/assets/megatron/megatron-0.0.3.map.json +0 -1
@@ -0,0 +1,59 @@
|
|
1
|
+
// Converts a simple date string into Date + Time + Timezone wrapped in HTML
|
2
|
+
//
|
3
|
+
// Input:
|
4
|
+
// - String, compatible with JS date parsing e.g. "2014-10-20" or "2014-05-21 10:63"
|
5
|
+
// - String, timezone: "UTC", "CST", etc.
|
6
|
+
//
|
7
|
+
// Returns: HTML which is "2014-01-28 18:00:00 CST", separated and wrapped with spans
|
8
|
+
// with classnames: date, time and timezone
|
9
|
+
//
|
10
|
+
var dateToHtml = function (dateString, zone) {
|
11
|
+
|
12
|
+
if(isNaN(new Date("2014-01-29T18:14:29+00:00").getDate())) {
|
13
|
+
return false
|
14
|
+
}
|
15
|
+
|
16
|
+
var date = new Date(dateString)
|
17
|
+
var zone = zone || date.getTimezoneOffset()/-60
|
18
|
+
|
19
|
+
if(zone === 'UTC') {
|
20
|
+
var y = date.getUTCFullYear()
|
21
|
+
var mo = pad(date.getUTCMonth() + 1)
|
22
|
+
var d = pad(date.getUTCDate())
|
23
|
+
var h = pad(date.getUTCHours())
|
24
|
+
var m = pad(date.getUTCMinutes())
|
25
|
+
var s = pad(date.getUTCSeconds())
|
26
|
+
} else {
|
27
|
+
var y = date.getFullYear()
|
28
|
+
var mo = pad(date.getMonth() + 1)
|
29
|
+
var d = pad(date.getDate())
|
30
|
+
var h = pad(date.getHours())
|
31
|
+
var m = pad(date.getMinutes())
|
32
|
+
var s = pad(date.getSeconds())
|
33
|
+
|
34
|
+
var tz = String(date).match(/\((.+)\)$/)
|
35
|
+
|
36
|
+
if(tz) {
|
37
|
+
var zone = tz[1]
|
38
|
+
} else {
|
39
|
+
var zone = "GMT "
|
40
|
+
zone += ((zone > 0) ? '+' : '')
|
41
|
+
zone += " "+ pad(zone*100, 4)
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
str = '<span class="date">'+y+'-'+mo+'-'+d+'</span>'
|
46
|
+
str += ' <span class="time">'+h+':'+m+':'+s+'</span>'
|
47
|
+
str += ' <span class="timezone">'+zone+'</span>'
|
48
|
+
return str
|
49
|
+
}
|
50
|
+
|
51
|
+
var pad = function(num, pad){
|
52
|
+
pad = pad || 2
|
53
|
+
while(String(num).length < pad) {
|
54
|
+
num = '0' + num
|
55
|
+
}
|
56
|
+
return num
|
57
|
+
}
|
58
|
+
|
59
|
+
module.exports = dateToHtml
|
@@ -0,0 +1,87 @@
|
|
1
|
+
var timeago = require('./timeago')
|
2
|
+
var dateToHtml = require('./date-to-html')
|
3
|
+
var classie = require('classie')
|
4
|
+
var bean = require('bean')
|
5
|
+
|
6
|
+
require('compose-dataset-shim')
|
7
|
+
|
8
|
+
var TimeSwitch = {
|
9
|
+
|
10
|
+
// Attach listeners, setup HTML templates
|
11
|
+
setup: function() {
|
12
|
+
if(!timeago.browserSupport()) return false
|
13
|
+
if(!this.listening) this.listen()
|
14
|
+
|
15
|
+
var timeEls = document.querySelectorAll('.time-switch[datetime]')
|
16
|
+
|
17
|
+
Array.prototype.forEach.call(timeEls, function(el) {
|
18
|
+
var datetime = el.getAttribute('datetime')
|
19
|
+
var timeagoPosition = el.dataset.timeago
|
20
|
+
var timeagoStyle = el.dataset.timeagoStyle
|
21
|
+
el.innerHTML = TimeSwitch.template(datetime, timeagoPosition, timeagoStyle)
|
22
|
+
classie.add(el, 'time-switch')
|
23
|
+
el.setAttribute('title', 'toggle timezones')
|
24
|
+
})
|
25
|
+
},
|
26
|
+
|
27
|
+
// Attach listeners to toggle time zones whine clicked
|
28
|
+
listen: function() {
|
29
|
+
bean.on(document, "click", ".time-switch", TimeSwitch.toggle)
|
30
|
+
this.listening = true
|
31
|
+
},
|
32
|
+
|
33
|
+
// Switch between UTC and local time
|
34
|
+
toggle: function(event) {
|
35
|
+
var timeEls = document.querySelectorAll('.time-switch')
|
36
|
+
|
37
|
+
Array.prototype.forEach.call(timeEls, function(el) {
|
38
|
+
classie.toggle(el, 'alt-zone')
|
39
|
+
})
|
40
|
+
},
|
41
|
+
|
42
|
+
// Supply HTML for UTC and local datetime
|
43
|
+
//
|
44
|
+
// Input:
|
45
|
+
// - date (a date object)
|
46
|
+
// - timeagoPosition, String, either 'before' or 'after'
|
47
|
+
//
|
48
|
+
template: function(date, timeagoPosition, timeagoStyle) {
|
49
|
+
var utc = dateToHtml(date, 'UTC')
|
50
|
+
var local = dateToHtml(date)
|
51
|
+
var t = '';
|
52
|
+
|
53
|
+
if (timeagoPosition === 'before') {
|
54
|
+
t += this.timeagoTemplate(date, timeagoPosition, timeagoStyle)
|
55
|
+
}
|
56
|
+
|
57
|
+
t += "<span class='utc'><span class='clock_line_icon'></span> "
|
58
|
+
t += utc + "</span>"
|
59
|
+
t += "<span class='local'><span class='clock_fill_icon'></span> "
|
60
|
+
t += local + "</span>"
|
61
|
+
|
62
|
+
if (timeagoPosition === 'after') {
|
63
|
+
t += this.timeagoTemplate(date, timeagoPosition, timeagoStyle)
|
64
|
+
}
|
65
|
+
|
66
|
+
return t
|
67
|
+
},
|
68
|
+
|
69
|
+
// Converts a date to relative time string wrapped in a span
|
70
|
+
timeagoTemplate: function(date, position, style) {
|
71
|
+
var relative = timeago.parse(date, style)
|
72
|
+
var dash = "<span class='dash'> - </span>"
|
73
|
+
var html = ''
|
74
|
+
|
75
|
+
if(relative) {
|
76
|
+
if (position === 'after') html += dash
|
77
|
+
html += "<span class='timeago'>"+ relative +"</span> "
|
78
|
+
return html
|
79
|
+
} else {
|
80
|
+
return ''
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
}
|
85
|
+
|
86
|
+
module.exports = TimeSwitch
|
87
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
// Timeago by Brandon Mathis, based on JavaScript Pretty Date Copyright (c) 2011 John Resig
|
2
|
+
// Returns relative time
|
3
|
+
|
4
|
+
let Timeago = {
|
5
|
+
// setup HTML templates
|
6
|
+
setup: function() {
|
7
|
+
|
8
|
+
var timeEls = document.querySelectorAll('.timeago[datetime]')
|
9
|
+
|
10
|
+
Array.prototype.forEach.call(timeEls, function(el) {
|
11
|
+
var datetime = el.attributes.datetime.value
|
12
|
+
var style = el.dataset.timeagoStyle
|
13
|
+
el.innerHTML = Timeago.parse(datetime, style)
|
14
|
+
})
|
15
|
+
},
|
16
|
+
|
17
|
+
// If a browser can't handle dates, bail.
|
18
|
+
browserSupport: function() {
|
19
|
+
return !isNaN(new Date("2014-01-29T18:14:29+00:00").getDate())
|
20
|
+
},
|
21
|
+
|
22
|
+
parse: function(time, style) {
|
23
|
+
|
24
|
+
style = style || "normal"
|
25
|
+
if (typeof(time) == 'string') {
|
26
|
+
time = new Date(time)
|
27
|
+
}
|
28
|
+
|
29
|
+
if (style === 'short')
|
30
|
+
var say = {
|
31
|
+
just_now: "now",
|
32
|
+
minute_ago: "1m",
|
33
|
+
minutes_ago: "m",
|
34
|
+
hour_ago: "1h",
|
35
|
+
hours_ago: "h",
|
36
|
+
yesterday: "1d",
|
37
|
+
days_ago: "d",
|
38
|
+
last_week: "1w",
|
39
|
+
weeks_ago: "w"
|
40
|
+
}
|
41
|
+
|
42
|
+
if (style === 'normal')
|
43
|
+
var say = {
|
44
|
+
just_now: "just now",
|
45
|
+
minute_ago: "1 minute",
|
46
|
+
minutes_ago: " minutes",
|
47
|
+
hour_ago: "1 hour",
|
48
|
+
hours_ago: " hours",
|
49
|
+
yesterday: "1 day",
|
50
|
+
days_ago: " days",
|
51
|
+
last_week: "1 week",
|
52
|
+
weeks_ago: " weeks"
|
53
|
+
}
|
54
|
+
|
55
|
+
if (style === 'long')
|
56
|
+
var say = {
|
57
|
+
just_now: "just now",
|
58
|
+
minute_ago: "1 minute ago",
|
59
|
+
minutes_ago: " minutes ago",
|
60
|
+
hour_ago: "1 hour ago",
|
61
|
+
hours_ago: " hours ago",
|
62
|
+
yesterday: "1 day ago",
|
63
|
+
days_ago: " days ago",
|
64
|
+
last_week: "1 week ago",
|
65
|
+
weeks_ago: " weeks ago"
|
66
|
+
}
|
67
|
+
|
68
|
+
var secs = ((new Date().getTime() - new Date(time).getTime()) / 1000)
|
69
|
+
var mins = Math.floor(secs / 60)
|
70
|
+
var hours = Math.floor(secs / 3600)
|
71
|
+
var days = Math.floor(secs / 86400)
|
72
|
+
var weeks = Math.floor(days / 7)
|
73
|
+
var months = Math.floor(days / 30)
|
74
|
+
|
75
|
+
if(isNaN(secs) || days < 0) {
|
76
|
+
return false
|
77
|
+
}
|
78
|
+
|
79
|
+
if(days === 0) {
|
80
|
+
if (secs < 60) return say.just_now
|
81
|
+
else if(secs < 120) return say.minute_ago
|
82
|
+
else if(secs < 3600) return mins + say.minutes_ago
|
83
|
+
else if(secs < 7200) return say.hour_ago
|
84
|
+
else return hours + say.hours_ago
|
85
|
+
} else {
|
86
|
+
if(days === 1) return say.yesterday
|
87
|
+
else if(days < 7) return days + say.days_ago
|
88
|
+
else if(weeks === 1) return say.last_week
|
89
|
+
else return weeks + say.weeks_ago
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
module.exports = Timeago
|
95
|
+
|
@@ -0,0 +1,163 @@
|
|
1
|
+
var bean = require('bean')
|
2
|
+
var classie = require('classie')
|
3
|
+
var _ = require('lodash')
|
4
|
+
|
5
|
+
require('compose-tap-event')
|
6
|
+
require('compose-dataset-shim')
|
7
|
+
|
8
|
+
var Toggler = {
|
9
|
+
listen: function(){
|
10
|
+
bean.on(document, "click", "[data-toggle], [data-show], [data-hide]", Toggler.trigger)
|
11
|
+
bean.on(document, "change", ".select-toggler", Toggler.trigger)
|
12
|
+
},
|
13
|
+
|
14
|
+
refresh: function(){
|
15
|
+
Toggler.toggleRadios()
|
16
|
+
Toggler.toggleCheckboxes()
|
17
|
+
Toggler.setupSelects()
|
18
|
+
},
|
19
|
+
|
20
|
+
trigger: function(event) {
|
21
|
+
|
22
|
+
var target = event.currentTarget
|
23
|
+
|
24
|
+
if (target.tagName.toLowerCase() == 'a' && target.getAttribute('href') == "#") {
|
25
|
+
event.preventDefault()
|
26
|
+
event.stop()
|
27
|
+
}
|
28
|
+
|
29
|
+
if (target.type == 'radio') {
|
30
|
+
Toggler.toggleRadios('input[name="'+ target.name +'"]')
|
31
|
+
} else if (target.type == 'checkbox') {
|
32
|
+
Toggler.toggleCheckbox(target)
|
33
|
+
} else if (target.tagName.toLowerCase() == 'select') {
|
34
|
+
Toggler.toggleSelect(target)
|
35
|
+
} else {
|
36
|
+
Toggler.dispatch(target, 'hide')
|
37
|
+
Toggler.dispatch(target, 'toggle')
|
38
|
+
Toggler.dispatch(target, 'show')
|
39
|
+
}
|
40
|
+
},
|
41
|
+
|
42
|
+
dispatch: function(el, type, force) {
|
43
|
+
if (el.dataset[type]){
|
44
|
+
Toggler.setState(el.dataset[type], type)
|
45
|
+
}
|
46
|
+
},
|
47
|
+
|
48
|
+
setState: function(selectors, state) {
|
49
|
+
var matches = document.querySelectorAll(selectors)
|
50
|
+
if (typeof(state) == 'boolean') {
|
51
|
+
state = (state ? 'show' : 'hide')
|
52
|
+
}
|
53
|
+
|
54
|
+
Array.prototype.forEach.call(matches, function(match){
|
55
|
+
Toggler[state](match)
|
56
|
+
})
|
57
|
+
},
|
58
|
+
|
59
|
+
toggle: function(el) {
|
60
|
+
|
61
|
+
if (el.offsetParent === null) {
|
62
|
+
Toggler.show(el)
|
63
|
+
} else {
|
64
|
+
Toggler.hide(el)
|
65
|
+
}
|
66
|
+
|
67
|
+
},
|
68
|
+
|
69
|
+
show: function(el) {
|
70
|
+
classie.remove(el, 'hidden')
|
71
|
+
classie.add(el, 'visible')
|
72
|
+
var focusEl = el.querySelector('[data-focus]')
|
73
|
+
|
74
|
+
if (focusEl) {
|
75
|
+
focusEl.focus()
|
76
|
+
}
|
77
|
+
},
|
78
|
+
|
79
|
+
hide: function(el) {
|
80
|
+
classie.remove(el, 'visible')
|
81
|
+
classie.add(el, 'hidden')
|
82
|
+
},
|
83
|
+
|
84
|
+
toggleRadios: function(radios) {
|
85
|
+
var radios = radios || 'input[type=radio][data-show]'
|
86
|
+
|
87
|
+
Array.prototype.forEach.call(document.querySelectorAll(radios), function(radio) {
|
88
|
+
Toggler.setState(radio.dataset.show, radio.checked)
|
89
|
+
})
|
90
|
+
},
|
91
|
+
|
92
|
+
toggleCheckbox: function(checkbox) {
|
93
|
+
Toggler.setState(checkbox.dataset.hide, !checkbox.checked)
|
94
|
+
Toggler.setState(checkbox.dataset.toggle, 'toggle')
|
95
|
+
Toggler.setState(checkbox.dataset.show, checkbox.checked)
|
96
|
+
},
|
97
|
+
|
98
|
+
toggleSelect: function(select) {
|
99
|
+
var option = select.selectedOptions[0]
|
100
|
+
Toggler.dispatch(option, 'hide')
|
101
|
+
Toggler.dispatch(option, 'show')
|
102
|
+
},
|
103
|
+
|
104
|
+
toggleCheckboxes: function() {
|
105
|
+
var checkboxes = 'input[type=checkbox][data-toggle]'
|
106
|
+
Array.prototype.forEach.call(document.querySelectorAll(checkboxes), Toggler.toggleCheckbox)
|
107
|
+
},
|
108
|
+
|
109
|
+
// Add data-hide to each <option> containing the selectors from other
|
110
|
+
// option's data-show. This makes the toggling of elements exclusive.
|
111
|
+
//
|
112
|
+
setupSelects: function(select){
|
113
|
+
Array.prototype.forEach.call(document.querySelectorAll('option[data-show]'), function(option){
|
114
|
+
if (!option.dataset.hide) {
|
115
|
+
|
116
|
+
var select = Toggler.getSelectFromOption(option)
|
117
|
+
classie.add(select, 'select-toggler')
|
118
|
+
var options = select.querySelectorAll('option')
|
119
|
+
var selectors = Toggler.showAttributes(options)
|
120
|
+
|
121
|
+
Array.prototype.forEach.call(options, function(o) {
|
122
|
+
option.dataset.hide = _.compact(selectors.filter(function(selector){
|
123
|
+
return option.dataset.show != selector && selector != ""
|
124
|
+
})).join(',')
|
125
|
+
})
|
126
|
+
|
127
|
+
// Ensure that currently selected option is toggled properly
|
128
|
+
//
|
129
|
+
Toggler.toggleSelect(select)
|
130
|
+
}
|
131
|
+
})
|
132
|
+
},
|
133
|
+
|
134
|
+
// Find parent <select> for an option (accounts for option groups)
|
135
|
+
//
|
136
|
+
getSelectFromOption: function(el) {
|
137
|
+
var p = el.parentElement
|
138
|
+
|
139
|
+
if (p.tagName.toLowerCase() == 'select') {
|
140
|
+
return p
|
141
|
+
} else {
|
142
|
+
return Toggler.getSelectFromOption(p)
|
143
|
+
}
|
144
|
+
},
|
145
|
+
|
146
|
+
// Return an array of all data-show values from elements
|
147
|
+
//
|
148
|
+
showAttributes: function(elements) {
|
149
|
+
return Array.prototype.map.call(elements, function(el) {
|
150
|
+
return el.dataset.show
|
151
|
+
})
|
152
|
+
},
|
153
|
+
|
154
|
+
toggleSelects: function(selects) {
|
155
|
+
var selects = selects || 'option[data-show]'
|
156
|
+
|
157
|
+
Array.prototype.forEach.call(document.querySelectorAll(radios), function(radio) {
|
158
|
+
Toggler.setState(radio.dataset.show, radio.checked)
|
159
|
+
})
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
module.exports = Toggler
|
@@ -0,0 +1,76 @@
|
|
1
|
+
.demo {
|
2
|
+
margin: 1.6em 0;
|
3
|
+
}
|
4
|
+
.demo-header {
|
5
|
+
overflow: hidden;
|
6
|
+
margin: 1.2em 0;
|
7
|
+
}
|
8
|
+
|
9
|
+
.demo-heading {
|
10
|
+
display: inline-block;
|
11
|
+
font-weight: normal;
|
12
|
+
vertical-align: bottom;
|
13
|
+
float: left;
|
14
|
+
margin: 0;
|
15
|
+
}
|
16
|
+
|
17
|
+
.demo-source-toggle {
|
18
|
+
float: right;
|
19
|
+
vertical-align: bottom;
|
20
|
+
}
|
21
|
+
|
22
|
+
.demo-box {
|
23
|
+
list-style: none;
|
24
|
+
position: relative;
|
25
|
+
margin-bottom: $block-margin;
|
26
|
+
border: 1px solid $page-border;
|
27
|
+
background: #fafafa;
|
28
|
+
margin-top: $block-margin + 2em;
|
29
|
+
|
30
|
+
&-row {
|
31
|
+
padding: 10px;
|
32
|
+
border-bottom: 1px solid #e5e5e5;
|
33
|
+
position: relative;
|
34
|
+
|
35
|
+
&:last-child {
|
36
|
+
border-bottom: 0;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
&.padded {
|
41
|
+
@include pad_box;
|
42
|
+
pre {
|
43
|
+
padding: 0;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
.heading-anchor:after {
|
48
|
+
top: -.8em;
|
49
|
+
left: -.8em;
|
50
|
+
}
|
51
|
+
|
52
|
+
.demo-header {
|
53
|
+
position: absolute;
|
54
|
+
top: -30px;
|
55
|
+
left: -1px;
|
56
|
+
right: -1px;
|
57
|
+
padding: 0 1em;
|
58
|
+
margin: 0;
|
59
|
+
border: 1px solid #e5e5e5;
|
60
|
+
background: #f5f5f5;
|
61
|
+
font-family: Helvetica, Arial, sans-serif;
|
62
|
+
line-height: 30px;
|
63
|
+
font-size: 13px;
|
64
|
+
z-index: 2;
|
65
|
+
color: $light-text-color;
|
66
|
+
}
|
67
|
+
|
68
|
+
.demo-heading {
|
69
|
+
font-size: 1em;
|
70
|
+
}
|
71
|
+
|
72
|
+
pre {
|
73
|
+
border: none;
|
74
|
+
margin: 0;
|
75
|
+
}
|
76
|
+
}
|