Easily connect your Nuxt3 application to your directus server. 🐰

Overview

nuxt-directus

nuxt-directus

npm version npm downloads Github Actions CI Codecov License

Directus Module for Nuxt 3

Features

  • Nuxt3 ready
  • Handle authentication
  • RESTful methods
  • TypeScript Support

Setup

yarn add nuxt-directus # yarn
npm i nuxt-directus # npm

Basic usage

Add nuxt-directus to your Nuxt config:

// nuxt.config.js

export default {
  buildModules: ["nuxt-directus"],
};

Development

  1. Clone this repository
  2. Install dependencies using yarn install or npm install
  3. Start development server using yarn dev or npm run dev

License

Copyright (c) 2022 Conner Luka Bachmann MIT License

Comments
  • useAsyncData example for static generation

    useAsyncData example for static generation

    How one would use directus API to generate a completely static site using Nuxt3? Simple html/js files that do not trigger backend requests.

    I'm trying to implement the following:

    export const asyncDirectusItems = async (key, config, transform) => {
      const { getItems } = useDirectusItems();
      const { data } = await useAsyncData(key, async () => await getItems(config), {transform});
      return data;
    };
    
    export const asyncDirectusItemById = async (collection, id, transform) => {
      const { getItemById } = useDirectusItems();
      const key = `${collection}#${id}`;
      const { data } = await useAsyncData(key, async () => await getItemById({ collection, id }), {transform});
      return data;
    };
    

    But recent Nuxt 3 RC's (9 and 12) either fail to generate directly accessible SSR pages or mix their markup with the front page. Also I'm having trouble to prevent Directus API calls (which are unnecessary for a completely static website).

    <script setup>
    const categories = await asyncDirectusItems('blog_categories', {
      collection: "Blog",
      params: {
        fields: "category",
        groupBy: "category"
      }
    });
    
    const posts = await asyncDirectusItems('published_blogs', {
      collection: "Blog",
      params: {
        filter: {
          status: "published"
        }
      }
    });
    </script>
    ```html
    question 
    opened by ckald 21
  • feat!: add refresh token flow

    feat!: add refresh token flow

    • [ ] Bug fix (a non-breaking change which fixes an issue)
    • [x] New feature (a non-breaking change which adds functionality)
    • [x] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    add refresh token flow, to able to get a new token after it expired

    Checklist:

    • [x] My change requires a change to the documentation.
    • [ ] I have updated the documentation accordingly.
    • [ ] I have added tests to cover my changes (if not applicable, please state why)
    enhancement 
    opened by Danielwinkelmann 13
  • Use access_token authentication method

    Use access_token authentication method

    Is your feature request related to a problem? Please describe.

    You currently can't use the Directus access token method to authenticate to the API. Ie. I share the "token" from the User > Admin Settings section and provide that in the Query String or the Authorization Bearer header.

    Describe the solution you'd like

    login should accept a {"token" OR { email: string, password: string }

    <script setup lang="ts">
    const { login } = useDirectusAuth();
    const router = useRouter();
    
    const onSubmit = async () => {
      try {
        await login({ token: "" });
      } catch (e) {}
    };
    </script>
    
    enhancement 
    opened by craigharman 12
  • bug on auth

    bug on auth

    I am developing a little project based on nuxt 3 and Directus.

    There is a problem when i'm trying to login logout. When i call login method, the user is fetch and setted and same for token and when i logout, i have the user and the token as undefined. But when i retry login with other user, the useDirectusUser returns last user and not new one. I don't know why but it's a real problem.

    PS/ To avoid the problem and have new user, i have to refresh the page.

    bug needs reproduction 
    opened by DeltaCorporate 11
  • feat: token authentification

    feat: token authentification

    Implemented the authentification option for static tokens, normal token after login have priority!

    Types of changes

    • [ ] Bug fix (a non-breaking change which fixes an issue)
    • [x] New feature (a non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    • [ ] My change requires a change to the documentation.
    • [x] I have updated the documentation accordingly.
    • [ ] I have added tests to cover my changes (if not applicable, please state why)

    Will close #31 And answer the newest discussion #51

    @craigharman @mklueh

    enhancement 
    opened by Intevel 8
  • feat: add auto refresh if token is expired

    feat: add auto refresh if token is expired

    some additions to handle autorefresh if token is expired. my tetsts with directus 9.5.2 worked well.

    Types of changes

    • [ ] Bug fix (a non-breaking change which fixes an issue)
    • [x] New feature (a non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    Checklist:

    • [ ] My change requires a change to the documentation.
    • [ ] I have updated the documentation accordingly.
    • [ ] I have added tests to cover my changes (if not applicable, please state why)
    opened by NMathar 8
  • [request error] [unhandled] [500] nuxt instance unavailable in pinia store

    [request error] [unhandled] [500] nuxt instance unavailable in pinia store

    Version

    nuxt-directus 3.2.2 nuxt: 3.0.0-rc.13

    Steps to reproduce

    use the useDirectus methods inside a pinia store...

    What is Expected?

    for it to work

    What is actually happening?

    pinia apparently does not have access to the nuxt instance. This is unfortunate as I would mainly like to use useDirectus inside my pinia store. Not sure if this is something you can fix, but wantesd to make really sure that this is not possible or if I'm doing something wrong.

    bug 
    opened by dataexcess 7
  • feat: Middleware example to docs

    feat: Middleware example to docs

    Types of changes

    • [ ] Bug fix (a non-breaking change which fixes an issue)
    • [ ] New feature (a non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    New section with an example on how to use a middleware for auth redirect https://github.com/Intevel/nuxt-directus/issues/8

    Checklist:

    • [ ] My change requires a change to the documentation.
    • [x] I have updated the documentation accordingly.
    • [ ] I have added tests to cover my changes (if not applicable, please state why)
    opened by casualmatt 7
  • feat(chore): created useCollections composable

    feat(chore): created useCollections composable

    Types of changes

    • [ ] Bug fix (a non-breaking change which fixes an issue)
    • [x] New feature (a non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    Added all the endpoints for manipulating collections as per the Directus API You can now list, get (by name), update and delete a collection. Adds a new composable useDirectusCollection.

    Checklist:

    • [x] My change requires a change to the documentation.
    • [x] I have updated the documentation accordingly.
    • [x] I have added tests to cover my changes (if not applicable, please state why)
    opened by craigharman 6
  • Auth middleware useDirectusUser is undefined

    Auth middleware useDirectusUser is undefined

    nuxt-directus 1.1.4 nuxt: 3.0.0-27478897.169aa35

    Steps to reproduce

    1. Create page /login.vue
    2. Create page /index.vue and add
    definePageMeta({
      middleware: ["auth"]
    })
    
    1. Add middleware /middleware/auth.ts
    // /middleware/auth.ts
    export default defineNuxtRouteMiddleware((to, from) => {
      const user = useDirectusUser()
    
      if (!user.value) {
        return navigateTo("/login")
      }
    })
    

    What is Expected?

    Using const { login } = useDirectusAuth(); I should be able to sign in, refresh the page and stay signed in, as user.value is still defined.

    What is actually happening?

    On refresh, the middleware kicks in again and this time returns user.value as undefined and redirects me to /login. Even though user.value is still defined.

    Workaround

    Using useDirectusToken()seems to stay defined, and can be used as a workaround for auth middleware.

    // /middleware/auth.ts
    export default defineNuxtRouteMiddleware((to, from) => {
      const token = useDirectusToken()
    
      if (!token.value) {
        return navigateTo("/login")
      }
    })
    
    bug 
    opened by madsh93 6
  • How to recognize an authentication error to server error

    How to recognize an authentication error to server error

    The try catch on login always returns data undefined.

    There is a method to catch errors generated upstream (400, the account does not exist, 401, credential invalid or another for an server error 404/500)?

    Thanks

    question 
    opened by theo-stocchetti 4
  • feat: Rendering section added to options.md

    feat: Rendering section added to options.md

    Types of changes

    • [ x ] Bug fix (a non-breaking change which fixes an issue)
    • [ x ] New feature (a non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    1. Describes different rendering modes, including static site rendering by example.
    2. Small typo fix in options.md

    Checklist:

    • [ ] My change requires a change to the documentation.
    • [ x ] I have updated the documentation accordingly.
    • [ ] I have added tests to cover my changes (if not applicable, please state why)
    opened by mklueh 0
  • feat: useDirectusUsers composables to access built-in Users collection

    feat: useDirectusUsers composables to access built-in Users collection

    Types of changes

    • [ ] Bug fix (a non-breaking change which fixes an issue)
    • [ x ] New feature (a non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    In the existing useDirectusItems composable, the users collection is not available due to hardcoded URL segment, /items in each request. In the examples, an Articles collection is available with an 'author' attribute, but you're unable to get the author's details with the existing composables. This update adds useDirectusUsers composable to allow access to the /users area in the exact same manner as useDirectusItems. The code is copied from useDirectusItems and modified to match the request and response patterns of the users endpoint.

    Checklist:

    • [ x ] My change requires a change to the documentation.
    • [ x ] I have updated the documentation accordingly.
    • [ x ] I have added tests to cover my changes (if not applicable, please state why)
    opened by dochoss 0
  • feat: rewrite items and collections API for better typings

    feat: rewrite items and collections API for better typings

    Types of changes

    • [ ] Bug fix (a non-breaking change which fixes an issue)
    • [ ] New feature (a non-breaking change which adds functionality)
    • [x] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    Besides all changes in https://github.com/Intevel/nuxt-directus/pull/77, this PR changes the usage of most methods in the useDirectusCollections and useDirectusItems in order to provide better typings. By providing a collection ID first (i.e. createItems('news', { items: { title: 'Hi' }} instead of createItems({ collection: 'news', items: { title: 'Hi' }}) we can make TypeScript aware of the correct collection types in the remaining parameters. This makes sure we can type check item data in createItems and updateItem.

    In my opinion, this also improves the API, because users have to type less code, e.g. getCollection({ collection: 'news' }) simply becomes getCollection('news').

    Checklist:

    • [x] My change requires a change to the documentation.
    • [x] I have updated the documentation accordingly.
    • [ ] I have added tests to cover my changes (if not applicable, please state why)
    opened by Anoesj 1
  • feat: maintenance and replace typed `getItems` etc. with fully typed composables to reduce repetition

    feat: maintenance and replace typed `getItems` etc. with fully typed composables to reduce repetition

    Types of changes

    • [x] Bug fix (a non-breaking change which fixes an issue)
    • [x] New feature (a non-breaking change which adds functionality)
    • [x] Breaking change (fix or feature that would cause existing functionality to change)

    Description

    Fixes

    This PR fixes some examples in the docs (getCollection and using const instead of var). It also fixes some minor issues, like removing the import for defineNuxtConfig that can be left out of Nuxt 3 modules. Furthermore, it fixes some ESLint warnings, like reordering imports and removing redundant async keywords.

    Using pnpm

    As many packages in the Vue ecosystem have switched to pnpm, it makes sense to apply that change here as well.

    Typed composables changes

    Instead of passing the expected return type to every separate composable method, with the changes made in this PR, you can pass along all your Collections to useDirectusCollections and useDirectusItems and all its methods will be typed automatically. This can be seen in action in the playground, which I updated accordingly. For example, when running:

    type News = {
      id: number;
      title: string;
      content: string;
      status: string;
    };
    
    type Books = {
      id: number;
      title: string;
      content: string;
      status: string;
    };
    
    type Collections = {
      news: News;
      books: Books;
    };
    
    const { getItems } = useDirectusItems<Collections>();
    
    // 'news' is now automatically typed as 'News[]'
    const news = await getItems({
      // Your IDE will now autosuggest 'news' and 'books',
      // as these are the only available collections
      collection: 'news',
      params: {
        filter: {
          content: 'yyeeet',
          title: 'Test1',
        },
      },
    })
    
    // 'books' is now automatically typed as { meta: { total_count?: number; filter_count?: number;}; data: Books[]; }
    const books = await getItems({
      // Your IDE will now autosuggest 'news' and 'books',
      // as these are the only available collections
      collection: 'books',
      params: {
        // Adding 'meta' will automatically change the return
        // type of the 'getItems' method, because `getItems`
        // now has proper function overloads.
        meta: '*',
      },
    })
    

    One thing of importance is that in order to keep it simple with the typings, I removed the possibility of passing a type to methods like getItems directly, like getItems<News>({ collection: 'news' }). But in my opinion, this breaking change is justified because the changes in this PR allow you to type less code.

    The return type of useDirectusUser has been updated to align with what the latest version of Directus returns (used to be export type DirectusUser = object | null;). You can also override this by passing your own type to useDirectusUser<MyUserType> and useDirectusAuth<MyUserType>.

    Checklist:

    • [ ] My change requires a change to the documentation.
    • [ ] I have updated the documentation accordingly.
    • [ ] I have added tests to cover my changes (if not applicable, please state why)

    Actually, none of the examples in the docs include passing a type to any of the composables at all. This would be a big improvement, but is probably unrelated to this PR.

    opened by Anoesj 1
  • Add an update user method

    Add an update user method

    Is your feature request related to a problem? Please describe.

    Besides the createUser({ ... }) method, I think there should be an updateUser({ ... }) method that updates the current user.

    Describe the solution you'd like

    N/A

    Describe alternatives you've considered

    N/A

    Additional context

    N/A

    enhancement 
    opened by TitusKirch 3
Releases(v3.2.2)
  • v3.2.2(Nov 17, 2022)

  • v3.2.1(Nov 7, 2022)

  • v3.2.0(Nov 6, 2022)

    What's Changed

    • chore(deps): update all non-major dependencies to ^3.0.0-rc.11 by @renovate in https://github.com/Intevel/nuxt-directus/pull/69
    • feat: throw err on $fetch by @linkb15 in https://github.com/Intevel/nuxt-directus/pull/78
    • chore(deps): update all non-major dependencies to ^3.0.0-rc.13 by @renovate in https://github.com/Intevel/nuxt-directus/pull/80

    New Contributors

    • @linkb15 made their first contribution in https://github.com/Intevel/nuxt-directus/pull/78

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v3.1.0...v3.2.0

    Source code(tar.gz)
    Source code(zip)
  • v3.1.0(Oct 6, 2022)

  • v3.0.3(Sep 5, 2022)

  • v3.0.2(Sep 4, 2022)

    What's Changed

    • fix(module): autoimport hook deprecated by @Intevel in https://github.com/Intevel/nuxt-directus/pull/67

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v3.0.1...v3.0.2

    Source code(tar.gz)
    Source code(zip)
  • v3.0.1(Sep 4, 2022)

    What's Changed

    • chore(deps): update all non-major dependencies to ^3.0.0-rc.9 by @renovate in https://github.com/Intevel/nuxt-directus/pull/64

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v3.0.0...v3.0.1

    Source code(tar.gz)
    Source code(zip)
  • v3.0.0(Aug 28, 2022)

  • v2.4.0(Jul 29, 2022)

  • v2.3.0(Jul 25, 2022)

    What's Changed

    • chore(deps): update all non-major dependencies to ^3.0.0-rc.5 by @renovate in https://github.com/Intevel/nuxt-directus/pull/47
    • chore(deps): update all non-major dependencies by @renovate in https://github.com/Intevel/nuxt-directus/pull/53
    • fix: :bug: playground fetch collection now works by @craigharman in https://github.com/Intevel/nuxt-directus/pull/55
    • feat: token authentification by @Intevel in https://github.com/Intevel/nuxt-directus/pull/54

    New Contributors

    • @Intevel made their first contribution in https://github.com/Intevel/nuxt-directus/pull/54

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v2.2.0...v2.3.0

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Jun 10, 2022)

    What's Changed

    • fix: stringify "deep" key on get item by id by @Nainterceptor in https://github.com/Intevel/nuxt-directus/pull/38

    New Contributors

    • @Nainterceptor made their first contribution in https://github.com/Intevel/nuxt-directus/pull/38

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v2.0.2...v2.1.0

    Source code(tar.gz)
    Source code(zip)
  • v2.0.2(May 27, 2022)

    What's Changed

    • feat(chore): search type to directus query params by @NMathar in https://github.com/Intevel/nuxt-directus/pull/36

    New Contributors

    • @NMathar made their first contribution in https://github.com/Intevel/nuxt-directus/pull/36

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v2.0.1...v2.0.2

    Source code(tar.gz)
    Source code(zip)
  • v2.0.1(May 18, 2022)

    What's Changed

    • chore(deps): update all non-major dependencies to ^3.0.0-rc.3 by @renovate in https://github.com/Intevel/nuxt-directus/pull/30
    • feat(chore): created useCollections composable by @craigharman in https://github.com/Intevel/nuxt-directus/pull/34
    • feat(docs): runtime config note to setup by @craigharman in https://github.com/Intevel/nuxt-directus/pull/32

    New Contributors

    • @craigharman made their first contribution in https://github.com/Intevel/nuxt-directus/pull/34

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v2.0.0...v2.0.1

    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(May 6, 2022)

    ⚠ BREAKING CHANGES

    • chore: getItemById return an array of items

    Features

    • docs: created docs for notifications (afacf8a)
    • main: created notification types (f0d8719)
    • main: implement notification support (7d0c5b9)
    • main: removed error throwing (7919b63)

    Bug Fixes

    • chore: getItemById return an array of items (2ef29ce), closes #29
    • docs: buildModules to module (0731e38)
    • docs: setup buildModule (291b9e7)
    • docs: setup space (8268149)

    1.8.0 (2022-04-24)

    Features

    • chore: add graphql support (358bbf6)
    Source code(tar.gz)
    Source code(zip)
  • v1.8.0(Apr 24, 2022)

  • v1.7.1(Apr 23, 2022)

  • v1.7.0(Apr 19, 2022)

  • v1.5.0(Apr 11, 2022)

  • v1.4.0(Apr 9, 2022)

  • v1.3.0(Apr 3, 2022)

    What's Changed

    • feat: add getThumbnail method by @Danielwinkelmann in https://github.com/Intevel/nuxt-directus/pull/9
    • feat: add typescript generics, add getSingletonItem by @Danielwinkelmann in https://github.com/Intevel/nuxt-directus/pull/10

    New Contributors

    • @Danielwinkelmann made their first contribution in https://github.com/Intevel/nuxt-directus/pull/9

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v1.2.1...v1.3.0

    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Mar 31, 2022)

  • v1.2.0(Mar 31, 2022)

    What's Changed

    • Fixed bad link, updated Readme by @xNaCly in https://github.com/Intevel/nuxt-directus/pull/6

    New Contributors

    • @xNaCly made their first contribution in https://github.com/Intevel/nuxt-directus/pull/6

    Full Changelog: https://github.com/Intevel/nuxt-directus/compare/v1.1.4...v1.2.0

    Source code(tar.gz)
    Source code(zip)
  • v1.1.4(Mar 27, 2022)

⚡️ Minimal GraphQL Client + Code Generation for Nuxt3

nuxt-graphql-client ⚡️ Minimal GraphQL Client + Code Generation for Nuxt ⚡️ Minimal GraphQL Client + Code Generation for Nuxt Documentation Features Z

Conrawl Rogers 245 Dec 27, 2022
Create Nuxt3 apps with zero effort.

Create Nuxt3 Create Nuxt3 apps with zero effort. Features Select UI frameworks and install it from list Install extra modules like '@nuxt/content' Ins

Mehmet Ali Külahçı 8 Jul 9, 2022
🪅 Nuxt 3 module to connect with any API securely – server proxy & customizable composable names

nuxt-api-party This module provides composables to fetch data from an API of your choice securely. You can customize the composable names! Given json-

Johann Schopplich 65 Dec 26, 2022
OpenID-Connect(OIDC) integration module for nuxt 3.0.

Nuxt OpenID-Connect OpenID-Connect(OIDC) integration module for nuxt 3.0. Features An Nuxt 3 module. OIDC integration ( implemetation base openid-clie

Aborn Jiang 10 Dec 24, 2022
Matteo Bruni 4.7k Jan 4, 2023
Easily remove all refs from an object using the `deepUnref`-composable.

Vue - Deep Unrefs Similar to unref(), easily remove all refs recursively from an object using the deepUnref-composable. ?? Get Started Luckily, it's i

Open Web 4 May 19, 2022
Easily remove all refs from an object using the `deepUnref`-composable.

Vue - Deep Unrefs Similar to unref(), easily remove all refs recursively from an object using the deepUnref-composable. ?? Get Started Luckily, it's i

Open Web Foundation 4 May 19, 2022
quickly start your Vue dev server

vue-fast-dev-server 10倍缩短您的vue dev server启动时间 安装 npm install vue-fast-dev-server --save-dev vue.config.js const path = require('path') module.exports

null 22 Feb 28, 2022
A Nuxt.js module that injects a server route to serve the GraphQL Playground

@pin-pon/nuxt-graphql-playground A Nuxt.js module that injects a server route to serve the GraphQL Playground Setup Add @pin-pon/nuxt-graphql-playgrou

Pin-Pon 3 Sep 22, 2022
A Vite plugin for projecting your application onto a remote production page during development.

vite-plugin-proxy-page A Vite plugin for developing an SPA in the context of a deployed production page. What's the Problem? It's an increasingly comm

Alex MacArthur 13 Nov 13, 2022
My first Angular application

todolist Github Pages link not working, the link is not displaying the actual site, its showing nothing. Please help if you can identify the mistake.

Soham Sarkar 2 Jul 1, 2021
Carpatin is a React JS Admin Dashboard Template that focuses on the management flows of a back-office application. We leverage the Material-UI power of stylizing the components in a way that feels more professional.

Carpatin Dashboard Free Carpatin is a React Js Admin Dashboard Template that focuses on the management flows of a back-office application. We leverage

Devias 64 Dec 12, 2022
multiple page application create by vue-cli4.5.15

vue-multiple-cli create mutiple page by vue-cli4.5.15 基于vue-cli4.5.15搭建的多页面应用,主要是将src目录下单文件应用改成多模块的应用,使其一个脚手架可以开发多个互不影响的模块,同时又可以共用一些公共组件和方法。 安装使用 git

LewisLen 1 Dec 25, 2021
A headless, single-page dashboard application for Shoplix

Configure API address cd ui-domain vi api.js set api address // development environment export const dev = { base: 'your api address', seller: 'yo

Shopflix 26 May 5, 2022
A headless, single-page dashboard application for Shoplix

Configure API address cd ui-domain vi api.js set api address // development environment export const dev = { base: 'your api address', seller: 'yo

Shopfly 26 Apr 22, 2022
Durudex Web Application.

⚡️ Durudex Web ?? Modules api: @urql/core-based client for Durudex API app: SolidJS application lib: SolidJS extensions and utilities form: object-ori

Durudex 10 Dec 15, 2022
:necktie: :briefcase: Build fast :rocket: and easy multiple beautiful resumes and create your best CV ever! Made with Vue and LESS.

best-resume-ever ?? ?? Build fast ?? and easy multiple beautiful resumes and create your best CV ever! Made with Vue and LESS. Cool Creative Green Pur

Sara Steiert 15.8k Jan 9, 2023
The first truly composable CSS animation library. Built for Vue, React, SCSS, and CSS, AnimXYZ will bring your website to life.

AnimXYZ animxyz.com AnimXYZ helps you create, customize, and compose animations for your website. Powered by CSS variables to allow a nearly limitless

Ingram Projects 2.1k Jan 2, 2023
A simple, customization star rating component for your vue3 projects

vue3-star-ratings A simple, customizable component for star ratings Documentation Features Uses svg for the stars, so it can scale without quality los

Abiodun Olunu 14 Oct 7, 2022