Merge branch 'andrehadianto/design-system-components' of https://github.com/snowball-tools/snowballtools-base into ayungavis/T-4845-datepicker
This commit is contained in:
commit
2117f3e2a7
@ -8,7 +8,9 @@
|
|||||||
"@radix-ui/react-avatar": "^1.0.4",
|
"@radix-ui/react-avatar": "^1.0.4",
|
||||||
"@radix-ui/react-checkbox": "^1.0.4",
|
"@radix-ui/react-checkbox": "^1.0.4",
|
||||||
"@radix-ui/react-popover": "^1.0.7",
|
"@radix-ui/react-popover": "^1.0.7",
|
||||||
|
"@radix-ui/react-radio-group": "^1.1.3",
|
||||||
"@radix-ui/react-tabs": "^1.0.4",
|
"@radix-ui/react-tabs": "^1.0.4",
|
||||||
|
"@radix-ui/react-tooltip": "^1.0.7",
|
||||||
"@testing-library/jest-dom": "^5.17.0",
|
"@testing-library/jest-dom": "^5.17.0",
|
||||||
"@testing-library/react": "^13.4.0",
|
"@testing-library/react": "^13.4.0",
|
||||||
"@testing-library/user-event": "^13.5.0",
|
"@testing-library/user-event": "^13.5.0",
|
||||||
|
@ -98,19 +98,29 @@ const Button = forwardRef<
|
|||||||
href,
|
href,
|
||||||
...baseLinkProps,
|
...baseLinkProps,
|
||||||
};
|
};
|
||||||
return <a {...externalLinkProps}>{_children}</a>;
|
return (
|
||||||
|
// @ts-expect-error - ref
|
||||||
|
<a ref={ref} {...externalLinkProps}>
|
||||||
|
{_children}
|
||||||
|
</a>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Internal link
|
// Internal link
|
||||||
return (
|
return (
|
||||||
<Link {...baseLinkProps} to={href}>
|
// @ts-expect-error - ref
|
||||||
|
<Link ref={ref} {...baseLinkProps} to={href}>
|
||||||
{_children}
|
{_children}
|
||||||
</Link>
|
</Link>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
const { ...buttonProps } = _props;
|
const { ...buttonProps } = _props;
|
||||||
// @ts-expect-error - as prop is not a valid prop for button elements
|
return (
|
||||||
return <button {...buttonProps}>{_children}</button>;
|
// @ts-expect-error - as prop is not a valid prop for button elements
|
||||||
|
<button ref={ref} {...buttonProps}>
|
||||||
|
{_children}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[],
|
[],
|
||||||
@ -161,8 +171,6 @@ const Button = forwardRef<
|
|||||||
return (
|
return (
|
||||||
<Component
|
<Component
|
||||||
{...props}
|
{...props}
|
||||||
// @ts-expect-error - ref is not a valid prop for button elements
|
|
||||||
ref={ref}
|
|
||||||
className={buttonTheme({ ...styleProps, class: className })}
|
className={buttonTheme({ ...styleProps, class: className })}
|
||||||
>
|
>
|
||||||
{cloneIcon(leftIcon, { ...iconSize })}
|
{cloneIcon(leftIcon, { ...iconSize })}
|
||||||
|
54
packages/frontend/src/components/shared/Radio/Radio.theme.ts
Normal file
54
packages/frontend/src/components/shared/Radio/Radio.theme.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import { VariantProps, tv } from 'tailwind-variants';
|
||||||
|
|
||||||
|
export const radioTheme = tv({
|
||||||
|
slots: {
|
||||||
|
root: ['flex', 'gap-3', 'flex-wrap'],
|
||||||
|
wrapper: ['flex', 'items-center', 'gap-2', 'group'],
|
||||||
|
label: ['text-sm', 'tracking-[-0.006em]', 'text-elements-high-em'],
|
||||||
|
radio: [
|
||||||
|
'w-5',
|
||||||
|
'h-5',
|
||||||
|
'rounded-full',
|
||||||
|
'border',
|
||||||
|
'group',
|
||||||
|
'border-border-interactive/10',
|
||||||
|
'shadow-button',
|
||||||
|
'group-hover:border-border-interactive/[0.14]',
|
||||||
|
'focus-ring',
|
||||||
|
// Checked
|
||||||
|
'data-[state=checked]:bg-controls-primary',
|
||||||
|
'data-[state=checked]:group-hover:bg-controls-primary-hovered',
|
||||||
|
],
|
||||||
|
indicator: [
|
||||||
|
'flex',
|
||||||
|
'items-center',
|
||||||
|
'justify-center',
|
||||||
|
'relative',
|
||||||
|
'w-full',
|
||||||
|
'h-full',
|
||||||
|
'after:content-[""]',
|
||||||
|
'after:block',
|
||||||
|
'after:w-2.5',
|
||||||
|
'after:h-2.5',
|
||||||
|
'after:rounded-full',
|
||||||
|
'after:bg-transparent',
|
||||||
|
'after:group-hover:bg-controls-disabled',
|
||||||
|
'after:group-focus-visible:bg-controls-disabled',
|
||||||
|
// Checked
|
||||||
|
'after:data-[state=checked]:bg-elements-on-primary',
|
||||||
|
'after:data-[state=checked]:group-hover:bg-elements-on-primary',
|
||||||
|
'after:data-[state=checked]:group-focus-visible:bg-elements-on-primary',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
variants: {
|
||||||
|
orientation: {
|
||||||
|
vertical: { root: ['flex-col'] },
|
||||||
|
horizontal: { root: ['flex-row'] },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
orientation: 'vertical',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export type RadioTheme = VariantProps<typeof radioTheme>;
|
63
packages/frontend/src/components/shared/Radio/Radio.tsx
Normal file
63
packages/frontend/src/components/shared/Radio/Radio.tsx
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {
|
||||||
|
Root as RadixRoot,
|
||||||
|
RadioGroupProps,
|
||||||
|
} from '@radix-ui/react-radio-group';
|
||||||
|
import { RadioTheme, radioTheme } from './Radio.theme';
|
||||||
|
import { RadioItem, RadioItemProps } from './RadioItem';
|
||||||
|
|
||||||
|
export interface RadioOption extends RadioItemProps {
|
||||||
|
/**
|
||||||
|
* The label of the radio option.
|
||||||
|
*/
|
||||||
|
label: string;
|
||||||
|
/**
|
||||||
|
* The value of the radio option.
|
||||||
|
*/
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RadioProps extends RadioGroupProps, RadioTheme {
|
||||||
|
/**
|
||||||
|
* The options of the radio.
|
||||||
|
* @default []
|
||||||
|
* @example
|
||||||
|
* ```tsx
|
||||||
|
* const options = [
|
||||||
|
* {
|
||||||
|
* label: 'Label 1',
|
||||||
|
* value: '1',
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* label: 'Label 2',
|
||||||
|
* value: '2',
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* label: 'Label 3',
|
||||||
|
* value: '3',
|
||||||
|
* },
|
||||||
|
* ];
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
options: RadioOption[];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Radio component is used to select one option from a list of options.
|
||||||
|
*/
|
||||||
|
export const Radio = ({
|
||||||
|
className,
|
||||||
|
options,
|
||||||
|
orientation,
|
||||||
|
...props
|
||||||
|
}: RadioProps) => {
|
||||||
|
const { root } = radioTheme({ orientation });
|
||||||
|
|
||||||
|
return (
|
||||||
|
<RadixRoot {...props} className={root({ className })}>
|
||||||
|
{options.map((option) => (
|
||||||
|
<RadioItem key={option.value} {...option} />
|
||||||
|
))}
|
||||||
|
</RadixRoot>
|
||||||
|
);
|
||||||
|
};
|
74
packages/frontend/src/components/shared/Radio/RadioItem.tsx
Normal file
74
packages/frontend/src/components/shared/Radio/RadioItem.tsx
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import React, { ComponentPropsWithoutRef } from 'react';
|
||||||
|
import {
|
||||||
|
Item as RadixRadio,
|
||||||
|
Indicator as RadixIndicator,
|
||||||
|
RadioGroupItemProps,
|
||||||
|
RadioGroupIndicatorProps,
|
||||||
|
} from '@radix-ui/react-radio-group';
|
||||||
|
import { radioTheme } from './Radio.theme';
|
||||||
|
|
||||||
|
export interface RadioItemProps extends RadioGroupItemProps {
|
||||||
|
/**
|
||||||
|
* The wrapper props of the radio item.
|
||||||
|
* You can use this prop to customize the wrapper props.
|
||||||
|
*/
|
||||||
|
wrapperProps?: ComponentPropsWithoutRef<'div'>;
|
||||||
|
/**
|
||||||
|
* The label props of the radio item.
|
||||||
|
* You can use this prop to customize the label props.
|
||||||
|
*/
|
||||||
|
labelProps?: ComponentPropsWithoutRef<'label'>;
|
||||||
|
/**
|
||||||
|
* The indicator props of the radio item.
|
||||||
|
* You can use this prop to customize the indicator props.
|
||||||
|
*/
|
||||||
|
indicatorProps?: RadioGroupIndicatorProps;
|
||||||
|
/**
|
||||||
|
* The id of the radio item.
|
||||||
|
*/
|
||||||
|
id?: string;
|
||||||
|
/**
|
||||||
|
* The label of the radio item.
|
||||||
|
*/
|
||||||
|
label?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The RadioItem component is used to render a radio item.
|
||||||
|
*/
|
||||||
|
export const RadioItem = ({
|
||||||
|
className,
|
||||||
|
wrapperProps,
|
||||||
|
labelProps,
|
||||||
|
indicatorProps,
|
||||||
|
label,
|
||||||
|
id,
|
||||||
|
...props
|
||||||
|
}: RadioItemProps) => {
|
||||||
|
const { wrapper, label: labelClass, radio, indicator } = radioTheme();
|
||||||
|
|
||||||
|
// Generate a unique id for the radio item from the label if the id is not provided
|
||||||
|
const kebabCaseLabel = label?.toLowerCase().replace(/\s+/g, '-');
|
||||||
|
const componentId = id ?? kebabCaseLabel;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={wrapper({ className: wrapperProps?.className })}>
|
||||||
|
<RadixRadio {...props} className={radio({ className })} id={componentId}>
|
||||||
|
<RadixIndicator
|
||||||
|
forceMount
|
||||||
|
{...indicatorProps}
|
||||||
|
className={indicator({ className: indicatorProps?.className })}
|
||||||
|
/>
|
||||||
|
</RadixRadio>
|
||||||
|
{label && (
|
||||||
|
<label
|
||||||
|
{...labelProps}
|
||||||
|
className={labelClass({ className: labelProps?.className })}
|
||||||
|
htmlFor={componentId}
|
||||||
|
>
|
||||||
|
{label}
|
||||||
|
</label>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
2
packages/frontend/src/components/shared/Radio/index.ts
Normal file
2
packages/frontend/src/components/shared/Radio/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export * from './Radio';
|
||||||
|
export * from './RadioItem';
|
@ -9,6 +9,8 @@ export const tabsTheme = tv({
|
|||||||
// Horizontal – default
|
// Horizontal – default
|
||||||
'px-1',
|
'px-1',
|
||||||
'pb-5',
|
'pb-5',
|
||||||
|
'cursor-default',
|
||||||
|
'select-none',
|
||||||
'text-elements-low-em',
|
'text-elements-low-em',
|
||||||
'border-b-2',
|
'border-b-2',
|
||||||
'border-transparent',
|
'border-transparent',
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
import { tv } from 'tailwind-variants';
|
||||||
|
|
||||||
|
export const tooltipTheme = tv({
|
||||||
|
slots: {
|
||||||
|
content: [
|
||||||
|
'z-tooltip',
|
||||||
|
'rounded-md',
|
||||||
|
'bg-surface-high-contrast',
|
||||||
|
'p-2',
|
||||||
|
'text-elements-on-high-contrast',
|
||||||
|
],
|
||||||
|
arrow: ['fill-surface-high-contrast'],
|
||||||
|
},
|
||||||
|
});
|
47
packages/frontend/src/components/shared/Tooltip/Tooltip.tsx
Normal file
47
packages/frontend/src/components/shared/Tooltip/Tooltip.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import type {
|
||||||
|
TooltipContentProps,
|
||||||
|
TooltipTriggerProps,
|
||||||
|
} from '@radix-ui/react-tooltip';
|
||||||
|
import { ReactNode, useState } from 'react';
|
||||||
|
|
||||||
|
import { TooltipBase, type TooltipBaseProps } from './TooltipBase';
|
||||||
|
|
||||||
|
export interface TooltipProps extends TooltipBaseProps {
|
||||||
|
triggerProps?: TooltipTriggerProps;
|
||||||
|
contentProps?: TooltipContentProps;
|
||||||
|
content?: ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/radix-ui/primitives/issues/955#issuecomment-1798201143
|
||||||
|
// Wrap on top of Tooltip base to make tooltip open on mobile via click
|
||||||
|
export const Tooltip = ({
|
||||||
|
children,
|
||||||
|
triggerProps,
|
||||||
|
contentProps,
|
||||||
|
content,
|
||||||
|
...props
|
||||||
|
}: TooltipProps) => {
|
||||||
|
const [isTooltipVisible, setIsTooltipVisible] = useState(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TooltipBase
|
||||||
|
open={isTooltipVisible}
|
||||||
|
onOpenChange={setIsTooltipVisible}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<TooltipBase.Trigger
|
||||||
|
asChild
|
||||||
|
onBlur={() => setIsTooltipVisible(false)}
|
||||||
|
onClick={() => setIsTooltipVisible((prevOpen) => !prevOpen)}
|
||||||
|
onFocus={() => setTimeout(() => setIsTooltipVisible(true), 0)}
|
||||||
|
{...triggerProps}
|
||||||
|
>
|
||||||
|
{triggerProps?.children ?? children}
|
||||||
|
</TooltipBase.Trigger>
|
||||||
|
<TooltipBase.Content {...contentProps}>
|
||||||
|
{content ?? contentProps?.children ?? 'Coming soon'}
|
||||||
|
</TooltipBase.Content>
|
||||||
|
</TooltipBase>
|
||||||
|
);
|
||||||
|
};
|
@ -0,0 +1,38 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {
|
||||||
|
Provider,
|
||||||
|
TooltipProps as RadixTooltipProps,
|
||||||
|
Root,
|
||||||
|
type TooltipProviderProps,
|
||||||
|
} from '@radix-ui/react-tooltip';
|
||||||
|
import { useState, type PropsWithChildren } from 'react';
|
||||||
|
|
||||||
|
import { TooltipContent } from './TooltipContent';
|
||||||
|
import { TooltipTrigger } from './TooltipTrigger';
|
||||||
|
|
||||||
|
export interface TooltipBaseProps extends RadixTooltipProps {
|
||||||
|
providerProps?: TooltipProviderProps;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TooltipBase = ({
|
||||||
|
children,
|
||||||
|
providerProps,
|
||||||
|
...props
|
||||||
|
}: PropsWithChildren<TooltipBaseProps>) => {
|
||||||
|
const [isTooltipVisible, setIsTooltipVisible] = useState(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Provider {...providerProps}>
|
||||||
|
<Root
|
||||||
|
open={isTooltipVisible}
|
||||||
|
onOpenChange={setIsTooltipVisible}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</Root>
|
||||||
|
</Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
TooltipBase.Trigger = TooltipTrigger;
|
||||||
|
TooltipBase.Content = TooltipContent;
|
@ -0,0 +1,46 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {
|
||||||
|
Arrow,
|
||||||
|
Content,
|
||||||
|
Portal,
|
||||||
|
type TooltipArrowProps,
|
||||||
|
type TooltipContentProps,
|
||||||
|
} from '@radix-ui/react-tooltip';
|
||||||
|
|
||||||
|
import { tooltipTheme } from '../Tooltip.theme';
|
||||||
|
|
||||||
|
export interface ContentProps extends TooltipContentProps {
|
||||||
|
hasArrow?: boolean;
|
||||||
|
arrowProps?: TooltipArrowProps;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TooltipContent = ({
|
||||||
|
children,
|
||||||
|
arrowProps,
|
||||||
|
className,
|
||||||
|
hasArrow = true,
|
||||||
|
...props
|
||||||
|
}: ContentProps) => {
|
||||||
|
const { content, arrow } = tooltipTheme();
|
||||||
|
return (
|
||||||
|
<Portal>
|
||||||
|
<Content
|
||||||
|
className={content({
|
||||||
|
className,
|
||||||
|
})}
|
||||||
|
sideOffset={5}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{hasArrow && (
|
||||||
|
<Arrow
|
||||||
|
className={arrow({
|
||||||
|
className: arrowProps?.className,
|
||||||
|
})}
|
||||||
|
{...arrowProps}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{children}
|
||||||
|
</Content>
|
||||||
|
</Portal>
|
||||||
|
);
|
||||||
|
};
|
@ -0,0 +1 @@
|
|||||||
|
export * from './TooltipContent';
|
@ -0,0 +1,12 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Trigger, type TooltipTriggerProps } from '@radix-ui/react-tooltip';
|
||||||
|
|
||||||
|
export type TriggerProps = TooltipTriggerProps;
|
||||||
|
|
||||||
|
export const TooltipTrigger = ({ children, ...props }: TriggerProps) => {
|
||||||
|
return (
|
||||||
|
<Trigger asChild {...props}>
|
||||||
|
{children}
|
||||||
|
</Trigger>
|
||||||
|
);
|
||||||
|
};
|
@ -0,0 +1 @@
|
|||||||
|
export * from './TooltipTrigger';
|
2
packages/frontend/src/components/shared/Tooltip/index.ts
Normal file
2
packages/frontend/src/components/shared/Tooltip/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export * from './Tooltip';
|
||||||
|
export * from './TooltipBase';
|
@ -18,16 +18,20 @@ import {
|
|||||||
renderTabs,
|
renderTabs,
|
||||||
renderVerticalTabs,
|
renderVerticalTabs,
|
||||||
} from './renders/tabs';
|
} from './renders/tabs';
|
||||||
|
import { RADIO_OPTIONS } from './renders/radio';
|
||||||
|
import { Radio } from 'components/shared/Radio';
|
||||||
import {
|
import {
|
||||||
renderInlineNotificationWithDescriptions,
|
renderInlineNotificationWithDescriptions,
|
||||||
renderInlineNotifications,
|
renderInlineNotifications,
|
||||||
} from './renders/inlineNotifications';
|
} from './renders/inlineNotifications';
|
||||||
import { renderInputs } from './renders/input';
|
import { renderInputs } from './renders/input';
|
||||||
import { DatePicker } from 'components/shared/DatePicker';
|
import { DatePicker } from 'components/shared/DatePicker';
|
||||||
|
import { renderTooltips } from './renders/tooltip';
|
||||||
|
|
||||||
const Page = () => {
|
const Page = () => {
|
||||||
const [singleDate, setSingleDate] = useState<Value>();
|
const [singleDate, setSingleDate] = useState<Value>();
|
||||||
const [dateRange, setDateRange] = useState<Value>();
|
const [dateRange, setDateRange] = useState<Value>();
|
||||||
|
const [selectedRadio, setSelectedRadio] = useState<string>('');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="relative h-full min-h-full">
|
<div className="relative h-full min-h-full">
|
||||||
@ -42,13 +46,21 @@ const Page = () => {
|
|||||||
|
|
||||||
<div className="w-full h border border-gray-200 px-20 my-10" />
|
<div className="w-full h border border-gray-200 px-20 my-10" />
|
||||||
|
|
||||||
{/* Button */}
|
|
||||||
<div className="flex flex-col gap-10 items-center justify-between">
|
<div className="flex flex-col gap-10 items-center justify-between">
|
||||||
|
<h1 className="text-2xl font-bold">Tooltip</h1>
|
||||||
|
<div className="flex w-full flex-wrap max-w-[680px] justify-center gap-10">
|
||||||
|
{renderTooltips()}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="w-full h border border-gray-200 px-20 my-10" />
|
||||||
|
|
||||||
|
{/* Input */}
|
||||||
<h1 className="text-2xl font-bold">Input</h1>
|
<h1 className="text-2xl font-bold">Input</h1>
|
||||||
<div className="flex w-full flex-col gap-10">{renderInputs()}</div>
|
<div className="flex w-full flex-col gap-10">{renderInputs()}</div>
|
||||||
|
|
||||||
<div className="w-full h border border-gray-200 px-20 my-10" />
|
<div className="w-full h border border-gray-200 px-20 my-10" />
|
||||||
|
|
||||||
|
{/* Button */}
|
||||||
<h1 className="text-2xl font-bold">Button</h1>
|
<h1 className="text-2xl font-bold">Button</h1>
|
||||||
<div className="flex flex-col gap-10">
|
<div className="flex flex-col gap-10">
|
||||||
{renderButtons()}
|
{renderButtons()}
|
||||||
@ -162,6 +174,27 @@ const Page = () => {
|
|||||||
|
|
||||||
<div className="w-full h border border-gray-200 px-20 my-10" />
|
<div className="w-full h border border-gray-200 px-20 my-10" />
|
||||||
|
|
||||||
|
{/* Radio */}
|
||||||
|
<div className="flex flex-col gap-10 items-center justify-between">
|
||||||
|
<h1 className="text-2xl font-bold">Radio</h1>
|
||||||
|
<div className="flex gap-20 items-start">
|
||||||
|
<Radio
|
||||||
|
options={RADIO_OPTIONS}
|
||||||
|
orientation="vertical"
|
||||||
|
value={selectedRadio}
|
||||||
|
onValueChange={setSelectedRadio}
|
||||||
|
/>
|
||||||
|
<Radio
|
||||||
|
options={RADIO_OPTIONS}
|
||||||
|
orientation="horizontal"
|
||||||
|
value={selectedRadio}
|
||||||
|
onValueChange={setSelectedRadio}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="w-full h border border-gray-200 px-20 my-10" />
|
||||||
|
|
||||||
{/* Inline notification */}
|
{/* Inline notification */}
|
||||||
<div className="flex flex-col gap-10 items-center justify-between">
|
<div className="flex flex-col gap-10 items-center justify-between">
|
||||||
<h1 className="text-2xl font-bold">Inline Notification</h1>
|
<h1 className="text-2xl font-bold">Inline Notification</h1>
|
||||||
|
16
packages/frontend/src/pages/components/renders/radio.ts
Normal file
16
packages/frontend/src/pages/components/renders/radio.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { RadioOption } from 'components/shared/Radio';
|
||||||
|
|
||||||
|
export const RADIO_OPTIONS: RadioOption[] = [
|
||||||
|
{
|
||||||
|
label: 'Label 1',
|
||||||
|
value: '1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Label 2',
|
||||||
|
value: '2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Label 3',
|
||||||
|
value: '3',
|
||||||
|
},
|
||||||
|
];
|
30
packages/frontend/src/pages/components/renders/tooltip.tsx
Normal file
30
packages/frontend/src/pages/components/renders/tooltip.tsx
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Button } from 'components/shared/Button';
|
||||||
|
import { Tooltip } from 'components/shared/Tooltip';
|
||||||
|
import { ContentProps } from 'components/shared/Tooltip/TooltipContent';
|
||||||
|
|
||||||
|
const alignments: ContentProps['align'][] = ['start', 'center', 'end'];
|
||||||
|
const sides: ContentProps['side'][] = ['left', 'top', 'bottom', 'right'];
|
||||||
|
|
||||||
|
export const renderTooltips = () => {
|
||||||
|
const tooltips = sides.map((side) => {
|
||||||
|
return alignments.map((align) => {
|
||||||
|
return (
|
||||||
|
<Tooltip
|
||||||
|
key={`${side}-${align}`}
|
||||||
|
content="tooltip content"
|
||||||
|
contentProps={{ align, side }}
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
key={`${side}-${align}`}
|
||||||
|
className="h-16 self-center"
|
||||||
|
>
|
||||||
|
Tooltip ({side} - {align})
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return tooltips;
|
||||||
|
};
|
@ -8,10 +8,13 @@ export default withMT({
|
|||||||
'../../node_modules/@material-tailwind/react/theme/components/**/*.{js,ts,jsx,tsx}',
|
'../../node_modules/@material-tailwind/react/theme/components/**/*.{js,ts,jsx,tsx}',
|
||||||
],
|
],
|
||||||
theme: {
|
theme: {
|
||||||
fontFamily: {
|
|
||||||
sans: ['Inter', 'sans-serif'],
|
|
||||||
},
|
|
||||||
extend: {
|
extend: {
|
||||||
|
zIndex: {
|
||||||
|
tooltip: '52',
|
||||||
|
},
|
||||||
|
fontFamily: {
|
||||||
|
sans: ['Inter', 'sans-serif'],
|
||||||
|
},
|
||||||
fontSize: {
|
fontSize: {
|
||||||
'2xs': '0.625rem',
|
'2xs': '0.625rem',
|
||||||
'3xs': '0.5rem',
|
'3xs': '0.5rem',
|
||||||
|
44
yarn.lock
44
yarn.lock
@ -3478,6 +3478,23 @@
|
|||||||
"@babel/runtime" "^7.13.10"
|
"@babel/runtime" "^7.13.10"
|
||||||
"@radix-ui/react-slot" "1.0.2"
|
"@radix-ui/react-slot" "1.0.2"
|
||||||
|
|
||||||
|
"@radix-ui/react-radio-group@^1.1.3":
|
||||||
|
version "1.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz#3197f5dcce143bcbf961471bf89320735c0212d3"
|
||||||
|
integrity sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.13.10"
|
||||||
|
"@radix-ui/primitive" "1.0.1"
|
||||||
|
"@radix-ui/react-compose-refs" "1.0.1"
|
||||||
|
"@radix-ui/react-context" "1.0.1"
|
||||||
|
"@radix-ui/react-direction" "1.0.1"
|
||||||
|
"@radix-ui/react-presence" "1.0.1"
|
||||||
|
"@radix-ui/react-primitive" "1.0.3"
|
||||||
|
"@radix-ui/react-roving-focus" "1.0.4"
|
||||||
|
"@radix-ui/react-use-controllable-state" "1.0.1"
|
||||||
|
"@radix-ui/react-use-previous" "1.0.1"
|
||||||
|
"@radix-ui/react-use-size" "1.0.1"
|
||||||
|
|
||||||
"@radix-ui/react-roving-focus@1.0.4":
|
"@radix-ui/react-roving-focus@1.0.4":
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974"
|
resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974"
|
||||||
@ -3517,6 +3534,25 @@
|
|||||||
"@radix-ui/react-roving-focus" "1.0.4"
|
"@radix-ui/react-roving-focus" "1.0.4"
|
||||||
"@radix-ui/react-use-controllable-state" "1.0.1"
|
"@radix-ui/react-use-controllable-state" "1.0.1"
|
||||||
|
|
||||||
|
"@radix-ui/react-tooltip@^1.0.7":
|
||||||
|
version "1.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz#8f55070f852e7e7450cc1d9210b793d2e5a7686e"
|
||||||
|
integrity sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.13.10"
|
||||||
|
"@radix-ui/primitive" "1.0.1"
|
||||||
|
"@radix-ui/react-compose-refs" "1.0.1"
|
||||||
|
"@radix-ui/react-context" "1.0.1"
|
||||||
|
"@radix-ui/react-dismissable-layer" "1.0.5"
|
||||||
|
"@radix-ui/react-id" "1.0.1"
|
||||||
|
"@radix-ui/react-popper" "1.1.3"
|
||||||
|
"@radix-ui/react-portal" "1.0.4"
|
||||||
|
"@radix-ui/react-presence" "1.0.1"
|
||||||
|
"@radix-ui/react-primitive" "1.0.3"
|
||||||
|
"@radix-ui/react-slot" "1.0.2"
|
||||||
|
"@radix-ui/react-use-controllable-state" "1.0.1"
|
||||||
|
"@radix-ui/react-visually-hidden" "1.0.3"
|
||||||
|
|
||||||
"@radix-ui/react-use-callback-ref@1.0.1":
|
"@radix-ui/react-use-callback-ref@1.0.1":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a"
|
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a"
|
||||||
@ -3570,6 +3606,14 @@
|
|||||||
"@babel/runtime" "^7.13.10"
|
"@babel/runtime" "^7.13.10"
|
||||||
"@radix-ui/react-use-layout-effect" "1.0.1"
|
"@radix-ui/react-use-layout-effect" "1.0.1"
|
||||||
|
|
||||||
|
"@radix-ui/react-visually-hidden@1.0.3":
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac"
|
||||||
|
integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.13.10"
|
||||||
|
"@radix-ui/react-primitive" "1.0.3"
|
||||||
|
|
||||||
"@radix-ui/rect@1.0.1":
|
"@radix-ui/rect@1.0.1":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f"
|
resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f"
|
||||||
|
Loading…
Reference in New Issue
Block a user