diff --git a/deepfence_frontend/apps/dashboard/src/features/auth/pages/Login.tsx b/deepfence_frontend/apps/dashboard/src/features/auth/pages/Login.tsx index 0876b2c9bb..45e78d7e5f 100644 --- a/deepfence_frontend/apps/dashboard/src/features/auth/pages/Login.tsx +++ b/deepfence_frontend/apps/dashboard/src/features/auth/pages/Login.tsx @@ -34,6 +34,7 @@ export const Login = () => { placeholder="name@example.com" sizing="sm" name="email" + color={data?.fieldErrors?.email ? 'error' : 'default'} /> {data?.fieldErrors?.email && (

@@ -47,6 +48,7 @@ export const Login = () => { placeholder="••••••••" sizing="sm" name="password" + color={data?.fieldErrors?.password ? 'error' : 'default'} /> {data?.fieldErrors?.password && (

diff --git a/deepfence_frontend/apps/dashboard/src/features/auth/pages/RegisterUser.tsx b/deepfence_frontend/apps/dashboard/src/features/auth/pages/RegisterUser.tsx index 90437db0a8..11f4f5cc91 100644 --- a/deepfence_frontend/apps/dashboard/src/features/auth/pages/RegisterUser.tsx +++ b/deepfence_frontend/apps/dashboard/src/features/auth/pages/RegisterUser.tsx @@ -35,6 +35,7 @@ export const RegisterUser = () => { placeholder="First Name" sizing="sm" name="firstName" + color={data?.fieldErrors?.firstName ? 'error' : 'default'} /> {data?.fieldErrors?.firstName && (

@@ -48,6 +49,7 @@ export const RegisterUser = () => { sizing="sm" name="lastName" className="mt-4" + color={data?.fieldErrors?.lastName ? 'error' : 'default'} /> {data?.fieldErrors?.lastName && (

@@ -61,6 +63,7 @@ export const RegisterUser = () => { sizing="sm" name="email" className="mt-4" + color={data?.fieldErrors?.email ? 'error' : 'default'} /> {data?.fieldErrors?.email && (

@@ -74,6 +77,7 @@ export const RegisterUser = () => { sizing="sm" name="password" className="mt-4" + color={data?.fieldErrors?.password ? 'error' : 'default'} /> {data?.fieldErrors?.password && (

@@ -87,6 +91,7 @@ export const RegisterUser = () => { sizing="sm" name="confirmPassword" className="mt-4" + color={data?.fieldErrors?.confirmPassword ? 'error' : 'default'} /> {data?.fieldErrors?.confirmPassword && (

@@ -100,6 +105,7 @@ export const RegisterUser = () => { sizing="sm" name="company" className="mt-4" + color={data?.fieldErrors?.company ? 'error' : 'default'} /> {data?.fieldErrors?.company && (

diff --git a/deepfence_frontend/packages/tailwind-preset/index.js b/deepfence_frontend/packages/tailwind-preset/index.js index 3bf0627f4a..a1138afdd8 100644 --- a/deepfence_frontend/packages/tailwind-preset/index.js +++ b/deepfence_frontend/packages/tailwind-preset/index.js @@ -62,7 +62,7 @@ module.exports = { 600: '#4B5563', 700: '#374151', 800: '#1F2937', - 900: '#111928', + 900: '#111827', }, red: { 50: '#FDF2F2', diff --git a/deepfence_frontend/packages/ui-components/src/components/input/HelperText.tsx b/deepfence_frontend/packages/ui-components/src/components/input/HelperText.tsx index 5626b6aa3c..9f0ba8cda9 100644 --- a/deepfence_frontend/packages/ui-components/src/components/input/HelperText.tsx +++ b/deepfence_frontend/packages/ui-components/src/components/input/HelperText.tsx @@ -2,38 +2,27 @@ import cx from 'classnames'; import { FC } from 'react'; import { twMerge } from 'tailwind-merge'; -import { Typography } from '@/components/typography/Typography'; - export type ColorType = 'default' | 'error' | 'success'; -export type SizeType = 'sm' | 'md'; type Props = { text: string; color: ColorType; - sizing?: SizeType; className?: string; }; export const classes = { color: { - default: 'border-gray-300 text-gray-500', - error: 'border-red-500 text-red-700', - success: 'border-green-500 text-green-700', - }, - size: { - sm: `${Typography.size.sm}`, - md: `${Typography.size.base}`, + default: 'text-gray-500 dark:text-gray-400', + error: 'text-red-600 dark:text-red-600', + success: 'text-green-600 dark:text-green-600', }, }; -export const HelperText: FC = ({ text, sizing = 'sm', color, className }) => { +export const HelperText: FC = ({ text, color, className }) => { return (

diff --git a/deepfence_frontend/packages/ui-components/src/components/input/TextInput.stories.tsx b/deepfence_frontend/packages/ui-components/src/components/input/TextInput.stories.tsx index 07516d9307..819cd5eb92 100644 --- a/deepfence_frontend/packages/ui-components/src/components/input/TextInput.stories.tsx +++ b/deepfence_frontend/packages/ui-components/src/components/input/TextInput.stories.tsx @@ -31,13 +31,14 @@ export const WithStartIcon = Template.bind({}); WithStartIcon.args = { placeholder: 'test@deepfence.io', startIcon: , + disabled: false, }; export const LargeInput = Template.bind({}); LargeInput.args = { placeholder: 'test@deepfence.io', startIcon: , - sizing: 'md', + sizing: 'lg', }; export const WithLabel = Template.bind({}); diff --git a/deepfence_frontend/packages/ui-components/src/components/input/TextInput.tsx b/deepfence_frontend/packages/ui-components/src/components/input/TextInput.tsx index 4c085796f4..5d9e6d32e0 100644 --- a/deepfence_frontend/packages/ui-components/src/components/input/TextInput.tsx +++ b/deepfence_frontend/packages/ui-components/src/components/input/TextInput.tsx @@ -5,9 +5,8 @@ import { IconContext } from 'react-icons'; import { twMerge } from 'tailwind-merge'; import HelperText from '@/components/input/HelperText'; -import { Typography } from '@/components/typography/Typography'; -export type SizeType = 'sm' | 'md'; +export type SizeType = 'sm' | 'md' | 'lg'; export type ColorType = 'default' | 'error' | 'success'; export interface TextInputProps @@ -27,50 +26,106 @@ type IconProps = { id?: string; color?: ColorType; sizing?: SizeType; + disabled?: boolean; }; -export const classes = { +export const inputClasses = { color: { default: cx( - 'border-gray-300 text-gray-500', - 'focus:border-blue-600 focus:text-gray-900', - 'dark:border-gray-600 dark:text-gray-400', - 'dark:focus:border-blue-800 dark:focus:text-white dark:active:text-white', + // ring styles + 'ring-gray-300 focus:ring-blue-600', + 'dark:ring-gray-600 dark:focus:ring-blue-600', + // bg styles + 'bg-gray-50', + 'dark:bg-gray-700', + // placeholder styles + 'placeholder-gray-500 disabled:placeholder-gray-400', + 'dark:placeholder-gray-400 dark:disabled:placeholder-gray-500', + // text styles + 'text-gray-900 disabled:text-gray-700', + 'dark:text-white dark:disabled:text-gray-200', + ), + error: cx( + // ring styles + 'ring-red-200 focus:ring-red-500', + 'dark:ring-red-800 dark:focus:ring-red-500', + // bg styles + 'bg-red-50', + 'dark:bg-gray-700', + // placeholder styles + 'placeholder-red-400 disabled:placeholder-red-300', + 'dark:placeholder-red-700 dark:disabled:placeholder-red-800', + // text styles + 'text-red-700 disabled:text-red-500', + 'dark:text-red-500 dark:disabled:text-red-700', ), - error: cx('border-red-500', 'focus:border-red-500'), success: cx( - 'border-green-500 text-green-700', - 'focus:border-green-500 focus:text-green-500', + // ring styles + 'ring-green-300 focus:ring-green-500', + 'dark:ring-green-800 dark:focus:ring-green-500', + // bg styles + 'bg-green-50', + 'dark:bg-gray-700', + // placeholder styles + 'placeholder-green-400 disabled:placeholder-green-300', + 'dark:placeholder-green-700 dark:disabled:placeholder-green-800', + // text styles + 'text-green-700 disabled:text-green-500', + 'dark:text-green-500 dark:disabled:text-green-700', ), }, size: { - sm: `${Typography.size.sm} p-3`, - md: `${Typography.size.base} py-3.5 px-4`, + sm: `text-sm px-4 py-2`, + md: `text-sm leading-tight px-4 py-3`, + lg: `text-base px-4 py-3.5`, + }, +}; + +const iconClasses = { + color: { + default: { + enabled: cx('text-gray-500', 'dark:text-gray-400'), + disabled: cx('text-gray-400', 'dark:text-gray-500'), + }, + error: { + enabled: cx('text-red-400', 'dark:text-red-700'), + disabled: cx('text-red-300', 'dark:text-red-800'), + }, + success: { + enabled: cx('text-green-400', 'dark:text-green-700'), + disabled: cx('text-green-300', 'dark:text-green-800'), + }, + }, + size: { + sm: `w-4 h-4`, + md: `w-4 h-4`, + lg: `w-5 h-5`, }, }; const COLOR_DEFAULT = 'default'; -const SIZE_DEFAULT = 'sm'; +const SIZE_DEFAULT = 'md'; export const LeftIcon = ({ icon, id, color = COLOR_DEFAULT, sizing = SIZE_DEFAULT, + disabled, }: IconProps) => { return ( {icon} @@ -84,20 +139,21 @@ export const RightIcon = ({ id, color = COLOR_DEFAULT, sizing = SIZE_DEFAULT, + disabled, }: IconProps) => { return ( {icon} @@ -130,9 +186,7 @@ export const TextInput = forwardRef( {label && ( {required && *} {label} @@ -140,22 +194,34 @@ export const TextInput = forwardRef( )}

{startIcon && ( - + + )} + {endIcon && ( + )} - {endIcon && } ( {...rest} />
- {helperText && ( - - )} + {helperText && } ); }, diff --git a/deepfence_frontend/packages/ui-components/src/components/input/TextInputArea.tsx b/deepfence_frontend/packages/ui-components/src/components/input/TextInputArea.tsx index daf95c5654..0199f7b825 100644 --- a/deepfence_frontend/packages/ui-components/src/components/input/TextInputArea.tsx +++ b/deepfence_frontend/packages/ui-components/src/components/input/TextInputArea.tsx @@ -16,6 +16,7 @@ export interface TextInputAreaProps color?: ColorType; } +// TODO: use the same color classes as input const classes = { size: { sm: `${Typography.size.sm} p-3`, @@ -76,14 +77,7 @@ export const TextInputArea = forwardRef {...rest} /> - {helperText && ( - - )} + {helperText && } ); },