JavaScript image gallery for mobile and desktop, modular, framework independent

Overview

Stand With Ukraine

PhotoSwipe v5 — JavaScript image gallery and lightbox

Demo | Documentation

Sponsor via OpenCollective Follow on Twitter

Repo structure

  • dist/ - main JS and CSS
  • src/ - source JS and CSS.
    • src/js/photoswipe.js - entry for PhotoSwipe Core.
    • src/js/lightbox/lightbox.js - entry for PhotoSwipe Lightbox.
  • docs/ - documentation markdown files.
  • demo-docs-website/ - website with documentation, demos and manual tests.
  • build/ - rollup build config.

To build JS and CSS in dist/ directory, run npm run build.

To run the demo website and automatically rebuild files during development, run npm install in demo-docs-website/ and npm run watch in the root directory.

Older versions

Documentation for the old version (v4) can be found here and the code for 4.1.3 is here.

Comments
  • Video support

    Video support

    Now that is v4.0, have you got any plan on introducing it? I remember that old versions was not doing it. I was hoping that now that you're managing it maybe it could be introduced. See http://brutaldesign.github.io/swipebox/ for an example.

    Thanks in advance :)

    P.S.: if you need some inputs or user-cases feel free to ask them, since I've already patched swipebox to support a better embedding of video URLs :)

    Feature Request 
    opened by julianxhokaxhiu 46
  • Responsive Example ?

    Responsive Example ?

    Using the JS from this CodePen http://codepen.io/dimsemenov/pen/ZYbPJM and am trying to add responsive images as functionality to it but I do not know how to do that.

    Can I simply replace:

                // create slide object
                item = {
                    src: linkEl.getAttribute('href'),
                    w: parseInt(size[0], 10),
                    h: parseInt(size[1], 10)
                };
    

    with

    var items = [
    
        // Slide 1
        {
            mediumImage: {
                src: 'path/to/medium-image-1.jpg',
                w:800,
                h:600
            },
            originalImage: {
                src: 'path/to/large-image-1.jpg',
                w: 1400,
                h: 1050
            }
        },
    
        // Slide 2
        // {
        //     mediumImage: {
        //         src: 'path/to/medium-image-2.jpg',
        //         ...
        //     
        // ...
    
    ];
    

    and then add

    // create variable that will store real size of viewport
    var realViewportWidth,
        useLargeImages = false,
        firstResize = true,
        imageSrcWillChange;
    
    // beforeResize event fires each time size of gallery viewport updates
    gallery.listen('beforeResize', function() {
        // gallery.viewportSize.x - width of PhotoSwipe viewport
        // gallery.viewportSize.y - height of PhotoSwipe viewport
        // window.devicePixelRatio - ratio between physical pixels and device independent pixels (Number)
        //                          1 (regular display), 2 (@2x, retina) ...
    
    
        // calculate real pixels when size changes
        realViewportWidth = gallery.viewportSize.x * window.devicePixelRatio;
    
        // Code below is needed if you want image to switch dynamically on window.resize
    
        // Find out if current images need to be changed
        if(useLargeImages && realViewportWidth < 1000) {
            useLargeImages = false;
            imageSrcWillChange = true;
        } else if(!useLargeImages && realViewportWidth >= 1000) {
            useLargeImages = true;
            imageSrcWillChange = true;
        }
    
        // Invalidate items only when source is changed and when it's not the first update
        if(imageSrcWillChange && !firstResize) {
            // invalidateCurrItems sets a flag on slides that are in DOM,
            // which will force update of content (image) on window.resize.
            gallery.invalidateCurrItems();
        }
    
        if(firstResize) {
            firstResize = false;
        }
    
        imageSrcWillChange = false;
    
    });
    
    
    // gettingData event fires each time PhotoSwipe retrieves image source & size
    gallery.listen('gettingData', function(index, item) {
    
        // Set image source & size based on real viewport width
        if( useLargeImages ) {
            item.src = item.originalImage.src;
            item.w = item.originalImage.w;
            item.h = item.originalImage.h;
        } else {
            item.src = item.mediumImage.src;
            item.w = item.mediumImage.w;
            item.h = item.mediumImage.h;
        }
    
        // It doesn't really matter what will you do here, 
        // as long as item.src, item.w and item.h have valid values.
        // 
        // Just avoid http requests in this listener, as it fires quite often
    
    });
    
    
    // Note that init() method is called after gettingData event is bound
    gallery.init();
    

    in between

            // Pass data to PhotoSwipe and initialize it
            gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
    
            // insert responsive image code here 
            gallery.init();
    

    ?

    I have looked at the index.html from the website folder of this repo and loaded it on the local server with XAMPP but it does not work at all, meaning PhotoSwipe is not initialized. I thought that the website folder is a fully working example, as repsonsive image code is found in the JS section of that index.html file.

    Does any one have a working example of how to get responsive images working with PhotoSwipe on a server that does have medium and large images? Or is there a live website perhaps that uses responsive images with PhotoSwipe?

    I am really new to JS and trying to put the pieces together. My question is basically how can I get the JS to read the var items = .. for responsive images when using the JS from this CodePen http://codepen.io/dimsemenov/pen/ZYbPJM ?

    Since the slide object is parsed with JS from the DOM I have no clue where to add the responsive images object in the JS.

    Any help or live example would be awesome.

    opened by ghost 30
  • 3rd Image always stuck on loading image

    3rd Image always stuck on loading image

    Hi,

    Pretty sweet plugin. Trying to use the exclusive mode with no thumbnails. I'm also using jQuery mobile. It seems no matter what I do, photoswipe always shows a loading indicator for the 3rd image, and it never loads. Your exclusive mode doesn't have an example using jQuery mobile, but I get the idea. I just put the var options in the jQuery document ready. However, even if I use the non-jQuery call, the same exact thing happens. Any ideas?

    Thanks, -Jon

    opened by wjthomas9 29
  • Basic modal functionality

    Basic modal functionality

    Hey dimsemenov,

    I saw there was basic work being done on a modal/non-modal option. I'm interested in having a photoswipe gallery embedded in as part of the page rather than taking up the entire space so I went ahead and made the modal option do this. Let me know if this works, and if there's anything else to add!

    To use in a non-modal situation, place the template inside a positioned element and the photoswipe gallery will take up the space of the parent when opened.

    Currently known bug: two-finger zoom offsets the image as if it were based off the entire screen rather than just the parent. I couldn't find where those calculations happened exactly, so the bug exists in this current state. If you could direct me to how the calculation is done I'll fix the bug. Thanks!

    opened by hellochar 27
  • zooming not working in android

    zooming not working in android

    Thank you for PhotoSwipe. I am using jquery-1.6.4.min.js,code.photoswipe.jquery-3.0.5.min.js,jquery.mobile-1.0rc2.min.js , there is no error except zooming in android. Pinch and zoom works in ipad,iphone why its not working in android. solutions please.........

    Feature Request Old PhotoSwipe 
    opened by rambo123 27
  • [iOS] Load a large images

    [iOS] Load a large images

    When you have a large images in your gallery, for example: 200 images, each image about 70K, so the total load is: 200x70=14,000k = 14 MB

    Yeah .... but look at this link: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html,

    And we can see some first images in the gallery, in this case I can see first 140 images (140x70 = 9800KB), and other images (141, 142, .... 200) I can't see it ? is this a bug ?

    Thanks for a cool framework ......

    opened by phuocle 26
  • Added object-position property support.

    Added object-position property support.

    I was trying to add a basic object-position support.

    This approach ~~requires to use additional data attribute data-cropped-position~~:

    <a ...
      data-cropped="true">
      <img ../>
    </a>
    
    img {
      object-fit: cover;
      object-position: center top;
    }
    

    Demo link: https://breezefront.com/screenshots

    Needs review 
    opened by vovayatsyuk 24
  • Can't share images via photoswipe-ui-default.js default setup, nor any I've tried

    Can't share images via photoswipe-ui-default.js default setup, nor any I've tried

    Having a heckuva time trying to share images from PhotoSwipe in social media. Neither Facebook nor Pinterest shares are working, they both give image url errors. I've tried various things, culled from issue posts here and elsewhere, but can't get anything to work. I know Facebook has changed things. Does anyone have a setup that works?

    I'm using the app_id in the Facebook share line, which I believe you need now. The line I'm using now in photoswipe-ui-default.js is: {id:'facebook', label:'Share on Facebook', url:'https://www.facebook.com/dialog/share?app_id=XXXXXX&href={{url}}&picture={{raw_image_url}}'}, ... with my proper add_id in there, of course. I've also tried image_url instead of raw_image_url, but same result. The Facebook error says: "picture should represent a valid URL". However, the same raw_image_url used in the {id:'download', label:'Download image', url:'{{raw_image_url}}', download:true} line works fine, and returns a valid url, so I don't know why FB can't extract a good url.

    When attempting to share via Pinterest, I also get an image url error message, saying: "Parameter 'image_url' (value https:../cartoons/01.jpg) is not a valid URL format", using that abbreviated url in the message. I'm not sure if that's the actual url Pinterest is getting, thus causing the error, or if their error message just shortens it. Again, I can't see why the url would be bad, since it works with the Download image link.

    Any help would be much appreciated. Thank you.

    opened by jamminjames 23
  • Feature request/suggestion

    Feature request/suggestion

    Safari on iPad has the feature that if you tap and hold an image you can save it. This seems to work only if you do that to an img element (though I haven't thoroughly checked that). In the photoswipe image gallery this doesn't work as you are hovering over something else apparently. Would it be possible to modify photoswipe accordingly? Would be really cool if you could save images that way.

    opened by Hk1020 23
  • jquery-1.7.1.min.js Bug

    jquery-1.7.1.min.js Bug

    Thank you for PhotoSwipe.

    Pinch and zoom on an image loaded in a gallery, using the jquery example and my own web app, breaks when using jquery-1.7.1.min.js. With no other changes jquery-1.6.4.min.js works beautifully. By breaks I mean the screen goes black, everything disappears and requires a reload of the page to return.

    opened by moonerent 21
  • Uncaught TypeError: Cannot read property 'x' of undefined

    Uncaught TypeError: Cannot read property 'x' of undefined

    I've already solved the problem, adding here to document the problem, in case someone runs into this as I did

    Uncaught TypeError: Cannot read property 'x' of undefined error threw me off for a good 2 hours.

    I read almost every line of the Call Stack in chrome debugger, ( it lead _equalizePoints() ), going back and forth until I discovered, that I had specified the images object like this:

    image.push({ src: "http://----.jpg", width: 100, height 100 });
    

    As it turns out, the expected keys for width & height are w and h, and not width or height.

    I assume that because PhotoSwipe is still in beta, there is no throwing of error helpful error messages, when data is missing. A "No width or height of image found" would have been very helpful, instead I tried to inspect the bounds of my images, try to figure out when and what is called, etc.

    opened by pyronaur 20
  • issues with custom data sources and webp

    issues with custom data sources and webp

    I've been trying to implement photoswipe on a site that already uses picture elements. So I had to use the dataSource option and some custom code to build a data source out of the existing list of picture elements. I then implemented the webp code from the documentation so that the lightbox utilized responsive image sets.

    I'm having a problem though. When opening the lightbox, the second image viewed (via prev or next) is missing its style="width:x; height:y;" settings. image gets displayed unconstrained and breaks the bounds of the lightbox.

    Click an image here https://devsite.santafedrygoods.com/product/alonpi-cashmere-degrade-puka-poncho-with-leather-trim-in-black-brown/

    once you cycle thru all the images however, the image shows up fine. Can't figure out why this would be happening.

    here is my code to build the options and init photoswipe

    ``

    opened by JoshBauguss 1
  • repeating destroy and init calls triggering the error Uncaught (in promise) TypeError: Cannot convert undefined or null to object

    repeating destroy and init calls triggering the error Uncaught (in promise) TypeError: Cannot convert undefined or null to object

    Source code:

    import PhotoSwipeLightbox from 'https://unpkg.com/photoswipe/dist/photoswipe-lightbox.esm.js';
    
    const lightbox = new PhotoSwipeLightbox({
      gallery: '#my-gallery',
      children: 'a',
      pswpModule: () => import('https://unpkg.com/photoswipe'),
    });
    
    lightbox.init();
    lightbox.destroy();
    lightbox.init();
    lightbox.destroy();
    lightbox.init();
    lightbox.destroy();
    lightbox.init();
    

    (Object.keys(this._listeners)).forEach((name) => {

    this._listeners is null in this case.

    Playground what reproduces the bug: https://codepen.io/tranquility/pen/ExpxEGB

    Try to open any image and check the developer console image

    p.s.: Who faced with this problem on some dynamic data - use dataSource attribute instead of gallery and children combination. Use pswpLightbox.loadAndOpen(index) for opening the image.

    Bug 
    opened by studentIvan 1
  • [ionic] Type 'undefined' does not satisfy the constraint 'Node'.

    [ionic] Type 'undefined' does not satisfy the constraint 'Node'.

    Getting below error when you do ionic serve

    Repo: https://github.com/indraraj26/ionic-photoswipe-test

    [ng] Error: node_modules/photoswipe/dist/types/util/util.d.ts:12:123 - error TS2344: Type 'undefined' does not satisfy the constraint 'Node'.
    [ng] 
    [ng] 12 export function createElement<T extends Falsy | keyof HTMLElementTagNameMap = "div", NodeToAppendElementTo extends Node = undefined>(className?: string | undefined, tagName?: T, appendToEl?: NodeToAppendElementTo): T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : HTMLDivElement;
    [ng]                                                           
    

    ionic info

    ionic info
    
    Ionic:
    
       Ionic CLI                     : 6.20.3 (/usr/local/lib/node_modules/@ionic/cli)
       Ionic Framework               : @ionic/angular 6.4.0
       @angular-devkit/build-angular : 15.0.3
       @angular-devkit/schematics    : 15.0.3
       @angular/cli                  : 15.0.3
       @ionic/angular-toolkit        : 6.1.0
    
    Capacitor:
    
       Capacitor CLI      : 4.6.1
       @capacitor/android : not installed
       @capacitor/core    : 4.6.1
       @capacitor/ios     : not installed
    
    Utility:
    
       cordova-res : not installed globally
       native-run  : 1.7.1
    
    System:
    
       NodeJS : v18.12.1 (/usr/local/bin/node)
       npm    : 8.19.2
       OS     : macOS Monterey
    
    
    opened by indraraj26 0
  • Documentation: Demo should show clickToCloseNonZoomable with TRUE too

    Documentation: Demo should show clickToCloseNonZoomable with TRUE too

    https://photoswipe.com/options/#clicktoclosenonzoomable

    • First I thought my web browser does not follow the clickToCloseNonZoomable option.

    • Only to then realize that the demo shows clickToCloseNonZoomable with FALSE so it behaves correctly.

    • Then I reflected on myself and realized why I was confused and first thought this was a bug:

      • Showing the demo with clickToCloseNonZoomable: false makes little sense.
      • Everywhere else on that demo page you use rather large images.
      • So you have experienced that option nowhere else, and in the example which is about that option you show it as false.

    Recommendation: Showcase this option with the appropriately small imagery as you have it already there with the option clickToCloseNonZoomable once true and once false.

    Suggestion 
    opened by porg 0
  • Introduce zoom levels fill-width fill-height plus 9 alignment options (anchor points)

    Introduce zoom levels fill-width fill-height plus 9 alignment options (anchor points)

    Status Quo

    • Alignment for the zoom levels fit and fill is currently hardcoded to mid-center.
    • This is a good fit for most content.

    Design / Presentation Challenge

    • But for some content having full control over alignment matters!
    • Most prominent use case: Screenshots or Screen Designs. Sample use case below.
    • But also other use cases, e.g. full body model photography, where you want e.g. the initial zoom level to be the total view (= fit) where you see the whole model, and then the zoomed-in-view to be fill-width with an alignment of top-center so that you can cycle through the zoomed in head/torso area of the photo models.

    Proposal

    Alignment options

    Currently hard-coded to mid-center. I propose to offer all 9 alignment anchor points:

    • top-left, top-center, top-right,
    • mid-left, mid-center, mid-right,
    • bottom-left, bottom-center, bottom-right.

    Zoom Levels

    • https://photoswipe.com/adjusting-zoom-level/#supported-values : fit and fill , which are axis agnostic.
    • I propose to add the zoom values fill-width and fill-height with which you can work axis-specific.

    Use Case: Presenting screenshot series from a responsive + international app

    PhotoSwipe - Introduce zoom levels fill-width fill-height plus 9 alignment options

    Given:

    • Different width per each device class in the screenshot series
    • Possibly different heights per each device class, in case of full page length screenshots (longer than viewport) with different content lengths.
    • App which can be LTR or RTL, so the content anchor point may be either top-left or top-right.

    Full control with the new parameters:

    • If I had the 9 different alignment options and using zoom level 1(=100% = 1 image pixel fills 1 CSS pixel) I could achieve that the screenshots, even if differently sized align perfectly.
      • The viewer can much more easily visually track UI/content elements on the different device classes, when jumping between their screenshots.
    • And for the simpler use case of having same width screenshots but with different height, then I would choose fill-width and alignment top-center.
      • This would guarantee that the app-header is always top-aligned, regardless how long the different screenshots in the series may be.
    Suggestion 
    opened by porg 2
  • Image not loaed when max-height property is defined for an image!

    Image not loaed when max-height property is defined for an image!

    If the max-height CSS property is defined for an img element using a percentage value ( e.g max-height: 100%; ), an empty lightbox appears when this image is clicked. max-width , height (without max-), and using pixels, not percentage (max-height: 100px) properties do not cause this error.

    Potential Bug 
    opened by Shvan11 2
Releases(v5.3.4)
  • v5.3.4(Nov 22, 2022)

    Accessibility improvements (via @in0ni).

    • added ARIA attributes to follow 'carousel' pattern,
    • set/unset aria-hidden according to active slide,
    • set id=pswp__items, and ensure buttons have aria-controls pointing to it
    Source code(tar.gz)
    Source code(zip)
  • v5.2.2(Mar 28, 2022)

    Major update that changes initialization method!

    New demo | New docs

    What's new

    Code quality and rewrite in ES6 The script is now distributed as an ES module and does not require a build step to use.

    Simpler initialization and dynamic import support PhotoSwipe now supports dynamic import and does not block page rendering.

    <script type="module">
    import Lightbox from './photoswipe-lightbox.esm.js';
    const lightbox = new Lightbox({
      gallery: '#my-gallery',
      children: 'a',
      pswpModule: () => import('./photoswipe.esm.js')
    });
    lightbox.init();
    </script>
    

    Animation and gesture engine update Improved performance of most animations, touch gestures should feel more fluid now. The initial opening or closing transition can be run from cropped thumbnails.

    Single CSS file and no external assets Using CSS variables, default icons are dynamically generated and tiny.

    Built-in responsive images support PhotoSwipe also dynamically loads larger images as the user zooms via srcset.

    Open images in zoomed state It's now much easier to control the zoom level.

    Removed features from the core Some built-in features were removed in v5, either because they are using outdated technology or just rarely used. Some of them are or will be replaced by a plugin. These include:

    • History API (#hash-based navigation is outdated)
    • Social sharing (unreliable URL, lack of Opengraph support)
    • Fullscreen button (rarely used, double fullscreen). Related example in docs →
    • Caption (accessibility problems). Refer to the caption section of docs.
    • Inline gallery support (v5 is mainly designed to be used as a dialog).
    Source code(tar.gz)
    Source code(zip)
  • v4.1.3(Jan 8, 2019)

  • v4.1.2(Apr 5, 2017)

    Fix: iOS 10.3 not updating layout after orientaton change in some cases. For more details please refer to issue https://github.com/dimsemenov/PhotoSwipe/issues/1315#issuecomment-291897591

    Source code(tar.gz)
    Source code(zip)
  • v4.1.1(Dec 24, 2015)

    • Fix: click on inline SVG in slide or controls causes error "SvgAnimatedString no className".
    • Fix: Firefox 42 not rendering nearby images sometimes, issue #1014.
    • Disabled native fullscreen option entirely in old versions of Android
    • Added option fitControlsWidth for the default UI (default was not changed – 1200px), issue #1021.

    :christmas_tree:

    Source code(tar.gz)
    Source code(zip)
  • v4.1.0(Jul 11, 2015)

    Improved rendering performance of images that are larger than PhotoSwipe viewport, which leads to more smooth swipe transition and decreased memory usage (up to 50% depending on image and viewport size), but affects zooming behaviour.

    Composited layer for the image is now created only after it's zoomed. Watch screencast that demonstrates how it works now.

    This change does not affect public API, everything should work as before.

    Also some small things that were changed:

    • closeOnScroll is now blocked if animations are running or gesture is performed.
    • Horizontal dragging direction is forced if previous swipe transition wasn't finished.
    • Reduced duration of transition that finishes zoom gesture (300 to 200ms).
    • verticalDragRange default value increased from 0.6 to 0.75.
    • Reduced default maximum spread and double tap zoom level from 2x and 1.5x to 1.33x.
    Source code(tar.gz)
    Source code(zip)
  • v4.0.8(May 21, 2015)

    • Added ability to use custom identifiers for the slides in the URL, for example: http://example.com/?gid=1&pid=your-custom-gallery-item-uid. More info in FAQ section of docs. (via @csu & @kyleder).
    • Added vertical drag range option (verticalDragRange) (via @v-yanchevsky).
    • Added ability to control size of PhotoSwipe viewport (it doesn't have to fill 100% width and height of window). More info in FAQ section of docs.
    • Fix: partly broken preloader animation when direction:rtl.
    Source code(tar.gz)
    Source code(zip)
  • v4.0.7(Mar 18, 2015)

    • Fix: slow wheel scroll on Windows Firefox (#730).
    • Fix: wrong image size when it's smaller than PhotoSwipe viewport in IE8.
    • Fix: freeze in Ubuntu Firefox 36 (#783), only CSS file changed.
    • Added SVG support: image size is forced to defined "w" & "h" properties of slide object. See demo.
    • Update bower.json main array with default ui (via @inlikealion).
    • Lazy-loading when using responsive images: allow item alteration before checking validity (via @DanielMuller).
    Source code(tar.gz)
    Source code(zip)
  • v4.0.6(Feb 25, 2015)

    • Fix: incorrect zoom pan position in fullscreen when page was scrolled.
    • Fix: fullscreen icon is not updating when changing fullscreen state.
    • Fix: orientation change breaks layout if there are 2 slides.
    • Fix: error when image finished loading (can appear only when low number of items and when rapidly switching slides).
    • Fix: issue with RTL layouts (via @louy).
    • Fix: error appears when captionEl:false.
    • closeOnScroll is now triggered only by mousewheel events and only in browsers that support transform. As various browsers trigger scroll event unpredictably (during page load, when bars appear, etc.).
    • Fix: in desktop Safari PhotoSwipe that opens on page load can close (caused by above issue).
    • Added `mainScrollAnimStart" event (via @asadovsky).
    • Some developers prefer to edit CSS file directly without using Sass, that’s why code comments are now visible in .css files too (in dist/ folder), not just in .scss files.

    Support PhotoSwipe on Flattr →

    Source code(tar.gz)
    Source code(zip)
  • v4.0.5(Jan 15, 2015)

    • Reset idle timer on controls click.
    • Hide share modal when slides change.
    • Added clickToCloseNonZoomable option.
    • Bugfix: error when replacing slide dynamically.
    • Removed minZoom and maxZoom properties from slide object.
    Source code(tar.gz)
    Source code(zip)
  • v4.0.3(Jan 3, 2015)

    • Fix: dynamic adding/removing slides issue.
    • During zoom/pan image position is now rounded (#704). Not rounded position could cause not sharp image on high-dpi screens
    • Hide arrows and counter if there is only one slide.
    • Prevent page scroll if closeOnScroll:false.
    • Added options that allow to parse share links output.
    • Added event that triggers when share link is clicked.
    • Configurable zoom level for double-tap zoom.
    • Prettified, commented and structured Sass files.
    • Added documentation on how to add/remove/edit slides dynamically.

    More info in commit history.

    Source code(tar.gz)
    Source code(zip)
  • v4.0.2(Dec 21, 2014)

    • Now you can add HTML content in slides, more info in documentation.
    • Fix: links trigger during or after drag gesture.
    • Allow dragging or panning only via left mouse button.
    • Double tap zooms to 1.5x if initial zoom is less than 0.7x.
    • Force paint on bg and root element (opening transition).
    Source code(tar.gz)
    Source code(zip)
  • v4.0.1(Dec 16, 2014)

    • Fix: in IE8 3rd image not always appended.
    • Minified assets (images, svg).
    • Improved keyboard events handling. Esc key handler moved to keydown. Keyup listener removed entirely. Added e.preventDefault() to keyboard events.
    • Fix: commonjs/browserify issue.
    • Improved Sass files, added Autoprefixer, path to assets can be configurable.
    • Fix: in old Android (<4.4) tap event could trigger twice.

    More info in commit history.

    Source code(tar.gz)
    Source code(zip)
Owner
Dmytro Semenov
Dmytro Semenov
3D Infinite Art Gallery! This pulls from Reddit's r/Art and creates a procedural infinite art gallery from random (sfw-only) posts.

Infinite-Art-Gallery Click for Demo! 3D Infinite Procedurally-Generated Art Gallery! This pulls from Reddit's r/Art and creates a procedural infinite

Austin 33 Dec 15, 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
Full featured JavaScript image & video gallery. No dependencies

lightgallery.js Full featured JavaScript lightbox gallery. No dependencies. Important notice lightgallery.js has been merged with lightGallery. That m

Sachin Neravath 5.2k Dec 30, 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
Freewall is a cross-browser and responsive jQuery plugin to help you create grid, image and masonry layouts for desktop, mobile, and tablet...

Freewall Freewall is a cross-browser and responsive jQuery plugin to help you create many types of grid layouts: flexible layouts, images layouts, nes

Minh Nguyen 1.9k Dec 27, 2022
Phaser is a fun, free and fast 2D game framework for making HTML5 games for desktop and mobile web browsers, supporting Canvas and WebGL rendering.

Phaser - HTML5 Game Framework Phaser is a fast, free, and fun open source HTML5 game framework that offers WebGL and Canvas rendering across desktop a

Richard Davey 33.4k Jan 7, 2023
The Raspberry Pi + OpenScan Pi Shield can be used to control two independent stepper motors and a variety of different cameras

OpenScan2 Overview: The Raspberry Pi + OpenScan Pi Shield can be used to control two independent stepper motors and a variety of different cameras (Pi

Thomas 149 Jan 3, 2023
Lightweight and independent Pinterest-like cascading grid layout library

Bricklayer is a Lightweight and Independent Pinterest-like Cascading Grid Layout Library ?? Simpler than any other cascading grid layout tools. ❄️ Lig

Adem ilter 2.5k Dec 22, 2022
optimize image & upload file to cloud as image bed with tiny image automic.

Rush! 图片压缩 & 直传图床工具 这是一个兴趣使然的项目, 希望 Rush! 能让这个世界的网络资源浪费减少一点点 下载 Downloads 获取最新发行版 功能 Features 拖拽批量压缩图片, 支持格式 jpg/png/gif Drop to optimize, jpg/png/gif

{ Chao } 3 Nov 12, 2022
This provides an extension integration with Docker Desktop to run k9s quickly and easily through the Docker Desktop interface.

k9s extension for Docker Desktop This provides an extension integration with Docker Desktop to allow k9s quickly and easily through the Docker Desktop

James Spurin 14 Dec 16, 2022
Desktop App for mdSilo: Tiny Knowledge silo on your desktop.

mdSilo A mind silo for storing ideas, thought, knowledge with a powerful writing tool. built with React and Tauri. Demo Discord This is desktop app, a

D.Loh 203 Dec 27, 2022
Interactive To Do List, draggable tasks, optimized for desktop and mobile screen sizes. It reserves data in local storage. Built with HTML, CSS, and JavaScript.

To Do List Interactive daily To-Do List Built With Major languages: html, css, javascript Frameworks: Technologies used: Webpack Live Demo Live Demo L

Jafar Yousef 6 Aug 4, 2022
Pure JavaScript library that add .is-hover class instead of css :hover for mobile and desktop.

MultiDeviceHover Pure JavaScript library that add .is-hover class instead of css :hover for mobile and desktop. Usage Install Using npm, install multi

Ryuta Sakai 1 Oct 5, 2021
Fast Hugo gallery theme/module suitable for lots of images.

Gallery Deluxe A Hugo Module to show a photo gallery. It's very fast/effective, especially if you have lots of images on display. See the annotated in

Bjørn Erik Pedersen 51 Jan 2, 2023
This is my to-do list website built with html, css and JavaScript. In this project I used Webpack to bundle JavaScript and ES6 modules to write modular JavaScript.

To-Do-List App This is my to-do list website built with html, css and JavaScript. In this project I used Webpack to bundle JavaScript and ES6 modules

Samuel Mwape 18 Sep 20, 2022
Enrich your browsing experience, whether it be on mobile (iOS) or your desktop (macOS)

steven's userscripts safari specific AutoScroll.user.js (middle mouse scroll click drag wheel) mobile keyboard.user.js (mobile virtual keyboard shortc

Steven G. 6 Dec 15, 2022
A modular front-end framework - inspired by the server-side and Web Components.

The NX framework Home page, Docs NX is a modular front-end framework - built with ES6 and Web Components. The building blocks of NX are the core, the

NX framework 464 Dec 5, 2022
A desktop app handling image uploading and text transfering.

Transmitter Introduction 一款利用Github repository实现图床+文本传输的桌面应用 框架:Vite+React+Electron Tutorial release 创建Github token:https://docs.github.com/en/authent

Wenhao Zhang 3 Mar 24, 2022