1- export function toggleAccordion ( element ) {
1+ document . addEventListener ( 'DOMContentLoaded' , ( ) => {
2+ const accordions = document . querySelectorAll ( '.kroma-accordion-container' ) ;
3+
4+ accordions . forEach ( container => {
5+ const items = container . querySelectorAll ( '[data-header]' ) ;
6+
7+ items . forEach ( item => {
8+ const headerText = item . getAttribute ( 'data-header' ) ;
9+ const contentText = item . getAttribute ( 'data-content' ) ;
10+ const isSubItem = item . closest ( '.kroma-accordion-content' ) ;
11+
12+ const header = document . createElement ( 'button' ) ;
13+ header . classList . add ( isSubItem ? 'kroma-accordion-sub-header' : 'kroma-accordion-header' ) ;
14+ header . setAttribute ( 'aria-label' , `Toggle ${ headerText } ` ) ;
15+ header . textContent = headerText ;
16+ header . onclick = ( ) => toggleAccordion ( header ) ;
17+
18+ const content = document . createElement ( 'div' ) ;
19+ content . classList . add ( isSubItem ? 'kroma-accordion-sub-content' : 'kroma-accordion-content' ) ;
20+ content . innerHTML = `<p>${ contentText } </p>` ;
21+
22+ item . appendChild ( header ) ;
23+ item . appendChild ( content ) ;
24+ item . removeAttribute ( 'data-header' ) ;
25+ item . removeAttribute ( 'data-content' ) ;
26+ } ) ;
27+ } ) ;
28+ } ) ;
29+
30+ function toggleAccordion ( element ) {
231 const content = element . nextElementSibling ;
332 const parentItem = content . parentElement ;
4- const isOpen = parentItem . classList . contains ( 'accordion-item-open' ) || parentItem . classList . contains ( 'accordion-sub-item-open' ) ;
5-
33+ const isOpen = parentItem . classList . contains ( 'kroma- accordion-item-open' ) || parentItem . classList . contains ( 'kroma- accordion-sub-item-open' ) ;
34+
635 if ( isOpen ) {
7- // Close accordion
8- content . style . height = content . scrollHeight + 'px' ; // Start with current height
9- content . offsetHeight ; // Force reflow
10- content . style . height = '0' ; // Collapse
11-
12- parentItem . classList . remove ( 'accordion-item-open' , 'accordion-sub-item-open' ) ;
13- content . addEventListener ( 'transitionend' , function handler ( ) {
14- content . style . paddingTop = '0' ;
15- content . style . paddingBottom = '0' ;
16- content . removeEventListener ( 'transitionend' , handler ) ;
17- } ) ;
36+ content . style . height = content . scrollHeight + 'px' ; // Start with current height
37+ content . offsetHeight ; // Force reflow
38+ content . style . height = '0' ; // Collapse
39+
40+ parentItem . classList . remove ( 'kroma-accordion-item-open' , 'kroma-accordion-sub-item-open' ) ;
41+ content . addEventListener ( 'transitionend' , function handler ( ) {
42+ content . style . paddingTop = '0' ;
43+ content . style . paddingBottom = '0' ;
44+ content . removeEventListener ( 'transitionend' , handler ) ;
45+ } ) ;
1846 } else {
19- // Open accordion
20- const parent = element . closest ( '.accordion-container, .accordion-item, .accordion-sub-item' ) ;
21- const openSubItems = parent . querySelectorAll ( '.accordion-item-open > .accordion-content, .accordion-sub-item-open > .accordion-sub-content' ) ;
22-
23- openSubItems . forEach ( subItem => {
24- subItem . style . height = subItem . scrollHeight + 'px' ;
25- subItem . offsetHeight ; // Force reflow
26- subItem . style . height = '0' ;
27- subItem . parentElement . classList . remove ( 'accordion-item-open' , 'accordion-sub-item-open' ) ;
28- } ) ;
29-
30- content . style . height = '0' ;
31- content . style . paddingTop = '' ;
32- content . style . paddingBottom = '' ;
33- parentItem . classList . add ( 'accordion-item-open' , 'accordion-sub-item-open' ) ;
34- content . offsetHeight ; // Force reflow
35- content . style . height = content . scrollHeight + 'px' ; // Expand to full height
36-
37- content . addEventListener ( 'transitionend' , function handler ( ) {
38- content . style . height = 'auto' ;
39- content . removeEventListener ( 'transitionend' , handler ) ;
40- } ) ;
47+ const parent = element . closest ( '.kroma-accordion-container, .kroma-accordion-item, .kroma-accordion-sub-item' ) ;
48+ const openSubItems = parent . querySelectorAll ( '.kroma-accordion-item-open > .kroma-accordion-content, .kroma-accordion-sub-item-open > .kroma-accordion-sub-content' ) ;
49+
50+ openSubItems . forEach ( subItem => {
51+ subItem . style . height = subItem . scrollHeight + 'px' ;
52+ subItem . offsetHeight ; // Force reflow
53+ subItem . style . height = '0' ;
54+ subItem . parentElement . classList . remove ( 'kroma-accordion-item-open' , 'kroma-accordion-sub-item-open' ) ;
55+ } ) ;
56+
57+ content . style . height = '0' ;
58+ content . style . paddingTop = '' ;
59+ content . style . paddingBottom = '' ;
60+ parentItem . classList . add ( 'kroma-accordion-item-open' , 'kroma-accordion-sub-item-open' ) ;
61+ content . offsetHeight ; // Force reflow
62+ content . style . height = content . scrollHeight + 'px' ; // Expand to full height
63+
64+ content . addEventListener ( 'transitionend' , function handler ( ) {
65+ content . style . height = 'auto' ;
66+ content . removeEventListener ( 'transitionend' , handler ) ;
67+ } ) ;
4168 }
42- }
69+ }
70+
0 commit comments