Parallax Engine that reacts to the orientation of a smart device

Related tags

Scroll parallax
Overview

Parallax.js

CDNJS

Parallax Engine that reacts to the orientation of a smart device. Where no gyroscope or motion detection hardware is available, the position of the cursor is used instead.

Check out the demo to see it in action!

Table of Contents

1. Getting started

1.1 Installation

1.1 a) Using the CDN

  1. Add <script src="https://cdnjs.cloudflare.com/ajax/libs/parallax/3.1.0/parallax.min.js"></script> to your markup
  2. Done!

Many thanks to the fine folks over at cdnjs for hosting our library.

1.1 b) Beginners

  1. Head over to the releases Section
  2. Download compiled.zip from the latest release
  3. Extract the ZIP archive and locate the parallax.js and parallax.min.js files
    • Use parallax.js if you want to snoop around in the code
    • Use parallax.min.js for deployment, because it has a smaller file size
  4. Copy the file of your choice into your project directory
  5. So far, so good!

1.1 c) Professionals

npm i -s parallax-js

You will then find the source code in node_modules/parallax-js/src/parallax.js and the browserified, babelified, uglified, production-ready version in node_modules/parallax-js/dist/parallax.min.js

1.2 Preparations

Include the Script

If you use the compiled version, either downloaded from the releases page, or copied from the dist folder, include the script like any other Javascript library:
<script src="path/to/parallax.js"></script>

Of course, when you've installed via npm, and use browserify/babel, you can also simply do:
import Parallax from 'parallax-js' or
const Parallax = require('parallax-js')

Create your HTML elements

Each Parallax.js instance needs a container element, the scene. You're free to identify it by any means you want, but for now, let's use an ID:

<div id="scene">
</div>

Per default, all direct child elements of the scene will become moving objects, the layers. You can change this to a custom query selector, but again, we're going with the easiest approach for now:

<div id="scene">
  <div>My first Layer!</div>
  <div>My second Layer!</div>
</div>

While all other options and parameters are optional, with sane defaults, and can be set programatically, each layer needs a data-depth attribute. The movement applied to each layer will be multiplied by its depth attribute.

<div id="scene">
  <div data-depth="0.2">My first Layer!</div>
  <div data-depth="0.6">My second Layer!</div>
</div>

1.3 Run Parallax

As soon as your DOM is ready and loaded, you can create a new Parallax.js instance, providing your scene element as first parameter.

var scene = document.getElementById('scene');
var parallaxInstance = new Parallax(scene);

That's it, you're running Parallax.js now!

2. Configuration

2.1 Programmatic vs Declarative

Most configuration settings can be declared either as data-value attribute of the scene element, or property of the configuration object. The programmatic approach will take priority over the data-value attributes set in the HTML.
Some options can also be set at run-time via instance methods.

Declarative:

<div data-relative-input="true" id="scene">
  <div data-depth="0.2">My first Layer!</div>
  <div data-depth="0.6">My second Layer!</div>
</div>

Programmatic:

var scene = document.getElementById('scene');
var parallaxInstance = new Parallax(scene, {
  relativeInput: true
});

Using Methods at Runtime:

parallaxInstance.friction(0.2, 0.2);

2.2 Configuration Options

relativeInput

Property: relativeInput
Attribute: data-relative-input

Value: boolean
Default: false

Makes mouse input relative to the position of the scene element.
No effect when gyroscope is used.

clipRelativeInput

Property: clipRelativeInput
Attribute: data-clip-relative-input

Value: boolean
Default: false

Clips mouse input to the bounds of the scene. This means the movement stops as soon as the edge of the scene element is reached by the cursor.
No effect when gyroscope is used, or hoverOnly is active.

hoverOnly

Property: hoverOnly
Attribute: data-hover-only

Value: boolean
Default: false

Parallax will only be in effect while the cursor is over the scene element, otherwise all layers move back to their initial position. Works best in combination with relativeInput.
No effect when gyroscope is used.

inputElement

Property: inputElement
Attribute: data-input-element
Method: setInputElement(HTMLElement)

Value: null or HTMLElement / String
Default: null

Allows usage of a different element for cursor input.
The configuration property expects an HTMLElement, the data value attribute a query selector string.
Will only work in combination with relativeInput, setting hoverOnly might make sense too.
No effect when gyroscope is used.

calibrateX & calibrateY

Property: calibrateX & calibrateY
Attribute: data-calibrate-x & data-calibrate-y
Method: calibrate(x, y)

Value: boolean
Default: false for X, true for Y

Caches the initial X/Y axis value on initialization and calculates motion relative to this.
No effect when cursor is used.

invertX & invertY

Property: invertX & invertY
Attribute: data-invert-x & data-invert-y
Method: invert(x, y)

Value: boolean
Default: true

Inverts the movement of the layers relative to the input. Setting both of these values to false will cause the layers to move with the device motion or cursor.

limitX & limitY

Property: limitX & limitY
Attribute: data-limit-x & data-limit-y
Method: limit(x, y)

Value: false or integer
Default: false

Limits the movement of layers on the respective axis. Leaving this value at false gives complete freedom to the movement.

scalarX & scalarY

Property: scalarX & scalarY
Attribute: data-scalar-x & data-scalar-y
Method: scalar(x, y)

Value: float
Default: 10.0

Multiplies the input motion by this value, increasing or decreasing the movement speed and range.

frictionX & frictionY

Property: frictionX & frictionY
Attribute: data-friction-x & data-friction-y
Method: friction(x, y)

Value: float between 0 and 1
Default: 0.1

Amount of friction applied to the layers. At 1 the layers will instantly go to their new positions, everything below 1 adds some easing.
The default value of 0.1 adds some sensible easing. Try 0.15 or 0.075 for some difference.

originX & originY

Property: originX & originY
Attribute: data-origin-x & data-origin-y
Method: origin(x, y)

Value: float between 0 and 1
Default: 0.5

X and Y origin of the mouse input. The default of 0.5 refers to the center of the screen or element, 0 is the left (X axis) or top (Y axis) border, 1 the right or bottom.
No effect when gyroscope is used.

precision

Property: precision
Attribute: data-precision

Value: integer
Default: 1

Decimals the element positions will be rounded to. 1 is a sensible default which you should not need to change in the next few years, unless you have a very interesting and unique setup.

selector

Property: selector
Attribute: data-selector

Value: null or string
Default: null

String that will be fed to querySelectorAll on the scene element to select the layer elements. When null, will simply select all direct child elements.
Use .layer for legacy behaviour, selecting only child elements having the class name layer.

pointerEvents

Property: pointerEvents
Attribute: data-pointer-events

Value: boolean
Default: false

Set to true to enable interactions with the scene and layer elements. When set to the default of false, the CSS attribute pointer-events: none will be applied for performance reasons.
Setting this to true alone will not be enough to fully interact with all layers, since they will be overlapping. You have to either set position: absolute on all layer child elements, or keep pointerEvents at false and set pointer-events: all for the interactable elements only.

onReady

Property: onReady

Value: null or function
Default: null

Callback function that will be called as soon as the Parallax instance has finished its setup. This might currently take up to 1000ms (calibrationDelay * 2).

3. Methods

In addition to the configuration methods outlined in the section above, there are a few more publicly accessible methods:

enable()

Enables a disabled Parallax instance.

disable()

Disables a running Parallax instance.

destroy()

Completely destroys a Parallax instance, allowing it to be garbage collected.

version()

Returns the version number of the Parallax library.

4. Development

4.1 Running the Project

  1. Clone the Repository git clone [email protected]:wagerfield/parallax.git
  2. Open the working directory cd parallax
  3. Install dependencies npm install
  4. Run development server gulp watch
  5. Open http://localhost:9000/ in browser

4.2 Opening an Issue

If you need help relating the direct usage of this library in a project of yours, provide us with a working, running example of your work. This can be a GitHub repository, a ZIP file containing your work, a project on CodePen or JSFiddle, you name it.
Do not complain about something not working without giving us some way to help you. Thank you!

4.3 Known Issues

SVG-Bug in MS Edge

It seems MS Edge does not support the children or querySelectorAll methods for SVG elements.

5. FAQ

How can I use this Library with jQuery?

jQuery will not prevent you from using this library in any way. If you want to use jQuery for selecting your Parallax scene element, you can do so too.

var scene = $('#scene').get(0);
var parallaxInstance = new Parallax(scene);

How can I interact with my layers?

Check out the section on the configuration option pointerEvents above.

How do I get the demo files to work?

Either download compiled_with_examples.zip from the GitHub Releases section, or follow section 4.1

6. Information

6.1 License

This project is licensed under the terms of the MIT License. Enjoy!

6.2 Authors

Matthew Wagerfield: @wagerfield
René Roth: Website

Comments
  • Missing `NODE_ENV` or `BABEL_ENV` environment variables

    Missing `NODE_ENV` or `BABEL_ENV` environment variables

    I have a Create React App ejected environment and got this error when I try to install the package:

    Error: Using `babel-preset-react-app` requires that you specify `NODE_ENV` or `BABEL_ENV` environment variables. Valid values are "development", "test", and "production". Instead, received: undefined.
    

    I don't know if anyone else has the same error, that is such annoying because I can't install anything new or update my packages without removing the eslint section on my package.json file and putting it back again after it finishes.

    bug 
    opened by guilhermemarconi 17
  • Firefox fix.

    Firefox fix.

    Added another flag to test if the deviceorientation event is ever fired. On Firefox (at least on a Mac) it seems that the orientation event objects are there, but the event itself is never fired - so the test in the code based on "this.desktop" property never executes since that function is never invoked.

    opened by drojdjou 17
  • Not working on IE 8

    Not working on IE 8

    The script seems to break when trying to use Internet Explorer. There are several errors with the parallax.js file and also the script in html.

    Is there any workaround or alternative code, that could display something else instead of the broken website for IE?

    One of the many errors..

    Object doesn't support this property or method: this.onMouseMove = this.onMouseMove.bind(this);

    opened by JoonasR 13
  • Local parallax

    Local parallax

    How to use parallax only if I hover particularly section? I want to use parallax on some section only when i hover that section of page. Tnx

    I try this : var scene = $('.js-prlx2')[0]; var parallax = new Parallax(scene, { clipRelativeInput: true, relativeInput: true, hoverOnly: true, inputElement: ('.js-prlx2')[0], });

    question 
    opened by sarambasic 12
  • Parallax v3.0 not working on the latest IE11

    Parallax v3.0 not working on the latest IE11

    Hi @wagerfield I just found out about your amazing plugin today. When I'm testing the latest Parallax v3.0 in IE, it doesn't work at, but it works pretty well in Chrome.

    I'm using the latest IE11 in Win10, so it shouldn't be considered an "old" IE, just wonder if there's anything you can do to fix it. Thanks.

    bug 
    opened by pingshunhuangalex 12
  • Problem with images not scrolling on Y axis

    Problem with images not scrolling on Y axis

    Hi, I've been using parallax.js and everything worked quite okay. Except that my images doesn't move at all on the Y axis, they only respond to the X axis... Do you know how to fix it, where should I look ?

    Thank you !

    opened by analxlogik 12
  • Body duplicated

    Body duplicated

    Hi, I can't explain why, but it looks like my body is duplicated when I use parallax.js on this page : http://kaarton.com/cine/event-category/cine-minots/

    If anyone has an idea ...

    Thanks a lot !

    Regards

    opened by agenceKanvas 12
  • "deviceorientation" works on Surface but needs change of "desktop" detection

    I have been trying to get it work on Microsoft Surface and at least the deviceorientation event is there and works (tested on Surface RT Windows 8.1 Preview IE11, not sure if IE10 also supports this). The main problem is in the deviceorientation eventhandler:

    Parallax.prototype.desktop =    !navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|IEMobile)/);
    ...
    if (!this.desktop && event.beta !== null && event.gamma !== null) {
    

    If you remove "!this.desktop" is does work on Surface which is matched by the desktop detection but is both desktop AND table. I suggest simply detecting the event and event properties is safer than device/userAgent parsing.

    I am still working out why the demo works kinda strange and sometimes does not start, maybe it is because of beta nature of IE11, a slightly similar event handling or something else. But generally the deviceorientation event works.

    Great work by the way :)

    opened by cthedot 12
  • enhancement: allow class name other than

    enhancement: allow class name other than "layer"

    So I'm using this is a much larger project and attempting to name space all css classes and layer stands out as a fairly generic name. It's unlikely to actually cause an issue but it would be great to be able to pass in an alternative layer class name or a prefix ('my-custom-layer') so the library doesn't dictate code style in anyway.

    opened by lupos 11
  • Continued Development

    Continued Development

    Ever grateful to Matthew Wagerfield & Claudio Guglieri for putting this together, although with the apparent popularity of this repo on github and it's (nail-biting) use in production means that some continued development of the project is very much needed.

    If anyone is willing to serve this goal then post here to co-ordinate the effort, stating your contribution, linking to valid forks or any other way you can forward this endeavour.

    Myself, I am a front-end designer wth a focus on SVG & JS animation so I'm more use as a feature scope, feature debug, demo and docs kinda contributor ;o) Though I would be happy to host any new repo and take the lead in that regard.

    This thread is intended to serve as a signpost for others looking to answer the same question so bump away, even if my call falls on deaf ears!

    opened by pixeltherapy 11
  • Parallax is not working

    Parallax is not working

    Hi guys,

    It very URGENT!

    I'm doing create parallax website for client project but seem not working. I download your new version. I use jquery.min.js. and here my coding:

    HTML

    <div id="container" class="Parallax">
        <ul id="scene" class="scene">
             <li class="layer left" data-depth="0.30"><img src="" alt="...."></li>
             <li class="layer left-1" data-depth="0.80"><img src="" alt="...."></li>
             <li class="layer center" data-depth="0.20"><img src="" alt="...."></li>
         </ul>
    </div>
    

    JS

    var scene = document.getElementById('scene'); var parallax = new Parallax(scene);

    Can you please fix this problem?

    Thanks,

    Shaun.

    opened by onmarketing 10
  • Img starting position

    Img starting position

    I have 3 transparent superhero image, and i want that all start form center. But, ... only one is in center, and other on position 0,0

    how to solv that, dat all 3, other all X number of image, start from vertical and horisontal center ?

    opened by AleksandarNeustadt 0
  • Uncaught ReferenceError: Parallax is not defined

    Uncaught ReferenceError: Parallax is not defined

    I have used parallax in home page and it is working fine. but, Does get error as below in console for other inner pages.

    screnshote

    theme.js file.

    window.onload = function () { 
    	var scene = document.getElementById('scene');
    	var parallaxInstance = new Parallax(scene);
    }
    
    opened by harnishdesign 0
  • npm install doesn't seem to work when using `import`

    npm install doesn't seem to work when using `import`

    Could not find a declaration file for module 'parallax-js'. 'C:/dev/premier-properties-management/node_modules/parallax-js/dist/parallax.js' implicitly has an 'any' type. Try 'npm i --save-dev @types/parallax-js' if it exists or add a new declaration (.d.ts) file containing 'declare module 'parallax-js';

    This was the issue I received from Visual Studio Code while attempting to import a fresh npm install of Parallax. import Parallax from 'parallax-js'; I've since changed it to const Parallax = require('parallax-js'); which seems to work just fine.

    I did also attempt to run the npm i --save-dev @types/parallax-js command however that didn't work out. I'm working in the Angular CLI environment (which includes babel), using typescript.

    opened by nathan-i-martin 4
  • Does not work with Angular Universal

    Does not work with Angular Universal

    Hello! I'm using Angular Universal (SSR) for SEO and after compiling have a problem (server build) : ERROR TypeError: Cannot read properties of null (reading 'indexOf') 167590141-62be6578-1bda-4c10-8b90-0b34cbc87f20

    opened by Liudmyla01 0
  • Parallax animations moving really slow on Mac Chrome

    Parallax animations moving really slow on Mac Chrome

    Anybody else experiencing the parallax animations moving super chunky and slowly? I'm only experiencing this on Mac Chrome v96/0

    Here is an example: https://stage.avhero.com/

    I'd love if somebody would be able to help me troubleshoot this. Thank you!

    My Script looks like this:

    <script>    
        var thisScene = document.getElementById('elementID');
        var parallaxInstance = new Parallax(thisScene);
      </script>
    
    support 
    opened by paulstroot 5
Releases(v3.1)
  • v3.1(Sep 10, 2017)

    v3.1 is here, featuring a vastly improved Readme and finally working npm releases again! That's right, you can now just do npm install parallax-js and be up-to-date again 🎆

    Additionally, I have those features for you:

    • Breaking: added selector option, now by default all child elements of the scene will become layers, see Readme on how to restore legacy behaviour
    • added hoverOnly option
    • added inputElement option
    • fixed bug when using deviceMotion events
    • polyfilled Object.assign for IE compatibility
    • added ready callback
    • added destroy method
    • some slight performance improvements
    Source code(tar.gz)
    Source code(zip)
    compiled-with-examples.zip(84.20 KB)
    compiled.zip(46.37 KB)
  • v3.0(May 6, 2017)

    Proudly presenting the first release after nearly 3 years!

    Let's get the breaking changes out of the way first:

    • the jQuery/Zepto version has been removed, use new Parallax($('#scene').get(0)) if you need to
    • pointer events are disabled for layers by default, see the #interactivity section of the Readme for details on how to enable them
    • HTML inline attributes take priority over the initial JS parameters
    • support for old IE versions might be broken, please let me know if so and I'll try to fix it

    Those were necessary to bring you these improvements and new features:

    • general repository cleanup, more readable code, nicer coding style ✨
    • a great build flow for contributors and those curious about the source code 🏗
    • with a better documentation 📝
    • lightning fast npm install process ⚡️
    • you can now actually require and/or import parallax-js 😮
    • bugfixes of course 👾
    • increased performance and compatibility, especially for mobile devices 📱
    • depth can be set independently for X and Y axis 👁
    • adjustable precision, set to the best value for both performance and optics 🎯

    Let us know what you think! And a big shoutout to all contributors, thank you for making this possible 💖

    Choose compiled.zip from below if you want a drag-and-drop JS file.

    Source code(tar.gz)
    Source code(zip)
    compiled-with-examples.zip(44.68 KB)
    compiled.zip(12.67 KB)
  • v2.1.3(May 12, 2014)

  • v2.1.2(Apr 26, 2014)

  • v2.1.1(Apr 26, 2014)

  • v2.1.0(Apr 26, 2014)

  • v2.0.1(Apr 25, 2014)

  • v2.0.0(Apr 25, 2014)

    • Rewrote layer motion to use px rather than %, allowing for layers to have a zero width and height footprint, which in turn allows for interactive elements to be positioned on multiple layers without blocking one another.
    • Created interactive.html to demonstrate the aforementioned functionality.
    • Optimised internal css method so that prefixed properties are cached.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.1(Apr 20, 2014)

  • v1.1.0(Apr 20, 2014)

    • Updated mouse input to always be relative to the window rather than the page using event.client[X|Y] rather than event.page[X|Y].
    • Added relativeInput behaviour to switch the mouse input coordinate system to the element passed to the Parallax constructor. See README for details.
    • Added clipRelativeInput behaviour to limit the mouse input influence to the bounds of the element passed to the Parallax constructor. See README for details.
    • Created a new example: relative.html to demonstrate this new functionality.
    Source code(tar.gz)
    Source code(zip)
Stellar.js - Parallax scrolling made easy

Stellar.js PLEASE NOTE: This project is no longer maintained. If parallax scrolling is something you care about, please apply to become a contributor

Mark Dalgleish 4.6k Dec 10, 2022
jQuery plugin for creating interactive parallax effect

jquery.parallax What does jquery.parallax do? jquery.parallax turns nodes into absolutely positioned layers that move in response to the mouse. Depend

stephband 1.1k Nov 25, 2022
Simple and tiny JavaScript library that adds parallax animations on any images

simpleParallax.js simpleParallax.js is a very simple and tiny Vanilla JS library that adds parallax animations on any images. Where it may be laboriou

Geoffrey 1.5k Jan 3, 2023
Lightweight, vanilla javascript parallax library

RELLAX Rellax is a buttery smooth, super lightweight, vanilla javascript parallax library. Update: Rellax now works on mobile (v1.0.0). Demo Website G

Dixon & Moe 6.7k Dec 30, 2022
🛤 Detection of elements in viewport & smooth scrolling with parallax.

Locomotive Scroll Detection of elements in viewport & smooth scrolling with parallax effects. Installation ⚠️ Scroll-hijacking is a controversial prac

Locomotive 5.9k Dec 31, 2022
⚡️The Fullstack React Framework — built on Next.js

The Fullstack React Framework "Zero-API" Data Layer — Built on Next.js — Inspired by Ruby on Rails Read the Documentation “Zero-API” data layer lets y

⚡️Blitz 12.5k Jan 4, 2023
This GitHub action activates when a contributor raises a PR. It comments and reacts to the PR. Moreover, assigns the PR to the author.

This GitHub action activates when a contributor raises a PR. It comments and reacts to the PR. Moreover, assigns the PR to the author.

Ankur 9 Oct 1, 2022
FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF.

FileAPI A set of JavaScript tools for working with files. Get started Download the files from the dist directory, and then: <div> <!-- "js-fileapi-

Free and open source software developed at Mail.Ru 3.6k Jan 3, 2023
jQuery Tabs Plugin. CSS Tabs with Accessible and Responsive Design. Lot of Tab Themes with Vertical and Horizontal Orientation.

Macaw Tabs Macaw Tabs is jQuery tabs plugin. It helps you to create accessible and responsive jQuery tabs by implementing the W3 design patterns for t

HTMLCSSFreebies 6 Dec 8, 2022
whatsapp api to remote your whatsapp device. Support multi device, multi client. Still update to more feature. Please fork, star, donate and share.

Ndalu-wa-client DEPENDENCIES : { "@adiwajshing/baileys": "^4.2.0", "@adiwajshing/keyed-db": "^0.2.4", "axios": "^0.27.2", "body-parser

null 29 Jan 4, 2023
Device.js is a JavaScript library to detect device, viewport, and browser information using plain JavaScript.

Device.js Device.js is a JavaScript library to detect device, viewport, and browser information using plain JavaScript. Compatibility Works with all m

Emanuel R. Vásquez 5 Dec 16, 2022
UAParser.js - Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. Supports browser & node.js environment.

UAParser.js JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data with relatively small footprint (~17KB m

Faisal Salman 7.4k Jan 4, 2023
Stand-alone parallax scrolling library for mobile (Android + iOS) and desktop. No jQuery. Just plain JavaScript (and some love).

Please note: skrollr hasn't been under active development since about September 2014 (check out the contributions graphs on https://github.com/Prinzho

Alexander Prinzhorn 18.6k Jan 3, 2023
Stellar.js - Parallax scrolling made easy

Stellar.js PLEASE NOTE: This project is no longer maintained. If parallax scrolling is something you care about, please apply to become a contributor

Mark Dalgleish 4.6k Dec 10, 2022
jQuery plugin for creating interactive parallax effect

jquery.parallax What does jquery.parallax do? jquery.parallax turns nodes into absolutely positioned layers that move in response to the mouse. Depend

stephband 1.1k Nov 25, 2022
Simple and tiny JavaScript library that adds parallax animations on any images

simpleParallax.js simpleParallax.js is a very simple and tiny Vanilla JS library that adds parallax animations on any images. Where it may be laboriou

Geoffrey 1.5k Jan 3, 2023
Lightweight, vanilla javascript parallax library

RELLAX Rellax is a buttery smooth, super lightweight, vanilla javascript parallax library. Update: Rellax now works on mobile (v1.0.0). Demo Website G

Dixon & Moe 6.7k Dec 30, 2022
Simple parallax scrolling effect inspired by Spotify.com implemented as a jQuery plugin

Parallax.js Simple parallax scrolling implemented as a jQuery plugin. http://pixelcog.com/parallax.js/ Please also check our v2.0.0-alpha! We'd be hap

PixelCog Inc. 3.5k Dec 21, 2022
👓 Parallax tilt hover effect for React JS - tilt.js

React.js - Tilt.js React version of tilt.js Demo https://vx-demo.now.sh/gallery Install yarn: yarn add react-tilt npm: npm install --save react-tilt U

Jon 340 Dec 23, 2022
Playful and Colorful One-Page portfolio featuring Parallax effects and animations. Especially designers and/or photographers will love this theme! Built with MDX and Theme UI.

Gatsby Starter Portfolio: Cara Playful and Colorful One-Page portfolio featuring Parallax effects and animations. Using the Gatsby Theme @lekoarts/gat

prashanth s 1 Dec 24, 2021