5.24.1 • Published 10 months ago

@purpurds/icon v5.24.1

Weekly downloads
-
License
AGPL-3.0-only
Repository
-
Last release
10 months ago

import { Meta, Stories, ArgTypes, Canvas, Subtitle } from "@storybook/blocks";

import * as IconStories from "./src/icon.stories"; import packageInfo from "./package.json";

Icon

Version {packageInfo.version}

Showcase

Properties

Installation

Via NPM

Add the dependency to your consumer app like "@purpurds/purpur": "^x.y.z"

In MyApp.tsx

import "@purpurds/purpur/styles";

Examples

In MyComponent.tsx

Specific icon component

import { IconAiRobot } from "@purpurds/purpur";

export const MyComponent = () => {
  return (
    <div>
      <IconAiRobot size="xs" />
    </div>
  );
};

General icon component with prop

import { Icon, aiRobot } from "@purpurds/purpur";

export const MyComponent = () => {
  return (
    <div>
      <Icon svg={aiRobot} size="xs" />
    </div>
  );
};

Usage with dynamic import

If you don't know beforehand what icon to use, e.g. if it comes from a CMS, you can use a dynamic import. Be aware that this will result in a larger bundle size since all icons have to be included in the bundle.

import React, { useEffect, useState } from "react";
import type { IconBaseProps, IconName } from "@purpurds/icon";
import { DEFAULT_SIZE } from "@purpurds/icon";
import { pascalCase } from "change-case";

export type IconDynamicProps = {
  name: IconName;
} & IconBaseProps;

export const IconDynamic = ({
  ["data-testid"]: dataTestId,
  name,
  className,
  allyTitle,
  size = DEFAULT_SIZE,
  ...props
}: IconDynamicProps) => {
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const [Component, setComponent] = useState<React.ComponentType<any> | null>(null);

  useEffect(() => {
    const importComponent = async () => {
      try {
        const module = await import(`@purpurds/icon/dist/components/${name}.es.js`);
        setComponent(() => module[`Icon${pascalCase(name)}`]);
      } catch (error) {
        // eslint-disable-next-line no-console
        console.error(`Error importing component "${name}":`, error);
      }
    };

    importComponent();
  }, [name]);

  return Component ? (
    <Component
      allyTitle={allyTitle}
      className={className}
      size={size}
      data-testid={dataTestId}
      {...props}
    />
  ) : null;
};

IconDynamic.displayName = "IconDynamic";
5.24.1

10 months ago

5.24.0

10 months ago

5.23.0

10 months ago

5.21.1

10 months ago

5.21.0

10 months ago

5.22.0

10 months ago

5.18.3

11 months ago

5.18.2

11 months ago

5.18.1

11 months ago

5.18.0

11 months ago

5.19.1

11 months ago

5.19.0

11 months ago

5.17.0

11 months ago

5.20.1

11 months ago

5.20.0

11 months ago

5.16.1

11 months ago

5.16.0

11 months ago

5.15.1

11 months ago

5.15.0

11 months ago

5.14.0

12 months ago

5.5.0

1 year ago

5.3.0

1 year ago

5.1.2

1 year ago

5.13.0

12 months ago

5.11.2

1 year ago

5.11.1

1 year ago

5.11.0

1 year ago

5.8.2

1 year ago

5.8.1

1 year ago

5.8.0

1 year ago

5.4.3

1 year ago

5.6.0

1 year ago

5.4.2

1 year ago

5.4.1

1 year ago

5.4.0

1 year ago

5.2.0

1 year ago

5.12.0

1 year ago

5.10.1

1 year ago

5.10.0

1 year ago

5.9.0

1 year ago

5.7.0

1 year ago

5.1.1

1 year ago

5.1.0

1 year ago

5.0.0

1 year ago

4.5.0

1 year ago

4.6.0

1 year ago

4.5.1

1 year ago

4.4.0

1 year ago

4.3.0

1 year ago

4.2.0

1 year ago

4.1.1

1 year ago

4.1.0

1 year ago

4.0.2

1 year ago

4.0.1

1 year ago

4.0.0

1 year ago

3.7.1

1 year ago

3.7.0

1 year ago

3.6.0

1 year ago

3.5.1

1 year ago

3.5.0

1 year ago

3.4.0

1 year ago

3.3.2

1 year ago

3.3.1

1 year ago

3.3.0

1 year ago

3.2.0

1 year ago

3.1.0

1 year ago

3.0.1

1 year ago

3.0.0

1 year ago

2.8.0

1 year ago