Reactive Extensions for Angular

Related tags

Angular rx-angular
Overview

RxAngular rx-angular CI

RxAngular offers a comprehensive toolset for handling fully reactive Angular applications with the main focus on runtime performance and template rendering.

RxAngular is divided into different packages:

Used together, you get a powerful tool for developing high-performance angular applications with or without NgZone.

This repository holds a set of helpers to create fully reactive as well as fully zone-less applications.

rx-angular logo

Links

Packages

Find details in the linked readme files below for installation and setup instructions, examples and resources.

Browsers support

IE / Edge
IE / Edge
Firefox
Firefox
Chrome
Chrome
Safari
Safari
iOS Safari
iOS Safari
IE11, Edge last version last version last 2 versions last 2 versions
Comments
  • Missing change detection since `@rx-angular/cdk@1.0.0-beta.3`

    Missing change detection since `@rx-angular/[email protected]`

    Description

    Since our Angular 14 update which included upgrading @rx-angular/cdk from 1.0.0-beta.2 to 1.0.0-beta.3 we got some problems with missing change detections.

    We have an application with a splitted view with some *rxLet directives. With the update we encounter the problem, that changes triggered in the main view aren't rendered in the sidebar, only after a clicking some UI element in the sidebar it gets rendered.

    We found 2 options to fix the problem:

    1. Replace *rxLet="vm$; let vm" with *ngIf="vm$ | async as vm"
    2. Downgrading @rx-angular/cdk to 1.0.0-beta.2

    Maybe it is related to the coalescing optimizations in the latest version.

    Environment

    Angular CLI: 14.1.1
    Node: 16.13.2
    OS: Windows 10
    
    Angular: 14.1.1
    Ivy Workspace: Yes
    
    "@rx-angular/cdk": "1.0.0-beta.3",
    "@rx-angular/state": "1.6.1",
    "@rx-angular/template": "1.0.0-beta.33",
    
    🐞 Bug đŸ› ī¸ CDK 
    opened by twittwer 25
  • bug: `rxLet` directive no longer renders content when Observable emits `undefined`

    bug: `rxLet` directive no longer renders content when Observable emits `undefined`

    Description

    Hey RX'ers. Potential bug with rxLet directive. It seems that something has changed in a recent update and undefined values / emissions now cause the directive to fail to render the children within the element to which it is attached.

    Previously, the rxLet directive would render regardless of the value of the emission. So unless I'm missing something, this seems like a breaking change. An emission of null renders child elements just fine, which is what I would expect from either that or undefined values.

    Steps to Reproduce the Issue

    export class MyComponent {
       value$ = of(undefined);
    }
    
    <div *rxLet="value$ as value">
    ABCD
    </div>
    

    Essentially. If value$ emits undefined, the content will not be rendered. If value$ emits null, the content will be rendered as expected.

    Both null and undefined should cause content to be rendered.

    Environment

        "rxjs": "^7.5.7",
        "@rx-angular/cdk": "^1.0.0-rc.2",
        "@rx-angular/state": "^1.7.0",
        "@rx-angular/template": "^1.0.0-rc.3",
        "@angular/animations": "14.2.6",
        "@angular/cdk": "14.2.5",
        "@angular/common": "14.2.6",
        "@angular/core": "14.2.6",
        "@angular/fire": "^7.4.1",
        "@angular/forms": "14.2.6",
        "@angular/platform-browser": "14.2.6",
        "@angular/platform-browser-dynamic": "14.2.6",
        "@angular/pwa": "14.2.6",
        "@angular/router": "14.2.6",
        "@angular/service-worker": "14.2.6",
    

    Related to Other Issues

    Tasks to Resolve This

    Notes

    opened by lincolnthree 20
  • feat: PoC RxSignals

    feat: PoC RxSignals

    • [x] implement
    • [x] test
    • [x] web docs
    • [x] JS docs

    Often setters are enough. In such cases, we can use state.set({prop}).

    If we want to apply behaviour we need to get a stream. This often leads to bloated code with Subjects.

    @Component({
    template: `
    <input (input)="searchBtn.next($event.target.value)" /> {{search$ | async}}
    <button (click)="submitBtn.next()" >Submit<button>
    `
    })
    class Component {
    
      _submitBtn = new Sunject<void>();
      _search = new Sunject<string>();
      
      set submitBtn() {
          _submitBtn.next()
      }
      set search(search: string) {
          _search.next(search)
      }
      get search$() {
          return _search.asObservable();
      }
      
      refresh$ = this. search$.pipe(
        switchMap(fetchData)
      )
    
    }
    

    We could use a Proxy object and a little TS to reduce the boilerplate here:

    @Component({
    template: `
    <input (input)="uiActions.searchBtn($event.target.value)" /> {{search$ | async}}
    <button (click)="uiActions.submit()" >Submit<button>
    `
    })
    class Component {
      
      uiActions = getActions<{submit: viod, search: string}>()
      
      refresh$ = this. uiActions.search$.pipe(
        switchMap(fetchData)
      )
    
    }
    

    A config object could even get rid of the mapping in the template:

    @Component({
    template: `
    <input (input)="uiActions.search($event)" /> {{search$ | async}}
    <button (click)="uiActions.submit()" >Submit<button>
    `
    })
    class Component {
      
      uiActions = getActions<{submit: viod, search: string}>({search: (e) => e.target.value})
      
      refresh$ = this. uiActions.search$.pipe(
        switchMap(fetchData)
      )
    
    }
    

    If we use the actions only in the class with RxEffects or RxState we won't cause any memory leaks.

    @Component({
    template: `
    <input (input)="uiActions.search($event.target.value)" /> {{search$ | async}}
    <button (click)="uiActions.submit()" >Submit<button>
    `
    })
    class Component {
      
      uiActions = getActions<{submit: viod, search: string}>()
      
      refresh$ = this. uiActions.search$.pipe(
        switchMap(fetchData)
      )
    
    }
    

    A config object could even get rid of the mapping in the template:

    @Component({
    template: `
    <input (input)="uiActions.search($event)" /> {{search$ | async}}
    <button (click)="uiActions.submit()" >Submit<button>
    `,
    providers: [ RxState, RxEffects]
    })
    class Component {
      
      uiActions = getActions<{submit: viod, search: string}>({search: (e) => e.target.value})
      
      constructor( private effects: RxEffects, private state: RxState<{list: any[]}>) {
        this.state('list', this. uiActions.search$.pipe(switchMap(fetchData)));
        this.effects(this.uiActions.search$, fetchData);
      }
    
    }
    

    As we have no subscriber after the component is destroyed we don't need to complete the Subjects.

    However if we would pass it to another service which has a longer life time we could create a memory leak:

    @Component({
    template: `
    <input (input)="uiActions.search($event)" /> {{search$ | async}}
    <button (click)="uiActions.submit()" >Submit<button>
    `,
    providers: [ RxState, RxEffects]
    })
    class Component {
      
      uiActions = getActions<{submit: viod, search: string}>({search: (e) => e.target.value})
      
      constructor( private globalService: GlobalService) {
        this.globalService.connectSearchTrigger(this.uiActions.search$);
      }
    
    }
    

    Here, as the global service lives longer than the component we have subscribers on the subject after the component is destroyed. For such situations, a hook is needed to get the component destroyed event.


    Update: Due to typing issues, I had to refactor to an architecture where we have a wrapper scope for the action create function. Incredible BIG THANKS to @ddprrt for the support here.

    The current solution provides a service and a factory function.

    The service is hooked into Angular's life-cycles and so it cleans up on destruction. The factory function returns a pair of functions, create and destroy that can be used manually.

    Service:

    export class RxActionFactory<T extends Actions> implements OnDestroy {
      private readonly subjects: SubjectMap<T> = {} as SubjectMap<T>;
      create<U extends ActionTransforms<T> = {}>(transforms?: U): RxActions<T, U> {
        return new Proxy(
          {} as RxActions<T, U>,
          actionProxyHandler(this.subjects, transforms)
        ) as RxActions<T, U>;
      }
    
      destroy() {
        for (let subjectsKey in this.subjects) {
          this.subjects[subjectsKey].complete();
        }
      }
    
      ngOnDestroy() {
        this.destroy();
      }
    }
    

    Service Usage:

    interface StateActions {
      refreshList: viod,
    }
    
    @Injectable({providedIn: 'root'})
    class GlobalState implements OnDestroy {
        _fac = new RxActionFactory<StateActions >();
        uiActions = this._fac.create()
        
        ngOnDestroy() {
            this._fac.destroy();
        }
    

    Component Usage:

    interface UIActions {
      submit: viod, 
      search: string
    }
    
    @Component({
    template: `
    <input (input)="uiActions.search($event)" /> {{search$ | async}}
    <button (click)="uiActions.submit()" >Submit<button>
    `,
    providers: [ RxState, RxEffects, RxActionFactory]
    })
    class Component {
      
      uiActions = this.actionFactory.create({
        search: (e: Event | string | number) => e.target.value !== undefined ? e.target.value + '' : e + ''
      })
      
      constructor( 
         private globalService: GlobalService,
         private actionFactory: RxActionFactory<UIActions>
      ) {
        this.globalService.connectSearchTrigger(this.uiActions.search$);
      }
    
    }
    

    The factory function is maybe irrelevant for Angular but still worth looking at it:

    export function rxActionCreator<T extends {}>() {
      const subjects = {} as SubjectMap<T>;
      return {
        create,
        destroy: (): void => {
          for (let subjectsKey in subjects) {
            subjects[subjectsKey].complete();
          }
        },
      };
    
      function create<U extends ActionTransforms<T> = {}>(
        transforms?: U
      ): RxActions<T, U> {
        return new Proxy(
          {} as RxActions<T, U>,
          actionProxyHandler(subjects, transforms)
        ) as RxActions<T, U>;
      }
    }
    

    Usage:

    type UIActions = {
      search: string;
      check: number;
    };
    
    const {create, destroy} = rxActionCreator<UIActions>();
    const actions = create({
      search: (v: number) => 'string',
    });
    create.search(4);
    

    Update:

    I removed the function because we can also do new RxActionsFactory<any>().create(). Additionally, docus are now present as well as tests.

    Missin features:

    • Angular Error handler

    Missing tests:

    • subscribe to a subject that is not emitted on
    • emit on a property without subscriber
    • error in transform

    The only flaw we could maybe see here is the wrapper e.g. new RxActionsFactory().create().prop

    For now I have no clue how we could get rid of it and expose the setter and observables directly e.g. new RxActionsFactory().prop. One problem is typescript, the other Proxies, classes and typescript :). Maybe problems to solve in a later step...

    Related issues: #423, #1013

    { } State đŸ›‚ Test đŸ“– Docs API đŸ› ī¸ CDK 
    opened by BioPhoton 16
  • Setting up strategies.

    Setting up strategies.

    Scope

    This PR will be focusing on setting up strategies on global/feature/component levels and passing these settings to existing directives.

    All information below is a very early work in progress and just topics to discuss.

    InjectionTokens approach

    3 tokens introduced.

    • RX_AVAILABLE_STRATEGIES with all available strategies.
    • RX_ANGULAR_DEFAULT_STRATEGY default strategy for elements in the viewport ('local').
    • RX_ANGULAR_DEFAULT_OUT_OF_VIEWPORT_STRATEGY default strategy for elements out of viewport ('noop').

    Changing default strategies.

    • Through providers array on the needed level and useValue.
    • Planned RxRenderer service (will be introduced in separate PR).

    Adding a new strategy.

    • Through providers array on the needed level and useValue.
    • Planned RxRenderer service (will be introduced in separate PR).

    Consuming strategies

    • By @Inject().

    Service approach

    StrategySetupService introduced. Implemented with RxState.

    State interface

    export interface StrategySetupState {
      strategies: AvailableStrategies;
      currentStrategy: StrategyNameType;
      currentOutOfViewportStrategy: StrategyNameType;
    }
    

    API

    • setStrategy. Accepts strategy name.
    • setOutOfViewportStrategy. Accepts strategy name.
    • addStrategy. Accepts request object.
    export interface AddStrategyRequest {
      name: string;
      constructor: StrategyConstructorType;
      options?: {
        useAsDefault: boolean;
        useAsOutOfViewPort: boolean;
      };
    }
    

    This part need to return full strategy function instead of name. Or we should split responsibilities between RxRenderer & SetupService :)

    • strategy$. Observable of currentStrategy.
    • outOfViewportStrategy$. Observable of currentOutOfViewportStrategy.
    • get strategy(). currentStrategy.
    • get outOfViewportStrategy(). currentOutOfViewportStrategy.

    Other

    Some typing introduced for strategy names, constructor functions, etc.

    Template đŸš§ WIP 
    opened by Karnaukhov-kh 15
  • fix(state): exclude `undefined` from return type of `stateful`

    fix(state): exclude `undefined` from return type of `stateful`

    Fixes #837.

    This should fix the typing for #stateful to no longer include undefined.

    I am not sure what to do about the declaration and definition of #stateful in app/demos/src though..? I changed the one in libs/state/src.

    https://github.com/rx-angular/rx-angular/blob/cbd921df0b7eebd56b4b3cb6428a825fd6bb8acb/apps/demos/src/app/rx-angular-pocs/cdk/utils/rxjs/operators/stateful.ts#L47

    { } State đŸ› ī¸ CDK 
    opened by niklaas 12
  • Incorrect Implicit Types - Push and Let directives

    Incorrect Implicit Types - Push and Let directives

    There seems to be some thing going on with the types the Angular Language Service is picking up for these directives.

    Push Directive

    https://github.com/rx-angular/rx-angular/blob/d27cc66599819ddf3d541981cb1b29270453786d/libs/template/src/lib/push/push.pipe.ts#L112-L137

    Example

    Screen Shot 2021-05-30 at 6 23 10 PM Screen Shot 2021-05-30 at 6 22 35 PM Screen Shot 2021-05-30 at 6 22 20 PM

    Angular Reference

    Async Pipe

    Let Directive

    https://github.com/rx-angular/rx-angular/blob/d27cc66599819ddf3d541981cb1b29270453786d/libs/template/src/lib/let/let.directive.ts#L457-L466

    Example

    Screen Shot 2021-05-30 at 6 28 30 PM Screen Shot 2021-05-30 at 6 27 40 PM Screen Shot 2021-05-30 at 6 28 23 PM

    Angular Reference

    NgIfContext

    opened by wSedlacek 12
  • Expose After Render Callback from directives

    Expose After Render Callback from directives

    WIP

    Todod:

    • [x] Implement renedered$
    • [x] Implement scheduleCD
    • [x] Implement rxScheduleCD
    • [x] Demonstrate the different ways to access the signal
    • [ ] Demonstrate/Document Edge cases and cavets

    Description

    Implemented a new Output for the LetDirective which emits the latest value after it was rendered by the strategy. The feature was requested as afterRender signal for the upcoming @rx-angular/template RC release #203.

    Why

    The signal emits after the RenderStrategy has detected the changes to be rendered. Users now have a proper notification about when a change was actually reflected to the view. This is especially useful for DOM calculations. E.g. where you rely on the height of an element after it's state got manipulated.

    I have implemented a small example use case demonstrating this behavior. In this example I am calculating the height of a div after it's state chanted. The height gets calculated twice. One time after the value got chanted and one time after the renderCallback emitted.

    image

    Please test it out:

    • yarn nx s examples
    • navigate to render-callback/render-callback-01
    • press the "update content" button

    Usage

    Template Syntax

    Since it's not possible to subscribe to output-bindings of structural directives with *-Syntax, users would have to use TemplateSyntax to bind to the callback inside the view.

        <ng-template let-content
                     [rxLet]="content$"
                     (rendered)="rendered$.next($event)">
          <div class="example-box"
               #box>
            {{ content }}
          </div>
        </ng-template>
    

    ViewChild

    Another way would be to fetch the LetDirective as ViewChild and subscribe to the event manually.

      @ViewChild(LetDirective) letDirective: LetDirective<any>;
      readonly rendered$ = this.letDirective.rendered;
    

    Known Issues & Caveats

    The implementation relies on the RenderStrategy to work properly. So we have to make sure that all of our strategies are emitting after they got rendered.

    How is it possible for the PushPipe to have an output? (inside the view. you could always inject it as viewchild)

    Another thing to think about is coalescing. As long as the user only has 1 LetDirective which handles changeDetection for the component, there shouldn't be an issue. But as soon as multiple renderAware or even RenderStrategy users are in place, things can quickly get messy. There can be a situation where you subscribe to the renderSignal of 1 particular LetDirective, which would never emit a value, because those changes are detected by another LetDirective/RenderStrategy/PushPipe.

    To encounter this issue we could explain that you would have to listen to all Let/Push/RenderStrategy in order to get notified that your component re-rendered.

    But I guess this won't be an issue anymore after #294 was transformed into real code :+1:

    I am happy for any feedback and discussions on this topic!

    ✍ī¸ Enhancement  Template đŸš§ WIP 
    opened by hoebbelsB 12
  • selectSlice still a problem?

    selectSlice still a problem?

    Upgraded to 1.3 with the hope of being able to use selectSlice rather than a combination of distinctUntilSomeChanged and map, and it doesn't seem to be giving the result I expected.

    Here's the existing code I was hoping to be able to refactor:

    image

    Here's the refactored code:

    image

    The typescript compiler isn't happy with this as can be seen:

    image

    I thought I should be able to use selectSlice as above. Am I missing something?

    🐞 Bug { } State 
    opened by christianacca 12
  • `@rx-angular/cdk/zone-less/rxjs` doesn't play well with RxJS TestScheduler

    `@rx-angular/cdk/zone-less/rxjs` doesn't play well with RxJS TestScheduler

    Description

    I'm using the @rx-angular/cdk/zone-less/rxjs package. Specifically the timer observable creational function. When I was using version 1.0.0-beta.2 it wasn't broken. My unit tests started to act weird when I upgraded to version 1.0.0-beta.3. I think this is related to the refactoring made to schedulers inside the CDK package.

    Steps to Reproduce the Issue

    Reproduction repo: https://github.com/exequiel09/rxa-cdk-scheduler-issue/tree/ea21ee5079879eb25f278d987ce2e4cf54a2c0c5/apps/rxa-cdk-scheduler-issue/src/app/backoff

    Just run npx nx run rxa-cdk-scheduler-issue:test

    The example in the repo uses a copy of backoff-rxjs that's patched with @rx-angular/cdk to use the timer observable.

    Environment

    Angular: 14 RxJS: 7.4

    Also, the actual project uses RxJS 6 and Angular 13 and it happens. The repro above is just a minimal reproduction of the issue.

    Screen Shot 2022-06-14 at 5 15 44 PM

    opened by exequiel09 11
  • "no directive is matched on attribute rxLet" - Angular 10

    I'm trying to use the *rxLet directive, but within template it says "no directive is matched on attribute rxLet"

    I included TemplateModule. I tried with a fresh Angular 10 application. Am i missing something?

    🐞 Bug  Template 
    opened by matze1234 11
  • Global and local strategies configuration

    Global and local strategies configuration

    Things to discuss

    General

    • How we should setup global strategies? Global Service vs InjectionTokens.
    • What are pros and cons of Global Service & InjectionTokens?
    • How Global Service and InjectionTokens should behave with lazy-loaded modules?
    • Registering custom strategies (?)

    Configuration granularity

    • Global level. Global Service or InjectionTokens will behave the same.
    • Lazy loaded features. Custom service/token instance vs global instance.
    • Component level. Planned RxRenderer can be used.
    • Let, ViewportPrio, RxRenderer & Push. Planned RxRenderer can be used.
    • Change at the run time. What should we use? RxRenderer/another service?
    ✍ī¸ Enhancement  Template 
    opened by Karnaukhov-kh 11
  • rxIf - don't resolve a static value

    rxIf - don't resolve a static value

    Hello,

    Maybe it's a bug, maybe I'm doing something wrong. I'll be glad for help :) I tried to use your library, but sadly I can't get a positive result of using a rxIf with static data. I tried on stackblitz and in our company app, but sadly I can't go through it.

    I'm using versions: Angular: 14 RXJS: 7.6.0 rx-angular/template: ^1.0.0-rc.4

    Screenshot from 2022-12-22 13-39-09

    opened by dawidwitek 1
  • *rxLet directive doesn't trigger for the observables set up later than component rendering

    *rxLet directive doesn't trigger for the observables set up later than component rendering

    Description

    *rxLet directive doesn't trigger for the observables set up later than component rendering.

    Sometimes we don't have the observable defined straight on a component init. Sometimes we need to assign that later (e.g. fetch some data on demand).

    Steps to Reproduce the Issue

    See the example please: (https://stackblitz.com/edit/angular-ivy-mblqcq?file=src%2Fapp%2Fapp.component.ts)

    opened by ysdidenko 4
  • docs: Tell more about the intention behind this library

    docs: Tell more about the intention behind this library

    Hello,

    Could you please add some information, maybe a small introduction about this library to the docs?

    • What was the intention to create this library?
    • What are the advantages over other libraries? (NGRX, NGXS, Akita, Elf, RXJS)
    • What about speed, ease of use, and number of features?

    I would really like to learn more about it!

    Best Regards, Marius

    opened by mariusbolik 0
  • Update transformation looses typing

    Update transformation looses typing

    Description

    When using the update function from rx-angular/cdk/transformations to update an item in an array, that item is not typed anymore.

    Steps to Reproduce the Issue

    Create an array with an item, update set item with a new value using the update function. Check the instaceof the item.

    Stackblitz example: https://stackblitz.com/edit/angular-ivy-dko7ba?file=src/app/app.component.ts

    Example will create a collection, patch the collection using the update and log the results in the console. The last check will actually fail while it should: image

    You can actually see that in the console that the typing is not known anymore (foo -> object): image

    Environment

    image

    opened by jeroenwallaeys 1
  • Add (timeupdate) event to unpatch directive

    Add (timeupdate) event to unpatch directive

    When listening to the timeupdate event on a HTMLVideoElement, the callback is always in NgZone. and triggers changeDetection.

    Further video events to include: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video?retiredLocale=de#events

    opened by ProjectBay 0
Owner
RxAngular
RxAngular offers a comprehensive toolset for handling fully reactive Angular applications with the main focus on runtime performance and template rendering.
RxAngular
Sam4Sc - a migration assistant for Angular to SCAM (Single Angular Component Modules) and Standalone Components

Sam4Sc - a migration assistant for Angular to SCAM (Single Angular Component Modules) and Standalone Components

Rainer Hahnekamp 7 Nov 16, 2022
Clarity Angular is a scalable, accessible, customizable, open-source design system built for Angular.

Getting Started Clarity Angular is published as two npm packages: Contains the static styles for building HTML components. Contains the Angular compon

VMware Clarity 145 Dec 29, 2022
An example application that uses file-based routing with Angular, Analog, Vite with the Angular Router

Angular, Vite, and File-based routes This is an example application that uses Angular, Analog, and Vite for file-based routing. Routes are places in t

Brandon 9 Sep 25, 2022
Monorepo for all the tooling related to using ESLint with Angular

Angular ESLint Monorepo for all the tooling which enables ESLint to lint Angular projects

angular-eslint 1.4k Dec 29, 2022
Semantic UI Angular Integrations

Semantic-UI-Angular Semantic-UI-Angular is a pure AngularJS 1.x set of directives for Semantic-UI components. We are considering Angular 2 support in

Semantic Org 561 Dec 28, 2022
The code for a set of Angular 6+ components for the PatternFly project.

The code for a set of Angular 6+ components for the PatternFly project. Note that the release/3.x branch supports Angular 4 and 5.

PatternFly 87 Nov 15, 2022
Angular 11 & Bootstrap 5 & Material Design 2.0 UI KIT

MDB 5 Angular Angular 12 & Bootstrap 5 & Material Design 2.0 UI KIT >> Get Started in 4 steps >> MDBAngular 5 Demo 500+ material UI components Super s

MDBootstrap 1.1k Dec 30, 2022
Component infrastructure and Material Design components for Angular

Official components for Angular The Angular team builds and maintains both common UI components and tools to help you build your own custom components

Angular 23.2k Jan 3, 2023
Angular UI Component Library based on Ant Design

NG-ZORRO An enterprise-class Angular UI component library based on Ant Design. English | įŽ€äŊ“中文 ✨ Features An enterprise-class UI design system for Angu

NG-ZORRO 8.3k Jan 6, 2023
Angular 2 building blocks :package: based on Semantic UI

Angular2 & Semantic UI Angular2 - Semantic UI Live demo ng-semantic.herokuapp.com Angular 2 Semantic UI version: 2.2.2 Installation npm install ng-sem

Vlado Tesanovic 995 Dec 23, 2022
Native Angular components & directives for Lightning Design System

ng-lightning This library contains native Angular components and directives written from scratch in TypeScript using the Lightning Design System CSS f

null 910 Dec 8, 2022
Native AngularJS (Angular) directives for Bootstrap

Native AngularJS (Angular) directives for Bootstrap. Smaller footprint (20kB gzipped), no 3rd party JS dependencies (jQuery, bootstrap JS) required. Please read the README.md file before submitting an issue!

AngularUI 14.4k Jan 3, 2023
NG Bootstrap - Angular powered Bootstrap widgets

NG Bootstrap - Angular powered Bootstrap widgets Angular widgets built from the ground up using only Bootstrap 4 CSS with APIs designed for the Angula

ng-bootstrap 8k Dec 24, 2022
🚀 Style and Component Library for Angular

ngx-ui Component & Style Library for Angular by Swimlane. Installing npm i @swimlane/ngx-ui --S Install the project's peer depencencies (moment, codem

Swimlane 654 Dec 24, 2022
Lightweight, Material Design inspired go to top button. No dependencies. Pure Angular!

Angular ScrollTop Button Lightweight, Material Design inspired button for scroll-to-top of the page. No dependencies. Pure Angular! ✓ Angular 13, Ivy

BART! 19 Dec 18, 2022
The best way to quickly integrate Bootstrap 5 Bootstrap 4 or Bootstrap 3 Components with Angular

ngx-bootstrap The best way to quickly integrate Bootstrap 5 Bootstrap 4 or Bootstrap 3 Components with Angular Links Documentation Release Notes Slack

Valor Software 5.4k Jan 8, 2023
Customizable Angular UI Library based on Eva Design System

Nebular Documentation | Stackblitz Template | UI Bakery - Angular UI Builder | Angular templates Nebular is a customizable Angular 10 UI Library with

Akveo 7.7k Dec 31, 2022
A set of UI components for use with Angular 2 and Bootstrap 4.

#Fuel-UI A set of UI components for use with Angular 2 and Bootstrap 4. See Fuel-UI homepage for live demo and documentation. ##Dependencies Node Gulp

Fuel Interactive 302 Jul 4, 2022
Element for Angular

Element for Angular Catalog Documentation Getting Started Contribution Support LICENSE Documentation element-angular Getting Started Install: # instal

éĨŋäē†äšˆå‰įĢ¯ 520 Nov 14, 2022