Coder Social home page Coder Social logo

vasilionjea / ember-a11y-accordion Goto Github PK

View Code? Open in Web Editor NEW
7.0 4.0 6.0 6.05 MB

Ember accordion component with accessibility as a first class citizen

Home Page: https://vasilionjea.github.io/ember-a11y-accordion/

License: MIT License

JavaScript 74.34% HTML 2.61% CSS 3.62% Handlebars 19.43%
ember ember-addon ember-a11y-accordion accordion accessibility a11y javascript

ember-a11y-accordion's Introduction

ember-a11y-accordion

Build Status

This Ember addon is based on the W3C's ARIA best practices for accordions and treats accessibility as a first class citizen. Live demo: https://vasilionjea.github.io/ember-a11y-accordion/

Install

ember install ember-a11y-accordion

Usage

<AccordionList
  @animation={{false}}
  @onAfterShow={{this.onAfterShow}}
  @onShow={{this.onAccordionShow}}
  class="my-accordion" as |accordion|>
  <accordion.item @expandOnInit={{true}} @name="item1" as |item|>
    <item.header @ariaLevel="4" class="first-header">Lorem ipsum</item.header>
    <item.panel class="first-panel">
      <p>Lorem <a href="#">ipsum</a> dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
    </item.panel>
  </accordion.item>
  <accordion.item @name="item2" as |item|>
    <item.header @ariaLevel="4">Dolor Sit</item.header>
    <item.panel>
      <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
    </item.panel>
  </accordion.item>
  <accordion.item @isDisabled={{true}} as |item|>
    <item.header @ariaLevel="4">This is disabled</item.header>
    <item.panel>
      <p>User cannot interact with this item.</p>
    </item.panel>
  </accordion.item>
</AccordionList>

There is an additional collapsible component called collapsible-list and all the options are exactly the same as the accordion list component. The only difference is that accordions expand one item at a time, whereas collapsibles can have multiple items expanded at any point in time.

Both the accordion-list and the collapsible-list components accept the following actions:

  • onShow Triggered when the header is clicked.
  • onAfterShow Triggered once the content is visible and all animations completed. Without animation, it triggers after the onShow action.

The collapsible-list component additionally accepts the following actions:

  • onHide Triggered when the header is clicked and the panel is closing.

onHide, onShow and onAfterShow will receive an object as first argument with a name property containing the name of the accordion-item becoming visible and other properties.

Roles, States, Attributes, and Classes

Role Attribute Element Classes  
    div .a11y-accordion-list Simply used as a container and doesn't have any semantic meaning.
    section .a11y-accordion-item
.a11y-accordion-item--is-expanded
.a11y-accordion-item--is-disabled
Represents an accordion section, which contains the header and the panel. When expanded, it contains the additional .a11y-accordion-item--is-expanded class. When the @isDisabled attribute is passed in and set to true, the component's element additionally contains the .a11y-accordion-item--is-disabled class.
heading aria-level="3" header .a11y-accordion-header Represents an accordion item's heading. By default it acts as level 3 heading but it should be changed to whatever makes sense in a page's context.
  type="button" button .a11y-accordion-header__trigger The button element is the only element inside the heading element and functions as the trigger for the accordion panel.
  aria-expanded="true" button .a11y-accordion-header__trigger Set to true when the accordion panel is expanded, otherwise it's set to false.
  aria-controls="ID" button .a11y-accordion-header__trigger Points to the panel ID, which the trigger controls.
  aria-disabled="true" button .a11y-accordion-header__trigger Set to true when the panel it controls is expanded, and set to false when the panel is collapsed. This ARIA attribute is also controlled by the optional @isDisabled attribute that can be passed to accordion item components.
region   section .a11y-accordion-panel-wrapper

This is the accordion panel which the trigger controls. The region role is helpful to the perception of structure by screen reader users when panels contain heading elements or a nested accordion.

Note that you should never style this element.

  aria-labelledby="ID" section .a11y-accordion-panel-wrapper Points to the associated trigger element, which labels this panel region.
  aria-hidden="true" section .a11y-accordion-panel-wrapper Set to true when the panel is collapsed, otherwise it's set to false. This ARIA attribute is important when accordion items are visually hidden due to animation.
    div .a11y-accordion-panel-content

This is where the contents of the panel are rendered.

The panel content can be styled via CSS, however, note that when the @animation={{true}} attribute is passed to the accordion-list component, the content's height is calculated via JavaScript and it doesn't take into account the CSS margin property. With that said, only apply padding for styling purposes to the content element.

Contribute

See the Contributing guide for details.

Install

  • git clone <repository-url> this repository
  • cd ember-a11y-accordion
  • npm install

Running

Running Tests

  • npm test (Runs ember try:each to test the addon against multiple Ember versions)
  • ember test
  • ember test --server

Building

  • ember build

License

This project is licensed under the MIT License.

ember-a11y-accordion's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

ember-a11y-accordion's Issues

Add me as collaborator

Hi, @vasilionjea. I work with @ryanone at LinkedIn and would like to request if I can be made a collaborator as well. Seems like collaborators do not have permission to add other collaborators. Thanks!

Additional Owners?

Hi @vasilionjea, hope all is well. I'm reaching out to see if you'd be open to having additional people be owners of this project? Granted it hasn't undergone a lot of development lately, and if you're not intending on owning it, some of us at your former employer would be willing to take it on, or at least help you be co-owners.

onHide for accordion-list

Would like to be informed when a panel is closing even when triggered by another panel opening (in the case of accordion-list)

The use case is we want to show a different state on the panel once it has been opened at least once.

Any plans to update to Octane?

Hi - I'm wondering if it's on the roadmap to update the codebase in general, and get it up to date with things like Octane, etc.?

@vasilionjea Actually, if it helps, I forked the repo and updated to Octane and Ember 3.26. If you're willing to look at a PR, I can send one your way.

Programmatically opening/closing panels

Is it possible to programmatically open and close panels? One rationale for this functionality is if the accordion contains form elements and there is a validation error inside a closed panel, we open it up.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.