5.24.1 • Published 9 months ago

@purpurds/icon v5.24.1

Weekly downloads
-
License
AGPL-3.0-only
Repository
-
Last release
9 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

9 months ago

5.24.0

9 months ago

5.23.0

9 months ago

5.21.1

9 months ago

5.21.0

9 months ago

5.22.0

9 months ago

5.18.3

10 months ago

5.18.2

10 months ago

5.18.1

10 months ago

5.18.0

10 months ago

5.19.1

9 months ago

5.19.0

9 months ago

5.17.0

10 months ago

5.20.1

9 months ago

5.20.0

9 months ago

5.16.1

10 months ago

5.16.0

10 months ago

5.15.1

10 months ago

5.15.0

10 months ago

5.14.0

11 months ago

5.5.0

1 year ago

5.3.0

1 year ago

5.1.2

1 year ago

5.13.0

11 months ago

5.11.2

11 months ago

5.11.1

11 months ago

5.11.0

11 months 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

11 months ago

5.10.1

12 months ago

5.10.0

12 months 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