@zcomp/spoilers
TypeScript icon, indicating that this package has built-in type declarations

0.0.6 • Public • Published

What is it?

A small library implementing spoilers. A spoiler is a block with a head and a body — when you click on a head, body disappears. When you click again — it appears again. It's that easy. Spoilers can be grouped into... emmmm... a group. A spoiler group behaves much like accordions from other component libraries.

Installation

npm i --save @zcomp/spoilers

Usage

const spoilers = require('@zcomp/spoilers');
spoilers.SpoilerFactory.init(); // it will not give you spoilers for the next Game of Thrones season, sorry
spoilers.SpoilerGroupFactory.init();

Note that SpoilerGroupFactory.init requires SpoilerFactory.init to be called beforehand. HTML markup:

<div class="js-spoiler">
  <button class="js-spoiler__head">
    Click me
  </button>

  <div class="js-spoiler__body">
    Some content
  </div>
</div>

The library does not actually hides body, it just adds classes to elements. You should manually add styles to your css files to hide body element. For example:

.js-spoiler__body--closed {
  display: none;
}

When spoiler is opened, root element has js-spoiler--opened class. When it is closed, js-spoiler--closed class is added. Body can have js-spoiler__body--opened and js-spoiler__body--closed, and head — js-spoiler__head--opened and js-spoiler__head--closed classes. After spoiler component initialized, js-spoiler--inited class will be present on root element.

You can make spoiler to be opened initially just by adding js-spoiler--opened class in HTML.

To create spoiler group, insert the following markup:

<div class="js-spoiler-group">
  <div class="js-spoiler"></div>
  <div class="js-spoiler"></div>
  <div class="js-spoiler"></div>
</div>

The only purpose for spoiler group to exists is to manage opened/closed state of its children spoilers. If spoiler group is exclusive, it allows only one spoiler to be opened at the same time. By default, spoiler groups are not exclusive. You should either add data-spoiler-group-exclusive attribute to root element, of set defaultExclusive property of options object to true to make it exclusive (you can use data-spoiler-group-exclusive="false" in this case to make a component non-exclusive). If spoiler is exclusive, and you have several initially opened spoilers inside, only the first one will remain opened after initializing, others will be closed. If you have no initially opened spoilers, all spoilers will be closed after group initializes. But you can force a spoiler with particular index inside a group to be opened initially by adding data-spoiler-group-opened-index to the root element. This attribute should contain a number depicting index of the spoiler that should be opened on init. The same can be done with defaultOpenedIndex property of options object. Attributes always have priority over options. If this index is negative (or just invalid), no spoilers will be opened.

You can dynamically display different text content for any elements inside spoiler depending on whether spoiler is opened or closed:

<div class="js-spoiler">
  <button class="js-spoiler__head" data-spoiler-opened-text="Opened" data-spoiler-closed-text="Closed"></button>
  <div class="js-spoiler__body"></div>
</div>

Here button will display "Closed" when spoiler is closed and "Opened" when spoiler is opened.

Events

Some events are fired on root element of the component. All these events bubble. before-spoiler-change-state is fired before spoiler changes state. You can cancel it by calling preventDefault method on event object. after-spoiler-change-state is fired after spoiler changes state.

Readme

Keywords

none

Package Sidebar

Install

npm i @zcomp/spoilers

Weekly Downloads

0

Version

0.0.6

License

MIT

Last publish

Collaborators

  • zenwarr