From 21c2b187367777ed4bf33b7cc263784913815c01 Mon Sep 17 00:00:00 2001 From: Katie Langerman <18661030+langermank@users.noreply.github.com> Date: Mon, 23 Sep 2024 13:01:02 -0700 Subject: [PATCH] adding functionality to match dotcom --- .../IssueLabel/IssueLabel.module.css | 192 ++++++++++++ .../IssueLabel/IssueLabel.stories.tsx | 11 +- .../experimental/IssueLabel/IssueLabel.tsx | 281 +++++------------- 3 files changed, 271 insertions(+), 213 deletions(-) create mode 100644 packages/react/src/experimental/IssueLabel/IssueLabel.module.css diff --git a/packages/react/src/experimental/IssueLabel/IssueLabel.module.css b/packages/react/src/experimental/IssueLabel/IssueLabel.module.css new file mode 100644 index 00000000000..8e47f7acfcc --- /dev/null +++ b/packages/react/src/experimental/IssueLabel/IssueLabel.module.css @@ -0,0 +1,192 @@ +.IssueLabel { + background-color: var(--label-bgColor-rest); + color: var(--label-fgColor); + border: none; + display: inline-flex; + align-items: center; + border-radius: 999px; + font-size: 12px; + line-height: calc(20 / 12); + font-weight: var(--base-text-weight-semibold, 600); + + &[data-size='small'] { + min-height: var(--base-size-20, 1.25rem); + padding-inline: var(--base-size-8, 0.5rem); + } + + &[data-size='large'] { + min-height: var(--base-size-24, 1.5rem); + padding-inline: var(--base-size-12, 0.75rem); + } + + &[data-variant='pink'] { + --label-bgColor-rest: var(--label-pink-bgColor-rest); + --label-bgColor-hover: var(--label-pink-bgColor-hover); + --label-bgColor-active: var(--label-pink-bgColor-active); + --label-fgColor: var(--label-pink-fgColor-rest); + --label-fgColor-hover: var(--label-pink-fgColor-hover); + --label-fgColor-active: var(--label-pink-fgColor-active); + } + + &[data-variant='plum'] { + --label-bgColor-rest: var(--label-plum-bgColor-rest); + --label-bgColor-hover: var(--label-plum-bgColor-hover); + --label-bgColor-active: var(--label-plum-bgColor-active); + --label-fgColor: var(--label-plum-fgColor-rest); + --label-fgColor-hover: var(--label-plum-fgColor-hover); + --label-fgColor-active: var(--label-plum-fgColor-active); + } + + &[data-variant='purple'] { + --label-bgColor-rest: var(--label-purple-bgColor-rest); + --label-bgColor-hover: var(--label-purple-bgColor-hover); + --label-bgColor-active: var(--label-purple-bgColor-active); + --label-fgColor: var(--label-purple-fgColor-rest); + --label-fgColor-hover: var(--label-purple-fgColor-hover); + --label-fgColor-active: var(--label-purple-fgColor-active); + } + + &[data-variant='indigo'] { + --label-bgColor-rest: var(--label-indigo-bgColor-rest); + --label-bgColor-hover: var(--label-indigo-bgColor-hover); + --label-bgColor-active: var(--label-indigo-bgColor-active); + --label-fgColor: var(--label-indigo-fgColor-rest); + --label-fgColor-hover: var(--label-indigo-fgColor-hover); + --label-fgColor-active: var(--label-indigo-fgColor-active); + } + + &[data-variant='blue'] { + --label-bgColor-rest: var(--label-blue-bgColor-rest); + --label-bgColor-hover: var(--label-blue-bgColor-hover); + --label-bgColor-active: var(--label-blue-bgColor-active); + --label-fgColor: var(--label-blue-fgColor-rest); + --label-fgColor-hover: var(--label-blue-fgColor-hover); + --label-fgColor-active: var(--label-blue-fgColor-active); + } + + &[data-variant='cyan'] { + --label-bgColor-rest: var(--label-cyan-bgColor-rest); + --label-bgColor-hover: var(--label-cyan-bgColor-hover); + --label-bgColor-active: var(--label-cyan-bgColor-active); + --label-fgColor: var(--label-cyan-fgColor-rest); + --label-fgColor-hover: var(--label-cyan-fgColor-hover); + --label-fgColor-active: var(--label-cyan-fgColor-active); + } + + &[data-variant='teal'] { + --label-bgColor-rest: var(--label-teal-bgColor-rest); + --label-bgColor-hover: var(--label-teal-bgColor-hover); + --label-bgColor-active: var(--label-teal-bgColor-active); + --label-fgColor: var(--label-teal-fgColor-rest); + --label-fgColor-hover: var(--label-teal-fgColor-hover); + --label-fgColor-active: var(--label-teal-fgColor-active); + } + + &[data-variant='pine'] { + --label-bgColor-rest: var(--label-pine-bgColor-rest); + --label-bgColor-hover: var(--label-pine-bgColor-hover); + --label-bgColor-active: var(--label-pine-bgColor-active); + --label-fgColor: var(--label-pine-fgColor-rest); + --label-fgColor-hover: var(--label-pine-fgColor-hover); + --label-fgColor-active: var(--label-pine-fgColor-active); + } + + &[data-variant='green'] { + --label-bgColor-rest: var(--label-green-bgColor-rest); + --label-bgColor-hover: var(--label-green-bgColor-hover); + --label-bgColor-active: var(--label-green-bgColor-active); + --label-fgColor: var(--label-green-fgColor-rest); + --label-fgColor-hover: var(--label-green-fgColor-hover); + --label-fgColor-active: var(--label-green-fgColor-active); + } + + &[data-variant='lime'] { + --label-bgColor-rest: var(--label-lime-bgColor-rest); + --label-bgColor-hover: var(--label-lime-bgColor-hover); + --label-bgColor-active: var(--label-lime-bgColor-active); + --label-fgColor: var(--label-lime-fgColor-rest); + --label-fgColor-hover: var(--label-lime-fgColor-hover); + --label-fgColor-active: var(--label-lime-fgColor-active); + } + + &[data-variant='olive'] { + --label-bgColor-rest: var(--label-olive-bgColor-rest); + --label-bgColor-hover: var(--label-olive-bgColor-hover); + --label-bgColor-active: var(--label-olive-bgColor-active); + --label-fgColor: var(--label-olive-fgColor-rest); + --label-fgColor-hover: var(--label-olive-fgColor-hover); + --label-fgColor-active: var(--label-olive-fgColor-active); + } + + &[data-variant='lemon'] { + --label-bgColor-rest: var(--label-lemon-bgColor-rest); + --label-bgColor-hover: var(--label-lemon-bgColor-hover); + --label-bgColor-active: var(--label-lemon-bgColor-active); + --label-fgColor: var(--label-lemon-fgColor-rest); + --label-fgColor-hover: var(--label-lemon-fgColor-hover); + --label-fgColor-active: var(--label-lemon-fgColor-active); + } + + &[data-variant='yellow'] { + --label-bgColor-rest: var(--label-yellow-bgColor-rest); + --label-bgColor-hover: var(--label-yellow-bgColor-hover); + --label-bgColor-active: var(--label-yellow-bgColor-active); + --label-fgColor: var(--label-yellow-fgColor-rest); + --label-fgColor-hover: var(--label-yellow-fgColor-hover); + --label-fgColor-active: var(--label-yellow-fgColor-active); + } + + &[data-variant='orange'] { + --label-bgColor-rest: var(--label-orange-bgColor-rest); + --label-bgColor-hover: var(--label-orange-bgColor-hover); + --label-bgColor-active: var(--label-orange-bgColor-active); + --label-fgColor: var(--label-orange-fgColor-rest); + --label-fgColor-hover: var(--label-orange-fgColor-hover); + --label-fgColor-active: var(--label-orange-fgColor-active); + } + + &[data-variant='red'] { + --label-bgColor-rest: var(--label-red-bgColor-rest); + --label-bgColor-hover: var(--label-red-bgColor-hover); + --label-bgColor-active: var(--label-red-bgColor-active); + --label-fgColor: var(--label-red-fgColor-rest); + --label-fgColor-hover: var(--label-red-fgColor-hover); + --label-fgColor-active: var(--label-red-fgColor-active); + } + + &[data-variant='coral'] { + --label-bgColor-rest: var(--label-coral-bgColor-rest); + --label-bgColor-hover: var(--label-coral-bgColor-hover); + --label-bgColor-active: var(--label-coral-bgColor-active); + --label-fgColor: var(--label-coral-fgColor-rest); + --label-fgColor-hover: var(--label-coral-fgColor-hover); + --label-fgColor-active: var(--label-coral-fgColor-active); + } + + &[data-variant='gray'] { + --label-bgColor-rest: var(--label-gray-bgColor-rest); + --label-bgColor-hover: var(--label-gray-bgColor-hover); + --label-bgColor-active: var(--label-gray-bgColor-active); + --label-fgColor: var(--label-gray-fgColor-rest); + --label-fgColor-hover: var(--label-gray-fgColor-hover); + --label-fgColor-active: var(--label-gray-fgColor-active); + } + + &[data-variant='brown'] { + --label-bgColor-rest: var(--label-brown-bgColor-rest); + --label-bgColor-hover: var(--label-brown-bgColor-hover); + --label-bgColor-active: var(--label-brown-bgColor-active); + --label-fgColor: var(--label-brown-fgColor-rest); + --label-fgColor-hover: var(--label-brown-fgColor-hover); + --label-fgColor-active: var(--label-brown-fgColor-active); + } + + &[data-variant='auburn'] { + --label-bgColor-rest: var(--label-auburn-bgColor-rest); + --label-bgColor-hover: var(--label-auburn-bgColor-hover); + --label-bgColor-active: var(--label-auburn-bgColor-active); + --label-fgColor: var(--label-auburn-fgColor-rest); + --label-fgColor-hover: var(--label-auburn-fgColor-hover); + --label-fgColor-active: var(--label-auburn-fgColor-active); + } +} diff --git a/packages/react/src/experimental/IssueLabel/IssueLabel.stories.tsx b/packages/react/src/experimental/IssueLabel/IssueLabel.stories.tsx index 69c649caa2d..50104a3bd51 100644 --- a/packages/react/src/experimental/IssueLabel/IssueLabel.stories.tsx +++ b/packages/react/src/experimental/IssueLabel/IssueLabel.stories.tsx @@ -9,11 +9,13 @@ const meta = { export default meta -export const Default = () => Issue label +export const Default = () => export const Playground: StoryObj = { - render: args => Issue label, - args: {}, + render: args => , + args: { + text: 'Issue label', + }, argTypes: { fillColor: { hex: undefined, @@ -47,5 +49,8 @@ export const Playground: StoryObj = { 'auburn', ], }, + text: { + control: 'text', + }, }, } diff --git a/packages/react/src/experimental/IssueLabel/IssueLabel.tsx b/packages/react/src/experimental/IssueLabel/IssueLabel.tsx index 4d44b7834e2..6f8472c6601 100644 --- a/packages/react/src/experimental/IssueLabel/IssueLabel.tsx +++ b/packages/react/src/experimental/IssueLabel/IssueLabel.tsx @@ -1,8 +1,8 @@ import React from 'react' -import styled from 'styled-components' -import {get} from '../../constants' import {getColorsFromHex} from './getColorFromHex' import {useTheme} from '../../ThemeProvider' +import {clsx} from 'clsx' +import classes from './IssueLabel.module.css' export type Hex = `#${string}` type LabelColorVariant = @@ -28,24 +28,57 @@ type LabelColorVariant = // These colors should overlap with label -export interface IssueLabelProps extends React.PropsWithChildren { - /** - * - */ +// extends Omit, 'size' | 'id'> + +export interface IssueLabelProps { fillColor?: Hex + size?: 'small' | 'large' + variant?: LabelColorVariant + href?: string + as?: 'button' | 'a' | 'span' /** - * + * The function that gets called when a user clicks the remove button, or keys "Backspace" or "Delete" when focused on the token */ - size?: 'small' | 'large' - + onRemove?: () => void /** - * + * Whether the token is selected */ - variant?: LabelColorVariant + isSelected?: boolean + /** + * The text label inside the token + */ + text: React.ReactNode + /** + * A unique identifier that can be associated with the token + */ + id?: number | string + + className?: string + onClick?: React.MouseEventHandler + onFocus?: React.FocusEventHandler + // onClick?: (event: MouseEvent) => void + // onFocus?: (event: FocusEvent) => void } -export function IssueLabel({children, fillColor, size = 'small', variant = 'gray', ...rest}: IssueLabelProps) { +export function IssueLabel({ + className, + fillColor, + size = 'small', + variant = 'gray', + href, + onClick, + onFocus, + text, + as, + id, + ...rest +}: IssueLabelProps) { + // Error handling: `href` and `onClick` should not be set simultaneously + if (href && onClick) { + throw new Error('`href` and `onClick` cannot both be set. Choose either a link (``) or a button (`