SkillAgentSearch skills...

Handorgel

Accessible W3C conform accordion written in ES6.

Install / Use

/learn @oncode/Handorgel
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Handorgel

NPM version Coding Style MIT License

Accessible W3C conform accordion written in ES6. Handorgel is the Swiss German name for accordion.

Visit the demo

Features

  • ARIA accessible
  • Keyboard interaction
  • Extensive API
  • Animated collapsing
  • Fully customizable via CSS
  • No external dependencies
  • Lightweight (~3kb minified and gziped)

Installation

Package manager

Manager | Command --- | --- npm | npm install handorgel yarn | yarn add handorgel

CDN / Download

File | CDN --- | --- CSS | handorgel.css CSS (minified) | handorgel.min.css JS | handorgel.js JS (minified) | handorgel.min.js

Usage

Markup

<div class="handorgel">
  <h3 class="handorgel__header">
    <button class="handorgel__header__button">
      Title
    </button>
  </h3>
  <div class="handorgel__content" data-open>
    <div class="handorgel__content__inner">
      Content openened by default
    </div>
  </div>
  <h3 class="handorgel__header">
    <button class="handorgel__header__button">
      Title 2
    </button>
  </h3>
  <div class="handorgel__content">
    <div class="handorgel__content__inner">
      Content closed by default
    </div>
  </div>

  ...

</div>

Note: Use the heading tags that fit into your content to output semantic markup.

CSS

Import the SASS file from your node_modules folder to make use of the variables:

// e.g. changing opening/closing transition times
$handorgel__content--open-transition-height-time: .1s;
$handorgel__content--open-transition-opacity-time: .2s;
$handorgel__content-transition-height-time: .05s;
$handorgel__content-transition-opacity-time: .05s;
//...

@import '~handorgel/src/scss/style';

Alternatively you can just include the built CSS file inside the /lib folder file or from the CDN.

Javascript

Initialization (with all options and their defaults):

var accordion = new handorgel(document.querySelector('.handorgel'), {

  // whether multiple folds can be opened at once
  multiSelectable: true,
  // whether the folds are collapsible
  collapsible: true,

  // whether ARIA attributes are enabled
  ariaEnabled: true,
  // whether W3C keyboard shortcuts are enabled
  keyboardInteraction: true,
  // whether to loop header focus (sets focus back to first/last header when end/start reached)
  carouselFocus: true,

  // attribute for the header or content to open folds at initialization
  initialOpenAttribute: 'data-open',
  // whether to use transition at initial open
  initialOpenTransition: true,
  // delay used to show initial transition
  initialOpenTransitionDelay: 200,

  // header/content element selectors or array of elements
  headerElements: '.handorgel__header',
  contentElements: '.handorgel__content',

  // header/content class if fold is open
  headerOpenClass: 'handorgel__header--open',
  contentOpenClass: 'handorgel__content--open',

  // header/content class if fold has been opened (transition finished)
  headerOpenedClass: 'handorgel__header--opened',
  contentOpenedClass: 'handorgel__content--opened',

  // header/content class if fold has been focused
  headerFocusClass: 'handorgel__header--focus',
  contentFocusClass: 'handorgel__content--focus',

  // header/content class if fold is disabled
  headerDisabledClass: 'handorgel__header--disabled',
  contentDisabledClass: 'handorgel__content--disabled',

})

API

Events

Event | Description | Parameters --- | --- | --- destroy | Accordeon is about to be destroyed. | destroyed | Accordeon has been destroyed. | fold:open | Fold is about to be opened. | HandorgelFold: Fold instance fold:opened | Fold has opened. | HandorgelFold: Fold instance fold:close | Fold is about to be closed. | HandorgelFold: Fold instance fold:closed | Fold has closed. | HandorgelFold: Fold instance fold:focus | Fold button has been focused. | HandorgelFold: Fold instance fold:blur | Fold button has lost focus. | HandorgelFold: Fold instance

How to listen for events:

var accordion = new handorgel(document.querySelector('.handorgel'))

// listen for event
accordion.on('fold:open', (fold) => {
  // ...
})

// listen for event once
accordion.once('fold:open', (fold) => {
  // ...
})

// remove event listener
accordion.off('fold:open', fn)

Methods

Handorgel Class

Method | Description | Parameters --- | --- | --- update | Update fold instances (use if you dynamically append/remove DOM nodes). | focus | Set focus to a new header button (you can also directly use the native focus() method on the button). | target: New header button to focus (next, previous, last or first) destroy | Destroy fold instances, remove event listeners and ARIA attributes. |

Example:

var accordion = new handorgel(document.querySelector('.handorgel'))

// destroy
accordion.destroy()

HandorgelFold Class

Method | Description | Parameters --- | --- | --- open | Open content. | transition: Whether transition should be active during opening (default: true). close | Close content. | transition: Whether transition should be active during closing (default: true). toggle | Toggle content. | transition: Whether transition should be active during toggling (default: true). disable | Disable fold. | enable | Enable fold. | focus | Set focus to fold button. | blur | Remove focus from fold button. | destroy | Remove event listeners and ARIA attributes. |

Example:

var accordion = new handorgel(document.querySelector('.handorgel'))

// close first fold
accordion.folds[0].close()

Browser compatibility

  • Newest two browser versions of Chrome, Firefox, Safari and Edge

Development

  • npm run build - Build production version of the feature.
  • npm run demo - Build demo of the feature, run watchers and start browser-sync.
  • npm run test - Test the feature.

License

MIT LICENSE

Related Skills

View on GitHub
GitHub Stars260
CategoryDevelopment
Updated1y ago
Forks25

Languages

JavaScript

Security Score

85/100

Audited on Jan 22, 2025

No findings