• Stars
    star
    245
  • Rank 159,819 (Top 4 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Animate once, use Everywhere! 💫

Built With Stencil Maintenance NPM version Downloads TotalDownloads Twitter Follow

<animatable/>

Web Component built with Stencil.js to use Web Animations API in a declarative way. You can animate any HTML element easily:

<animatable-component
  autoplay
  easing="ease-in-out"
  duration="800"
  delay="300"
  animation="tada"
>
  <h1>Hello World</h1>
</animatable-component>

With the largest list of Keyframes/Easing Functions that can also be used with other animation tools or Platforms! 🧚

Demo 🎮

Do you want to see this web component in action? Visit https://codepen.io/jdnichollsc/full/rNNYBbe yay! 🎉

Animatable

Includes a PWA demo for debugging animations!

Usage 🎉

<animatable-component autoplay iterations="3" animation="heartBeat" easing="ease-in" duration="1000">
  <h1>Proof that Tony Stark has a heart ✵</h1>
</animatable-component>
<animatable-cube
  autoplay
  fill="forwards"
  composite="add"
  duration="2600"
  easing="linear"
  iterations="Infinity"
  fromClassName="playing"
  toClassName="finished"
  animation="rotate-90-vertical-bck"
>
  <div slot="front-face">Front</div>
  <div slot="back-face">Back</div>
  <div slot="right-face">Right</div>
  <div slot="left-face">Left</div>
  <div slot="top-face">Top</div>
  <div slot="bottom-face">Bottom</div>
</animatable-cube>

With other animation libraries:

import {
  ANIMATIONS,
  EASING_FUNCTIONS,
  EASING,
  KEYFRAMES
} from '@proyecto26/animatable-component';

const bounceKeyFrames = KEYFRAMES[ANIMATIONS.BOUNCE];
const easingOutCubic = EASING_FUNCTIONS[EASING.EASE_OUT_CUBIC];

// Use here any other animation tool like Ionic Animations, AnimeJS, GSAP, etc! :)

Getting Started 📖

Packages

Project Package Version Links
Core @proyecto26/animatable-component version README.md
React @proyecto26/animatable-component-react version README.md

Script tag

  • Put a script tag similar to this <script src='https://cdn.jsdelivr.net/npm/@proyecto26/[email protected]/dist/animatable-component/animatable-component.esm.js'></script> in the head of your index.html
  • Then you can use the element anywhere in your template, JSX, html etc

Node Modules

  • Run npm install @proyecto26/animatable-component --save
  • Put a script tag similar to this <script src='node_modules/@proyecto26/animatable-component/dist/animatable-component/animatable-component.esm.js'></script> in the head of your index.html
  • Then you can use the element anywhere in your template, JSX, html etc

In a stencil-starter app

  • Run npm install @proyecto26/animatable-component --save
  • Add an import to the npm packages import @proyecto26/animatable-component;
  • Then you can use the element anywhere in your template, JSX, html etc

Framework integrations 👨‍💻

Angular

Using animatable-component component within an Angular project:

Including the Custom Elements Schema

Including the CUSTOM_ELEMENTS_SCHEMA in the module allows the use of Web Components in the HTML files. Here is an example of adding it to AppModule:

import { BrowserModule } from '@angular/platform-browser';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  bootstrap: [AppComponent],
  schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule {}

The CUSTOM_ELEMENTS_SCHEMA needs to be included in any module that uses Animatable.

Calling defineCustomElements

Animatable component includes a function used to load itself in the application window object. That function is called defineCustomElements() and needs to be executed once during the bootstrapping of your application. One convenient place to add it is in the main.ts file as follows:

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { defineCustomElements as defineAnimatable } from '@proyecto26/animatable-component/loader';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.log(err));
defineAnimatable(window);

from stencil documentation

React

  • Specific Wrapper

When using a wrapper component, It's not necessary to access the reference directly to attach events, etc. More details here.

import React from 'react';
import {
  AnimatableComponent,
  ANIMATIONS,
  EASING
} from '@proyecto26/animatable-component-react';

const App = () => {
  return (
    <AnimatableComponent
      autoPlay
      delay={300}
      duration={800}
      composite='add'
      direction='alternate'
      iterations={Infinity}
      animation={ANIMATIONS.TADA}
      easing={EASING.EASE_IN_OUT_BACK}
      onStart={() => console.log('Starting animation')}
      onFinish={() => console.log('Finished animation')}
      onCancel={() => console.log('Cancelled animation')}
    >
      <div>
        <p>HELLO WORLD</p>
      </div>
    </AnimatableComponent>
  );
};
export default App;
  • Web Component

Other option is using the web component directly:

import React from 'react'
import ReactDOM from 'react-dom'
import { defineCustomElements as defineAnimatable } from '@proyecto26/animatable-component/loader'
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

defineAnimatable(window);

from stencil documentation

Vue

In order to use the animatable-component Web Component inside of a Vue application, it should be modified to define the custom elements and to inform the Vue compiler which elements to ignore during compilation. This can all be done within the main.js file as follows:

import Vue from 'vue';
import { defineCustomElements as defineAnimatable } from '@proyecto26/animatable-component/loader'

import App from './App.vue';

Vue.config.productionTip = false;
Vue.config.ignoredElements = [/animatable-\w*/];

// Bind the custom element to the window object
defineAnimatable(window);

new Vue({
  render: h => h(App)
}).$mount('#app');

from stencil documentation

Stencil

To animate Functional Components you can use the createAnimatableComponent utility, e.g:

  • utils.tsx
import {
  createAnimatableComponent
} from '@proyecto26/animatable-component';

const SendMessageButton = (props) => (
  <ion-fab-button {...props}>
    <ion-icon name='send' />
  </ion-fab-button>
);
export const AnimatableSendMessageButton = createAnimatableComponent(SendMessageButton);
export const keyFramesSendMessage: Keyframe[] = [
  {
    opacity: '0',
    transform: 'rotate(0deg)'
  },
  {
    opacity: '1',
    transform: 'rotate(360deg)'
  }
];
export const optionsSendMessage: KeyframeAnimationOptions = {
  duration: 500,
  easing: 'ease-in-out'
};
  • my-component.tsx
import { Component, Host, h } from '@stencil/core';
import { AnimatableSendMessageButton, keyFramesSendMessage, optionsSendMessage } from './utils'

@Component({
  tag: 'my-component',
  shadow: false
})
export class MyComponent {
  render() {
    return (
       <AnimatableSendMessageButton
        autoPlay
        keyFrames={keyFramesSendMessage}
        options={optionsSendMessage}
        onFinish={() => alert('Eureka!')}
      />
    )
  }
}

Credits 👍

Contributing

When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change.
Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated ❤️.
You can learn more about how you can contribute to this project in the contribution guide.

Supporting 🍻

I believe in Unicorns 🦄 Support me, if you do too.

Donate Ethereum, ADA, BNB, SHIBA, USDT, DOGE:

Wallet address

Wallet address: 0x3F9fA8021B43ACe578C2352861Cf335449F33427

Please let us know your contributions! 🙏

Enterprise 💼

Available as part of the Tidelift Subscription.

The maintainers of <animatable/> and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.

Security contact information 🚨

To report a security vulnerability, please use the Tidelift security contact. Tidelift will coordinate the fix and disclosure.

License ⚖️

This repository is available under the MIT License.

Happy coding 💯

Made with ❤️

More Repositories

1

react-native-inappbrowser

📱InAppBrowser for React Native (Android & iOS) 🤘
Java
1,266
star
2

RestClient

🦄 A Promise based REST and HTTP client for Unity 🎮
C#
1,214
star
3

awesome-unity

A curated list of awesome Unity games! 🎮
714
star
4

awesome-jsgames

A curated list of awesome JavaScript Games 🎮
445
star
5

TheJobInterviewGuide

A job guide to help developers get through interviews and get amazing jobs!
333
star
6

ion-phaser

A web component to use Phaser Framework with Angular, React, Vue, etc 🎮
TypeScript
248
star
7

MyAPI

A template to create awesome APIs easily ⚡️
TypeScript
135
star
8

Phaser-Kinetic-Scrolling-Plugin

Kinetic Scrolling plugin for Canvas using Phaser Framework
JavaScript
130
star
9

MyApp

A template to create awesome Apps easily ⚡️
TypeScript
75
star
10

nativescript-inappbrowser

📱InAppBrowser for NativeScript (Android & iOS) 🤘
TypeScript
72
star
11

nativescript-ionic-template

📱 🖥 Create Mobile First apps, Web and Native sharing the code with Angular 🎉
TypeScript
69
star
12

cardano-developer

A Cardano Developer Guide
62
star
13

proyecto26.github.io

The Proyecto26 github homepage.
JavaScript
57
star
14

thecryptopurge

A crypto shooter-survival real-time NFT-based game inspired by The Purge 💸
JavaScript
57
star
15

MyBot

🧠 Create chatbots easily with Bot Framework! 🤖
JavaScript
31
star
16

Phaser-Workshop

A workshop to create awesome games with Phaser Framework 🎮
22
star
17

mercadopago-api

API for MercadoPago Checkout
TypeScript
20
star
18

Roxy-Fileman-for-Node.js

Roxy Fileman, upload and manage files with Node.js!
JavaScript
15
star
19

PokeDex-GO

The Best PokéDex for Pokémon Go, created by Pokémon masters! 😺
JavaScript
14
star
20

ion-phaser-ce

A web component to use Phaser Framework CE (Community Edition) with Angular, React, Vue, etc 🎮
TypeScript
11
star
21

react-native-mercado-pago-enterprise

Integrating Mobile Checkout of MercadoPago with React Native to create a payment experience in your applications.
11
star
22

use-dictionary

A React useReducer() hook to use dictionaries (keys and values) 🔑
TypeScript
9
star
23

dotnet-documentation

SOLID, DI, N-Tier, Logs, etc with dotnet
9
star
24

colombia

Departamentos y Municipios de Colombia 🇨🇴
6
star
25

BuyMeNear

Buy Me Near is a revolutionary, meaningful way to fund your creative work.
JavaScript
6
star
26

react-native-animations-demo

Animate with React Native ⏯
JavaScript
6
star
27

web-animations-workshop

Workshop of Web Animations API and Web Components
4
star
28

record-audio-button-enterprise

🔴 A Web Component for Recording Audio with a swipe gesture inspired by WhatsApp (Enterprise) 💼
4
star
29

Xamarin

A summary/template about Xamarin 📱
C#
3
star
30

social-change

Social change through technology, together we are more! 💪
3
star
31

Phaser-Market

Discover & share phaser plugins for your games
CSS
3
star
32

OpenSourceCoin

A cryptocurrency for Open Source Contributors & Developers
2
star
33

ionic-background-geolocation

Background Geolocation App using BackgroundLocation and Location ionic plugins
TypeScript
2
star
34

stencil-ionic-components

Create StencilJS Components reusing Ionic components
TypeScript
2
star
35

concertx-frontend

Empowering musical artists and fans with immersive concert experiences and trusted transactions. Start bringing your concert ideas to life today!
TypeScript
2
star
36

NodeBots

Nodebots (Tessel), IoT and Azure
JavaScript
1
star
37

flutter-inappbrowser

📱InAppBrowser for Flutter (Android & iOS) 🤘
1
star
38

ProjectX

NextJS template with TailwindCSS, etc
1
star