1+ import live-web.dom
2+ import live-web.behavior
3+ import live-elements-web-server.style
4+
5+ component AccordionToggle < Div{
6+ string[] extraClasses: []
7+ classes: this.extraClasses.concat([ScopedStyle.className(AccordionToggle)])
8+
9+ Array<DOMElement> content: []
10+
11+ Object __behavior = DOMBehavior{
12+ domEvents: {
13+ click: (e) => {
14+ e.preventDefault()
15+ let collapsible = e.currentTarget
16+ const path = [collapsible]
17+ while ( collapsible ){
18+ if ( 'accordion' in collapsible.dataset && 'toggle' in collapsible.dataset && 'content' in collapsible.dataset ){
19+ const accordion = collapsible
20+ const toggleClass = collapsible.dataset.toggle
21+ const contentClass = collapsible.dataset.content
22+ const toggleElem = path.find(te => te.classList.contains(toggleClass))
23+ if ( toggleElem ){
24+ const toggleElemContent = toggleElem.querySelector(`.${contentClass}`)
25+ if ( toggleElem.classList.contains('show') ){
26+ toggleElem.classList.remove('show')
27+ toggleElemContent.style.maxHeight = '0'
28+ } else {
29+ const allToggleElem = accordion.querySelectorAll(`.${toggleClass}`)
30+ allToggleElem.forEach(te => {
31+ if ( te.classList.contains('show') ){
32+ const content = te.querySelector(`.${contentClass}`)
33+ content.style.maxHeight = content.scrollHeight + "px"
34+ window.requestAnimationFrame(() => { content.style.maxHeight = "0" })
35+ te.classList.remove('show')
36+ }
37+ })
38+ toggleElemContent.style.maxHeight = toggleElemContent.scrollHeight + "px"
39+ setTimeout(() => { toggleElemContent.style.maxHeight = 'none' }, 400)
40+ toggleElem.classList.add('show')
41+ }
42+ }
43+ break
44+ }
45+ collapsible = collapsible.parentNode
46+ path.push(collapsible)
47+ }
48+ }
49+ }
50+ }
51+
52+ children: this.content.concat(this.__behavior)
53+ }
0 commit comments