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 && }
);
},