luda
Version:
A library helps to build cross-framework UI components.
128 lines (107 loc) • 3.88 kB
text/coffeescript
import '../kernel/index.coffee'
luda.mixin 'toggleable',
# cls:
# toggleable:
# active: string #required
# data:
# toggleable:
# interruption: string # required
# toggle: string # optional
# default:
# toggleable:
# trigger: boolean #optional
# evt:
# toggleable:
# activate: string # required
# activated: string # required
# deactivate: string # required
# deactivated: string # required
# selector:
# toggleable:
# target: string # optional
toggleableActive: -> .hasClass .toggleable.active
toggleableTriggerable: (e) ->
return if
return true if /key/.test e.type
return true unless .els[0].contains e.target
trigger = ?.toggleable?.trigger
toggleAttr = .toggleable.trigger
return trigger unless toggleAttr
evtPath = e.eventPath()
index = evtPath.indexOf( .els[0]) + 1
evtPath.slice(0, index).some (el) ->
ins = luda el
return unless ins.hasData toggleAttr
trigger = ins.data(toggleAttr) isnt false
true
trigger
toggleableActivate: ->
return if
evt = .trigger( .toggleable.activate, null, true)[0]
return if evt.isDefaultPrevented()
clearTimeout
delete
.addClass .toggleable.active
= setTimeout =>
delete
.trigger .toggleable.activated
, .transitionDuration()
true
toggleableDeactivate: ->
return unless
evt = .trigger( .toggleable.deactivate, null, true)[0]
return if evt.isDefaultPrevented()
clearTimeout
delete
.removeClass .toggleable.active
= setTimeout =>
delete
.trigger .toggleable.deactivated
, .transitionDuration()
true
toggleableToggle: (force) ->
return if force is true
return if force is false
if
else
toggleableTransitioning: ->
'toggleableActivating' of this or 'toggleableDeactivating' of this
toggleableFocusOpener: (e) ->
if
return = document.activeElement
return unless
if 'focus' of ins = luda
ins.focus not e.detail, e.detail
else
.focus {preventScroll: e.detail}
toggleableActivateOnEvent: (e) ->
return unless and
true
toggleableDeactivateOnEvent: (e) ->
return unless and
true
toggleableToggleOnEvent: (e) ->
return unless and
true
toggleableCreate: ->
dataAttr = .toggleable.interruption
return unless interruption = .data dataAttr
evt = .toggleable[interruption]
.removeData dataAttr
.trigger evt
toggleableDestroy: ->
if 'toggleableActivating' of this
interruption = 'activated'
clearTimeout
else if 'toggleableDeactivating' of this
interruption = 'deactivated'
clearTimeout
interruption and .data .toggleable.interruption, interruption
toggleableFind: ->
target = ?.toggleable?.target
toggleableTarget: target or ->