npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@teamthunderfoot/modal

v0.0.2

Published

Modal package

Downloads

8

Readme

Modal

An npm package that provides a Modal class to manage modals in your application.

Here's an example

Installation

npm install @teamthunderfoot/modal

Usage

import Modal from "@teamthunderfoot/modal";

class Page {
  constructor() {
    this.init();
    this.events();
  }

  init() {

    const modal = new Modal({
        backdrop: 'c--modal-backdrop-a', // class of the backdrop
        backdropActiveClass: 'c--modal-backdrop-a--is-active', // active class of the backdrop
        element: document.querySelector(".c--modal-a")
        elementClass: 'c--modal-a', // class of the modal
        modalIdTarget: 'modal-1', // ID of the modal
        modalActiveClass: 'c--modal-a--is-active', // active class of the modal
        onHide: () => {
            // do something when the modal closes
        },
        onShow: () => {
            // do something when the modal pops up
        }
    });
  }

  events() {
  }
}

export default Page;

new Page();

You can also use the functions show() and hide() to use them at your convenience.

modal.show();
modal.hide()

Usage for Nuxt

1 - Create a file Modal.js inside the plugins folder & add this.

import Modal from "@teamthunderfoot/modal";

export default ({ app }, inject) => {
    inject('Modal', () => new Modal({
        backdrop: 'c--modal-backdrop-a', // class of the backdrop
        backdropActiveClass: 'c--modal-backdrop-a--is-active', // active class of the backdrop
        element: document.querySelector(".c--modal-a")
        elementClass: 'c--modal-a', // class of the modal
        modalIdTarget: 'modal-1', // ID of the modal
        modalActiveClass: 'c--modal-a--is-active', // active class of the modal
        onHide: () => {
            // do something when the modal closes
        },
        onShow: () => {
            // do something when the modal pops up
        }
    }));
};

2 - Reference it in your nuxt.config.js

plugins: [
    { src: '~/plugins/Modal.js', ssr: false }
]

3- In your Page.vue

async mounted() {
    setTimeout(() => {
        this.$Modal();
    }, 200)
}

In your HTML file, add the necessary elements for the modal. The modal should have a specific structure that includes a backdrop and the modal content.

  • Modal: The modal element should have:

    • A unique ID. Example: id="modal-1".
    • A class for the modal. Example: class="c--modal-a".
    • Modal content inside the modal element.
  • Button to open: The button element should have an attribute that references the ID of the modal it is interacting with. Example: tf-ds-modal-target="modal-1".

  • Button to close: The button element should have an attribute that references the ID of the modal it is interacting with. Example: tf-ds-modal-close="modal-1".

HTML

<button type="button" class="c--btn-a" tf-ds-modal-target="modal-1">
    Launch demo modal
</button>
<div id="modal-1" class="c--modal-a" role="dialog">
    <h3 class="f--font-third">Welcome to a super modal</h3>
    <img src="https://www.turn-keytechnologies.com/wp-content/uploads/2020/02/aruba-mobility-master.png" alt="">
    <p class="">Lorem ipsum, dolor sit amet consectetur adipisicing elit.</p>
    <button class="c--modal-a__btn" tf-ds-modal-close="modal-1" aria-label="Close">
        <svg class="c--modal-a__btn__icon apb apb-close" viewBox="0 0 15.81 15.81" enable-background="new 0 0 15.81 15.81" xml:space="preserve">
            <path d="M8.74,8.03l6.82,6.82l-0.71,0.71L8.03,8.74l-7.07,7.07L0.25,15.1l7.07-7.07L0,0.71L0.71,0l7.32,7.32l7.07-7.07l0.71,0.71L8.74,8.03z"/>
        </svg>
    </button>
</div>

CSS Styles

.c--modal-a {
    opacity: 0;
    visibility: hidden;
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 1000;
    transition: all 0.3s ease-in-out;
    width: 60%;
    background-color: #78f2c5;
    padding: 2rem;
    transition: transform 0.3s 0s ease;
}

.c--modal-a__btn {
    position: absolute;
    top: 2rem;
    right: 2rem;
    color: #1a191d;
}

.c--modal-a__btn__icon {
    color: #1a191d;
    height: 1rem;
}

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
    .c--modal-a__btn__icon {
        width: 1rem;
    }
}

.c--modal-a__btn__icon path {
    fill: #1a191d;
}
.c--modal-a--is-active {
    visibility: visible;
    opacity: 1;
}

.c--modal-backdrop-a {
    visibility: visible;
    opacity: 1;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100vh;
    z-index: 100;
    background-color: rgba(26, 25, 29, 0.7);
    transform: translate(0px, 100%);
    transition: transform 0.3s 0s ease;
}

.c--modal-backdrop-a--is-active {
    transform: translate(0px, 0%);
}

Customization

You can customize the CSS classes used by the modal package to match your project's styles and structure. Modify the class names in both the JavaScript and HTML sections accordingly.

Options

backdrop: Specifies the CSS class for the modal backdrop.

backdropActiveClass: Specifies the CSS class to indicate that the modal backdrop is active.

element: Specifies the element for the modal itself.

elementClass: Specifies the CSS class for the modal itself.

modalIdTarget: Specifies the ID of the modal HTML element.

modalActiveClass: Specifies the CSS class to indicate that the modal is active.

onHide: Optional function to be executed when the modal is hidden.

onShow: Optional function to be executed when the modal is shown.

Destroy

Destroys the Modal instance by removing event listeners and resetting the state. This method should be called when you want to completely

const modal = new Modal(options);
modal.destroy();

More than one modal

If you have two or more modals, you can instantiate the JS class in the following way:

import Modal from "@teamthunderfoot/modal";

class Page {
  constructor() {
    this.modal = [];

    this.init()
  }

  init() {

    document.querySelectorAll(".c--modal-a").forEach((element, index) => {
        this.modal[index] = new Modal({
            backdrop: "c--modal-backdrop-a",
            backdropActiveClass: "c--modal-backdrop-a--is-active",
            element: element,
            elementClass : "c--modal-a",
            modalIdTarget: element.getAttribute("id"),
            modalActiveClass: "c--modal-a--is-active",
            onHide: () => {
                //do something
            },
            onShow: () => {
                //do something
            },
        })
    });

    document.querySelector(".js--destroy-modal").addEventListener("click", (e) => {
        e.preventDefault();
        this.destroy()
    })
  }

  events() {
  }

  destroy(){
        document.querySelectorAll(".c--modal-a").forEach((element, index) => {
            this.modal[index].destroy();
        });
    }
}

export default Page;

new Page();