• Stars
    star
    560
  • Rank 79,541 (Top 2 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 6 years ago
  • Updated 4 months ago

Reviews

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

Repository Details

Make beautiful, animated loading skeletons that automatically adapt to your Angular apps

NGX Skeleton loader

npm downloads npm npm

NPM NPM

Build Status Coverage Status npm bundle size (minified + gzip) npm

ngx-skeleton-loader in action

Why skeletons?

If you want to get more details about that, please read "NGX-Skeleton-Loader — States, Animations, Performance, and Accessibility for your Angular App" blog post

The idea of this component is make the process transparent and easier. So the main point is integrate this component with other tooling process, such as:

  • Server-side rendering;
  • Progressive rendering;
  • Any other that you like :)

It's totally transparent for you and you can integrate easier in your application, improving your user experience 🎉

Demo

Try out our demos on Stackblitz!

Install

You can get it on NPM installing ngx-skeleton-loader module as a project dependency.

npm install ngx-skeleton-loader --save

Setup

You'll need to add NgxSkeletonLoaderModule to your application module. So that, the <ngx-skeleton-loader> components will be accessible in your application.

...
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
...

@NgModule({
  declarations: [
    YourAppComponent
  ],
  imports: [
    ...
    NgxSkeletonLoaderModule,
    ...
  ],
  providers: [],
  bootstrap: [YourAppComponent]
})

export class YourAppComponent {}

After that, you can use the ngx-skeleton-loader components in your templates, passing the configuration data into the component itself.

  • ngx-skeleton-loader: Handle the skeleton animation and the skeleton styles of your app;
<div class="item">
  <ngx-skeleton-loader count="5" appearance="circle"></ngx-skeleton-loader>
</div>

Using NgxSkeletonLoaderModule.forRoot()

Also, you can import the module in your app by calling NgxSkeletonLoaderModule.forRoot() when adding it. So it will be available across your Angular application.

Importing the module this way also allows you to globally configure the default values for the ngx-skeleton-loader components in your application, in case you need some different default values for your app.

...
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
...

@NgModule({
  declarations: [
    YourAppComponent
  ],
  imports: [
    ...
    NgxSkeletonLoaderModule.forRoot({ animation: 'pulse', loadingText: 'This item is actually loading...' }),
    ...
  ],
  providers: [],
  bootstrap: [YourAppComponent]
})

export class YourAppComponent {}
<div class="item">
  <ngx-skeleton-loader count="5" appearance="circle"></ngx-skeleton-loader>
  <!-- above line will produce the rendering of 5 circles with the pulse animation and the aria-valuetext attribute set with "This item is actually loading..." -->
</div>

Extending theme via NgxSkeletonLoaderModule.forRoot()

By default when using NgxSkeletonLoaderModule.forRoot({ theme: /* ...list of CSS atributes */} }) the application is using this value as source of truth, overriding any local theming passed to <ngx-skeleton-loader> component via [theme] input. Check these steps in case you need to change this behaviour in your app

This method is also accepting the option of having a global theme and local theme inputs. You can enable it by passing NgxSkeletonLoaderModule.forRoot({ theme: { extendsFromRoot: true, /* ...list of CSS atributes */} }) in your module. Quite simple, right? 😄

By using that configuration in your application, you should also be aware that:

  • By default, every <ngx-skeleton-loader> component will use theme coming from NgxSkeletonLoaderModule.forRoot() as the source of truth
  • If there's any CSS attribute on the component locally which overrides the CSS spec, it combines both themes, but overriding global CSS attributes in favor of local ones.

As an example:

...
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
...

@NgModule({
  declarations: [
    YourAppComponent
  ],
  imports: [
    ...
    NgxSkeletonLoaderModule.forRoot({
      theme: {
        // Enabliong theme combination
        extendsFromRoot: true,
        // ... list of CSS theme attributes
        height: '30px',
      },
    }),
    ...
  ],
  providers: [],
  bootstrap: [YourAppComponent]
})

export class YourAppComponent {}
<div class="item">
  <ngx-skeleton-loader></ngx-skeleton-loader>
  <!-- above line will produce a skeleton component using `height: 30px;`" -->
  <ngx-skeleton-loader [theme]="{background: 'blue'}"></ngx-skeleton-loader>
  <!-- above line will produce a skeleton component using `height: 30px; background: blue;`" -->
  <ngx-skeleton-loader [theme]="{height: '50px', background: 'red'}"></ngx-skeleton-loader>
  <!-- above line will produce a skeleton component using `height: 50px; background: red;`" -->
</div>

WAI-ARIA values

  • loadingText - default Loading...: attribute that defines the text value for aria-valuetext attribute. Defaults to "Loading..."
  • aria-label - default loading: you can add ariaLabel as input of the component to set a different value.

Appearance

You can also define which appearance want to use in your skeleton loader by passing the options in your component via [appearance] attribute.

Options

  • '' - default: it will use it '' as appearance. At the end, it will render like a line;
  • line: it will render like a line. This is the same behavior as passing an empty string;
  • circle: it will use circle as appearance. Great for avatar skeletons, for example :);
  • custom-content: it will NOT add any appearance. Great for custom content, such as SVG, internal components and such;

Animations

You can also define which CSS animation you want to use - even not use any, if it's the case - in your skeleton loader by passing the options in your component via [animation] attribute.

Options

  • "false" (as string): it will disable the animation;
  • false (as boolean): it will disable the animation. Animation will receive false as string when attribute field it's not using binding. Component now can receive false (boolean), "false" (string), or any other animation type via binding;
  • progress - default: it will use it progress as animation;
  • progress-dark: it will use it progress-dark as animation. Recommended if your color schema is darken;
  • pulse: it will use pulse as animation;

progress is the default animation, used as the single one previously. If you don't pass the animation attribute, it defaults to progress.

<!--
If you need to change all the background wrapper
you need to apply the style changes on the 
`ngx-skeleton-loader` component wrapper
-->
<div class="item">
  <!-- Disables the animation -->
  <ngx-skeleton-loader animation="false"></ngx-skeleton-loader>
  <!-- Disables the animation, but receiving boolean value from binding -->
  <!-- Via binding it can receive `false` (boolean), "false" (string), or any other animation type -->
  <ngx-skeleton-loader [animation]="classAttributeWithBooleanFalseValue"></ngx-skeleton-loader>
  <!-- Uses `progress` as animation -->
  <ngx-skeleton-loader animation="progress"></ngx-skeleton-loader>
  <ngx-skeleton-loader></ngx-skeleton-loader>
  <!-- Uses `pulse` as animation -->
  <ngx-skeleton-loader animation="pulse"></ngx-skeleton-loader>
</div>

You can check the code details in the Stackblitz Live Demo Link

Theming

You can also define different styles for the skeleton loader by passing an object with the css styles - in dashed case - into the component via [theme] attribute.

<!--
If you need to change all the background wrapper
you need to apply the style changes on the 
`ngx-skeleton-loader` component wrapper
-->

<div style="background: #FF0001; padding: 10px;">
  <ngx-skeleton-loader
    count="5"
    [theme]="{ 
      'border-radius': '5px',
      height: '50px',
      'background-color': '#992929',
      border: '1px solid white'
    }"
  ></ngx-skeleton-loader>
</div>

The [theme] attribute now accepts the same configuration as ngStyle as well. That means you can manage to use like you're doing with the built-in directive, having a pleasure and beautiful experience

<!--
Note that we are using a combination of styles and ngStyle inside theme object,
having `height.px` receiving a number and `background-color` receiving a HEX Color
-->
<div style="background: #FF0001; padding: 10px;">
  <ngx-skeleton-loader
    count="5"
    [theme]="{ 
      'height.px': 50,
      'background-color': '#992929'
    }"
  ></ngx-skeleton-loader>
</div>

⚠️ This is here only as a documentation, but it's not encouraged to be used. Please consider use it with caution ⚠️

Also, you can use CSS to add theme styles into your component. However, there are some implications:

  • You're using :host in your stylesheet, which means you are aware of any possible problem :host can create for your app at that level since it's based on :host DOM style scoping
  • You're adding stylesheet based on <ngx-skeleton-loader> internal classes. It means that class naming changes on module's side will be breaking changes for your application as well.

As an example, your Component file is like this

import { Component } from '@angular/core';

@Component({
  selector: 'my-ngx-skeleton-loader-with-theming',
  templateUrl: './my-ngx-skeleton-loader-with-theming.component.html',
  styleUrls: ['./my-ngx-skeleton-loader-with-theming.component.css'],
})
export class MyNGXSkeletonLoaderWithThemingComponent {
  /* ... code goes here*/
}

And your component HTML code is

<!--
file: my-ngx-skeleton-loader-with-theming.component.html

As an example, it's not using themes via [theme] attributes.
-->

<ngx-skeleton-loader count="5" animation="pulse"></ngx-skeleton-loader>

You can apply theme changes in our stylesheet. At the end it will be

/* file: `my-ngx-skeleton-loader-with-theming.component.css`
 *
 * You can find more details about `:host` at
 * Angular Component Style Docs https://angular.io/guide/component-styles#host
 */
:host >>> ngx-skeleton-loader .skeleton-loader {
  border-radius: 5px;
  height: 50px;
  background-color: #992929;
  border: 1px solid white;
}

You should change the styles on the skeleton wrapper element in case you need to change the background color. You can check the code details in the Stackblitz Live Demo Link or check it out a content load simulation in this Stackblitz Live Demo Link

Development

Run demo locally

  1. This project uses Angular CLI as base. That means you just need to run npm start and access the link http://localhost:4200 in your browser

Run tests

  1. Run npm test for run tests. In case you want to test using watch, please use npm run tdd

Publish

this project is using np package to publish, which makes things straightforward. EX: npx np <patch|minor|major> --no-yarn --no-cleanup --contents=dist/ngx-skeleton-loader

For more details, please check np package on npmjs.com

Contribute

For any type of contribution, please follow the instructions in CONTRIBUTING.md and read CODE_OF_CONDUCT.md files.

Author

Wilson Mendes (willmendesneto)

More Repositories

1

micro-frontend-pages

Simulate a micro frontend project using NodeJS, React and NGinx Reverse Proxy in Alpine Docker images
JavaScript
183
star
2

keepr

JavaScript
103
star
3

ngx-feature-toggle

Your module to handle with feature toggles in Angular applications easier.
TypeScript
99
star
4

build-checker-app

Application using ReactJS + NodeJS for to monitor build/deploy status in your Continuous Integration server
JavaScript
50
star
5

hyper-oh-my-zsh

Oh-My-ZSH theme based on hyper terminal default theme 😎
41
star
6

hex-to-css-filter

Easy way to generate colors from HEX to CSS Filters
TypeScript
37
star
7

perf-marks

The isomorphic, simplest, and lightweight solution for User Timing API in Javascript - 🚀 only 208B 🚀. Tree-shaking and entry points built-in. Simple as that!
TypeScript
36
star
8

react-sweet-wizard

Your module to handle with Form Wizards in ReactJS applications easier.
JavaScript
27
star
9

vagrant-frontend-mobile-box

Vagrant box for Ionic Developers
Shell
21
star
10

frontend-search

Shell
19
star
11

generator-reactor

Your generator for ReactJS apps
JavaScript
18
star
12

build-checker

Application using Arduino + Johnny Five + NodeJS for to monitor build/deploy status in your Continuos Integration server
JavaScript
18
star
13

angular-contact-list

JavaScript
16
star
14

vscode-file-extra

Working with files in VSCode like a boss 😎
TypeScript
15
star
15

ng-numbers-only

NG Numbers Only - Input number in a easy way in AngularJS Apps
JavaScript
15
star
16

nodebots-workshop

Nodebots Workshop using NodeJS and Johnny-five
JavaScript
15
star
17

ngOfflineModel

Your AngularJS Module for Offline operations
JavaScript
13
star
18

feature-toggle-service

The simplest solution for feature toggle in Javascript. Simple how it should be.
TypeScript
12
star
19

CI-Tools

A code generator console for Codeigniter Framework.
PHP
12
star
20

update-yeoman-generator

A script to help update repositories using Yeoman generators to the latest version
JavaScript
11
star
21

ngx-page-click

Angular module to detect page events outside your wrapped component. Flexible and easy, how it should be ⇢
TypeScript
11
star
22

angular-performance

JavaScript
10
star
23

ngx-copy-to-clipboard

Copy content to clipboard in Angular applications easier 🎯.
TypeScript
9
star
24

ngx-micro-frontend-pages

Angular Microfrontend workshop - A collection of Page Modules and Components
TypeScript
9
star
25

micro-frontend-react-pages

CSS
7
star
26

ngx-scroll-lock

Angular module for Page Scroll locking
HTML
6
star
27

reactor-feature-toggle

Feature toggle components integration for your ReactJS application
TypeScript
6
star
28

my-codeigniter-skeleton

My skeleton for application with Codeigniter PHP Framework
PHP
6
star
29

bolt-complete

Bolt command completion
JavaScript
6
star
30

angular-architecture

My architecture organization for use of AngularJS Framework
JavaScript
6
star
31

social-share

JavaScript
5
star
32

angular2-feature-toggle

Your module to handle with feature toggles in Angular2 applications easier.
JavaScript
4
star
33

willmendesneto.github.io

My personal blog
JavaScript
4
star
34

node-github-diff

Github diffs with Node style 😎
JavaScript
3
star
35

dotfiles

My OSX default configuration
Shell
3
star
36

gdg-devfest-nordeste-app

JavaScript
3
star
37

fire-alarm

A Nodebots fire alarm using NodeJS Johnny-five
JavaScript
3
star
38

pino-sanitize

PinoJS Transformer to sanitize output by removing sensitive information
JavaScript
3
star
39

aws-serverless-playground

JavaScript
3
star
40

johnny-five-from-scratch

A Introduction to Johnny-Five, the JavaScript Robotics programming framework.
JavaScript
3
star
41

generator-poi-boilerplate-demo

Demo React Component from POI boilerplate generator
JavaScript
2
star
42

bitbucket-amazing-monorepo

Improving Monorepo projects for Bitbucket users 😎
JavaScript
2
star
43

Codeigniter-TDD-with-Hooks

A codeigniter unit tests example using only hooks.
PHP
2
star
44

card

My NPM business card
JavaScript
1
star
45

nodebots-javascript-and-robotic-in-a-real-world-en

1
star
46

angular-snake

JavaScript
1
star
47

npm-package-aliases-playground

JavaScript
1
star
48

generator-poi

JavaScript
1
star
49

nodebots-javascript-and-robotic-in-a-real-world-pt-br

1
star
50

arduino-matrix-8x8

Studies based in arduino plataform
C++
1
star
51

vhost

Making virtual host maniputation tasks more easier
Shell
1
star
52

react-hcard-generator

Simple hCard generator using ReactJS
JavaScript
1
star