diff --git a/src/elements/Link.tsx b/src/elements/Link.tsx new file mode 100644 index 00000000..fbcae0d1 --- /dev/null +++ b/src/elements/Link.tsx @@ -0,0 +1,31 @@ +import { type AnchorHTMLAttributes } from 'react' +import styled from 'styled-components' + +export type LinkProps = AnchorHTMLAttributes + +export const Link = styled.a` + color: ${p => p.theme.color.slateGray}; + text-decoration: underline; + + &:hover, + &._hover { + color: ${p => p.theme.color.blueYonder}; + svg { + color: ${p => p.theme.color.blueYonder}; + } + } + + &:active, + &._active { + color: ${p => p.theme.color.blueGray}; + svg { + color: ${p => p.theme.color.blueGray}; + } + } + + &:visited { + color: ${p => p.theme.color.slateGray}; + } +` + +Link.displayName = 'LinkButton' diff --git a/src/elements/LinkButton.tsx b/src/elements/LinkButton.tsx index 3b418e5e..f03b2b95 100644 --- a/src/elements/LinkButton.tsx +++ b/src/elements/LinkButton.tsx @@ -24,15 +24,15 @@ const ICON_SIZE: Record = { } const StyledLinkButton = styled.button` + align-items: flex-end; + background: transparent; + color: ${p => p.theme.color.slateGray}; + cursor: ${p => (p.disabled ? 'none' : 'pointer')}; display: flex; flex-direction: row; + font-size: ${p => FONT_SIZE[p.size]}; gap: 0.4rem; - align-items: flex-end; - background: transparent; text-decoration: underline; - cursor: ${({ disabled }: LinkButtonProps) => (disabled ? 'none' : 'pointer')}}; - font-size: ${({ size }: LinkButtonProps) => FONT_SIZE[size]}}; - color: ${p => p.theme.color.slateGray}; &:hover, &._hover { @@ -59,7 +59,7 @@ const StyledLinkButton = styled.button` } ` -function LinkButton({ children, Icon, ...props }: Readonly) { +export function LinkButton({ children, Icon, ...props }: Readonly) { return ( <> @@ -71,5 +71,3 @@ function LinkButton({ children, Icon, ...props }: Readonly) { } LinkButton.displayName = 'LinkButton' - -export { LinkButton } diff --git a/src/index.ts b/src/index.ts index 4f021cd1..50bca9cb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,6 +36,7 @@ export { IconButton } from './elements/IconButton' export { LinkButton } from './elements/LinkButton' export { Label } from './elements/Label' export { Legend } from './elements/Legend' +export { Link } from './elements/Link' export { Tag } from './elements/Tag' export { TagGroup } from './elements/TagGroup' @@ -209,6 +210,7 @@ export type { FigureProps } from './elements/Figure' export type { IconButtonProps } from './elements/IconButton' export type { LabelProps } from './elements/Label' export type { LegendProps } from './elements/Legend' +export type { LinkProps } from './elements/Link' export type { LinkButtonProps } from './elements/LinkButton' export type { TagProps } from './elements/Tag' export type { TagGroupProps } from './elements/TagGroup' diff --git a/stories/elements/Link.stories.tsx b/stories/elements/Link.stories.tsx new file mode 100644 index 00000000..da6f8b4b --- /dev/null +++ b/stories/elements/Link.stories.tsx @@ -0,0 +1,31 @@ +import { META_DEFAULTS } from '../../.storybook/constants' +import { generateStoryDecorator } from '../../.storybook/utils/generateStoryDecorator' +import { Link } from '../../src' + +import type { LinkProps } from '../../src' +import type { Meta } from '@storybook/react' + +/* eslint-disable sort-keys-fix/sort-keys-fix */ +const meta: Meta = { + ...META_DEFAULTS, + + title: 'Elements/Link', + component: Link, + + decorators: [generateStoryDecorator()] +} +/* eslint-enable sort-keys-fix/sort-keys-fix */ + +export default meta + +export function _Link(_props: LinkProps) { + return ( +

+ Here is{' '} + + a simple link + + . +

+ ) +}