An interactive guide for web page elements using jQuery and CSS3

Overview

pageguide.js

An interactive, responsive, and smart guide for web page elements using jQuery and CSS3. Works great for dynamic pages and single-page apps as well as static pages. Check it out IRL at http://tracelytics.github.com/pageguide!

Build Status

Table of Contents

Quick Start

Three quick start options are available:

  • Download the latest release
  • Clone the repo: git clone https://github.com/tracelytics/pageguide.git
  • Install with Bower: bower install pageguide

Pageguide comes with an example implementation (the files are in /example) which you can run locally with Grunt. Assuming you have a working copy of npm installed on your machine, open up a terminal, navigate to the root pageguide directory, and run:

$ npm install
$ grunt server

Then navigate to http://localhost:3000/example/ in your browser.

Read the Getting Started page for information on the framework contents and more.

How-To:

  1. Add references in your code to jQuery, pageguide.min.js & pageguide.min.css
  2. Add a single pageguide init() call within a document.ready callback.
  3. Add a simple <ul> to the bottom of the pages you want the pageguide to appear on.
  4. Customize the page guide tour title.
  5. (Optional) Add a welcome message to display to your users on page load.

An Example:

Step 1 - Add pageguide js

Add <script src="{YOUR_PATH}/pageguide.min.js"></script> to the bottom of your html document, right before your closing </body> tag.

Minified js is located in /dist/js/ (the source file is in /js/).

Step 2 - Add pageguide.css

Add <link rel="stylesheet" href="{YOUR_PATH}/pageguide.css"> to the header of your html document.

Minified css can be found in /dist/css/. Source LESS file is in /less/.

Step 3 - Add setup code

Add the following block of JavaScript to your html document:

$(document).ready(function() {
    tl.pg.init({ /* optional preferences go here */ });
});

Step 4 - Choose the elements that you want included in the page guide.

pageguide.js matches the first occurrence of the selector you specify in the <ul> you put on your pages in the next step.

Step 5 - Add the pageguide.js <ul> near the bottom of your pages.

The data-tourtarget attribute for each <li> should contain the selector for the element you wish to target with this step. Optional: use the classes tlypageguide_left, tlypageguide_right, tlypageguide_top, or tlypageguide_bottom to position the step indices.

    <ul id="tlyPageGuide" data-tourtitle="REPLACE THIS WITH A TITLE">
      <li class="tlypageguide_left" data-tourtarget=".first_element_to_target">
        <div>
          Here is the first item description. The number will appear to the left of the element.
        </div>
      </li>
      <li class="tlypageguide_right" data-tourtarget="#second_element_to_target">
        <div>
          Here is the second item description. The number will appear to the right of the element.
        </div>
      </li>
      <li class="tlypageguide_top" data-tourtarget=".third_element_to_target > div.is_here">
        <div>
          Here is the third item description. The number will appear above the element.
        </div>
      </li>
      <li class="tlypageguide_bottom" data-tourtarget="#fourth_element_to_target">
        <div>
          Here is the fourth item description. The number will appear below the element.
        </div>
      </li>
    </ul>

Step 6 (optional) - Add .tlyPageGuideWelcome near the bottom of your page.

    <div class="tlyPageGuideWelcome">
        <p>Here's a snappy modal to welcome you to my new page! pageguide is here to help you learn more.</p>
        <p>
            This button will launch pageguide:
            <button class="tlypageguide_start">let's go</button>
        </p>
        <p>
            This button will close the modal without doing anything:
            <button class="tlypageguide_ignore">not now</button>
        </p>
        <p>
            This button will close the modal and prevent it from being opened again:
            <button class="tlypageguide_dismiss">got it, thanks</button>
        </p>
    </div>

This element will display as an introductory welcome modal to your users when they visit your page. There are three elements you can include inside .tlyPageGuideWelcome to let users control its behavior:

  • .tlypageguide_start (required): Closes the welcome modal and launches pageguide.
  • .tlypageguide_ignore (optional): Simply closes the welcome modal.
  • .tlypageguide_dismiss (optional): Closes the welcome modal and never shows it again.

By default, the modal will continue to launch on page load until a user either a) launches pageguide, or b) dismisses the message by clicking .tlypageguide_dismiss. User preference for a particular URL is stored in localStorage with a cookie fallback.

Options

Pageguide can take a hash of options in init(). All are optional.

Option Type Default What it do
auto_show_first boolean true Whether or not to focus on the first visible item immediately on PG open
loading_selector selector '#loading' The CSS selector for the loading element. pageguide will wait until this element is no longer visible before starting up.
track_events_cb function noop Optional callback for tracking user interactions with pageguide. Should be a method taking a single parameter indicating the name of the interaction. (default none)
handle_doc_switch function null Optional callback to enlight or adapt interface depending on current documented element. Should be a function taking 2 parameters, current and previous data-tourtarget selectors. (default null)
custom_open_button selector null Optional id for toggling pageguide. Default null. If not specified then the default button is used.
pg_caption string 'page guide' Optional - sets the visible caption
dismiss_welcome function (see source) Optional function to permanently dismiss the welcome message, corresponding to check_welcome_dismissed. Default: sets a localStorage or cookie value for the (hashed) current URL to indicate the welcome message has been dismissed, corresponds to default check_welcome_dismissed function.
check_welcome_dismissed function (see source) Optional function to check whether or not the welcome message has been dismissed. Must return true or false. This function should check against whatever state change is made in dismiss_welcome. Default: checks whether a localStorage or cookie value has been set for the (hashed) current URL, corresponds to default dismiss_welcome function.
ready_callback function null A function to run once the pageguide ready event fires.
pointer_fallback boolean true Specify whether or not to provide a fallback for css pointer-events in browsers that do not support it.
default_zindex number 100 The css z-index to apply to the tlypageguide_shadow overlay elements
steps_element selector '#tlyPageGuide' Selector for the ul element whose steps you wish to use in this particular pageguide object
auto_refresh boolean false If set to true, pageguide will run a timer to constantly monitor the DOM for changes in the target elements and adjust the pageguide display (bubbles, overlays, etc) accordingly. The timer will only run while pageguide is open. Useful for single-page or heavily dynamic apps where pageguide steps or visible DOM elements can change often.
welcome_refresh boolean false Similar to auto_refresh, welcome_refresh enables a timer to monitor the DOM for new .tlyPageGuideWelcome elements. This is useful if your welcome element isn't loaded immediately, or if you want to show different welcome elements on different pages. The timer will run constantly, whether or not the pageguide is open, so enable at your discretion.
refresh_interval number 500 If auto_refresh or welcome_refresh is enabled, refresh_interval indicates in ms how often to poll the DOM for changes.

Requirements

  • jQuery 1.7 - 2.0

Tested In:

  • OSX
    • Chrome 26
    • Firefox 20
    • Safari 6.0.4

Contribute

Bugfix? Cool new feature? Alternate style? Send us a pull request!

Below are some instructions for developing with pageguide.js:

  1. Make sure Node.js is installed. We recommend you use NVM.

  2. Clone pageguide.js

    $ git clone [email protected]:tracelytics/pageguide.git
    $ cd pageguide
  3. We use Grunt to develop, test, and compile pageguide.js into /dist:

    $ cd pageguide
    $ npm install -g grunt-cli
    $ npm install
    $ grunt
  4. Create a feature branch and make some code changes

  5. Add unit tests (in /js/test/unit) and ensure your tests pass by running grunt.

  6. Send us a detailed pull request explaining your changes.

License

Copyright (c) 2013 Tracelytics, AppNeta

Pageguide is freely redistributable under the MIT License. See LICENSE for details.

Comments
  • Idempotence

    Idempotence

    On one-page applications, depending on the context in which it's set up, pageguide may be run multiple times on the same page. This can cause major issues with conflicting event handlers, multiple ready() timers, repeated (or lost) DOM elements, etc.

    Ideally, pageguide should always init() in a clean state, without having to worry about conflicting with existing handlers or elements. I already added a bit of support for this in 6841ead, removing any existing #tlyPageGuideWrapper elements, but it really needs to be taken a step further:

    • [x] Before creating any DOM elements, check for previously created ones and remove them
    • [x] Unbind any outstanding handlers before re-binding them
    • [x] Add a destroy method
    • [ ] Consider storing the pageguide object in the global scope inside tl.pg, so the object itself can be deleted safely before creating a new one*
    • [x] Handle new pageguide-related elements (#tlyPageGuide, #tlyPageGuideWelcome) gracefully -- persist them if necessary, but if new ones are detected on the page, use those instead

    I have done significant work on this in Traceview's copy of pageguide, which I can port over to this repo.

    * Is there ever a case where multiple pageguide objects on a single page are desirable? I don't think there is, but am happy to accommodate if anyone has a good argument for allowing it.

    enhancement 
    opened by arizzitano 11
  • Tests v1 and misc. cleanup

    Tests v1 and misc. cleanup

    This PR adds some primarily functional tests to pageguide, using the markup within the example page. These are certainly not exhaustive but they cover most of its basic use cases (opening/closing, navigating through steps, interacting with the welcome message, etc.). Due to pageguide's asynchronous nature, I had to write a few helper functions to delay test execution, but they still resemble basic QUnit tests for the most part.

    I wanted to hold off on writing too many small, specific unit tests for now, since I intend to overhaul pageguide significantly in fixing #28. However, most of this work will be done under the hood, so it will still behave like the pageguide we all know and love (thus, the functional tests, to facilitate further development).

    In addition to the new tests, it also adds a few things to pageguide.js:

    • Wrap entire body in closure and use $ for jQuery
    • Add ready_callback to the tl.pg.init options, allowing a callback to run on pg.ready(). This is primarily useful for running async tests, but could also help users trigger other actions once pageguide is ready.
    • Define markup for the guide and toggle within contiguous blocks before appending to the DOM. This makes this markup much easier to read, understand, and edit.
    • Add tl.pg.destroy() method, to remove all pageguide-associated DOM elements.
    • Automatically wrap #tlyPageGuide step text within container divs to cut down on the amount of markup required for the user to include.
    • Class the ins elements appended for step indices for easy reference and removal
    • Replace all contextual selections with find(), for performance reasons
    opened by arizzitano 5
  • Reserved word use

    Reserved word use

    Hi,

    I use closure compiler to minify my js files. When compressing pageguide, i get some errors because you seems to make use of reserved js words, which is against the standard.

    A simple variable rename should fix it.

    Here are the involved lines:

    line 251 the "str" word : tl.pg.hashCode = function (str) line 256 also "str" word: for (i = 0; i < str.length; i++) line 257 "str": char = str.charCodeAt(i);

    Thanks !

    bug 
    opened by moimael 4
  • Page guide welcome modal displayed before events are bound

    Page guide welcome modal displayed before events are bound

    cc: @arizzitano

    While doing some experimentation with pageguide, I noticed the following in the tl.pg.init function:

    https://github.com/tracelytics/pageguide/blob/master/js/pageguide.js#L127-L134

    We are displaying the welcome modal before we bind events. Since the event handlers don't get setup until the callback to pg.ready fires (which can take several seconds), this can result in a user clicking on the welcome modal buttons, without any effect.

    Thus, I see 3 possible solutions to this problem:

    1. Show welcome modal when pageguide is ready (delayed)

    pg.ready(function() {
        pg.setup_handlers();
        pg.$base.children(".tlypageguide_toggle").animate({ "right": "-120px" }, 250);
    
        if (pg.preferences.show_welcome) {
            pg.pop_welcome();
        }
    });
    

    2. Show welcome modal immediately

    pg.ready(function() {
        pg.$base.children(".tlypageguide_toggle").animate({ "right": "-120px" }, 250);
    });
    
    pg.setup_handlers();
    if (pg.preferences.show_welcome) {
        pg.pop_welcome();
    }
    

    This approach sets up event binding before pageguide is ready, so I'm not sure if this will break anything.

    3. Isolate welcome modal event handlers

    // New method for setting up only the event handlers for the welcome modal.
    tl.pg.PageGuide.prototype.setup_welcome_handlers = function () {
        ...
    }
    
    pg.ready(function() {
        pg.setup_handlers();
        pg.$base.children(".tlypageguide_toggle").animate({ "right": "-120px" }, 250);
    });
    
    if (pg.preferences.show_welcome) {
        pg.setup_welcome_handlers();
        pg.pop_welcome();
    }
    

    Assuming that the pg.setup_handlers(); needs to be called in the pg.ready callback, I think option 3 is the best choice.

    Thoughts?

    bug enhancement question 
    opened by danriti 4
  • New trigger on documented element display

    New trigger on documented element display

    In my case, I have kind of accordion menus, I would like a trigger a bit like your tracking trigger but called when a new doc string is displayed with "data-tourtarget" value as arg. (eventually from the closed doc too).

    This would allow me to open, close correspondents menus and to display/hide panels accordingly.

    I sound easy to implement and may be helpfull for other persons than me, ask me if you want me to do it or if you prefer do it yourself/do not pull that kind of stuff.

    enhancement 
    opened by Christophe31 4
  • Support for fixed targets

    Support for fixed targets

    This patch improve the guide's behaviour with fixed elements. If the target element has the data attribute 'position' assigned to 'fixed', the position of the arrow is calculated considering the top of the window.

    opened by hginer 3
  • Remove AppNeta logo from pages site

    Remove AppNeta logo from pages site

    Hey @dkuebric do you mind removing the AppNeta logo from the pageguide site ? We've gotten inquiries on our appneta.com live chat about whether or not we are still maintaining it. You could also remove AppNeta from the license.

    Thanks!

    opened by apinkham 2
  • Simple change to support fixed elements

    Simple change to support fixed elements

    I updated my addSteps function to support fixed elements

      tl.pg.PageGuide.prototype.addSteps = function () {
        var self = this;
        self.$steps.find('li').each(function (i, el) {
          var $el = $(el);
          var tourTarget = $el.data('tourtarget');
          var positionClass = $el.attr('class');
          var style = '';
          if (self.targetData[tourTarget] == null) {
            self.targetData[tourTarget] = {
              targetStyle: {},
              content: $el.html()
            };
            var hashCode = tl.pg.hashCode(tourTarget) + '';
            self.hashTable[hashCode] = tourTarget;
    
            function isFixed(ele, posType) {
              posType = posType || "fixed";
              if (ele.prop("tagName") === 'HTML') {
                return false;
              }
              return (ele.css("position") !== posType) ? isFixed(ele.offsetParent()): posType;
            }
    
            if (isFixed($(tourTarget))) {
    
              style = 'position:fixed;';
    
            }
    
            self.$content.append(
              '<div class="tlypageguide_shadow tlypageguide_shadow' + hashCode +
              '" data-selectorhash="' + hashCode + '" style="' + style + '">' +
              '<span class="tlyPageGuideStepIndex ' + positionClass + '"></span>' +
              '</div>'
            );
          }
        });
      };
    

    might be useful to others

    magic happens here

    function isFixed(ele, posType) {
      posType = posType || "fixed";
      if (ele.prop("tagName") === 'HTML') {
        return false;
      }
      return (ele.css("position") !== posType) ? isFixed(ele.offsetParent()): posType;
    }
    
    if (isFixed($(tourTarget))) {
    
      style = 'position:fixed;';
    
    }
    
    opened by austinrivas 2
  • Element positioned under #tlyPageGuideMessages does not scroll up into view

    Element positioned under #tlyPageGuideMessages does not scroll up into view

    When an element is positioned under the messages overlay at the bottom of the screen, the detection mechanism is flawed and the element will not scroll into view. For example, in my case (using Chrome 42.0.2311.39 beta (64-bit)) in the method tl.pg.isScrolledIntoView the values are :

    dvtop 0 dvbtm 1115 eltop 996 elbtm 1008

    The messages div is 100px in height, but also has 10px of padding on all sides. The check in the method determines if the bottom of the element is below the top of the viewport, and if the top of the element is above 100px from the bottom of the viewporrt.

    There are 2 problems with the check.

    1. It should check if top the element is below the top of the viewport.
    2. It should check if the bottom of the element is above the top of the #tlyPageGuideMessages div with padding.

    Below is a diff against 1.3.1 which solves the issue. (Forgive my github knowledge - if there is a more appropriate way to provide the diff, let me know and I will try to accomodate.) This change reorders the animation of the messages box with the animation of the element scrolling into view, so that we can make use of .outerHeight() for the collision check.

    @@ -266,13 +266,13 @@ tl.pg.interval = {}; * currently scrolled viewport. * elem (string): selector for the element in question **/

    • tl.pg.isScrolledIntoView = function(elem) {

    • tl.pg.isScrolledIntoView = function(elem, height) { var dvtop = $(window).scrollTop(), dvbtm = dvtop + $(window).height(), eltop = $(elem).offset().top, elbtm = eltop + $(elem).height();

    •    return (elbtm >= dvtop) && (eltop <= dvbtm - 100);
      
    •    return (eltop >= dvtop) && (elbtm <= dvbtm - height);
      

      };

      /** @@ -533,10 +533,10 @@ tl.pg.interval = {}; height = $(window).height()/2; }

    •        if (!tl.pg.isScrolledIntoView($(targetKey))) {
      
    •        this.$message.show().animate({'height': height}, 500);
      
    •        if (!tl.pg.isScrolledIntoView($(targetKey), this.$message.outerHeight())) {
               $('html,body').animate({scrollTop: target.targetStyle.top - 50}, 500);
           }
      
    •        this.$message.show().animate({'height': height}, 500);
           this.roll_number(this.$message.find('span'), target.index);
       }
      

      };

    opened by fatboyfitz 2
  • Requirements

    Requirements

    It would be great if the requirements were included in the readme file (jquery & jquery ui, etc...)

    I am trying to use this on a drupal 7 install and it doesn't seem to be working I think it might be a jquery version issue...

    opened by ghost 2
  • Number rolling behavior inaccurate

    Number rolling behavior inaccurate

    Currently, when you switch to a new item in the pageguide (using the previous and next buttons, or by jumping to an item by clicking the element on the host page), the number first changes to the updated value and then rolls over.

    The expected behavior is for the previous item number to roll out of view, and have the new item roll into view.

    bug 
    opened by seliopou 2
  • Writing PageGuide into div

    Writing PageGuide into div

    I have an app where the content is being written into a div and the elements I want to highlight are in that div. PageGuide writes everything into the body. How can I have it write it into the div with the content so it will all scroll well and such?

    opened by TedLQvine 0
  • Example code failing on startup unit tests

    Example code failing on startup unit tests

    Hello, I cloned the project and followed the instructions, but when I do a grunt server I get the following error:

    $ grunt server Running "clean:dist" (clean) task

    Running "jshint:gruntfile" (jshint) task

    1 file lint free.

    Running "jshint:src" (jshint) task

    1 file lint free.

    Running "jshint:test" (jshint) task

    1 file lint free.

    Running "qunit:files" (qunit) task Testing js/tests/index.html .........................OK Fatal error: Callback must be a function. Received undefined

    Here are the versions of node and grunt I'm using: $ node -v v14.16.0

    $ grunt -version grunt-cli v1.4.2 grunt v0.4.5

    opened by peterkva 0
  • tlyPageGuideToggles element prevents mouse events from hitting elements under it

    tlyPageGuideToggles element prevents mouse events from hitting elements under it

    If you have any clickable content underneath where the page guide expands, you won't get a pointer cursor and you can't click it.

    The tlyPageGuideToggles element needs a pointer-events: none style, and its children of class tlypageguide_toggle need it set back to auto.

    opened by clawfrank 0
  • Support for steps with no selector

    Support for steps with no selector

    It'd be nice to have a step that doesn't point to any particular element, for including support URLs and general comments.

    <ul ...>
      <li data-tourtarget="#mylastelement">
        <p>Finally, this is where ...</p>
      </li>
      <li>
        <p>That wraps it up. Having any trouble? Contact us at ...</p>
      </li>
    </ul>
    

    You can technically do this already by pointing to the body, but it puts an overlay over everything, which isn't desirable.

    opened by clawfrank 1
  • Dismiss cookie should ignore url parameters

    Dismiss cookie should ignore url parameters

    tl.pg.hashUrl = function () { return tl.pg.hashCode(window.location.href); };

    Should probably be

    tl.pg.hashUrl = function () { return tl.pg.hashCode(window.location.hostname + window.location.pathname); };

    opened by jseger 0
Releases(1.3.2)
  • 1.3.2(Mar 22, 2015)

    Fixes a number of minor bugs, including:

    • isScrolledIntoView not accounting for messages div (#50, #51) from @fatboyfitz
    • Closing any other open guides on a page (#48)
    • handle_doc_switch regression (#43)
    • Don't preventDefault on interactor click event, style tweaks, and first visible instance bugfix from @caseprince
    Source code(tar.gz)
    Source code(zip)
  • 1.3.1(Jun 27, 2014)

  • 1.3.0(Mar 18, 2014)

    This release adds significant new functionality, including auto-updating, easily removable overlay elements, support for multiple pageguides, and performance improvements. See #28 for further details & benchmarks.

    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Jan 31, 2014)

  • 1.1.0(Jan 3, 2014)

  • 1.0.0(Dec 18, 2013)

    Pageguide will now be using semver for releasing future updates to the library. This is required for use with Bower.

    Thus, we will be following the semver guidelines for versioning and packaging all our future releases.

    Source code(tar.gz)
    Source code(zip)
Owner
Tracelytics
The team that builds TraceView
Tracelytics
Guide your users through a tour of your app

Shepherd is maintained by Ship Shape. Contact us for web app consulting, development, and training for your project. Browsers support Edge Firefox Chr

Ship Shape 10.8k Dec 28, 2022
:flashlight: Set a spotlight focus on DOM element adding a overlay layer to the rest of the page

Focusable An awesome and lightweight library for performing spotlight in your DOM elements, setting an animated overlay to the rest of the page. You c

Hector Zarco 1.1k Dec 7, 2022
A light-weight, no-dependency, vanilla JavaScript engine to drive the user's focus across the page

Driver.js Powerful, highly customizable vanilla JavaScript engine to drive the user's focus across the page No external dependencies, supports all maj

Kamran Ahmed 14.3k Jan 4, 2023
jQuery feature tour plugin.

Joyride Joyride is an easy to configure site tour wizard for Foundation for Sites. Demo You can try out Joyride on the Demo Page. Installation To inst

zurb 1.4k Dec 8, 2022
Quick and easy product tours with Twitter Bootstrap Popovers

Bootstrap Tour Quick and easy way to build your product tours with Bootstrap Popovers. Compatible with Bootstrap >= 2.3.0 Demo and Documentation http:

Ulrich Sossou 4.4k Dec 23, 2022
Create a deep copy of a set of matched elements with the dynamic state of all form elements copied to the cloned elements.

jq-deepest-copy FUNCTION: Create a deep copy of a set of matched elements while preserving the dynamic state of any matched form elements. Example Use

Michael Coughlin 5 Oct 28, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
A simple guide to HTML elements

?? HEAD A simple guide to HTML <head> elements Table of Contents Recommended Minimum Elements Meta Link Icons Social Facebook Open Graph Twitter Card

Josh Buchea 29.5k Jan 1, 2023
Responsive, interactive and more accessible HTML5 canvas elements. Scrawl-canvas is a JavaScript library designed to make using the HTML5 canvas element a bit easier, and a bit more fun!

Scrawl-canvas Library Version: 8.5.2 - 11 Mar 2021 Scrawl-canvas website: scrawl-v8.rikweb.org.uk. Do you want to contribute? I've been developing thi

Rik Roots 227 Dec 31, 2022
ProgressJs is a JavaScript and CSS3 library which help developers to create and manage progress bar for every objects on the page.

ProgressJS ProgressJs is a JavaScript and CSS3 library which helps developers create and manage progress bars for every object on the page. How To Use

usablica 2.4k Dec 30, 2022
Custom Elements Manifest is a file format that describes custom elements in your project.

@custom-elements-manifest Custom Elements Manifest is a file format that describes custom elements. This format will allow tooling and IDEs to give ri

open-wc 131 Dec 15, 2022
Vue-cursor-fx - 🖱 An animated custom cursor effects for interactive elements like navigation - w/ VueJS - SSR Compatible

?? Vue Cursor Fx An animated custom cursor effects for interactive elements like navigation - w/ VueJS - SSR Compatible Installation This package is a

Luca Iaconelli 56 Aug 18, 2022
curtains.js is a lightweight vanilla WebGL javascript library that turns HTML DOM elements into interactive textured planes.

What is it ? Shaders are the new front-end web developpment big thing, with the ability to create very powerful 3D interactions and animations. A lot

Martin Laxenaire 1.4k Jan 1, 2023
The missing CLI for beautiful, interactive API docs powered by with Stoplight Elements

Elements CLI The missing CLI for beautiful, interactive API docs powered by with Stoplight Elements Installation Install using npm as global package:

skriptfabrik GmbH 6 Nov 22, 2022
The awesomebooks project is a simple list, but separated into 3 parts and given a retro feel. The main page is where we can add books, and on another page we can see the list, and remove items. There is also a "contact-us" page.

Awesome Books This is the restructured version of the famous awesome-books project! Here you can find JavaScript broken into modules, using import-exp

Matt Gombos 12 Nov 15, 2022
Super-smooth CSS3 transformations and transitions for jQuery

jQuery Transit Super-smooth CSS3 transformations and transitions for jQuery jQuery Transit is a plugin for to help you do CSS transformations and tran

Rico Sta. Cruz 7.4k Dec 23, 2022
A jquery plugin for CSS3 text animations.

Textillate.js v0.4.1 See a live demo here. Textillate.js combines some awesome libraries to provide an easy-to-use plugin for applying CSS3 animations

Jordan Schroter 3.6k Jan 2, 2023
Responsive, CSS3, touch-enabled jQuery Coverflow plugin.

jQuery.Flipster Flipster is a CSS3 3D transform-based jQuery plugin built to replicate the familiar 'cover flow' effect, but also supports a variety o

Adrien Delessert 704 Dec 28, 2022