content logo

React Accordions:

Single, Multiple and pre-Opened Modes Accordion using React JS

Using accordion code can be helpful for different purposes, such as frequently asked questions and other parts of the website. So, if you have a page and want to increase its beauty, this post can be helpful for you. This post shows the Single, Multiple and pre-Opened Modes Accordion using React JS and its beautiful design. This Simple Item Accordion Code is suitable for all websites and you can apply it with no worry. If you want to add an FAQ at the end of your content on your website, you can use Multiple Items Accordion.

In order to gain more information about this code, you can look at the React Accordion Code Example below. As you can see here, this code has a white background with black text. The title has a larger font size, and there is a field at the bottom of it with three items. These items of this pre-Opened Accordion Code have some pop-up buttons that you can access additional information after clicking on them. When you click on each part, its background changes to light blue beautifully. This allows you to distinguish the selected part from others.

#

Simple Item Accordion Code

#

pre-Opened Accordion Code

#

Multiple Items Accordion

#

React Accordion Code Example

<!-- This script got from frontendfreecode.com -->
<div id="root"></div><a style="font-size: 8pt; text-decoration: none" target="_blank" href="http://frontendfreecode.com">Free Frontend</a>
                                                                            
@custom-media --viewportSm (min-width: 480px);
@custom-media --viewportMd (min-width: 640px);
@custom-media --viewportLg (min-width: 960px);
@custom-media --viewportXl (min-width: 1280px);
:root {
	--containerMaxWidth: 1600px;
}
:root {
	--colorFacebook: #3e5a98;
	--colorLinkedin: #0078b6;
	--colorTwitter: #1da1f2;
	--colorWhite: #fff;
	--colorBlack: #000;
	--colorBlack75: #404040;
	--colorBlack50: #7f7f7f;
	--colorBlack25: #bfbfbf;
	--colorBlack10: #e5e5e5;
	--colorBlack5: #f2f2f2;
	--colorDarkGrey: #666;
	--colorDarkGrey75: #8d8d8d;
	--colorDarkGrey50: #b2b2b2;
	--colorDarkGrey25: #d9d9d9;
	--colorDarkGrey10: #efefef;
	--colorDarkGrey5: #f7f7f7;
	--colorCyan: #00aeef;
	--colorCyan75: #40c2f3;
	--colorCyan50: #7fd6f7;
	--colorCyan25: #bfebfb;
	--colorCyan10: #e5f7fd;
	--colorCyan5: #f2fbfe;
	--colorDigitalLightBlue: #0076b6;
	--colorDigitalLightBlue75: #4099c9;
	--colorDigitalLightBlue50: #7fbada;
	--colorDigitalLightBlue25: #bfdded;
	--colorDigitalLightBlue10: #e5f1f7;
	--colorDigitalLightBlue5: #f2f8fb;
	--colorDigitalDarkBlue: #00395d;
	--colorDigitalDarkBlue75: #406b86;
	--colorDigitalDarkBlue50: #7f9cae;
	--colorDigitalDarkBlue25: #bfcdd6;
	--colorDigitalDarkBlue10: #e5ebee;
	--colorDigitalDarkBlue5: #f2f5f7;
	--colorBurgundy: #9d063b;
	--colorBurgundy75: #b6446c;
	--colorBurgundy50: #ce829d;
	--colorBurgundy25: #e6c1ce;
	--colorBurgundy10: #f5e6eb;
	--colorBurgundy5: #faf2f5;
	--colorTaupe: #b1a194;
	--colorTaupe75: #c5b9af;
	--colorTaupe50: #d8d0c9;
	--colorTaupe25: #ebe7e4;
	--colorTaupe10: #f7f5f4;
	--colorTaupe5: #fbfaf9;
	--colorYellow: #ffbe10;
	--colorYellow75: #ffce4c;
	--colorYellow50: #ffde87;
	--colorYellow25: #ffefc3;
	--colorYellow10: #fff8e7;
	--colorYellow5: #fffcf3;
	--colorRed: #c33;
	--colorRed75: #d96666;
	--colorRed50: #e59999;
	--colorRed25: #f2cccc;
	--colorRed10: #faeaea;
	--colorRed5: #fcf5f5;
	--colorAmber: #dc630a;
	--colorAmber75: #e58a47;
	--colorAmber50: #edb184;
	--colorAmber25: #f6d8c2;
	--colorAmber10: #fbefe6;
	--colorAmber5: #fdf7f3;
	--colorGreen: #008312;
	--colorGreen75: #40a24e;
	--colorGreen50: #7fc188;
	--colorGreen25: #bfe0c4;
	--colorGreen10: #e5f2e7;
	--colorGreen5: #f2f9f3;
}
:root {
	--fontSize: 16px;
	--fontFamily: "Expert Sans Light", Verdana, sans-serif;
	--fontFamilyRegular: "Expert Sans Regular", Verdana, sans-serif;
	--fontFamilyBold: "Expert Sans Bold", Verdana, sans-serif;
	--fontFamilyB14: "Expert Sans B14 Light", Verdana, sans-serif;
	--fontColor: var(--colorDarkGrey);
	--lineHeight: 1.5;
}
:root {
	--linkColor: var(--colorDigitalLightBlue);
	--linkFocusColor: var(--colorDigitalDarkBlue);
	--linkFocusOutlineColor: var(--colorCyan50);
	--linkFocusOutlineSize: 2px;
	--linkFocusOutlineOffsetSize: 1px;
	--linkHoverColor: var(--colorDigitalDarkBlue);
}
:root {
	--selectionBackgroundColor: rgba(229, 247, 253, 0.99);
	--selectionColor: var(--colorDigitalDarkBlue);
}
:root {
	--spaceXs: 12px;
	--spaceSm: 24px;
	--spaceMd: 48px;
	--spaceLg: 64px;
}
:root {
	--fontSizeXlMobile: 36px;
	--fontSizeLgMobile: 30px;
	--fontSizeMdMobile: 24px;
	--fontSizeSmMobile: 20px;
	--fontSizeXsMobile: 16px;
	--fontSizeXxsMobile: 16px;
	--fontSizeB14: 14px;
	--letterSpacingXlMobile: -0.25px;
	--lineHeightXlMobile: 1.222222;
	--lineHeightLgMobile: 1.333333;
	--lineHeightMdMobile: 1.5;
	--lineHeightSmMobile: 1.6;
	--lineHeightXsMobile: 1.5;
	--lineHeightXxsMobile: 1.5;
	--fontSizeXl: 46px;
	--fontSizeLg: 36px;
	--fontSizeMd: 30px;
	--fontSizeSm: 24px;
	--FontSizeXs: 20px;
	--fontSizeXxs: 16px;
	--letterSpacingXl: -0.5px;
	--letterSpacingLg: -0.25px;
	--lineHeightXl: 1.173913;
	--lineHeightLg: 1.277777;
	--lineHeightMd: 1.333333;
	--lineHeightSm: 1.5;
	--LineHeightXs: 1.6;
	--lineHeightXxs: 1.5;
}
:root {
	--transitionSlow: 0.6s;
	--transitionMedium: 0.3s;
	--transitionFast: 0.15s;
}
:root {
	--Accordion-bgColor: #fff;
	--Accordion-textColor: var(--colorDarkGrey);
	--Accordion-borderColor: var(--colorBlack25);
	--Accordion-borderRadius: 5px;
	--Accordion-transition: var(--Accordion-transitionDuration) var(--Accordion-transitionTimingFunction);
	--Accordion-transitionDuration: var(--transitionMedium);
	--Accordion-transitionTimingFunction: ease-out;
	--Accordion-item--active-bgColor: var(--colorCyan5);
	--Accordion-item--active-borderColor: var(--colorDigitalLightBlue);
	--Accordion-item-chevronColor: #000;
	--Accordion-item-chevronTransition: transform var(--Accordion-transition);
	--Accordion-itemTitleLink-padding: var(--spaceXs);
	--Accordion-itemContentInner-padding: var(--spaceXs);
	--Accordion-itemContent-transition: max-height var(--Accordion-transition);
}
.Accordion {
	background-color: var(--Accordion-bgColor);
}
.Accordion-item {
	list-style: none;
}
.Accordion--hasJS .Accordion-item {
	border-bottom: 1px solid var(--Accordion-borderColor);
	border-left: 1px solid var(--Accordion-borderColor);
	border-right: 1px solid var(--Accordion-borderColor);
	border-top: 0;
}
.Accordion--hasJS .Accordion-item:first-child {
	border-top: 1px solid var(--Accordion-borderColor);
	border-top-left-radius: var(--Accordion-borderRadius);
	border-top-right-radius: var(--Accordion-borderRadius);
}
.Accordion--hasJS .Accordion-item:first-child .Accordion-itemTitle, .Accordion--hasJS .Accordion-item:first-child .Accordion-itemTitleLink {
	border-top-left-radius: var(--Accordion-borderRadius);
	border-top-right-radius: var(--Accordion-borderRadius);
}
.Accordion--hasJS .Accordion-item:last-child {
	border-bottom-left-radius: var(--Accordion-borderRadius);
	border-bottom-right-radius: var(--Accordion-borderRadius);
}
.Accordion-itemTitle {
	margin-bottom: 0;
}
.Accordion--hasJS .Accordion-itemTitle {
	cursor: pointer;
	margin-bottom: 0;
	margin-top: 0;
	position: relative;
}
.Accordion-itemTitleLink, .Accordion-itemTitleLink:visited, .Accordion-itemTitleLink:active, .Accordion-itemTitleLink:hover {
	color: var(--Accordion-textColor);
	display: block;
}
.Accordion--hasJS .Accordion-itemTitleLink {
	padding: var(--Accordion-itemTitleLink-padding);
}
.Accordion-item--active .Accordion-itemTitle {
	background-color: var(--Accordion-item--active-bgColor);
}
.Accordion--hasJS .Accordion-itemTitle::before, .Accordion--hasJS .Accordion-itemTitle::after {
	background-color: var(--Accordion-item-chevronColor);
	content: "";
	display: block;
	height: 3px;
	position: absolute;
	top: 22px;
	transition: var(--Accordion-item-chevronTransition);
	width: 11px;
}
.Accordion--hasJS .Accordion-itemTitle::before {
	left: 20px;
	transform: rotate(40deg);
}
.Accordion--hasJS .Accordion-itemTitle::after {
	left: 27px;
	transform: rotate(-220deg);
}
.Accordion--hasJS .Accordion-item--active .Accordion-itemTitle::before {
	transform: rotate(140deg);
}
.Accordion--hasJS .Accordion-item--active .Accordion-itemTitle::after {
	transform: rotate(-320deg);
}
.Accordion--hasJS .Accordion-itemTitleLink {
	border: 1px solid transparent;
	margin: -1px;
	padding-left: 50px;
}
.Accordion-item--active .Accordion-itemTitleLink, .Accordion-itemTitleLink:focus {
	background-color: var(--Accordion-item--active-bgColor);
	border-color: var(--Accordion-item--active-borderColor);
}
.Accordion--hasJS .Accordion-itemContent {
	overflow: hidden;
	transition: var(--Accordion-itemContent-transition);
}
.Accordion--hasJS .Accordion-itemContentInner {
	padding: var(--Accordion-itemContentInner-padding);
}
.Accordion-itemContent--closed {
	display: none;
}
.Accordion-itemContent--transitioning {
	max-height: 0;
}
class Accordion extends React.Component {
    constructor() {
        super();
        this.state = {
            selectedItems: []
        };
        this.toggleAccordionItem = this.toggleAccordionItem.bind(this);
        this.addSelectedItem = this.addSelectedItem.bind(this);
        this.removeSelectedItem = this.removeSelectedItem.bind(this);
        this.clearItemsThenAddSelectedItem = this.clearItemsThenAddSelectedItem.bind(this);
    }
    toggleAccordionItem(selectedItem) {
        const itemAlreadySelected = this.state.selectedItems.includes(selectedItem);
        if (itemAlreadySelected) {
            this.removeSelectedItem(selectedItem);
        } else {
            if (this.props.multiple) {
                this.addSelectedItem(selectedItem);
            } else {
                this.clearItemsThenAddSelectedItem(selectedItem);
            }
        }
    }
    addSelectedItem(selectedItem) {
        this.setState({
            selectedItems: [...this.state.selectedItems, selectedItem]
        });
    }
    clearItemsThenAddSelectedItem(selectedItem) {
        this.setState({
            selectedItems: []
        },
            function () {
                this.addSelectedItem(selectedItem);
            });
    }
    removeSelectedItem(selectedItem) {
        const positionOfItem = this.state.selectedItems.indexOf(selectedItem);
        this.state.selectedItems.splice(positionOfItem, 1);
        this.setState({
            selectedItems: this.state.selectedItems
        });
    }
    render() {
        const items = this.props.children.map((child, i) => {
            return React.cloneElement(child, {
                key: i,
                id: i,
                selectedItems: this.state.selectedItems,
                active: this.state.selectedItems.includes(i),
                toggleAccordionItem: this.toggleAccordionItem.bind(this, i),
                addSelectedItem: this.addSelectedItem.bind(this)
            });
        });
        return /*#__PURE__*/(
            React.createElement("ul", { className: "Accordion Accordion--hasJS" }, items));
    }
}
class AccordionItem extends React.Component {
    componentDidMount() {
        if (this.props.openOnLoad) {
            this.props.addSelectedItem(this.props.id);
        }
    }
    onKeyPressed(e) {
        if (/(40|39|38|37|36|35|32|13)/.test(e.keyCode)) {
            e.preventDefault();
        }
        if (/(13)/.test(e.keyCode)) {
            this.props.toggleAccordionItem(this.props.itemid);
        }
    }
    render() {
        return /*#__PURE__*/(
            React.createElement("li", { className: this.props.active === true ? 'Accordion-item Accordion-item--active' : 'Accordion-item' }, /*#__PURE__*/
                React.createElement("h3", { className: "Accordion-itemTitle" }, /*#__PURE__*/
                    React.createElement("a", { onKeyDown: this.onKeyPressed.bind(this), onClick: this.props.toggleAccordionItem, id: `${this.props.itemid}-tab`, href: `#${this.props.itemid}`, className: "Accordion-itemTitleLink", "aria-selected": this.props.active, "aria-expanded": this.props.active, "aria-controls": this.props.itemid, role: "tab" },
                        this.props.title)), /*#__PURE__*/
                React.createElement("div", { id: this.props.itemid, className: this.props.active === true ? 'Accordion-itemContent' : 'Accordion-itemContent--closed Accordion-itemContent', "aria-labelledby": `${this.props.itemid}-tab`, role: "tabpanel", "aria-hidden": !this.props.active }, /*#__PURE__*/
                    React.createElement("div", { className: "Accordion-itemContentInner" }, this.props.children))));
    }
}
class App extends React.Component {
    render() {
        return /*#__PURE__*/(
            React.createElement("div", null, /*#__PURE__*/
                React.createElement("div", null, /*#__PURE__*/
                    React.createElement("h2", null, "Accordion in multiple mode"), /*#__PURE__*/
                    React.createElement(Accordion, { multiple: true }, /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question One Title", itemid: "question1" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 1")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Two Title", itemid: "question2" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 2")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Three Title", itemid: "question3" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 3")))), /*#__PURE__*/
                React.createElement("div", null, /*#__PURE__*/
                    React.createElement("h2", null, "Accordion in single item mode"), /*#__PURE__*/
                    React.createElement(Accordion, null, /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Four Title", itemid: "question4" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 1")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Five Title", itemid: "question5" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 2")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Six Title", itemid: "question6" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 3")))), /*#__PURE__*/
                React.createElement("div", null, /*#__PURE__*/
                    React.createElement("h2", null, "Accordion with item pre-opened"), /*#__PURE__*/
                    React.createElement(Accordion, null, /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Seven Title", itemid: "question7" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 1")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Eight Title", itemid: "question8" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 2")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Nine Title", itemid: "question9", openOnLoad: true }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 3"))))));
    }
}
ReactDOM.render( /*#__PURE__*/React.createElement(App, null), document.getElementById('root'));
<script src='https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.min.js'></script>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- This script got from frontendfreecode.com -->

<script src='https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.min.js'></script>
<style>
@custom-media --viewportSm (min-width: 480px);
@custom-media --viewportMd (min-width: 640px);
@custom-media --viewportLg (min-width: 960px);
@custom-media --viewportXl (min-width: 1280px);
:root {
	--containerMaxWidth: 1600px;
}
:root {
	--colorFacebook: #3e5a98;
	--colorLinkedin: #0078b6;
	--colorTwitter: #1da1f2;
	--colorWhite: #fff;
	--colorBlack: #000;
	--colorBlack75: #404040;
	--colorBlack50: #7f7f7f;
	--colorBlack25: #bfbfbf;
	--colorBlack10: #e5e5e5;
	--colorBlack5: #f2f2f2;
	--colorDarkGrey: #666;
	--colorDarkGrey75: #8d8d8d;
	--colorDarkGrey50: #b2b2b2;
	--colorDarkGrey25: #d9d9d9;
	--colorDarkGrey10: #efefef;
	--colorDarkGrey5: #f7f7f7;
	--colorCyan: #00aeef;
	--colorCyan75: #40c2f3;
	--colorCyan50: #7fd6f7;
	--colorCyan25: #bfebfb;
	--colorCyan10: #e5f7fd;
	--colorCyan5: #f2fbfe;
	--colorDigitalLightBlue: #0076b6;
	--colorDigitalLightBlue75: #4099c9;
	--colorDigitalLightBlue50: #7fbada;
	--colorDigitalLightBlue25: #bfdded;
	--colorDigitalLightBlue10: #e5f1f7;
	--colorDigitalLightBlue5: #f2f8fb;
	--colorDigitalDarkBlue: #00395d;
	--colorDigitalDarkBlue75: #406b86;
	--colorDigitalDarkBlue50: #7f9cae;
	--colorDigitalDarkBlue25: #bfcdd6;
	--colorDigitalDarkBlue10: #e5ebee;
	--colorDigitalDarkBlue5: #f2f5f7;
	--colorBurgundy: #9d063b;
	--colorBurgundy75: #b6446c;
	--colorBurgundy50: #ce829d;
	--colorBurgundy25: #e6c1ce;
	--colorBurgundy10: #f5e6eb;
	--colorBurgundy5: #faf2f5;
	--colorTaupe: #b1a194;
	--colorTaupe75: #c5b9af;
	--colorTaupe50: #d8d0c9;
	--colorTaupe25: #ebe7e4;
	--colorTaupe10: #f7f5f4;
	--colorTaupe5: #fbfaf9;
	--colorYellow: #ffbe10;
	--colorYellow75: #ffce4c;
	--colorYellow50: #ffde87;
	--colorYellow25: #ffefc3;
	--colorYellow10: #fff8e7;
	--colorYellow5: #fffcf3;
	--colorRed: #c33;
	--colorRed75: #d96666;
	--colorRed50: #e59999;
	--colorRed25: #f2cccc;
	--colorRed10: #faeaea;
	--colorRed5: #fcf5f5;
	--colorAmber: #dc630a;
	--colorAmber75: #e58a47;
	--colorAmber50: #edb184;
	--colorAmber25: #f6d8c2;
	--colorAmber10: #fbefe6;
	--colorAmber5: #fdf7f3;
	--colorGreen: #008312;
	--colorGreen75: #40a24e;
	--colorGreen50: #7fc188;
	--colorGreen25: #bfe0c4;
	--colorGreen10: #e5f2e7;
	--colorGreen5: #f2f9f3;
}
:root {
	--fontSize: 16px;
	--fontFamily: "Expert Sans Light", Verdana, sans-serif;
	--fontFamilyRegular: "Expert Sans Regular", Verdana, sans-serif;
	--fontFamilyBold: "Expert Sans Bold", Verdana, sans-serif;
	--fontFamilyB14: "Expert Sans B14 Light", Verdana, sans-serif;
	--fontColor: var(--colorDarkGrey);
	--lineHeight: 1.5;
}
:root {
	--linkColor: var(--colorDigitalLightBlue);
	--linkFocusColor: var(--colorDigitalDarkBlue);
	--linkFocusOutlineColor: var(--colorCyan50);
	--linkFocusOutlineSize: 2px;
	--linkFocusOutlineOffsetSize: 1px;
	--linkHoverColor: var(--colorDigitalDarkBlue);
}
:root {
	--selectionBackgroundColor: rgba(229, 247, 253, 0.99);
	--selectionColor: var(--colorDigitalDarkBlue);
}
:root {
	--spaceXs: 12px;
	--spaceSm: 24px;
	--spaceMd: 48px;
	--spaceLg: 64px;
}
:root {
	--fontSizeXlMobile: 36px;
	--fontSizeLgMobile: 30px;
	--fontSizeMdMobile: 24px;
	--fontSizeSmMobile: 20px;
	--fontSizeXsMobile: 16px;
	--fontSizeXxsMobile: 16px;
	--fontSizeB14: 14px;
	--letterSpacingXlMobile: -0.25px;
	--lineHeightXlMobile: 1.222222;
	--lineHeightLgMobile: 1.333333;
	--lineHeightMdMobile: 1.5;
	--lineHeightSmMobile: 1.6;
	--lineHeightXsMobile: 1.5;
	--lineHeightXxsMobile: 1.5;
	--fontSizeXl: 46px;
	--fontSizeLg: 36px;
	--fontSizeMd: 30px;
	--fontSizeSm: 24px;
	--FontSizeXs: 20px;
	--fontSizeXxs: 16px;
	--letterSpacingXl: -0.5px;
	--letterSpacingLg: -0.25px;
	--lineHeightXl: 1.173913;
	--lineHeightLg: 1.277777;
	--lineHeightMd: 1.333333;
	--lineHeightSm: 1.5;
	--LineHeightXs: 1.6;
	--lineHeightXxs: 1.5;
}
:root {
	--transitionSlow: 0.6s;
	--transitionMedium: 0.3s;
	--transitionFast: 0.15s;
}
:root {
	--Accordion-bgColor: #fff;
	--Accordion-textColor: var(--colorDarkGrey);
	--Accordion-borderColor: var(--colorBlack25);
	--Accordion-borderRadius: 5px;
	--Accordion-transition: var(--Accordion-transitionDuration) var(--Accordion-transitionTimingFunction);
	--Accordion-transitionDuration: var(--transitionMedium);
	--Accordion-transitionTimingFunction: ease-out;
	--Accordion-item--active-bgColor: var(--colorCyan5);
	--Accordion-item--active-borderColor: var(--colorDigitalLightBlue);
	--Accordion-item-chevronColor: #000;
	--Accordion-item-chevronTransition: transform var(--Accordion-transition);
	--Accordion-itemTitleLink-padding: var(--spaceXs);
	--Accordion-itemContentInner-padding: var(--spaceXs);
	--Accordion-itemContent-transition: max-height var(--Accordion-transition);
}
.Accordion {
	background-color: var(--Accordion-bgColor);
}
.Accordion-item {
	list-style: none;
}
.Accordion--hasJS .Accordion-item {
	border-bottom: 1px solid var(--Accordion-borderColor);
	border-left: 1px solid var(--Accordion-borderColor);
	border-right: 1px solid var(--Accordion-borderColor);
	border-top: 0;
}
.Accordion--hasJS .Accordion-item:first-child {
	border-top: 1px solid var(--Accordion-borderColor);
	border-top-left-radius: var(--Accordion-borderRadius);
	border-top-right-radius: var(--Accordion-borderRadius);
}
.Accordion--hasJS .Accordion-item:first-child .Accordion-itemTitle, .Accordion--hasJS .Accordion-item:first-child .Accordion-itemTitleLink {
	border-top-left-radius: var(--Accordion-borderRadius);
	border-top-right-radius: var(--Accordion-borderRadius);
}
.Accordion--hasJS .Accordion-item:last-child {
	border-bottom-left-radius: var(--Accordion-borderRadius);
	border-bottom-right-radius: var(--Accordion-borderRadius);
}
.Accordion-itemTitle {
	margin-bottom: 0;
}
.Accordion--hasJS .Accordion-itemTitle {
	cursor: pointer;
	margin-bottom: 0;
	margin-top: 0;
	position: relative;
}
.Accordion-itemTitleLink, .Accordion-itemTitleLink:visited, .Accordion-itemTitleLink:active, .Accordion-itemTitleLink:hover {
	color: var(--Accordion-textColor);
	display: block;
}
.Accordion--hasJS .Accordion-itemTitleLink {
	padding: var(--Accordion-itemTitleLink-padding);
}
.Accordion-item--active .Accordion-itemTitle {
	background-color: var(--Accordion-item--active-bgColor);
}
.Accordion--hasJS .Accordion-itemTitle::before, .Accordion--hasJS .Accordion-itemTitle::after {
	background-color: var(--Accordion-item-chevronColor);
	content: "";
	display: block;
	height: 3px;
	position: absolute;
	top: 22px;
	transition: var(--Accordion-item-chevronTransition);
	width: 11px;
}
.Accordion--hasJS .Accordion-itemTitle::before {
	left: 20px;
	transform: rotate(40deg);
}
.Accordion--hasJS .Accordion-itemTitle::after {
	left: 27px;
	transform: rotate(-220deg);
}
.Accordion--hasJS .Accordion-item--active .Accordion-itemTitle::before {
	transform: rotate(140deg);
}
.Accordion--hasJS .Accordion-item--active .Accordion-itemTitle::after {
	transform: rotate(-320deg);
}
.Accordion--hasJS .Accordion-itemTitleLink {
	border: 1px solid transparent;
	margin: -1px;
	padding-left: 50px;
}
.Accordion-item--active .Accordion-itemTitleLink, .Accordion-itemTitleLink:focus {
	background-color: var(--Accordion-item--active-bgColor);
	border-color: var(--Accordion-item--active-borderColor);
}
.Accordion--hasJS .Accordion-itemContent {
	overflow: hidden;
	transition: var(--Accordion-itemContent-transition);
}
.Accordion--hasJS .Accordion-itemContentInner {
	padding: var(--Accordion-itemContentInner-padding);
}
.Accordion-itemContent--closed {
	display: none;
}
.Accordion-itemContent--transitioning {
	max-height: 0;
}
</style>

</head>
<body>
<div id="root"></div><div id="bcl"><a style="font-size:8pt;text-decoration:none;" href="http://www.devanswer.com">Free Frontend</a></div>
<script>
class Accordion extends React.Component {
    constructor() {
        super();
        this.state = {
            selectedItems: []
        };
        this.toggleAccordionItem = this.toggleAccordionItem.bind(this);
        this.addSelectedItem = this.addSelectedItem.bind(this);
        this.removeSelectedItem = this.removeSelectedItem.bind(this);
        this.clearItemsThenAddSelectedItem = this.clearItemsThenAddSelectedItem.bind(this);
    }
    toggleAccordionItem(selectedItem) {
        const itemAlreadySelected = this.state.selectedItems.includes(selectedItem);
        if (itemAlreadySelected) {
            this.removeSelectedItem(selectedItem);
        } else {
            if (this.props.multiple) {
                this.addSelectedItem(selectedItem);
            } else {
                this.clearItemsThenAddSelectedItem(selectedItem);
            }
        }
    }
    addSelectedItem(selectedItem) {
        this.setState({
            selectedItems: [...this.state.selectedItems, selectedItem]
        });
    }
    clearItemsThenAddSelectedItem(selectedItem) {
        this.setState({
            selectedItems: []
        },
            function () {
                this.addSelectedItem(selectedItem);
            });
    }
    removeSelectedItem(selectedItem) {
        const positionOfItem = this.state.selectedItems.indexOf(selectedItem);
        this.state.selectedItems.splice(positionOfItem, 1);
        this.setState({
            selectedItems: this.state.selectedItems
        });
    }
    render() {
        const items = this.props.children.map((child, i) => {
            return React.cloneElement(child, {
                key: i,
                id: i,
                selectedItems: this.state.selectedItems,
                active: this.state.selectedItems.includes(i),
                toggleAccordionItem: this.toggleAccordionItem.bind(this, i),
                addSelectedItem: this.addSelectedItem.bind(this)
            });
        });
        return /*#__PURE__*/(
            React.createElement("ul", { className: "Accordion Accordion--hasJS" }, items));
    }
}
class AccordionItem extends React.Component {
    componentDidMount() {
        if (this.props.openOnLoad) {
            this.props.addSelectedItem(this.props.id);
        }
    }
    onKeyPressed(e) {
        if (/(40|39|38|37|36|35|32|13)/.test(e.keyCode)) {
            e.preventDefault();
        }
        if (/(13)/.test(e.keyCode)) {
            this.props.toggleAccordionItem(this.props.itemid);
        }
    }
    render() {
        return /*#__PURE__*/(
            React.createElement("li", { className: this.props.active === true ? 'Accordion-item Accordion-item--active' : 'Accordion-item' }, /*#__PURE__*/
                React.createElement("h3", { className: "Accordion-itemTitle" }, /*#__PURE__*/
                    React.createElement("a", { onKeyDown: this.onKeyPressed.bind(this), onClick: this.props.toggleAccordionItem, id: `${this.props.itemid}-tab`, href: `#${this.props.itemid}`, className: "Accordion-itemTitleLink", "aria-selected": this.props.active, "aria-expanded": this.props.active, "aria-controls": this.props.itemid, role: "tab" },
                        this.props.title)), /*#__PURE__*/
                React.createElement("div", { id: this.props.itemid, className: this.props.active === true ? 'Accordion-itemContent' : 'Accordion-itemContent--closed Accordion-itemContent', "aria-labelledby": `${this.props.itemid}-tab`, role: "tabpanel", "aria-hidden": !this.props.active }, /*#__PURE__*/
                    React.createElement("div", { className: "Accordion-itemContentInner" }, this.props.children))));
    }
}
class App extends React.Component {
    render() {
        return /*#__PURE__*/(
            React.createElement("div", null, /*#__PURE__*/
                React.createElement("div", null, /*#__PURE__*/
                    React.createElement("h2", null, "Accordion in multiple mode"), /*#__PURE__*/
                    React.createElement(Accordion, { multiple: true }, /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question One Title", itemid: "question1" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 1")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Two Title", itemid: "question2" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 2")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Three Title", itemid: "question3" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 3")))), /*#__PURE__*/
                React.createElement("div", null, /*#__PURE__*/
                    React.createElement("h2", null, "Accordion in single item mode"), /*#__PURE__*/
                    React.createElement(Accordion, null, /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Four Title", itemid: "question4" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 1")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Five Title", itemid: "question5" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 2")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Six Title", itemid: "question6" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 3")))), /*#__PURE__*/
                React.createElement("div", null, /*#__PURE__*/
                    React.createElement("h2", null, "Accordion with item pre-opened"), /*#__PURE__*/
                    React.createElement(Accordion, null, /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Seven Title", itemid: "question7" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 1")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Eight Title", itemid: "question8" }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 2")), /*#__PURE__*/
                        React.createElement(AccordionItem, { title: "Question Nine Title", itemid: "question9", openOnLoad: true }, /*#__PURE__*/
                            React.createElement("p", null, "here is some text 3"))))));
    }
}
ReactDOM.render( /*#__PURE__*/React.createElement(App, null), document.getElementById('root'));
</script>

</body>
</html>
Preview