refactor: remove variant prop from input components and styles

- Removed the variant prop from Checkbox, Input, InputNumber, Switch, TextArea components.
- Updated styles to eliminate variant-specific classes for Checkbox, Input, InputNumber, TextArea, and Switch.
- Simplified class names in stylesheets to focus on status only.
- Adjusted documentation to reflect the removal of the variant prop.
This commit is contained in:
Firman Ramdhani
2026-02-02 16:36:23 +07:00
parent 53da0c70bd
commit 2c21da111e
16 changed files with 164 additions and 676 deletions
@@ -33,8 +33,8 @@ export default function CheckboxShowcase({ status: overrideStatus }: CheckboxSho
<div className="p-4 border border-gray-100 rounded-xl bg-gray-50/50"> <div className="p-4 border border-gray-100 rounded-xl bg-gray-50/50">
<span className="block mb-3 text-xs font-bold text-gray-400 uppercase">Filled</span> <span className="block mb-3 text-xs font-bold text-gray-400 uppercase">Filled</span>
<div className="flex gap-4"> <div className="flex gap-4">
<Checkbox variant="filled" status={overrideStatus} label="Standard" defaultChecked /> <Checkbox status={overrideStatus} label="Standard" defaultChecked />
<Checkbox variant="filled" status={overrideStatus} label="Unchecked" /> <Checkbox status={overrideStatus} label="Unchecked" />
</div> </div>
</div> </div>
</div> </div>
@@ -60,40 +60,6 @@ export default function CheckboxShowcase({ status: overrideStatus }: CheckboxSho
<Checkbox status={resolveStatus('success')} label={resolveStatus('success')} defaultChecked /> <Checkbox status={resolveStatus('success')} label={resolveStatus('success')} defaultChecked />
<Checkbox status={resolveStatus('info')} label={resolveStatus('info')} defaultChecked /> <Checkbox status={resolveStatus('info')} label={resolveStatus('info')} defaultChecked />
</div> </div>
{/* Filled Status */}
<div className="flex flex-wrap gap-6 p-6 bg-gray-50 border border-gray-200 rounded-xl">
<Checkbox
variant="filled"
status={resolveStatus('default')}
label={`${resolveStatus('default')} Filled`}
defaultChecked
/>
<Checkbox
variant="filled"
status={resolveStatus('error')}
label={`${resolveStatus('error')} Filled`}
defaultChecked
/>
<Checkbox
variant="filled"
status={resolveStatus('warning')}
label={`${resolveStatus('warning')} Filled`}
defaultChecked
/>
<Checkbox
variant="filled"
status={resolveStatus('success')}
label={`${resolveStatus('success')} Filled`}
defaultChecked
/>
<Checkbox
variant="filled"
status={resolveStatus('info')}
label={`${resolveStatus('info')} Filled`}
defaultChecked
/>
</div>
</div> </div>
</section> </section>
@@ -124,7 +90,7 @@ export default function CheckboxShowcase({ status: overrideStatus }: CheckboxSho
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<Checkbox disabled label="Disabled Unchecked" /> <Checkbox disabled label="Disabled Unchecked" />
<Checkbox disabled defaultChecked label="Disabled Checked" /> <Checkbox disabled defaultChecked label="Disabled Checked" />
<Checkbox disabled variant="filled" label="Disabled Filled" /> <Checkbox disabled label="Disabled Filled" />
</div> </div>
</div> </div>
@@ -69,75 +69,9 @@ export default function InputShowCase({ status }: { status?: InputStatusType })
</div> </div>
</section> </section>
{/* --- SECTION 2: FILLED VARIANT --- */} {/* --- SECTION 2: Component States & Validation --- */}
<section className="space-y-6">
<h2 className="text-lg font-bold text-gray-800 border-b pb-2">Filled Variant</h2>
<div className="grid grid-cols-1 md:grid-cols-4 gap-6">
<div className="space-y-3">
<Label>Basic Filled</Label>
<Input variant="filled" status={status} placeholder="Filled Input" />
<InputPassword variant="filled" status={status} placeholder="Filled Password" />
<InputNumber variant="filled" status={status} className="w-full" placeholder="Filled Number" />
<InputCurrency variant="filled" status={status} className="w-full" placeholder="Filled Currency" />
<TextArea variant="filled" status={status} placeholder="Filled TextArea" rows={2} />
</div>
<div className="space-y-3"> <section className="space-y-6 mt-6">
<Label>Filled + Prefix</Label>
<Input variant="filled" status={status} prefix={<Fix>ID</Fix>} placeholder="12345" />
<InputPassword variant="filled" status={status} prefix={<Fix>🔑</Fix>} placeholder="password" />
<InputNumber variant="filled" status={status} prefix={<Fix>Qty:</Fix>} className="w-full" />
<InputCurrency variant="filled" status={status} prefix="Rp " className="w-full" />
</div>
<div className="space-y-3">
<Label>Filled + Suffix</Label>
<Input variant="filled" status={status} suffix={<Fix>Optional</Fix>} placeholder="Full Name" />
<InputPassword variant="filled" status={status} suffix={<Fix>?</Fix>} placeholder="password" />
<InputNumber variant="filled" status={status} suffix={<Fix>pts</Fix>} className="w-full" />
<InputCurrency variant="filled" status={status} suffix={<Fix>tax-incl</Fix>} className="w-full" />
</div>
<div className="space-y-3">
<Label>Both & Special</Label>
<Input
variant="filled"
status={status}
prefix={<Fix>https://</Fix>}
suffix={<Fix>.io</Fix>}
placeholder="domain"
/>
{/* Password Tanpa Toggle */}
<InputPassword
variant="filled"
status={status}
visibilityToggle={false}
prefix={<Fix>🔑</Fix>}
suffix={<Fix>?</Fix>}
placeholder="Hidden Password"
/>
<InputNumber
variant="filled"
status={status}
prefix={<Fix>+</Fix>}
suffix={<Fix>%</Fix>}
className="w-full"
placeholder="tax"
/>
<InputCurrency
variant="filled"
status={status}
prefix="USD "
suffix={<Fix>cents</Fix>}
className="w-full"
placeholder="amount"
/>
</div>
</div>
</section>
{/* --- SECTION 3: Component States & Validation --- */}
<section className="space-y-6">
<h2 className="text-lg font-bold text-gray-800 border-b pb-2">Component States & Validation</h2> <h2 className="text-lg font-bold text-gray-800 border-b pb-2">Component States & Validation</h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8"> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
@@ -181,11 +115,11 @@ export default function InputShowCase({ status }: { status?: InputStatusType })
<div className="space-y-3"> <div className="space-y-3">
<Label>Error (Filled)</Label> <Label>Error (Filled)</Label>
<div className="space-y-3"> <div className="space-y-3">
<Input variant="filled" status="error" placeholder="Invalid input" /> <Input status="error" placeholder="Invalid input" />
<InputPassword variant="filled" status="error" placeholder="Wrong password" /> <InputPassword status="error" placeholder="Wrong password" />
<InputNumber variant="filled" status="error" className="w-full" placeholder="Out of range" /> <InputNumber status="error" className="w-full" placeholder="Out of range" />
<InputCurrency variant="filled" status="error" className="w-full" placeholder="Invalid amount" /> <InputCurrency status="error" className="w-full" placeholder="Invalid amount" />
<TextArea variant="filled" status="error" placeholder="Error in message" rows={2} /> <TextArea status="error" placeholder="Error in message" rows={2} />
</div> </div>
</div> </div>
</div> </div>
@@ -25,8 +25,8 @@ export const SwitchShowcase = () => {
<h3 className="text-sm font-medium text-gray-500 uppercase tracking-wider">Outlined (Default)</h3> <h3 className="text-sm font-medium text-gray-500 uppercase tracking-wider">Outlined (Default)</h3>
<p className="text-xs text-gray-400 mb-2">Background transparan saat off.</p> <p className="text-xs text-gray-400 mb-2">Background transparan saat off.</p>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<Switch variant="outlined" label="Outlined Off" /> <Switch label="Outlined Off" />
<Switch variant="outlined" defaultChecked label="Outlined On" /> <Switch defaultChecked label="Outlined On" />
</div> </div>
</div> </div>
@@ -35,8 +35,8 @@ export const SwitchShowcase = () => {
<h3 className="text-sm font-medium text-gray-500 uppercase tracking-wider">Filled</h3> <h3 className="text-sm font-medium text-gray-500 uppercase tracking-wider">Filled</h3>
<p className="text-xs text-gray-400 mb-2">Background abu-abu solid saat off.</p> <p className="text-xs text-gray-400 mb-2">Background abu-abu solid saat off.</p>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<Switch variant="filled" label="Filled Off" /> <Switch label="Filled Off" />
<Switch variant="filled" defaultChecked label="Filled On" /> <Switch defaultChecked label="Filled On" />
</div> </div>
</div> </div>
</div> </div>
@@ -53,27 +53,27 @@ export const SwitchShowcase = () => {
<div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200"> <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-6"> <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-6">
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="outlined" status="default" defaultChecked /> <Switch status="default" defaultChecked />
<span className="text-xs font-medium text-gray-500">Default (Brand)</span> <span className="text-xs font-medium text-gray-500">Default (Brand)</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="outlined" status="success" defaultChecked /> <Switch status="success" defaultChecked />
<span className="text-xs font-medium text-green-600">Success</span> <span className="text-xs font-medium text-green-600">Success</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="outlined" status="warning" defaultChecked /> <Switch status="warning" defaultChecked />
<span className="text-xs font-medium text-amber-600">Warning</span> <span className="text-xs font-medium text-amber-600">Warning</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="outlined" status="error" defaultChecked /> <Switch status="error" defaultChecked />
<span className="text-xs font-medium text-red-600">Error</span> <span className="text-xs font-medium text-red-600">Error</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="outlined" status="info" defaultChecked /> <Switch status="info" defaultChecked />
<span className="text-xs font-medium text-sky-600">Info</span> <span className="text-xs font-medium text-sky-600">Info</span>
</div> </div>
</div> </div>
@@ -82,27 +82,27 @@ export const SwitchShowcase = () => {
<div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200"> <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-6"> <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-6">
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="filled" status="default" defaultChecked /> <Switch status="default" defaultChecked />
<span className="text-xs font-medium text-gray-500">Default (Brand)</span> <span className="text-xs font-medium text-gray-500">Default (Brand)</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="filled" status="success" defaultChecked /> <Switch status="success" defaultChecked />
<span className="text-xs font-medium text-green-600">Success</span> <span className="text-xs font-medium text-green-600">Success</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="filled" status="warning" defaultChecked /> <Switch status="warning" defaultChecked />
<span className="text-xs font-medium text-amber-600">Warning</span> <span className="text-xs font-medium text-amber-600">Warning</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="filled" status="error" defaultChecked /> <Switch status="error" defaultChecked />
<span className="text-xs font-medium text-red-600">Error</span> <span className="text-xs font-medium text-red-600">Error</span>
</div> </div>
<div className="flex flex-col items-center gap-2"> <div className="flex flex-col items-center gap-2">
<Switch variant="filled" status="info" defaultChecked /> <Switch status="info" defaultChecked />
<span className="text-xs font-medium text-sky-600">Info</span> <span className="text-xs font-medium text-sky-600">Info</span>
</div> </div>
</div> </div>
@@ -209,7 +209,6 @@ export const SwitchShowcase = () => {
loading={loading} loading={loading}
label="Control Me" label="Control Me"
status="success" status="success"
variant="filled"
/> />
</div> </div>
</div> </div>
@@ -25,14 +25,13 @@ import { InputRef } from '@rc-component/input/lib/interface';
* @returns JSX.Element * @returns JSX.Element
*/ */
export const Checkbox = forwardRef<InputRef, CheckboxProps>((props, ref) => { export const Checkbox = forwardRef<InputRef, CheckboxProps>((props, ref) => {
const { label, status = 'default', variant = 'outlined', className, children, ...rest } = props; const { label, status = 'default', className, children, ...rest } = props;
const displayLabel = label || children; const displayLabel = label || children;
const wrapperClass = [ const wrapperClass = [
'rc-checkbox-wrapper', 'rc-checkbox-wrapper',
`checkbox-status-${status}`, `checkbox-status-${status}`,
`checkbox-variant-${variant}`,
rest.disabled ? 'rc-checkbox-wrapper-disabled' : '', rest.disabled ? 'rc-checkbox-wrapper-disabled' : '',
className, className,
] ]
@@ -13,14 +13,12 @@
* value={10} * value={10}
* onChange={(val) => console.log(val)} * onChange={(val) => console.log(val)}
* status="success" * status="success"
* variant="outlined"
* /> * />
* ``` * ```
* *
* @param {InputNumberProps} props - The input number component props * @param {InputNumberProps} props - The input number component props
* @param {InputStatusType} [props.status] - The validation status ('default', 'success', 'error', etc.) * @param {InputStatusType} [props.status] - The validation status ('default', 'success', 'error', etc.)
* @param {string} [props.className] - Additional CSS classes to apply * @param {string} [props.className] - Additional CSS classes to apply
* @param {'outlined' | 'filled' | 'borderless'} [props.variant='outlined'] - The visual variant style
* @param {React.Ref<HTMLInputElement>} ref - Ref to the underlying input element * @param {React.Ref<HTMLInputElement>} ref - Ref to the underlying input element
* *
* @returns {React.ReactElement} The rendered input number component * @returns {React.ReactElement} The rendered input number component
@@ -47,13 +45,11 @@ const DownIcon = () => (
); );
export const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>((props, ref) => { export const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>((props, ref) => {
const { status, className, variant = 'outlined', ...restProps } = props; const { status, className, ...restProps } = props;
const currentStatus: InputStatusType = status && VALID_INPUT_STATUSES.includes(status) ? status : 'default'; const currentStatus: InputStatusType = status && VALID_INPUT_STATUSES.includes(status) ? status : 'default';
const computedClassName = [className, `input-number-status-${currentStatus}`, `input-number-variant-${variant}`] const computedClassName = [className, `input-number-status-${currentStatus}`].filter(Boolean).join(' ');
.filter(Boolean)
.join(' ');
return ( return (
<RcInputNumber <RcInputNumber
@@ -3,16 +3,15 @@ import RcInput, { InputRef } from '@rc-component/input';
import { InputProps, InputStatusType, VALID_INPUT_STATUSES } from '../types'; import { InputProps, InputStatusType, VALID_INPUT_STATUSES } from '../types';
/** /**
* Input component that wraps the RC Input library with custom status and variant support. * Input component that wraps the RC Input library with custom status.
* *
* @component * @component
* @param {InputProps} props - The input component props * @param {InputProps} props - The input component props
* @param {InputStatusType} [props.status] - The validation status of the input (validated against VALID_INPUT_STATUSES) * @param {InputStatusType} [props.status] - The validation status of the input (validated against VALID_INPUT_STATUSES)
* @param {string} [props.className] - Additional CSS classes to apply to the input * @param {string} [props.className] - Additional CSS classes to apply to the input
* @param {'outlined' | 'filled'} [props.variant='outlined'] - The visual variant of the input
* @param {boolean} [props.disabled] - Whether the input is disabled * @param {boolean} [props.disabled] - Whether the input is disabled
* @param {InputRef} ref - Reference to the underlying RC Input element * @param {InputRef} ref - Reference to the underlying RC Input element
* @returns {React.ReactElement} The rendered Input component with computed classes for status, variant, and disabled state * @returns {React.ReactElement} The rendered Input component with computed classes for status, and disabled state
* *
* @remarks * @remarks
* - Invalid status values default to 'default' * - Invalid status values default to 'default'
@@ -20,7 +19,7 @@ import { InputProps, InputStatusType, VALID_INPUT_STATUSES } from '../types';
* - The 'input-disabled' helper class is manually added for custom wrapper styling when needed * - The 'input-disabled' helper class is manually added for custom wrapper styling when needed
*/ */
export const Input = forwardRef<InputRef, InputProps>((props, ref) => { export const Input = forwardRef<InputRef, InputProps>((props, ref) => {
const { status, className, variant = 'outlined', disabled, ...restProps } = props; const { status, className, disabled, ...restProps } = props;
// Determine current status, defaulting to 'default' if invalid // Determine current status, defaulting to 'default' if invalid
const currentStatus: InputStatusType = status && VALID_INPUT_STATUSES.includes(status) ? status : 'default'; const currentStatus: InputStatusType = status && VALID_INPUT_STATUSES.includes(status) ? status : 'default';
@@ -30,7 +29,6 @@ export const Input = forwardRef<InputRef, InputProps>((props, ref) => {
const computedClassName = [ const computedClassName = [
className, className,
`input-status-${currentStatus}`, `input-status-${currentStatus}`,
`input-variant-${variant}`,
// Add custom disabled class if disabled // Add custom disabled class if disabled
disabled ? 'input-disabled' : '', disabled ? 'input-disabled' : '',
] ]
@@ -184,87 +184,6 @@
box-shadow: 0 0 0 3px var(--color-info-100); box-shadow: 0 0 0 3px var(--color-info-100);
} }
/* =========================================
VARIANT: FILLED
========================================= */
/* --- Default Filled --- */
.checkbox-variant-filled .rc-checkbox-inner {
background-color: var(--color-gray-50);
border-color: var(--input-border); /* Slightly border to remain visible on white background */
}
.checkbox-variant-filled:hover .rc-checkbox-inner {
background-color: var(--color-gray-100);
border-color: var(--input-border-hover);
}
/* Checked State for Filled */
.checkbox-variant-filled.checkbox-status-default .rc-checkbox-checked .rc-checkbox-inner {
background-color: var(--color-brand-500);
border-color: var(--color-brand-500);
}
/* --- Error Filled --- */
.checkbox-variant-filled.checkbox-status-error .rc-checkbox-inner {
background-color: var(--color-error-50);
border-color: var(--color-error-300);
}
.checkbox-variant-filled.checkbox-status-error:hover .rc-checkbox-inner {
background-color: var(--color-error-100);
border-color: var(--color-error-500);
}
.checkbox-variant-filled.checkbox-status-error .rc-checkbox-checked .rc-checkbox-inner {
background-color: var(--color-error-500);
border-color: var(--color-error-500);
}
/* --- Warning Filled --- */
.checkbox-variant-filled.checkbox-status-warning .rc-checkbox-inner {
background-color: var(--color-warning-50);
border-color: var(--color-warning-300);
}
.checkbox-variant-filled.checkbox-status-warning:hover .rc-checkbox-inner {
background-color: var(--color-warning-100);
border-color: var(--color-warning-500);
}
.checkbox-variant-filled.checkbox-status-warning .rc-checkbox-checked .rc-checkbox-inner {
background-color: var(--color-warning-500);
border-color: var(--color-warning-500);
}
/* --- Success Filled --- */
.checkbox-variant-filled.checkbox-status-success .rc-checkbox-inner {
background-color: var(--color-success-50);
border-color: var(--color-success-300);
}
.checkbox-variant-filled.checkbox-status-success:hover .rc-checkbox-inner {
background-color: var(--color-success-100);
border-color: var(--color-success-500);
}
.checkbox-variant-filled.checkbox-status-success .rc-checkbox-checked .rc-checkbox-inner {
background-color: var(--color-success-500);
border-color: var(--color-success-500);
}
/* --- Info Filled --- */
.checkbox-variant-filled.checkbox-status-info .rc-checkbox-inner {
background-color: var(--color-info-50);
border-color: var(--color-info-300);
}
.checkbox-variant-filled.checkbox-status-info:hover .rc-checkbox-inner {
background-color: var(--color-info-100);
border-color: var(--color-info-500);
}
.checkbox-variant-filled.checkbox-status-info .rc-checkbox-checked .rc-checkbox-inner {
background-color: var(--color-info-500);
border-color: var(--color-info-500);
}
/* Focus Ring for Filled Variant */
.checkbox-variant-filled .rc-checkbox-input:focus-visible + .rc-checkbox-inner {
/* Box shadow will follow the status color from the STATUS MATRIX block above */
outline: none;
}
/* ========================================= /* =========================================
DISABLED STATE DISABLED STATE
========================================= */ ========================================= */
@@ -147,205 +147,106 @@
} }
/* ========================================= /* =========================================
3. STATUS MATRIX (VARIANT: OUTLINED) 3. STATUS MATRIX
========================================= */ ========================================= */
/* --- DEFAULT --- */ /* --- DEFAULT --- */
.input-number-variant-outlined.input-number-status-default { .input-number-status-default {
border-color: var(--input-border); border-color: var(--input-border);
} }
.input-number-variant-outlined.input-number-status-default:hover:not(.rc-input-number-disabled) { .input-number-status-default:hover:not(.rc-input-number-disabled) {
border-color: var(--input-border-hover); border-color: var(--input-border-hover);
} }
.input-number-variant-outlined.input-number-status-default:focus-within { .input-number-status-default:focus-within {
border-color: var(--focus-border-color); border-color: var(--focus-border-color);
box-shadow: 0 0 0 3px var(--focus-ring-color); box-shadow: 0 0 0 3px var(--focus-ring-color);
} }
/* Action Borders Sync */ /* Action Borders Sync */
.input-number-variant-outlined.input-number-status-default:focus-within .rc-input-number-actions { .input-number-status-default:focus-within .rc-input-number-actions {
border-left-color: var(--focus-border-color); border-left-color: var(--focus-border-color);
} }
.input-number-variant-outlined.input-number-status-default:focus-within .rc-input-number-action-up { .input-number-status-default:focus-within .rc-input-number-action-up {
border-bottom-color: var(--focus-border-color); border-bottom-color: var(--focus-border-color);
} }
/* --- ERROR --- */ /* --- ERROR --- */
.input-number-variant-outlined.input-number-status-error { .input-number-status-error {
border-color: var(--color-error-500); border-color: var(--color-error-500);
} }
.input-number-variant-outlined.input-number-status-error:hover:not(.rc-input-number-disabled) { .input-number-status-error:hover:not(.rc-input-number-disabled) {
border-color: var(--color-error-600); border-color: var(--color-error-600);
} }
.input-number-variant-outlined.input-number-status-error:focus-within { .input-number-status-error:focus-within {
border-color: var(--color-error-600); border-color: var(--color-error-600);
box-shadow: 0 0 0 3px var(--color-error-100); box-shadow: 0 0 0 3px var(--color-error-100);
} }
/* Action Borders Sync */ /* Action Borders Sync */
.input-number-variant-outlined.input-number-status-error .rc-input-number-actions { .input-number-status-error .rc-input-number-actions {
border-left-color: var(--color-error-500); border-left-color: var(--color-error-500);
} }
.input-number-variant-outlined.input-number-status-error .rc-input-number-action-up { .input-number-status-error .rc-input-number-action-up {
border-bottom-color: var(--color-error-500); border-bottom-color: var(--color-error-500);
} }
/* --- WARNING --- */ /* --- WARNING --- */
.input-number-variant-outlined.input-number-status-warning { .input-number-status-warning {
border-color: var(--color-warning-500); border-color: var(--color-warning-500);
} }
.input-number-variant-outlined.input-number-status-warning:hover:not(.rc-input-number-disabled) { .input-number-status-warning:hover:not(.rc-input-number-disabled) {
border-color: var(--color-warning-600); border-color: var(--color-warning-600);
} }
.input-number-variant-outlined.input-number-status-warning:focus-within { .input-number-status-warning:focus-within {
border-color: var(--color-warning-600); border-color: var(--color-warning-600);
box-shadow: 0 0 0 3px var(--color-warning-100); box-shadow: 0 0 0 3px var(--color-warning-100);
} }
/* Action Borders Sync */ /* Action Borders Sync */
.input-number-variant-outlined.input-number-status-warning .rc-input-number-actions { .input-number-status-warning .rc-input-number-actions {
border-left-color: var(--color-warning-500); border-left-color: var(--color-warning-500);
} }
.input-number-variant-outlined.input-number-status-warning .rc-input-number-action-up { .input-number-status-warning .rc-input-number-action-up {
border-bottom-color: var(--color-warning-500); border-bottom-color: var(--color-warning-500);
} }
/* --- SUCCESS --- */ /* --- SUCCESS --- */
.input-number-variant-outlined.input-number-status-success { .input-number-status-success {
border-color: var(--color-success-500); border-color: var(--color-success-500);
} }
.input-number-variant-outlined.input-number-status-success:hover:not(.rc-input-number-disabled) { .input-number-status-success:hover:not(.rc-input-number-disabled) {
border-color: var(--color-success-600); border-color: var(--color-success-600);
} }
.input-number-variant-outlined.input-number-status-success:focus-within { .input-number-status-success:focus-within {
border-color: var(--color-success-600); border-color: var(--color-success-600);
box-shadow: 0 0 0 3px var(--color-success-100); box-shadow: 0 0 0 3px var(--color-success-100);
} }
/* Action Borders Sync */ /* Action Borders Sync */
.input-number-variant-outlined.input-number-status-success .rc-input-number-actions { .input-number-status-success .rc-input-number-actions {
border-left-color: var(--color-success-500); border-left-color: var(--color-success-500);
} }
.input-number-variant-outlined.input-number-status-success .rc-input-number-action-up { .input-number-status-success .rc-input-number-action-up {
border-bottom-color: var(--color-success-500); border-bottom-color: var(--color-success-500);
} }
/* --- INFO --- */ /* --- INFO --- */
.input-number-variant-outlined.input-number-status-info { .input-number-status-info {
border-color: var(--color-info-500); border-color: var(--color-info-500);
} }
.input-number-variant-outlined.input-number-status-info:hover:not(.rc-input-number-disabled) { .input-number-status-info:hover:not(.rc-input-number-disabled) {
border-color: var(--color-info-600); border-color: var(--color-info-600);
} }
.input-number-variant-outlined.input-number-status-info:focus-within { .input-number-status-info:focus-within {
border-color: var(--color-info-600); border-color: var(--color-info-600);
box-shadow: 0 0 0 3px var(--color-info-100); box-shadow: 0 0 0 3px var(--color-info-100);
} }
/* Action Borders Sync */ /* Action Borders Sync */
.input-number-variant-outlined.input-number-status-info .rc-input-number-actions { .input-number-status-info .rc-input-number-actions {
border-left-color: var(--color-info-500); border-left-color: var(--color-info-500);
} }
.input-number-variant-outlined.input-number-status-info .rc-input-number-action-up { .input-number-status-info .rc-input-number-action-up {
border-bottom-color: var(--color-info-500); border-bottom-color: var(--color-info-500);
} }
/* ========================================= /* =========================================
4. STATUS MATRIX (VARIANT: FILLED) 4. DISABLED STATE
========================================= */
/* --- NORMAL FILLED --- */
.input-number-variant-filled.input-number-status-default {
background-color: var(--input-bg);
border-color: var(--input-border);
}
.input-number-variant-filled.input-number-status-default:hover:not(.rc-input-number-disabled) {
border-color: var(--input-border-hover);
}
.input-number-variant-filled.input-number-status-default:focus-within {
border-color: var(--focus-border-color);
box-shadow: 0 0 0 3px var(--focus-ring-color);
}
/* --- ERROR FILLED --- */
.input-number-variant-filled.input-number-status-error {
background-color: var(--color-error-50);
border-color: var(--color-error-500);
}
/* Actions Background & Border Sync (Error) */
.input-number-variant-filled.input-number-status-error .rc-input-number-actions {
background-color: var(--color-error-50);
border-left-color: var(--color-error-500);
}
.input-number-variant-filled.input-number-status-error .rc-input-number-action-up {
border-bottom-color: var(--color-error-500);
}
/* Focus: Revert to White BG */
.input-number-variant-filled.input-number-status-error:focus-within {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-error-100);
}
.input-number-variant-filled.input-number-status-error:focus-within .rc-input-number-actions {
background-color: var(--input-bg);
}
/* --- WARNING FILLED --- */
.input-number-variant-filled.input-number-status-warning {
background-color: var(--color-warning-50);
border-color: var(--color-warning-500);
}
.input-number-variant-filled.input-number-status-warning .rc-input-number-actions {
background-color: var(--color-warning-50);
border-left-color: var(--color-warning-500);
}
.input-number-variant-filled.input-number-status-warning .rc-input-number-action-up {
border-bottom-color: var(--color-warning-500);
}
.input-number-variant-filled.input-number-status-warning:focus-within {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-warning-100);
}
.input-number-variant-filled.input-number-status-warning:focus-within .rc-input-number-actions {
background-color: var(--input-bg);
}
/* --- SUCCESS FILLED --- */
.input-number-variant-filled.input-number-status-success {
background-color: var(--color-success-50);
border-color: var(--color-success-500);
}
.input-number-variant-filled.input-number-status-success .rc-input-number-actions {
background-color: var(--color-success-50);
border-left-color: var(--color-success-500);
}
.input-number-variant-filled.input-number-status-success .rc-input-number-action-up {
border-bottom-color: var(--color-success-500);
}
.input-number-variant-filled.input-number-status-success:focus-within {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-success-100);
}
.input-number-variant-filled.input-number-status-success:focus-within .rc-input-number-actions {
background-color: var(--input-bg);
}
/* --- INFO FILLED --- */
.input-number-variant-filled.input-number-status-info {
background-color: var(--color-info-50);
border-color: var(--color-info-500);
}
.input-number-variant-filled.input-number-status-info .rc-input-number-actions {
background-color: var(--color-info-50);
border-left-color: var(--color-info-500);
}
.input-number-variant-filled.input-number-status-info .rc-input-number-action-up {
border-bottom-color: var(--color-info-500);
}
.input-number-variant-filled.input-number-status-info:focus-within {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-info-100);
}
.input-number-variant-filled.input-number-status-info:focus-within .rc-input-number-actions {
background-color: var(--input-bg);
}
/* =========================================
5. DISABLED STATE
========================================= */ ========================================= */
.rc-input-number-disabled { .rc-input-number-disabled {
background-color: var(--disabled-bg) !important; background-color: var(--disabled-bg) !important;
@@ -163,141 +163,74 @@
------------------------------------------------ */ ------------------------------------------------ */
/* DEFAULT */ /* DEFAULT */
.input-variant-outlined.input-status-default { .input-status-default {
border-color: var(--input-border); border-color: var(--input-border);
} }
/* Hover */ /* Hover */
.input-variant-outlined.input-status-default:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) { .input-status-default:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) {
border-color: var(--input-border-hover); border-color: var(--input-border-hover);
} }
/* Focus */ /* Focus */
.input-variant-outlined.input-status-default:focus, .input-status-default:focus,
.input-variant-outlined.input-status-default.rc-input-affix-wrapper-focused { .input-status-default.rc-input-affix-wrapper-focused {
border-color: var(--focus-border-color); border-color: var(--focus-border-color);
box-shadow: 0 0 0 3px var(--focus-ring-color); box-shadow: 0 0 0 3px var(--focus-ring-color);
z-index: 1; z-index: 1;
} }
/* ERROR */ /* ERROR */
.input-variant-outlined.input-status-error { .input-status-error {
border-color: var(--color-error-500); border-color: var(--color-error-500);
z-index: 1; z-index: 1;
} }
.input-variant-outlined.input-status-error:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) { .input-status-error:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) {
border-color: var(--color-error-600); border-color: var(--color-error-600);
} }
.input-variant-outlined.input-status-error:focus, .input-status-error:focus,
.input-variant-outlined.input-status-error.rc-input-affix-wrapper-focused { .input-status-error.rc-input-affix-wrapper-focused {
border-color: var(--color-error-600); border-color: var(--color-error-600);
box-shadow: 0 0 0 3px var(--color-error-100); box-shadow: 0 0 0 3px var(--color-error-100);
} }
/* WARNING */ /* WARNING */
.input-variant-outlined.input-status-warning { .input-status-warning {
border-color: var(--color-warning-500); border-color: var(--color-warning-500);
z-index: 1; z-index: 1;
} }
.input-variant-outlined.input-status-warning:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) { .input-status-warning:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) {
border-color: var(--color-warning-600); border-color: var(--color-warning-600);
} }
.input-variant-outlined.input-status-warning:focus, .input-status-warning:focus,
.input-variant-outlined.input-status-warning.rc-input-affix-wrapper-focused { .input-status-warning.rc-input-affix-wrapper-focused {
border-color: var(--color-warning-600); border-color: var(--color-warning-600);
box-shadow: 0 0 0 3px var(--color-warning-100); box-shadow: 0 0 0 3px var(--color-warning-100);
} }
/* SUCCESS */ /* SUCCESS */
.input-variant-outlined.input-status-success { .input-status-success {
border-color: var(--color-success-500); border-color: var(--color-success-500);
z-index: 1; z-index: 1;
} }
.input-variant-outlined.input-status-success:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) { .input-status-success:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) {
border-color: var(--color-success-600); border-color: var(--color-success-600);
} }
.input-variant-outlined.input-status-success:focus, .input-status-success:focus,
.input-variant-outlined.input-status-success.rc-input-affix-wrapper-focused { .input-status-success.rc-input-affix-wrapper-focused {
border-color: var(--color-success-600); border-color: var(--color-success-600);
box-shadow: 0 0 0 3px var(--color-success-100); box-shadow: 0 0 0 3px var(--color-success-100);
} }
/* INFO */ /* INFO */
.input-variant-outlined.input-status-info { .input-status-info {
border-color: var(--color-info-500); border-color: var(--color-info-500);
z-index: 1; z-index: 1;
} }
.input-variant-outlined.input-status-info:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) { .input-status-info:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) {
border-color: var(--color-info-600); border-color: var(--color-info-600);
} }
.input-variant-outlined.input-status-info:focus, .input-status-info:focus,
.input-variant-outlined.input-status-info.rc-input-affix-wrapper-focused { .input-status-info.rc-input-affix-wrapper-focused {
border-color: var(--color-info-600); border-color: var(--color-info-600);
box-shadow: 0 0 0 3px var(--color-info-100); box-shadow: 0 0 0 3px var(--color-info-100);
} }
/* ------------------------------------------------
2. VARIANT: FILLED
------------------------------------------------ */
/* DEFAULT FILLED */
.input-variant-filled.input-status-default {
background-color: var(--input-bg);
border-color: var(--input-border);
}
.input-variant-filled.input-status-default:hover:not(.rc-input-affix-wrapper-disabled):not(:disabled) {
border-color: var(--input-border-hover);
}
.input-variant-filled.input-status-default:focus,
.input-variant-filled.input-status-default.rc-input-affix-wrapper-focused {
border-color: var(--focus-border-color);
box-shadow: 0 0 0 3px var(--focus-ring-color);
}
/* ERROR FILLED */
.input-variant-filled.input-status-error {
background-color: var(--color-error-50);
border-color: var(--color-error-500);
}
/* When focused, background becomes default input-bg (white) */
.input-variant-filled.input-status-error:focus,
.input-variant-filled.input-status-error.rc-input-affix-wrapper-focused {
background-color: var(--input-bg);
border-color: var(--color-error-500);
box-shadow: 0 0 0 3px var(--color-error-100);
}
/* WARNING FILLED */
.input-variant-filled.input-status-warning {
background-color: var(--color-warning-50);
border-color: var(--color-warning-500);
}
.input-variant-filled.input-status-warning:focus,
.input-variant-filled.input-status-warning.rc-input-affix-wrapper-focused {
background-color: var(--input-bg);
border-color: var(--color-warning-500);
box-shadow: 0 0 0 3px var(--color-warning-100);
}
/* SUCCESS FILLED */
.input-variant-filled.input-status-success {
background-color: var(--color-success-50);
border-color: var(--color-success-500);
}
.input-variant-filled.input-status-success:focus,
.input-variant-filled.input-status-success.rc-input-affix-wrapper-focused {
background-color: var(--input-bg);
border-color: var(--color-success-500);
box-shadow: 0 0 0 3px var(--color-success-100);
}
/* INFO FILLED */
.input-variant-filled.input-status-info {
background-color: var(--color-info-50);
border-color: var(--color-info-500);
}
.input-variant-filled.input-status-info:focus,
.input-variant-filled.input-status-info.rc-input-affix-wrapper-focused {
background-color: var(--input-bg);
border-color: var(--color-info-500);
box-shadow: 0 0 0 3px var(--color-info-100);
}
} }
@@ -150,42 +150,20 @@
} }
} }
/* =========================================
VARIANTS & STATUS MATRIX
========================================= */
/* -------------------------------
VARIANT: OUTLINED (Default)
Looks like an empty input when off.
------------------------------- */
.switch-variant-outlined .rc-switch {
background-color: var(--color-gray-200);
border-color: var(--color-gray-200);
}
.switch-variant-outlined .rc-switch:hover {
border-color: var(--color-brand-500);
}
/* -------------------------------
VARIANT: FILLED
Looks like a standard grey toggle when off.
------------------------------- */
.switch-variant-filled .rc-switch {
background-color: var(--color-gray-200);
border-color: var(--color-gray-200);
}
.switch-variant-filled .rc-switch:hover {
border-color: var(--color-brand-500);
}
/* ========================================= /* =========================================
STATUS COLORS (Applied to Checked State) STATUS COLORS (Applied to Checked State)
========================================= */ ========================================= */
/* --- DEFAULT (Brand) --- */ /* --- DEFAULT (Brand) --- */
.switch-status-default .rc-switch {
background-color: var(--color-gray-200);
border-color: var(--color-gray-200);
}
.switch-status-default .rc-switch:hover {
border-color: var(--color-brand-500);
}
.switch-status-default .rc-switch-checked { .switch-status-default .rc-switch-checked {
border-color: var(--color-brand-500); border-color: var(--color-brand-500);
background-color: var(--color-brand-500); background-color: var(--color-brand-500);
@@ -198,30 +176,16 @@
/* --- ERROR --- */ /* --- ERROR --- */
/* Hover Off state (Optional: Tint border red on hover even if off) */ /* Hover Off state (Optional: Tint border red on hover even if off) */
.switch-status-error.switch-variant-outlined .rc-switch { .switch-status-error .rc-switch {
background-color: var(--input-bg);
border-color: var(--color-error-300);
}
.switch-status-error.switch-variant-outlined .rc-switch:hover {
border-color: var(--color-error-500);
}
.switch-status-error.switch-variant-outlined .rc-switch:after {
background-color: var(--color-error-300);
box-shadow: 0 2px 4px 0 var(--color-error-100);
}
.switch-status-error.switch-variant-filled .rc-switch {
background-color: var(--color-error-50); background-color: var(--color-error-50);
border-color: var(--color-error-300); border-color: var(--color-error-300);
} }
.switch-status-error.switch-variant-filled .rc-switch:hover { .switch-status-error .rc-switch:hover {
border-color: var(--color-error-500); border-color: var(--color-error-500);
} }
.switch-status-error.switch-variant-filled .rc-switch:after { .switch-status-error .rc-switch:after {
background-color: #fff; background-color: #fff;
} }
@@ -235,7 +199,7 @@
box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
} }
.switch-status-error.switch-variant-filled .rc-switch-checked { .switch-status-error .rc-switch-checked {
border-color: var(--color-error-500); border-color: var(--color-error-500);
background-color: var(--color-error-500); background-color: var(--color-error-500);
} }
@@ -251,85 +215,18 @@
color: var(--color-error-500); color: var(--color-error-500);
} }
/* --- WARNING --- */
.switch-status-warning.switch-variant-outlined .rc-switch {
background-color: var(--input-bg);
border-color: var(--color-warning-300);
}
.switch-status-warning.switch-variant-outlined .rc-switch:hover {
border-color: var(--color-warning-500);
}
.switch-status-warning.switch-variant-outlined .rc-switch:after {
background-color: var(--color-warning-300);
box-shadow: 0 2px 4px 0 var(--color-warning-100);
}
.switch-status-warning.switch-variant-filled .rc-switch {
background-color: var(--color-warning-50);
border-color: var(--color-warning-300);
}
.switch-status-warning.switch-variant-filled .rc-switch:hover {
border-color: var(--color-warning-500);
}
.switch-status-warning.switch-variant-filled .rc-switch:after {
background-color: #fff;
}
/* Checked State */
.switch-status-warning.switch-variant-outlined .rc-switch-checked {
border-color: var(--color-warning-500);
background-color: var(--color-warning-500);
}
.switch-status-warning.switch-variant-outlined .rc-switch-checked:after {
background-color: #fff;
box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
}
.switch-status-warning.switch-variant-filled .rc-switch-checked {
border-color: var(--color-warning-500);
background-color: var(--color-warning-500);
}
/* Focus */
.switch-status-warning .rc-switch:focus-visible,
.switch-status-warning .rc-switch:focus {
box-shadow: 0 0 0 3px var(--color-warning-100);
border-color: var(--color-warning-500);
}
/* Loading Icon Color */
.switch-status-warning .rc-switch-loading-icon {
color: var(--color-warning-500);
}
/* --- SUCCESS --- */ /* --- SUCCESS --- */
.switch-status-success.switch-variant-outlined .rc-switch {
background-color: var(--input-bg);
border-color: var(--color-success-300);
}
.switch-status-success.switch-variant-outlined .rc-switch:hover { .switch-status-success .rc-switch {
border-color: var(--color-success-500);
}
.switch-status-success.switch-variant-outlined .rc-switch:after {
background-color: var(--color-success-300);
box-shadow: 0 2px 4px 0 var(--color-success-100);
}
.switch-status-success.switch-variant-filled .rc-switch {
background-color: var(--color-success-50); background-color: var(--color-success-50);
border-color: var(--color-success-300); border-color: var(--color-success-300);
} }
.switch-status-success.switch-variant-filled .rc-switch:hover { .switch-status-success .rc-switch:hover {
border-color: var(--color-success-500); border-color: var(--color-success-500);
} }
.switch-status-success.switch-variant-filled .rc-switch:after { .switch-status-success .rc-switch:after {
background-color: #fff; background-color: #fff;
} }
@@ -343,7 +240,7 @@
box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
} }
.switch-status-success.switch-variant-filled .rc-switch-checked { .switch-status-success .rc-switch-checked {
border-color: var(--color-success-500); border-color: var(--color-success-500);
background-color: var(--color-success-500); background-color: var(--color-success-500);
} }
@@ -359,31 +256,57 @@
color: var(--color-success-500); color: var(--color-success-500);
} }
/* --- WARNING --- */
.switch-status-warning .rc-switch {
background-color: var(--color-warning-50);
border-color: var(--color-warning-300);
}
.switch-status-warning .rc-switch:hover {
border-color: var(--color-warning-500);
}
.switch-status-warning .rc-switch:after {
background-color: #fff;
}
/* Checked State */
.switch-status-warning.switch-variant-outlined .rc-switch-checked {
border-color: var(--color-warning-500);
background-color: var(--color-warning-500);
}
.switch-status-warning.switch-variant-outlined .rc-switch-checked:after {
background-color: #fff;
box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
}
.switch-status-warning .rc-switch-checked {
border-color: var(--color-warning-500);
background-color: var(--color-warning-500);
}
/* Focus */
.switch-status-warning .rc-switch:focus-visible,
.switch-status-warning .rc-switch:focus {
box-shadow: 0 0 0 3px var(--color-warning-100);
border-color: var(--color-warning-500);
}
/* Loading Icon Color */
.switch-status-warning .rc-switch-loading-icon {
color: var(--color-warning-500);
}
/* --- INFO --- */ /* --- INFO --- */
.switch-status-info.switch-variant-outlined .rc-switch { .switch-status-info .rc-switch {
background-color: var(--input-bg);
border-color: var(--color-info-300);
}
.switch-status-info.switch-variant-outlined .rc-switch:hover {
border-color: var(--color-info-500);
}
.switch-status-info.switch-variant-outlined .rc-switch:after {
background-color: var(--color-info-300);
box-shadow: 0 2px 4px 0 var(--color-info-100);
}
.switch-status-info.switch-variant-filled .rc-switch {
background-color: var(--color-info-50); background-color: var(--color-info-50);
border-color: var(--color-info-300); border-color: var(--color-info-300);
} }
.switch-status-info.switch-variant-filled .rc-switch:hover { .switch-status-info .rc-switch:hover {
border-color: var(--color-info-500); border-color: var(--color-info-500);
} }
.switch-status-info.switch-variant-filled .rc-switch:after { .switch-status-info .rc-switch:after {
background-color: #fff; background-color: #fff;
} }
@@ -397,7 +320,7 @@
box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
} }
.switch-status-info.switch-variant-filled .rc-switch-checked { .switch-status-info .rc-switch-checked {
border-color: var(--color-info-500); border-color: var(--color-info-500);
background-color: var(--color-info-500); background-color: var(--color-info-500);
} }
@@ -118,137 +118,75 @@
------------------------------------------------ */ ------------------------------------------------ */
/* --- Default --- */ /* --- Default --- */
.textarea-variant-outlined.textarea-status-default { .textarea-status-default {
background-color: var(--input-bg); background-color: var(--input-bg);
border-color: var(--input-border); border-color: var(--input-border);
} }
/* Hover */ /* Hover */
.textarea-variant-outlined.textarea-status-default:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) { .textarea-status-default:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) {
border-color: var(--input-border-hover); border-color: var(--input-border-hover);
} }
/* Focus (Standalone OR Wrapper Focused) */ /* Focus (Standalone OR Wrapper Focused) */
.rc-textarea.textarea-variant-outlined.textarea-status-default:focus, .rc-textarea.textarea-status-default:focus,
.rc-textarea-affix-wrapper.textarea-variant-outlined.textarea-status-default.rc-textarea-affix-wrapper-focused { .rc-textarea-affix-wrapper.textarea-status-default.rc-textarea-affix-wrapper-focused {
border-color: var(--focus-border-color); border-color: var(--focus-border-color);
box-shadow: 0 0 0 3px var(--focus-ring-color); box-shadow: 0 0 0 3px var(--focus-ring-color);
z-index: 1; z-index: 1;
} }
/* --- Error --- */ /* --- Error --- */
.textarea-variant-outlined.textarea-status-error { .textarea-status-error {
border-color: var(--color-error-500); border-color: var(--color-error-500);
z-index: 1; z-index: 1;
} }
.textarea-variant-outlined.textarea-status-error:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) { .textarea-status-error:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) {
border-color: var(--color-error-600); border-color: var(--color-error-600);
} }
.rc-textarea.textarea-variant-outlined.textarea-status-error:focus, .rc-textarea.textarea-status-error:focus,
.rc-textarea-affix-wrapper.textarea-variant-outlined.textarea-status-error.rc-textarea-affix-wrapper-focused { .rc-textarea-affix-wrapper.textarea-status-error.rc-textarea-affix-wrapper-focused {
border-color: var(--color-error-600); border-color: var(--color-error-600);
box-shadow: 0 0 0 3px var(--color-error-100); box-shadow: 0 0 0 3px var(--color-error-100);
} }
/* --- Warning --- */ /* --- Warning --- */
.textarea-variant-outlined.textarea-status-warning { .textarea-status-warning {
border-color: var(--color-warning-500); border-color: var(--color-warning-500);
z-index: 1; z-index: 1;
} }
.textarea-variant-outlined.textarea-status-warning:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) { .textarea-status-warning:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) {
border-color: var(--color-warning-600); border-color: var(--color-warning-600);
} }
.rc-textarea.textarea-variant-outlined.textarea-status-warning:focus, .rc-textarea.textarea-status-warning:focus,
.rc-textarea-affix-wrapper.textarea-variant-outlined.textarea-status-warning.rc-textarea-affix-wrapper-focused { .rc-textarea-affix-wrapper.textarea-status-warning.rc-textarea-affix-wrapper-focused {
border-color: var(--color-warning-600); border-color: var(--color-warning-600);
box-shadow: 0 0 0 3px var(--color-warning-100); box-shadow: 0 0 0 3px var(--color-warning-100);
} }
/* --- Success --- */ /* --- Success --- */
.textarea-variant-outlined.textarea-status-success { .textarea-status-success {
border-color: var(--color-success-500); border-color: var(--color-success-500);
z-index: 1; z-index: 1;
} }
.textarea-variant-outlined.textarea-status-success:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) { .textarea-status-success:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) {
border-color: var(--color-success-600); border-color: var(--color-success-600);
} }
.rc-textarea.textarea-variant-outlined.textarea-status-success:focus, .rc-textarea.textarea-status-success:focus,
.rc-textarea-affix-wrapper.textarea-variant-outlined.textarea-status-success.rc-textarea-affix-wrapper-focused { .rc-textarea-affix-wrapper.textarea-status-success.rc-textarea-affix-wrapper-focused {
border-color: var(--color-success-600); border-color: var(--color-success-600);
box-shadow: 0 0 0 3px var(--color-success-100); box-shadow: 0 0 0 3px var(--color-success-100);
} }
/* --- Info --- */ /* --- Info --- */
.textarea-variant-outlined.textarea-status-info { .textarea-status-info {
border-color: var(--color-info-500); border-color: var(--color-info-500);
z-index: 1; z-index: 1;
} }
.textarea-variant-outlined.textarea-status-info:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) { .textarea-status-info:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) {
border-color: var(--color-info-600); border-color: var(--color-info-600);
} }
.rc-textarea.textarea-variant-outlined.textarea-status-info:focus, .rc-textarea.textarea-status-info:focus,
.rc-textarea-affix-wrapper.textarea-variant-outlined.textarea-status-info.rc-textarea-affix-wrapper-focused { .rc-textarea-affix-wrapper.textarea-status-info.rc-textarea-affix-wrapper-focused {
border-color: var(--color-info-600); border-color: var(--color-info-600);
box-shadow: 0 0 0 3px var(--color-info-100); box-shadow: 0 0 0 3px var(--color-info-100);
} }
/* ------------------------------------------------
2. VARIANT: FILLED
------------------------------------------------ */
/* --- Default Filled --- */
.textarea-variant-filled.textarea-status-default {
background-color: var(--input-bg);
border-color: var(--input-border);
}
.textarea-variant-filled.textarea-status-default:hover:not(:disabled):not(.rc-textarea-affix-wrapper-disabled) {
border-color: var(--input-border-hover);
}
.rc-textarea.textarea-variant-filled.textarea-status-default:focus,
.rc-textarea-affix-wrapper.textarea-variant-filled.textarea-status-default.rc-textarea-affix-wrapper-focused {
border-color: var(--focus-border-color);
box-shadow: 0 0 0 3px var(--focus-ring-color);
}
/* --- Error Filled --- */
.textarea-variant-filled.textarea-status-error {
background-color: var(--color-error-50);
border-color: var(--color-error-500);
}
.rc-textarea.textarea-variant-filled.textarea-status-error:focus,
.rc-textarea-affix-wrapper.textarea-variant-filled.textarea-status-error.rc-textarea-affix-wrapper-focused {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-error-100);
}
/* --- Warning Filled --- */
.textarea-variant-filled.textarea-status-warning {
background-color: var(--color-warning-50);
border-color: var(--color-warning-500);
}
.rc-textarea.textarea-variant-filled.textarea-status-warning:focus,
.rc-textarea-affix-wrapper.textarea-variant-filled.textarea-status-warning.rc-textarea-affix-wrapper-focused {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-warning-100);
}
/* --- Success Filled --- */
.textarea-variant-filled.textarea-status-success {
background-color: var(--color-success-50);
border-color: var(--color-success-500);
}
.rc-textarea.textarea-variant-filled.textarea-status-success:focus,
.rc-textarea-affix-wrapper.textarea-variant-filled.textarea-status-success.rc-textarea-affix-wrapper-focused {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-success-100);
}
/* --- Info Filled --- */
.textarea-variant-filled.textarea-status-info {
background-color: var(--color-info-50);
border-color: var(--color-info-500);
}
.rc-textarea.textarea-variant-filled.textarea-status-info:focus,
.rc-textarea-affix-wrapper.textarea-variant-filled.textarea-status-info.rc-textarea-affix-wrapper-focused {
background-color: var(--input-bg);
box-shadow: 0 0 0 3px var(--color-info-100);
}
} }
@@ -19,17 +19,7 @@ const LoadingSpinner = () => (
); );
export const Switch = forwardRef<HTMLButtonElement, SwitchProps>((props, ref) => { export const Switch = forwardRef<HTMLButtonElement, SwitchProps>((props, ref) => {
const { const { label, status = 'default', className, children, style, loading, disabled, ...rest } = props;
label,
status = 'default',
variant = 'outlined',
className,
children,
style,
loading,
disabled,
...rest
} = props;
const displayLabel = label || children; const displayLabel = label || children;
@@ -38,7 +28,6 @@ export const Switch = forwardRef<HTMLButtonElement, SwitchProps>((props, ref) =>
const wrapperClass = [ const wrapperClass = [
'rc-switch-wrapper', 'rc-switch-wrapper',
`switch-status-${status}`, `switch-status-${status}`,
`switch-variant-${variant}`,
!isEnabled ? 'rc-switch-wrapper-disabled' : '', !isEnabled ? 'rc-switch-wrapper-disabled' : '',
className, className,
] ]
@@ -3,37 +3,32 @@ import RcTextArea, { TextAreaRef } from '@rc-component/textarea';
import { InputStatusType, TextAreaProps, VALID_INPUT_STATUSES } from '../types'; import { InputStatusType, TextAreaProps, VALID_INPUT_STATUSES } from '../types';
/** /**
* Forwarding React component that renders an RcTextArea with normalized status and variant styling. * Forwarding React component that renders an RcTextArea with normalized status.
* *
* The component computes a CSS class string from the optional `className`, a `textarea-status-<status>` class * The component computes a CSS class string from the optional `className`, a `textarea-status-<status>` class
* (falling back to 'default' when `status` is missing or not one of VALID_INPUT_STATUSES), and a * (falling back to 'default' when `status` is missing or not one of VALID_INPUT_STATUSES), and a
* `textarea-variant-<variant>` class. All other props are passed through to the underlying RcTextArea.
* *
* The component forwards a ref to the underlying RcTextArea element. * The component forwards a ref to the underlying RcTextArea element.
* *
* @remarks * @remarks
* - `variant` defaults to `'outlined'`.
* - `status` is validated against `VALID_INPUT_STATUSES`; if invalid or absent, `'default'` is used. * - `status` is validated against `VALID_INPUT_STATUSES`; if invalid or absent, `'default'` is used.
* - Computed className shape: [className?, `textarea-status-${status}`, `textarea-variant-${variant}`].filter(Boolean).join(' ') * - Computed className shape: [className?, `textarea-status-${status}`].filter(Boolean).join(' ')
* *
* @param props.status - Optional input status (validated against VALID_INPUT_STATUSES). * @param props.status - Optional input status (validated against VALID_INPUT_STATUSES).
* @param props.className - Optional additional class name(s) to apply. * @param props.className - Optional additional class name(s) to apply.
* @param props.variant - Visual variant of the textarea; defaults to `'outlined'`.
* @param props.rest - All other props are forwarded to RcTextArea. * @param props.rest - All other props are forwarded to RcTextArea.
* *
* @returns A React element: the wrapped RcTextArea with forwarded ref and computed classes. * @returns A React element: the wrapped RcTextArea with forwarded ref and computed classes.
* *
* @example * @example
* <TextArea status="error" variant="filled" placeholder="Enter text" /> * <TextArea status="error" placeholder="Enter text" />
*/ */
export const TextArea = forwardRef<TextAreaRef, TextAreaProps>((props, ref) => { export const TextArea = forwardRef<TextAreaRef, TextAreaProps>((props, ref) => {
const { status, className, variant = 'outlined', ...restProps } = props; const { status, className, ...restProps } = props;
const currentStatus: InputStatusType = status && VALID_INPUT_STATUSES.includes(status) ? status : 'default'; const currentStatus: InputStatusType = status && VALID_INPUT_STATUSES.includes(status) ? status : 'default';
const computedClassName = [className, `textarea-status-${currentStatus}`, `textarea-variant-${variant}`] const computedClassName = [className, `textarea-status-${currentStatus}`].filter(Boolean).join(' ');
.filter(Boolean)
.join(' ');
return <RcTextArea ref={ref} className={computedClassName} {...restProps} />; return <RcTextArea ref={ref} className={computedClassName} {...restProps} />;
}); });
@@ -44,9 +44,7 @@ interface BaseFormItemComponentProps {
status?: InputStatusType; status?: InputStatusType;
} }
interface BaseFormInputComponentProps extends BaseFormItemComponentProps { interface BaseFormInputComponentProps extends BaseFormItemComponentProps {}
variant?: 'outlined' | 'filled';
}
/** /**
* Define specific component props * Define specific component props