|
1 |
| -"use client"; |
| 1 | +import { InfoBox, VARIANTS } from "@pythnetwork/component-library/InfoBox"; |
| 2 | +import type { ComponentProps, ReactNode } from "react"; |
| 3 | +import { Case } from "../Case"; |
2 | 4 |
|
3 |
| -import { Link } from "@pythnetwork/component-library/unstyled/Link"; |
4 |
| -import clsx from "clsx"; |
5 |
| -import type { ComponentProps, ElementType, ReactNode } from "react"; |
6 |
| - |
7 |
| -import styles from "./index.module.scss"; |
8 |
| - |
9 |
| -export const VARIANTS = [ |
10 |
| - "default", |
11 |
| - "primary", |
12 |
| - "secondary", |
13 |
| - "tertiary", |
14 |
| - "error", |
15 |
| - "info", |
16 |
| - "warning", |
17 |
| - "important", |
18 |
| - "success", |
19 |
| -] as const; |
20 |
| - |
21 |
| -type OwnProps = { |
| 5 | +type Props = ComponentProps<"div"> & { |
| 6 | + icon?: ReactNode; |
| 7 | + header?: ReactNode; |
22 | 8 | variant?: (typeof VARIANTS)[number] | undefined;
|
23 |
| - icon?: ReactNode | undefined; |
24 |
| - nonInteractive?: boolean | undefined; |
25 | 9 | };
|
26 | 10 |
|
27 |
| -export type Props<T extends ElementType> = Omit< |
28 |
| - ComponentProps<T>, |
29 |
| - keyof OwnProps |
30 |
| -> & |
31 |
| - OwnProps; |
32 |
| - |
33 |
| -export const Callout = ( |
34 |
| - props: (Props<"div"> & { nonInteractive?: true }) | Props<typeof Link>, |
35 |
| -) => { |
36 |
| - if (props.nonInteractive) { |
37 |
| - // eslint-disable-next-line @typescript-eslint/no-unused-vars |
38 |
| - const { nonInteractive, ...otherProps } = props; |
39 |
| - return <div {...calloutProps(otherProps)} />; |
40 |
| - } else if ("href" in props) { |
41 |
| - return <Link {...calloutProps(props)} />; |
42 |
| - } else { |
43 |
| - return <div {...calloutProps(props)} />; |
44 |
| - } |
| 11 | +const DEFAULT_ICONS: Record<(typeof VARIANTS)[number], string> = { |
| 12 | + neutral: "⦿", |
| 13 | + info: "💡", |
| 14 | + warning: "⚠️", |
| 15 | + error: "❗", |
| 16 | + data: "💾", |
| 17 | + success: "🎉", |
45 | 18 | };
|
46 | 19 |
|
47 |
| -const calloutProps = <T extends ElementType>({ |
48 |
| - className, |
49 |
| - variant = "default", |
50 |
| - children, |
| 20 | +export const Callout = ({ |
51 | 21 | icon,
|
52 |
| - ...props |
53 |
| -}: Props<T>) => ({ |
54 |
| - ...props, |
55 |
| - "data-variant": variant, |
56 |
| - className: clsx(styles.callout, className), |
57 |
| - children: ( |
58 |
| - <> |
59 |
| - <div className={styles.hover} /> |
60 |
| - <div className={styles.body}> |
61 |
| - {Boolean(icon) && <div className={styles.icon}>{icon}</div>} |
62 |
| - <div>{children}</div> |
63 |
| - </div> |
64 |
| - </> |
65 |
| - ), |
66 |
| -}); |
| 22 | + header, |
| 23 | + variant = "info", |
| 24 | + children, |
| 25 | + ...rest |
| 26 | +}: Props) => { |
| 27 | + return ( |
| 28 | + <InfoBox |
| 29 | + icon={icon ?? DEFAULT_ICONS[variant] ?? DEFAULT_ICONS["info"]} |
| 30 | + header={header ?? <Case variant="APA Title Case">{variant}</Case>} |
| 31 | + variant={variant} |
| 32 | + {...rest} |
| 33 | + > |
| 34 | + {children} |
| 35 | + </InfoBox> |
| 36 | + ); |
| 37 | +}; |
0 commit comments