Accordion is used for showing and hiding content but only one item can stay open at a time.
Note on Accordion Components
Accordion uses the same style as the collapse component but it works with radio inputs. You can control which item to be open by checking/unchecking the hidden radio input.
All collapse utilities are already defined in the cjm_fasthtml_daisyui.components.data_display.collapse module.
Test basic accordion using radio inputs from daisyUI v5 documentation.
Exported source
def test_accordion_basic_fasthtml_examples():"""Test basic accordion using radio inputs from daisyUI v5 documentation."""from fasthtml.common import Div, Inputfrom cjm_fasthtml_tailwind.utilities.borders import borderfrom cjm_fasthtml_tailwind.utilities.typography import font_size, font_weight, font_family, text_colorfrom cjm_fasthtml_daisyui.utilities.semantic_colors import bg_dui, border_dui# First accordion item accordion_item_1 = Div( Input(type="radio", name="my-accordion-1", checked="checked"), Div("How do I create an account?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click the "Sign Up" button in the top right corner and follow the registration process.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, bg_dui.base_100, border(), border_dui.base_300) )assert"collapse"in accordion_item_1.attrs['class']assert"bg-base-100"in accordion_item_1.attrs['class']assert"border"in accordion_item_1.attrs['class']assert"border-base-300"in accordion_item_1.attrs['class']assert accordion_item_1.children[0].attrs['type'] =="radio"assert accordion_item_1.children[0].attrs['name'] =="my-accordion-1"assert accordion_item_1.children[0].attrs['checked'] =="checked"assert"collapse-title"in accordion_item_1.children[1].attrs['class']assert"font-semibold"in accordion_item_1.children[1].attrs['class']assert accordion_item_1.children[1].children[0] =="How do I create an account?"assert"collapse-content"in accordion_item_1.children[2].attrs['class']assert"text-sm"in accordion_item_1.children[2].attrs['class']# Second accordion item accordion_item_2 = Div( Input(type="radio", name="my-accordion-1"), Div("I forgot my password. What should I do?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click on "Forgot Password" on the login page and follow the instructions sent to your email.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, bg_dui.base_100, border(), border_dui.base_300) )assert accordion_item_2.children[0].attrs['name'] =="my-accordion-1"assert'checked'notin accordion_item_2.children[0].attrs# Third accordion item accordion_item_3 = Div( Input(type="radio", name="my-accordion-1"), Div("How do I update my profile information?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Go to "My Account" settings and select "Edit Profile" to make changes.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, bg_dui.base_100, border(), border_dui.base_300) )assert accordion_item_3.children[1].children[0] =="How do I update my profile information?"assert accordion_item_3.children[2].children[0] =='Go to "My Account" settings and select "Edit Profile" to make changes.'# Test that all items share the same radio group nameassert accordion_item_1.children[0].attrs['name'] == accordion_item_2.children[0].attrs['name']assert accordion_item_2.children[0].attrs['name'] == accordion_item_3.children[0].attrs['name']# Return the accordion items in a Divreturn Div(accordion_item_1, accordion_item_2, accordion_item_3)# Run the teststest_accordion_basic_fasthtml_examples()
<div><div class="collapse bg-base-100 border border-base-300"><input type="radio" name="my-accordion-1" checked="checked"><div class="collapse-title font-semibold">How do I create an account?</div><div class="collapse-content text-sm">Click the "Sign Up" button in the top right corner and follow the registration process.</div></div><div class="collapse bg-base-100 border border-base-300"><input type="radio" name="my-accordion-1"><div class="collapse-title font-semibold">I forgot my password. What should I do?</div><div class="collapse-content text-sm">Click on "Forgot Password" on the login page and follow the instructions sent to your email.</div></div><div class="collapse bg-base-100 border border-base-300"><input type="radio" name="my-accordion-1"><div class="collapse-title font-semibold">How do I update my profile information?</div><div class="collapse-content text-sm">Go to "My Account" settings and select "Edit Profile" to make changes.</div></div></div>
Test accordion with arrow icon from daisyUI v5 documentation.
Exported source
def test_accordion_arrow_fasthtml_examples():"""Test accordion with arrow icon from daisyUI v5 documentation."""from fasthtml.common import Div, Inputfrom cjm_fasthtml_tailwind.utilities.borders import borderfrom cjm_fasthtml_tailwind.utilities.typography import font_size, font_weight, font_family, text_colorfrom cjm_fasthtml_daisyui.utilities.semantic_colors import bg_dui, border_dui# First accordion item with arrow accordion_arrow_1 = Div( Input(type="radio", name="my-accordion-2", checked="checked"), Div("How do I create an account?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click the "Sign Up" button in the top right corner and follow the registration process.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.arrow, bg_dui.base_100, border(), border_dui.base_300) )assert"collapse"in accordion_arrow_1.attrs['class']assert"collapse-arrow"in accordion_arrow_1.attrs['class']assert"bg-base-100"in accordion_arrow_1.attrs['class']assert"border"in accordion_arrow_1.attrs['class']assert"border-base-300"in accordion_arrow_1.attrs['class']assert accordion_arrow_1.children[0].attrs['type'] =="radio"assert accordion_arrow_1.children[0].attrs['name'] =="my-accordion-2"assert accordion_arrow_1.children[0].attrs['checked'] =="checked"# Second accordion item with arrow accordion_arrow_2 = Div( Input(type="radio", name="my-accordion-2"), Div("I forgot my password. What should I do?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click on "Forgot Password" on the login page and follow the instructions sent to your email.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.arrow, bg_dui.base_100, border(), border_dui.base_300) )assert"collapse-arrow"in accordion_arrow_2.attrs['class']assert accordion_arrow_2.children[0].attrs['name'] =="my-accordion-2"assert'checked'notin accordion_arrow_2.children[0].attrs# Third accordion item with arrow accordion_arrow_3 = Div( Input(type="radio", name="my-accordion-2"), Div("How do I update my profile information?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Go to "My Account" settings and select "Edit Profile" to make changes.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.arrow, bg_dui.base_100, border(), border_dui.base_300) )assert"collapse-arrow"in accordion_arrow_3.attrs['class']assert accordion_arrow_3.children[1].children[0] =="How do I update my profile information?"# Test that all arrow items share the same radio group nameassert accordion_arrow_1.children[0].attrs['name'] == accordion_arrow_2.children[0].attrs['name']assert accordion_arrow_2.children[0].attrs['name'] == accordion_arrow_3.children[0].attrs['name']# Return the accordion items in a Divreturn Div(accordion_arrow_1, accordion_arrow_2, accordion_arrow_3)# Run the teststest_accordion_arrow_fasthtml_examples()
<div><div class="collapse collapse-arrow bg-base-100 border border-base-300"><input type="radio" name="my-accordion-2" checked="checked"><div class="collapse-title font-semibold">How do I create an account?</div><div class="collapse-content text-sm">Click the "Sign Up" button in the top right corner and follow the registration process.</div></div><div class="collapse collapse-arrow bg-base-100 border border-base-300"><input type="radio" name="my-accordion-2"><div class="collapse-title font-semibold">I forgot my password. What should I do?</div><div class="collapse-content text-sm">Click on "Forgot Password" on the login page and follow the instructions sent to your email.</div></div><div class="collapse collapse-arrow bg-base-100 border border-base-300"><input type="radio" name="my-accordion-2"><div class="collapse-title font-semibold">How do I update my profile information?</div><div class="collapse-content text-sm">Go to "My Account" settings and select "Edit Profile" to make changes.</div></div></div>
Test accordion with plus/minus icon from daisyUI v5 documentation.
Exported source
def test_accordion_plus_fasthtml_examples():"""Test accordion with plus/minus icon from daisyUI v5 documentation."""from fasthtml.common import Div, Inputfrom cjm_fasthtml_tailwind.utilities.borders import borderfrom cjm_fasthtml_tailwind.utilities.typography import font_size, font_weight, font_family, text_colorfrom cjm_fasthtml_daisyui.utilities.semantic_colors import bg_dui, border_dui# First accordion item with plus/minus accordion_plus_1 = Div( Input(type="radio", name="my-accordion-3", checked="checked"), Div("How do I create an account?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click the "Sign Up" button in the top right corner and follow the registration process.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.plus, bg_dui.base_100, border(), border_dui.base_300) )assert"collapse"in accordion_plus_1.attrs['class']assert"collapse-plus"in accordion_plus_1.attrs['class']assert"bg-base-100"in accordion_plus_1.attrs['class']assert"border"in accordion_plus_1.attrs['class']assert"border-base-300"in accordion_plus_1.attrs['class']assert accordion_plus_1.children[0].attrs['type'] =="radio"assert accordion_plus_1.children[0].attrs['name'] =="my-accordion-3"assert accordion_plus_1.children[0].attrs['checked'] =="checked"# Second accordion item with plus/minus accordion_plus_2 = Div( Input(type="radio", name="my-accordion-3"), Div("I forgot my password. What should I do?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click on "Forgot Password" on the login page and follow the instructions sent to your email.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.plus, bg_dui.base_100, border(), border_dui.base_300) )assert"collapse-plus"in accordion_plus_2.attrs['class']assert accordion_plus_2.children[0].attrs['name'] =="my-accordion-3"assert'checked'notin accordion_plus_2.children[0].attrs# Third accordion item with plus/minus accordion_plus_3 = Div( Input(type="radio", name="my-accordion-3"), Div("How do I update my profile information?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Go to "My Account" settings and select "Edit Profile" to make changes.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.plus, bg_dui.base_100, border(), border_dui.base_300) )assert"collapse-plus"in accordion_plus_3.attrs['class']assert accordion_plus_3.children[1].children[0] =="How do I update my profile information?"assert accordion_plus_3.children[2].children[0] =='Go to "My Account" settings and select "Edit Profile" to make changes.'# Test that all plus items share the same radio group nameassert accordion_plus_1.children[0].attrs['name'] == accordion_plus_2.children[0].attrs['name']assert accordion_plus_2.children[0].attrs['name'] == accordion_plus_3.children[0].attrs['name']# Return the accordion items in a Divreturn Div(accordion_plus_1, accordion_plus_2, accordion_plus_3)# Run the teststest_accordion_plus_fasthtml_examples()
<div><div class="collapse collapse-plus bg-base-100 border border-base-300"><input type="radio" name="my-accordion-3" checked="checked"><div class="collapse-title font-semibold">How do I create an account?</div><div class="collapse-content text-sm">Click the "Sign Up" button in the top right corner and follow the registration process.</div></div><div class="collapse collapse-plus bg-base-100 border border-base-300"><input type="radio" name="my-accordion-3"><div class="collapse-title font-semibold">I forgot my password. What should I do?</div><div class="collapse-content text-sm">Click on "Forgot Password" on the login page and follow the instructions sent to your email.</div></div><div class="collapse collapse-plus bg-base-100 border border-base-300"><input type="radio" name="my-accordion-3"><div class="collapse-title font-semibold">How do I update my profile information?</div><div class="collapse-content text-sm">Go to "My Account" settings and select "Edit Profile" to make changes.</div></div></div>
Test accordion with join from daisyUI v5 documentation.
Exported source
def test_accordion_join_fasthtml_examples():"""Test accordion with join from daisyUI v5 documentation."""from fasthtml.common import Div, Inputfrom cjm_fasthtml_tailwind.utilities.borders import borderfrom cjm_fasthtml_tailwind.utilities.typography import font_size, font_weight, font_family, text_colorfrom cjm_fasthtml_daisyui.utilities.semantic_colors import bg_dui, border_duifrom cjm_fasthtml_daisyui.components.layout.join import join, join_item, join_directions# Accordion group using Join accordion_join = Div( Div( Input(type="radio", name="my-accordion-4", checked="checked"), Div("How do I create an account?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click the "Sign Up" button in the top right corner and follow the registration process.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.arrow, join_item, border_dui.base_300, border()) ), Div( Input(type="radio", name="my-accordion-4"), Div("I forgot my password. What should I do?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Click on "Forgot Password" on the login page and follow the instructions sent to your email.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.arrow, join_item, border_dui.base_300, border()) ), Div( Input(type="radio", name="my-accordion-4"), Div("How do I update my profile information?", cls=combine_classes(collapse_title, font_weight.semibold)), Div('Go to "My Account" settings and select "Edit Profile" to make changes.', cls=combine_classes(collapse_content, font_size.sm) ), cls=combine_classes(collapse, collapse_modifiers.arrow, join_item, border_dui.base_300, border()) ), cls=combine_classes(join, join_directions.vertical, bg_dui.base_100) )# Verify container structureassert"join"in accordion_join.attrs['class']assert"join-vertical"in accordion_join.attrs['class']assert"bg-base-100"in accordion_join.attrs['class']# Verify first accordion item item_1 = accordion_join.children[0]assert"collapse"in item_1.attrs['class']assert"collapse-arrow"in item_1.attrs['class']assert"join-item"in item_1.attrs['class']assert"border-base-300"in item_1.attrs['class']assert"border"in item_1.attrs['class']assert item_1.children[0].attrs['type'] =="radio"assert item_1.children[0].attrs['name'] =="my-accordion-4"assert item_1.children[0].attrs['checked'] =="checked"assert item_1.children[1].children[0] =="How do I create an account?"# Verify second accordion item item_2 = accordion_join.children[1]assert"collapse"in item_2.attrs['class']assert"collapse-arrow"in item_2.attrs['class']assert"join-item"in item_2.attrs['class']assert item_2.children[0].attrs['name'] =="my-accordion-4"assert'checked'notin item_2.children[0].attrsassert item_2.children[1].children[0] =="I forgot my password. What should I do?"# Verify third accordion item item_3 = accordion_join.children[2]assert"collapse"in item_3.attrs['class']assert"collapse-arrow"in item_3.attrs['class']assert"join-item"in item_3.attrs['class']assert item_3.children[0].attrs['name'] =="my-accordion-4"assert'checked'notin item_3.children[0].attrsassert item_3.children[1].children[0] =="How do I update my profile information?"# Test that all items share the same radio group nameassert item_1.children[0].attrs['name'] == item_2.children[0].attrs['name']assert item_2.children[0].attrs['name'] == item_3.children[0].attrs['name']# Return the accordion join in a Div (it's already a container, but returning for consistency)return accordion_join# Run the teststest_accordion_join_fasthtml_examples()
<div class="join join-vertical bg-base-100"><div class="collapse collapse-arrow join-item border-base-300 border"><input type="radio" name="my-accordion-4" checked="checked"><div class="collapse-title font-semibold">How do I create an account?</div><div class="collapse-content text-sm">Click the "Sign Up" button in the top right corner and follow the registration process.</div></div><div class="collapse collapse-arrow join-item border-base-300 border"><input type="radio" name="my-accordion-4"><div class="collapse-title font-semibold">I forgot my password. What should I do?</div><div class="collapse-content text-sm">Click on "Forgot Password" on the login page and follow the instructions sent to your email.</div></div><div class="collapse collapse-arrow join-item border-base-300 border"><input type="radio" name="my-accordion-4"><div class="collapse-title font-semibold">How do I update my profile information?</div><div class="collapse-content text-sm">Go to "My Account" settings and select "Edit Profile" to make changes.</div></div></div>