An accessible, open-source lightbox with no dependencies

Overview

Tobii

Version License Dependencies npm bundle size

An accessible, open-source lightbox with no dependencies.

See it in Action

Open slide with a picture of the Berlin television tower

Table of contents

Features

  • No dependencies
  • Supports multiple content types:
    • Images
    • Inline HTML
    • Iframes
    • Videos (YouTube, Vimeo)
  • Grouping
  • Events
  • Customizable with settings and CSS
  • Accessible:
    • ARIA roles
    • Keyboard navigation:
      • Prev/ Next Keys: Navigate through slides
      • ESCAPE Key: Close Tobii
      • TAB Key: Focus elements within Tobii, not outside
    • User preference media features:
      • prefers-reduced-motion media query
    • When Tobii opens, focus is set to the first focusable element in Tobii
    • When Tobii closes, focus returns to what was in focus before Tobii opened
  • Touch & Mouse drag support:
    • Drag/ Swipe horizontal to navigate through slides
    • Drag/ Swipe vertical to close Tobii
  • Responsive

Get Tobii

Download

CSS: dist/tobii.min.css

JavaScript:

  • dist/tobii.min.js: IIFE build for maximum browser support, including IE 11
  • dist/tobii.mjs: Build specially designed to work in all modern browsers
  • dist/tobii.module.js: ESM build
  • dist/tobii.umd.js: UMD build
  • dist/tobii.js: CommonJS/Node build

Package managers

Tobii is also available on npm.

npm install @midzer/tobii --save

Usage

You can install Tobii by linking the .css and .js files to your HTML file. The HTML code may look like this:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Your page title</title>

  <!-- CSS -->
  <link href="tobii.min.css" rel="stylesheet">
</head>
<body>
  <!-- Your HTML content -->

  <!-- JS -->
  <script src="tobii.min.js"></script>
</body>
</html>

Initialize the script by running:

const tobii = new Tobii()

Media types

Image

The standard way of using Tobii is a linked thumbnail image with the class name lightbox to a larger image:

<a href="path/to/image.jpg" class="lightbox">
  <img src="path/to/thumbnail.jpg" alt="I am a caption">
</a>

Instead of a thumbnail, you can also refer to a larger image with a text link:

<a href="path/to/image.jpg" class="lightbox">
  Open image
</a>

If you use a Markdown parser or CMS and want to make all images in a post automatically viewable in a lightbox, use the following JavaScript code to add all images to the same album:

document.addEventListener('DOMContentLoaded', () => {
  // This assumes your article is wrapped in an element with the class "content-article".
  document.querySelectorAll('.content-article img').forEach((articleImg) => {
    // Add lightbox elements in blog articles for Tobii.
    const lightbox = document.createElement('a');
    lightbox.href = articleImg.src;
    lightbox.classList.add('lightbox');
    lightbox.dataset.group = 'article';
    articleImg.parentNode.appendChild(lightbox);
    lightbox.appendChild(articleImg);
  });
});

Inline-HTML

For inline HTML, create an element with a unique ID:

<div id="selector">
  <!-- Your HTML content -->
</div>

Then create a link with the class name lightbox and a href attribute that matches the ID of the element:

<a href="#selector" data-type="html" class="lightbox">
  Open HTML content
</a>

or a button with the class name lightbox and a data-target attribute that matches the ID of the element:

<button type="button" data-type="html" data-target="#selector" class="lightbox">
  Open HTML content
</button>

In both ways, the attribute data-type with the value html is required.

Iframe

For an iframe, create a link with the class name lightbox:

<a href="https://www.wikipedia.org" data-type="iframe" class="lightbox">
  Open Wikipedia
</a>

or a button with the class name lightbox and a data-target attribute:

<button type="button" data-type="iframe" data-target="https://www.wikipedia.org" class="lightbox">
  Open Wikipedia
</button>

In both ways, the attribute data-type with the value iframe is required.

Optional attributes

  • data-height set the height and data-width the width of the iframe.

YouTube

For a YouTube video, create a link with the class name lightbox and a data-id attribute with the YouTube video ID:

<a href="#" data-type="youtube" data-id="KU2sSZ_90PY" class="lightbox">
  Open YouTube video
</a>

or a button with the class name lightbox and a data-id attribute with the YouTube video ID:

<button type="button" data-type="youtube" data-id="KU2sSZ_90PY" class="lightbox">
  Open YouTube video
</button>

In both ways, the attribute data-type with the value youtube is required.

Optional attributes

  • data-controls indicates whether the video player controls are displayed: 0 do not display and 1 display controls in the player.
  • data-height set the height and data-width the width of the player. I recommend using an external library for responsive iframes.

Grouping

If you have a group of related types that you would like to combine into a set, add the data-group attribute:

<a href="path/to/image_1.jpg" class="lightbox" data-group="vacation">
  <img src="path/to/thumbnail_1.jpg" alt="I am a caption">
</a>

<a href="path/to/image_2.jpg" class="lightbox" data-group="vacation">
  <img src="path/to/thumbnail_2.jpg" alt="I am a caption">
</a>

// ...

<a href="path/to/image_4.jpg" class="lightbox" data-group="birthday">
  <img src="path/to/thumbnail_4.jpg" alt="I am a caption">
</a>

// ...

Options

You can pass an object with custom options as an argument.

const tobii = new Tobii({
  captions: false
})

The following options are available:

Property Type Default Description
selector string ".lightbox" All elements with this class triggers Tobii.
captions bool true Display captions, if available.
captionsSelector "self", "img" "img" Set the element where the caption is. Set it to "self" for the a tag itself.
captionAttribute string "alt" Get the caption from given attribute.
captionText function null Custom callback which returns the caption text for the current element. The first argument of the callback is the element. If set, captionsSelector and captionAttribute are ignored.
nav bool, "auto" "auto" Display navigation buttons. "auto" hides buttons on touch-enabled devices.
navText string ["inline svg", "inline svg"] Text or HTML for the navigation buttons.
navLabel string ["Previous", "Next"] ARIA label for screen readers.
close bool true Display close button.
closeText string "inline svg" Text or HTML for the close button.
closeLabel string "Close" ARIA label for screen readers.
loadingIndicatorLabel string "Image loading" ARIA label for screen readers.
counter bool true Display current image index.
keyboard bool true Allow keyboard navigation.
zoom bool true Display zoom icon.
zoomText string "inline svg" Text or HTML for the zoom icon.
docClose bool true Click outside to close Tobii.
swipeClose bool true Swipe up to close Tobii.
draggable bool true Use dragging and touch swiping.
threshold number 100 Touch and mouse dragging threshold (in px).
autoplayVideo bool false Videos will automatically start playing as soon as they can do so without stopping to finish loading the data.

Data attributes

You can also use data attributes to customize HTML elements.

<a href="path/to/image.jpg" class="lightbox" data-group="custom-group">
  Open image.
</a>

The following options are available:

Property Description
data-type Sets media type. Possible values: html,iframe,youtube.
data-id Required for youtube media type.
data-target Can be used to set target for "iframe" and "html" types.
data-group Set custom group
data-width Set container width for iframe or youtube types.
data-height Set container height for iframe or youtube types.
data-controls Indicates whether the video player controls are displayed: 0 do not display and 1 display controls in the player.
data-allow Allows to set allow attribute on iframes.
data-srcset Allows to have Responsive image or retina images
data-zoom Allows to enable or disable zoom icon. Values: "true" or "false"

API

Function Description
open(index) Open Tobii. Optional index (Integer), zero-based index of the slide to open.
select(index) Select a slide with index (Integer), zero-based index of the slide to select.
previous() Select the previous slide.
next() Select the next slide.
selectGroup(value) Select a group with value (string), name of the group to select.
close() Close Tobii.
add(element) Add element (DOM element).
remove(element) Remove element (DOM element).
isOpen() Check if Tobii is open.
slidesIndex() Return the current slide index.
slidesCount() Return the current number of slides.
currentGroup() Return the current group name.
reset() Reset Tobii.
destroy() Destroy Tobii.

Events

Bind events with the .on() and .off() methods.

const tobii = new Tobii()

const listener = function listener () {
  console.log('eventName happened')
}

// bind event listener
tobii.on(eventName, listener)

// unbind event listener
tobii.off(eventName, listener)
eventName Description
open Triggered after Tobii has been opened.
close Triggered after Tobii has been closed.
previous Triggered after the previous slide is selected.
next Triggered after the next slide is selected.

Browser support

Tobii supports the following browser (all the latest versions):

  • Chrome
  • Firefox
  • Internet Explorer 11
  • Edge
  • Safari

Build instructions

See Wiki > Build instructions

Contributing

  • Open an issue or a pull request to suggest changes or additions
  • Spread the word

License

Tobii is available under the MIT license. See the LICENSE file for more info.

Comments
  • Also publish on npmjs.com

    Also publish on npmjs.com

    @midzer I just noticed that we still have an alpha version on https://www.npmjs.com/package/tobii released. Any chance to update the version there as well?

    opened by ocean90 11
  • Unwanted grouping

    Unwanted grouping

    Hello! I've setup a CodePen to point out two issues I'm seeing, the first of which is unwanted grouping.

    When I have more than one lightbox element and I do not use the data-group attribute, the lightbox behaves as if I did. See it, here:

    https://codepen.io/marcamos/pen/NWxaMXQ

    opened by marcamos 8
  • Question: PreventDefault in touchmove event

    Question: PreventDefault in touchmove event

    The code contains such a line https://github.com/rqrauhvmra/tobii/blob/ac432322c09dc30eba853a17b252250ba87ed453/src/js/tobii.js#L1234 Can you find out what it is for? Because it does not provide the ability to scale with a gesture.

    question 
    opened by SinnerAir 6
  • Close button and counter float on the picture

    Close button and counter float on the picture

    Close button and counter float on the picture in mobile if the picture is stretched in height.

    22ea2ced31

    I fixed it like this:

    .tobii__slider {
        top: 5em;
    }
    
    [data-type] {
        height: 100%;
        max-height: 100%;
        display: flex;
        align-items: center;
    }
    
        [data-type] > figure {
            max-height: 100%;
        } 
    
    question 
    opened by SinnerAir 6
  • Dragging not working

    Dragging not working

    In Chrome, dragging between images is not working in version 2.3.0 (was working in 2.2.0). One can see this feature is not working by trying to drag in the Images (grouped) demo.

    opened by wongjn 5
  • zoom icon

    zoom icon

    1. Zoom icon is nice to have, but sometimes it must be disabled. Right now having button with image inside, zoom icon will appear and it will not look good.

    Solution could be checking for data-zoom="false".

    1. using inline SVG for zoom icon for each of link is bad for performance. CSS should be used. Even it is not big deal, but having this activated by default for bis site will be a problem for performance. There is good tip:

    If we need SVG(s) for backgrounds but they are < than 5k each: .bg { background: url('data:image/svg+xml;utf8,<svg ...> ... '); }

    If we need SVG(s) for backgrounds but they are > than 5k each: .bg { background: url('images/file.svg'); }

    enhancement good first issue 
    opened by viliusle 5
  • animation issue

    animation issue

    Animation on second and third gallery items works only if you wait before opening second slide. If you open gallery and try to load next and next and next item fast, there will be no animation, but it will appear for other items.

    bug 
    opened by viliusle 5
  • Doesnt work with images containing query strings

    Doesnt work with images containing query strings

    As this title the doesnt like images containing a query string (like those coming from the Shopify CDN). This was fixed on the first version of Tobi, but doesnt seem to have been carried over to Tobii.

    question 
    opened by HashandSalt 5
  • Try: Update rollup config to also provide a node/browser ESM version

    Try: Update rollup config to also provide a node/browser ESM version

    This is WIP to try a rollup config which also exports an ESM version. With the ESM version I was able to reduce the file size of a custom build via npm/webpack by ~44%.

    At the moment I'm not sure if a cjs version is needed. Going to review the config of some related projects.

    opened by ocean90 5
  • Adding/removing elements

    Adding/removing elements

    To reproduce the issue, please do the following in the fiddle: https://jsfiddle.net/s56k8aum/3/

    1. Add First Image
    2. Remove First Image
    3. Add First Image (this causes exception)

    Could you please maybe add a method similar to reset or something and call it "refresh"? Basically "refresh" would walk the DOM and refresh based on changes in the DOM.

    opened by reachcalvyn 4
  • HubSpot forms not loading with v2.3.1

    HubSpot forms not loading with v2.3.1

    Hi, I need to show HubSpot form inside a Tobii lighbox. The form rendered correctly with the release v2.2.0.

    The form type in HubSpot is "raw HTML form" and is rendered inline via JavaScript, so it's not an iframe embed.

    // code to create the HubSpot form
    
    hbspt.forms.create({
            portalId: 'xxx',
            formId: 'xxx',
          });
    

    v.2.3.0 does not render the form either. Can you please check what could have broke this with these releases. Thanks.

    opened by taksu 4
  • missing close button for inline elements in some cases

    missing close button for inline elements in some cases

    If users will open modal dialog on Inline HTML elements, close button may not be visible if matching all conditions below:

    1. at least if device is mobile android (chrome). Sadly chrome mobile emulator does not reproduce this bug !
    2. inline dialog has lots of content (scrollbar activates).

    To reproducer it:

    1. edit https://midzer.github.io/tobii/demo/ and add lots of content for "Inline HTML" section to force scrollbar to appear.
    2. open it on mobile (android, Chrome) and open "Inline HTML" modal window
    3. most of close button will not be visible .

    What happens?

    There is CSS rule .tobii__slide [data-type] with value of: max-height: var(--slide-max-height); or max-height: calc(100vh - 2.77778em). Because this element is centered, layout shifts to top and hides most of close button. But I can not understand why desktop chrome and mobile chrome renders this situation in different ways.

    Possible solution

    Replace above line to: max-width: 100%.

    p.s. more testing must be made before this can be updated.

    opened by viliusle 2
  • Support for multiple lightbox instances.

    Support for multiple lightbox instances.

    Old rqrauhvmra tobi-library worked with multiple instances. Why the support has been dropped?

    Would it be possible to add a guid to class names (or as a user defined classname as input parameter) instead of hard coded names so the lightbox would work if there are multiple instances of it.

    opened by ABackw 1
  • Missing :hover and :focus styling on prev and next buttons

    Missing :hover and :focus styling on prev and next buttons

    Hi there!

    I was just randomly checking the color contrast of the prev and next buttons. I noticed they're set to opacity: .5 and aren't being updated to opacity: 1 on :hover or :focus.

    Is this the intended behaviour or just a bug?

    Thanks!

    enhancement good first issue 
    opened by jakobhaerter 2
  • No/wrong recalculating of counter after removal of item

    No/wrong recalculating of counter after removal of item

    Hello, it seems that the counter does not recalculate after an item is removed.

    1. i add several images to the lightbox -> counter is right
    2. i remove an image -> counter is wrong (shows too much items, numbers are mixed)

    Is there any workaround or quick fix?

    Thanks in advance! Maxi

    bug 
    opened by domaxistd 5
  • Custom Properties Scoping

    Custom Properties Scoping

    Naming of tobii's custom properties interferes with local custom properties due to generalized naming like --button-background or --button-color, set on :root level. A possible solution would be to scope variables inside tobii's parent node or to prefix everything, e.g. --tb-button-background.

    Thanks!

    enhancement good first issue 
    opened by jakobhaerter 6
  • Multiple You Tube Videos

    Multiple You Tube Videos

    Hi,

    I'm assuming it is possible to include multiple You Tube videos in a gallery arrangement? At the present time if I open one You Tube video in a light box then close it the next video opens the same ID at the same time point.

    Thanks in advance.

    Chris

    opened by Evakos 3
Releases(v2.4.0)
  • v2.4.0(Jun 7, 2022)

    Changes

    • tobii.mjs -> tobii.modern.js

    Fixed

    • All CSS custom properties are now prefixed with --tobii- to avoid conflicts (e.g. --tobii-base-font-size instead of --base-font-size: 18px).

    Deprecated

    • Unprefixed forms of CSS custom properties are deprecated and will no longer be supported in the next major release. Update now by adding the --tobii- prefix to your variables:
      • Before: --base-font-size: 18px;
      • After: --tobii-base-font-size: 18px;
    Source code(tar.gz)
    Source code(zip)
  • v2.3.3(Mar 15, 2022)

  • v2.3.2(Dec 6, 2021)

  • v2.3.1(Oct 24, 2021)

    Bugfixes

    • Do not preload retina images on 1x screen devices https://github.com/midzer/tobii/issues/86 https://github.com/midzer/tobii/commit/264530e90f6a141a9f3179d53fd725a0393c8b79
    • Removed duplicated demo https://github.com/midzer/tobii/commit/d897451c8f6edbd1080dc2f3743ef1ad10687efd
    Source code(tar.gz)
    Source code(zip)
  • v2.3.0(Aug 31, 2021)

    Added

    • close event https://github.com/midzer/tobii/issues/58
    • button, background style changes https://github.com/midzer/tobii/issues/23
    • ability to select HTML links using tab, ability to select text in HTML element https://github.com/midzer/tobii/issues/28
    • data-zoom attribute https://github.com/midzer/tobii/issues/62
    • ignore duplicates https://github.com/midzer/tobii/issues/59

    Misc

    • Split into modules https://github.com/midzer/tobii/issues/1
    • proof that images with query parameters works fine https://github.com/midzer/tobii/issues/46
    • console error on multiple instances https://github.com/midzer/tobii/issues/74
    • lint update: allow for "font-weight: bold;" https://github.com/midzer/tobii/issues/76
    • lint update: allow for "color: #aabbcc" https://github.com/midzer/tobii/issues/76
    • bump dependencies https://github.com/midzer/tobii/commit/85abd4ded909c7ff3cab0595ecd993951c1b8a88

    Docs

    • Demo: valid HTML, links working even with JS disabled https://github.com/midzer/tobii/issues/63
    • README: removed broken to-do link, updated features https://github.com/midzer/tobii/commit/f07e08cfb9af248187790cddfbcfe52105f4c460
    • README: added link to build instructions https://github.com/midzer/tobii/commit/610217888f973eb493b9edb3c126e8d1c7918af8

    Bugfixes

    • Use correct script name for modern demo https://github.com/midzer/tobii/commit/782edc71b9e70b0a00053c8a1dc7e9e2783a2c1c
    • fix watch mode https://github.com/midzer/tobii/commit/eda32a0acec382a4f7a49f2f176fb891d30a71a3
    • fix for multiple inline HTML elements with same target https://github.com/midzer/tobii/issues/64
    • improved iframe size after last design update https://github.com/midzer/tobii/issues/63
    • fixed issue when loading not existing image would show spinner forever https://github.com/midzer/tobii/commit/171ecb5aa1127c343b35d28881aae37955e36100
    • animation issue fix: removing timeout https://github.com/midzer/tobii/issues/61
    • fixed ability to zoom/scale with a gesture (2 fingers) https://github.com/midzer/tobii/issues/31
    • fixed body class (must always be set), extra body class, removed hide Scrollbar https://github.com/midzer/tobii/commit/6f89e97fb48683c4042d4143d4e64baf2e918475
    • fixed slow iframes https://github.com/midzer/tobii/issues/82
    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Jun 30, 2021)

    Added

    • Vimeo support https://github.com/midzer/tobii/issues/24
    • better YouTube iframe support
    • close event https://github.com/midzer/tobii/issues/58
    • retina images support https://github.com/midzer/tobii/issues/66
    • events with data https://github.com/midzer/tobii/issues/75
    • styles for inline HTML https://github.com/midzer/tobii/issues/60
    • npm run dev-modern https://github.com/midzer/tobii/issues/72

    Misc

    • improvements for iframe
    • hide iframe until loaded

    Docs

    • way better demo https://github.com/midzer/tobii/issues/63
    • README improved (data attributes) https://github.com/midzer/tobii/issues/68

    Bugfixes

    • fixed building on Windows https://github.com/midzer/tobii/issues/72
    • fixed ignoring data-target https://github.com/midzer/tobii/issues/67
    • fixed console warning with fullscreen duplicate on iframes

    Big thanks to new contributor @viliusle !

    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Apr 27, 2021)

    • Bugfix: Restore IE11 support https://github.com/midzer/tobii/pull/55
    • Enhancement: Limit files to be included in the package -> Smaller bundle size https://github.com/midzer/tobii/pull/56
    • Documentation: Update and clarify the available JavaScript files https://github.com/midzer/tobii/pull/57
    Source code(tar.gz)
    Source code(zip)
  • 2.0.10(Apr 23, 2021)

  • 2.0.9(Apr 23, 2021)

  • 2.0.8(Apr 23, 2021)

  • 2.0.7(Apr 23, 2021)

  • v2.0.5(Feb 22, 2021)

  • v2.0.0(Feb 22, 2021)

    After a while I think it is time to let Tobii out of beta :)

    New features

    • Move to ES6
    • Create extra module and UMD builds https://github.com/midzer/tobii/commit/0e216861f0f3d06aa4c6b5dbacb1f87e621cf386
    • Local demo pages https://github.com/midzer/tobii/commit/0e216861f0f3d06aa4c6b5dbacb1f87e621cf386
    • Add captionText config to set a callback for custom caption elements https://github.com/midzer/tobii/commit/481f7c9c8f836f0b24ec694d88a8a478a1283ff4
    • Add AVIF support https://github.com/midzer/tobii/commit/be8c20a7b4c61aa150be857f9c7eca4fc11588a2

    Dropped for v2

    • Split source code into modules
    Source code(tar.gz)
    Source code(zip)
Owner
In favor of approachable and maintainable solutions. I love building JAMstack websites with SSGs like Hugo and Jekyll 🚀
null
A beautiful, responsive, highly customizable and accessible replacement for JavaScript's popup boxes. Zero dependencies.Alerts ,dialogs

AsgarAlert (v1) for JS Install <script defer src="/asgar-alert.js"></script> Examples The most basic message: asgar("Hello world!"); A message signali

Asgar Aliyev 5 Dec 20, 2022
An open-source boat display cockpit for navigation, speed, heading, and tide tables running on Raspberry Pi and accessible as a webapp through any smartphone.

An open-source boat display cockpit for navigation, speed, heading, and tide tables running on Raspberry Pi and accessible as a webapp through any smartphone

Andy 44 Dec 30, 2022
LunaSec - Open Source Security Software built by Security Engineers. Scan your dependencies for Log4Shell, or add Data Tokenization to prevent data leaks. Try our live Tokenizer demo: https://app.lunasec.dev

Our Software We're a team of Security Engineers on a mission to make awesome Open Source Application Security tooling. It all lives in this repo. Here

LunaSec 1.2k Jan 7, 2023
A minimal, pure-CSS Lightbox replacement

CSSBox A simple, pure-CSS Lightbox replacement. An example page is available in the gh-pages branch, or online on GitHub Pages. Why CSSBox? Absolutely

Sylvia van Os 48 Nov 21, 2022
Chocolat : the lightbox so cool horses use it :horse:

Chocolat Chocolat is a responsive lightbox Documentation is here Demo page is here Documentation You can access the full documentation at this page :

Nicolas Turlais 1.7k Jan 6, 2023
Reference for How to Write an Open Source JavaScript Library - https://egghead.io/series/how-to-write-an-open-source-javascript-library

Reference for How to Write an Open Source JavaScript Library The purpose of this document is to serve as a reference for: How to Write an Open Source

Sarbbottam Bandyopadhyay 175 Dec 24, 2022
An Open-Source Platform to certify open-source projects.

OC-Frontend This includes the frontend for Open-Certs. ?? After seeing so many open-source projects being monetized ?? without giving any recognition

Open Certs 15 Oct 23, 2022
Shikhar 4 Oct 9, 2022
This is a project for open source enthusiast who want to contribute to open source in this hacktoberfest 2022. 💻 🎯🚀

HACKTOBERFEST-2022-GDSC-IET-LUCKNOW Beginner-Hacktoberfest Need Your first pr for hacktoberfest 2k22 ? come on in About Participate in Hacktoberfest b

null 8 Oct 29, 2022
A prototype on how web3 technology can enable us to build an open, immutable, reproducible, and permanently accessible scientific record.

Web3 Research A prototype on how web3 technology can enable us to build an open, immutable, reproducible, and permanently accessible scientific record

manveer 0 Nov 27, 2022
Completely free TS/JS one-file source code snippets with tests, which can be copied to avoid extra dependencies (contributions welcome).

TinySource Completely free TS/JS one-file source code snippets with tests, which can be copied to avoid extra dependencies (contributions welcome). Sn

null 81 Jan 3, 2023
A recreation of a startpage posted on Reddit without the source, so I rewrote it in Next.js + Tailwind for the open source community.

Startpage "Figma Balls" Rewrite Why Did I Make This I saw a startpage posted on the subreddit r/startpages that I thought looked nice, but when I look

Thomas Leon Highbaugh 5 Mar 29, 2022
Let's participate in Hacktoberfest and contribute to open-source. Star the repo and open a PR to get accepted.

Let's Contribute To Open-source First Contributions This project aims to simplify and guide the way, beginners can make their first contribution towar

Ehmad Saeed⚡ 5 Dec 3, 2022
Interactive, accessible toggle switches for the web.

On-Off Toggle Switch Interactive, accessible toggle switches for the web Transform checkboxes into toggle switches. Toggle switches made for the web a

Timmy Willison 91 Sep 9, 2022
Listing of accessible components & patterns

Accessible Components I've built a good handful of accessible markup patterns and widgets at this point. Each is based on testing with users, UX and d

Scott O'Hara 538 Jan 3, 2023
Dynamic, fast, accessible & zero dependency accordion for React

React Fast Accordion ⚡️ Dynamic, fast, accessible & zero dependency accordion for React How it's fast? Instead of adding event listener on all the ite

Shivam 59 Oct 8, 2022
Simple, fast, accessible accordion library with no dependency

React Fast Accordion ⚡️ Dynamic, fast, accessible & zero dependency accordion for React How it's fast? Instead of adding event listener on all the ite

Shivam 59 Oct 8, 2022
A library of high-quality primitives that help you build accessible user interfaces with SolidJS.

Solid Aria A library of high-quality primitives that help you build accessible user interfaces with SolidJS. Primitives @solid-aria/primitives - Expor

SolidJS Community 205 Jan 7, 2023