diff --git a/apps/www/src/app/examples/page.tsx b/apps/www/src/app/examples/page.tsx
index b65134762..86ff2dada 100644
--- a/apps/www/src/app/examples/page.tsx
+++ b/apps/www/src/app/examples/page.tsx
@@ -28,7 +28,7 @@ import {
Flex,
IconButton,
Indicator,
- InputField,
+ Input,
Menu,
Navbar,
Popover,
@@ -516,7 +516,7 @@ const Page = () => {
-
+
{/* Button Examples */}
@@ -1663,7 +1663,7 @@ const Page = () => {
- }
width='100%'
@@ -1832,7 +1832,7 @@ const Page = () => {
- }
width='100%'
diff --git a/apps/www/src/components/demo/demo-controls.tsx b/apps/www/src/components/demo/demo-controls.tsx
index f7978db50..0dc044732 100644
--- a/apps/www/src/components/demo/demo-controls.tsx
+++ b/apps/www/src/components/demo/demo-controls.tsx
@@ -8,7 +8,7 @@ import {
import {
Flex,
IconButton,
- InputField,
+ Input,
Select,
Switch,
Text
@@ -152,7 +152,7 @@ export default function DemoControls({
// For text and number types
return (
-
-
+
-
+
-
+
@@ -27,7 +27,7 @@ export function FieldExamples() {
-
+
diff --git a/apps/www/src/components/playground/fieldset-examples.tsx b/apps/www/src/components/playground/fieldset-examples.tsx
index 8266f016c..ff1bef250 100644
--- a/apps/www/src/components/playground/fieldset-examples.tsx
+++ b/apps/www/src/components/playground/fieldset-examples.tsx
@@ -1,6 +1,6 @@
'use client';
-import { Field, Fieldset, Flex, InputField } from '@raystack/apsara';
+import { Field, Fieldset, Flex, Input } from '@raystack/apsara';
import PlaygroundLayout from './playground-layout';
export function FieldsetExamples() {
@@ -9,15 +9,15 @@ export function FieldsetExamples() {
diff --git a/apps/www/src/components/playground/form-examples.tsx b/apps/www/src/components/playground/form-examples.tsx
index b02ea86c5..466a8e228 100644
--- a/apps/www/src/components/playground/form-examples.tsx
+++ b/apps/www/src/components/playground/form-examples.tsx
@@ -5,7 +5,7 @@ import {
Field,
Fieldset,
Form,
- InputField,
+ Input,
TextArea
} from '@raystack/apsara';
import PlaygroundLayout from './playground-layout';
@@ -22,14 +22,14 @@ export function FormExamples() {
>
-
+
diff --git a/apps/www/src/components/playground/index.ts b/apps/www/src/components/playground/index.ts
index 22d903501..3f1241e24 100644
--- a/apps/www/src/components/playground/index.ts
+++ b/apps/www/src/components/playground/index.ts
@@ -29,7 +29,7 @@ export * from './headline-examples';
export * from './icon-button-examples';
export * from './image-examples';
export * from './indicator-examples';
-export * from './input-field-examples';
+export * from './input-examples';
export * from './label-examples';
export * from './link-examples';
export * from './list-examples';
diff --git a/apps/www/src/components/playground/input-field-examples.tsx b/apps/www/src/components/playground/input-examples.tsx
similarity index 62%
rename from apps/www/src/components/playground/input-field-examples.tsx
rename to apps/www/src/components/playground/input-examples.tsx
index f03f4f477..994fb3fe6 100644
--- a/apps/www/src/components/playground/input-field-examples.tsx
+++ b/apps/www/src/components/playground/input-examples.tsx
@@ -1,32 +1,32 @@
'use client';
-import { Field, Flex, InputField } from '@raystack/apsara';
+import { Field, Flex, Input } from '@raystack/apsara';
import { Home, Info } from 'lucide-react';
import PlaygroundLayout from './playground-layout';
-export function InputFieldExamples() {
+export function InputExamples() {
return (
-
+
-
+
-
+
-
+
-
-
+ }
trailingIcon={}
/>
-
+
diff --git a/apps/www/src/content/docs/(overview)/index.mdx b/apps/www/src/content/docs/(overview)/index.mdx
index f0ee28b2d..9982ba243 100644
--- a/apps/www/src/content/docs/(overview)/index.mdx
+++ b/apps/www/src/content/docs/(overview)/index.mdx
@@ -24,7 +24,7 @@ Apsara provides over 50 components organized by function:
| **Layout** | Flex, Grid, Container, Separator |
| **Navigation** | Navbar, Sidebar, Breadcrumb, Tabs, Link |
| **Data Display** | DataTable, Table, List, Avatar, Badge, Chip, Indicator |
-| **Forms** | Button, InputField, TextArea, Select, Combobox, Checkbox, Radio, Switch, Slider, ColorPicker, Calendar |
+| **Forms** | Button, Input, TextArea, Select, Combobox, Checkbox, Radio, Switch, Slider, ColorPicker, Calendar |
| **Feedback** | Dialog, Drawer, Popover, Tooltip, Toast, Callout, EmptyState, Skeleton, Spinner |
| **Utilities** | Command, Search, CopyButton, CodeBlock, ScrollArea |
diff --git a/apps/www/src/content/docs/components/calendar/props.ts b/apps/www/src/content/docs/components/calendar/props.ts
index 53c38428b..504a087f6 100644
--- a/apps/www/src/content/docs/components/calendar/props.ts
+++ b/apps/www/src/content/docs/components/calendar/props.ts
@@ -1,4 +1,4 @@
-import { InputFieldProps } from '../input-field/props';
+import { InputProps } from '../input/props';
import { PopoverContentProps } from '../popover/props';
export interface CalendarProps {
@@ -68,10 +68,10 @@ export interface RangePickerProps {
/** Props for customizing the calendar */
calendarProps?: CalendarProps;
- /** Props for customizing the input fields */
- inputFieldsProps?: {
- startDate?: InputFieldProps;
- endDate?: InputFieldProps;
+ /** Props for customizing the inputs */
+ inputsProps?: {
+ startDate?: InputProps;
+ endDate?: InputProps;
};
/** Render prop for custom trigger */
@@ -108,8 +108,8 @@ export interface DatePickerProps {
*/
dateFormat?: string;
- /** Props for customizing the input field */
- inputFieldProps?: InputFieldProps;
+ /** Props for customizing the input */
+ inputProps?: InputProps;
/** Initial date value */
value?: Date;
diff --git a/apps/www/src/content/docs/components/command/index.mdx b/apps/www/src/content/docs/components/command/index.mdx
index 7928b2ed2..f360c0718 100644
--- a/apps/www/src/content/docs/components/command/index.mdx
+++ b/apps/www/src/content/docs/components/command/index.mdx
@@ -55,7 +55,7 @@ The root element owns the input value, the list of items, and the context used b
### Input
-Text input that drives the search. Accepts the same props as `InputField` and defaults to a magnifying-glass leading icon.
+Text input that drives the search. Accepts the same props as `Input` and defaults to a magnifying-glass leading icon.
diff --git a/apps/www/src/content/docs/components/field/demo.ts b/apps/www/src/content/docs/components/field/demo.ts
index 813903d09..bdbf807c1 100644
--- a/apps/www/src/content/docs/components/field/demo.ts
+++ b/apps/www/src/content/docs/components/field/demo.ts
@@ -10,7 +10,7 @@ export const getCode = (props: any) => {
if (error) fieldProps.error = error;
if (required !== undefined) fieldProps.required = required;
return `
-
+
`;
};
@@ -29,35 +29,35 @@ export const playground = {
export const simpleDemo = {
type: 'code',
code: `
-
+
`
};
export const errorDemo = {
type: 'code',
code: `
-
+
`
};
export const descriptionDemo = {
type: 'code',
code: `
-
+
`
};
export const requiredDemo = {
type: 'code',
code: `
-
+
`
};
export const optionalDemo = {
type: 'code',
code: `
-
+
`
};
@@ -99,10 +99,10 @@ export const customValidateDemo = {
`
};
-export const withInputFieldDemo = {
+export const withInputDemo = {
type: 'code',
code: `
-
+
`
};
diff --git a/apps/www/src/content/docs/components/field/index.mdx b/apps/www/src/content/docs/components/field/index.mdx
index f9710d2e7..145348644 100644
--- a/apps/www/src/content/docs/components/field/index.mdx
+++ b/apps/www/src/content/docs/components/field/index.mdx
@@ -15,7 +15,7 @@ import {
subComponentDemo,
constraintErrorsDemo,
customValidateDemo,
- withInputFieldDemo,
+ withInputDemo,
withTextAreaDemo,
withSelectDemo,
} from "./demo.ts";
@@ -31,10 +31,10 @@ Field supports two APIs: a **simple props API** for common use cases and a **sub
Use `label`, `description`, and `error` props for quick forms or when validation is handled externally (e.g., React Hook Form).
```tsx
-import { Field, InputField } from "@raystack/apsara";
+import { Field, Input } from "@raystack/apsara";
-
+
```
@@ -101,11 +101,11 @@ Provides field validity state to a render function. Use for custom validity-base
## Examples
-### With InputField
+### With Input
-Use Field to add label, description, and error to an InputField.
+Use Field to add label, description, and error to an Input.
-
+
### With TextArea
diff --git a/apps/www/src/content/docs/components/fieldset/demo.ts b/apps/www/src/content/docs/components/fieldset/demo.ts
index 82704882c..4579d4007 100644
--- a/apps/www/src/content/docs/components/fieldset/demo.ts
+++ b/apps/www/src/content/docs/components/fieldset/demo.ts
@@ -4,13 +4,13 @@ export const playground = {
type: 'code',
code: ``
};
@@ -19,10 +19,10 @@ export const basicDemo = {
type: 'code',
code: ``
};
@@ -32,10 +32,10 @@ export const subComponentDemo = {
code: ``
};
@@ -44,10 +44,10 @@ export const disabledDemo = {
type: 'code',
code: ``
};
@@ -57,15 +57,15 @@ export const nestedDemo = {
code: `
);
default:
return (
-
{
+describe('Input', () => {
describe('Basic Rendering', () => {
it('renders input element', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toBeInTheDocument();
});
it('applies custom className', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveClass('custom-input');
expect(input).toHaveClass(styles['input-field']);
@@ -20,36 +20,36 @@ describe('InputField', () => {
it('forwards ref correctly', () => {
const ref = vi.fn();
- render();
+ render();
expect(ref).toHaveBeenCalled();
});
it('renders with placeholder', () => {
- render();
+ render();
const input = screen.getByPlaceholderText('Enter text here');
expect(input).toBeInTheDocument();
});
it('sets custom width', () => {
- const { container } = render();
+ const { container } = render();
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
expect(wrapper).toHaveStyle({ width: '300px' });
});
it('sets numeric width as pixels', () => {
- const { container } = render();
+ const { container } = render();
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
expect(wrapper).toHaveStyle({ width: '400px' });
});
it('defaults to 100% width', () => {
- const { container } = render();
+ const { container } = render();
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
expect(wrapper).toHaveStyle({ width: '100%' });
});
it('disables input when disabled prop is true', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toBeDisabled();
});
@@ -57,13 +57,13 @@ describe('InputField', () => {
describe('Sizes', () => {
it('renders large size by default', () => {
- const { container } = render();
+ const { container } = render();
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
expect(wrapper).toHaveClass(styles['size-large']);
});
it('renders small size when specified', () => {
- const { container } = render();
+ const { container } = render();
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
expect(wrapper).toHaveClass(styles['size-small']);
});
@@ -71,13 +71,13 @@ describe('InputField', () => {
describe('Variants', () => {
it('renders default variant by default', () => {
- const { container } = render();
+ const { container } = render();
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
expect(wrapper).toHaveClass(styles['variant-default']);
});
it('renders borderless variant when specified', () => {
- const { container } = render();
+ const { container } = render();
const wrapper = container.querySelector(`.${styles['input-wrapper']}`);
expect(wrapper).toHaveClass(styles['variant-borderless']);
});
@@ -86,7 +86,7 @@ describe('InputField', () => {
describe('Icons', () => {
it('renders leading icon', () => {
const icon = 🔍;
- const { container } = render();
+ const { container } = render();
expect(screen.getByTestId('search-icon')).toBeInTheDocument();
const iconContainer = container.querySelector(
`.${styles['leading-icon']}`
@@ -96,7 +96,7 @@ describe('InputField', () => {
it('renders trailing icon', () => {
const icon = ✕;
- const { container } = render();
+ const { container } = render();
expect(screen.getByTestId('clear-icon')).toBeInTheDocument();
const iconContainer = container.querySelector(
`.${styles['trailing-icon']}`
@@ -107,17 +107,17 @@ describe('InputField', () => {
describe('Prefix and Suffix', () => {
it('renders prefix', () => {
- render();
+ render();
expect(screen.getByText('$')).toBeInTheDocument();
});
it('renders suffix', () => {
- render();
+ render();
expect(screen.getByText('USD')).toBeInTheDocument();
});
it('renders both prefix and suffix', () => {
- render();
+ render();
expect(screen.getByText('$')).toBeInTheDocument();
expect(screen.getByText('USD')).toBeInTheDocument();
});
@@ -126,7 +126,7 @@ describe('InputField', () => {
describe('Chips', () => {
it('renders chips', () => {
const chips = [{ label: 'Tag1' }, { label: 'Tag2' }];
- render();
+ render();
expect(screen.getByText('Tag1')).toBeInTheDocument();
expect(screen.getByText('Tag2')).toBeInTheDocument();
});
@@ -138,7 +138,7 @@ describe('InputField', () => {
{ label: 'Tag3' },
{ label: 'Tag4' }
];
- render();
+ render();
expect(screen.getByText('Tag1')).toBeInTheDocument();
expect(screen.getByText('Tag2')).toBeInTheDocument();
expect(screen.queryByText('Tag3')).not.toBeInTheDocument();
@@ -149,7 +149,7 @@ describe('InputField', () => {
it('renders dismissible chips with onRemove', () => {
const handleRemove = vi.fn();
const chips = [{ label: 'Tag1', onRemove: handleRemove }];
- const { container } = render();
+ const { container } = render();
const chip = container.querySelector(`.${styles.chip}`);
expect(chip).toBeInTheDocument();
});
@@ -158,14 +158,14 @@ describe('InputField', () => {
const chips = Array.from({ length: 5 }, (_, i) => ({
label: `Tag${i + 1}`
}));
- render();
+ render();
expect(screen.getByText('+2')).toBeInTheDocument();
});
it('does not render dismiss button on chips when disabled', () => {
const handleRemove = vi.fn();
const chips = [{ label: 'Tag1', onRemove: handleRemove }];
- render();
+ render();
const dismissButton = screen.queryByRole('button', {
name: 'Remove Tag1'
});
@@ -175,7 +175,7 @@ describe('InputField', () => {
it('chips are non-interactive when disabled', () => {
const handleRemove = vi.fn();
const chips = [{ label: 'Tag1', onRemove: handleRemove }];
- const { container } = render();
+ const { container } = render();
const chip = container.querySelector(`.${styles.chip}`);
expect(chip).toHaveAttribute('data-disabled');
});
@@ -183,7 +183,7 @@ describe('InputField', () => {
it('chips remain interactive when not disabled', () => {
const handleRemove = vi.fn();
const chips = [{ label: 'Tag1', onRemove: handleRemove }];
- render();
+ render();
const dismissButton = screen.getByRole('button', {
name: 'Remove Tag1'
});
@@ -195,7 +195,7 @@ describe('InputField', () => {
describe('Event Handling', () => {
it('handles onChange event', () => {
const handleChange = vi.fn();
- render();
+ render();
const input = screen.getByRole('textbox');
fireEvent.change(input, { target: { value: 'test' } });
expect(handleChange).toHaveBeenCalled();
@@ -203,7 +203,7 @@ describe('InputField', () => {
it('handles onFocus event', () => {
const handleFocus = vi.fn();
- render();
+ render();
const input = screen.getByRole('textbox');
fireEvent.focus(input);
expect(handleFocus).toHaveBeenCalled();
@@ -211,7 +211,7 @@ describe('InputField', () => {
it('handles onBlur event', () => {
const handleBlur = vi.fn();
- render();
+ render();
const input = screen.getByRole('textbox');
fireEvent.blur(input);
expect(handleBlur).toHaveBeenCalled();
@@ -219,7 +219,7 @@ describe('InputField', () => {
it('handles onKeyDown event', () => {
const handleKeyDown = vi.fn();
- render();
+ render();
const input = screen.getByRole('textbox');
fireEvent.keyDown(input, { key: 'Enter' });
expect(handleKeyDown).toHaveBeenCalled();
@@ -229,7 +229,7 @@ describe('InputField', () => {
describe('Input Types', () => {
const inputTypes = ['text', 'email', 'password', 'number', 'tel', 'url'];
it.each(inputTypes)('supports %s type', type => {
- const { container } = render();
+ const { container } = render();
const input = container.querySelector('input');
expect(input).toHaveAttribute('type', type);
});
@@ -237,19 +237,19 @@ describe('InputField', () => {
describe('Accessibility', () => {
it('supports aria-label', () => {
- render();
+ render();
const input = screen.getByLabelText('Search input');
expect(input).toBeInTheDocument();
});
it('supports aria-describedby', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('aria-describedby', 'description');
});
it('supports aria-required', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('aria-required', 'true');
});
@@ -257,43 +257,43 @@ describe('InputField', () => {
describe('Form Attributes', () => {
it('supports name attribute', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('name', 'email');
});
it('supports id attribute', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('id', 'email-input');
});
it('supports autoComplete attribute', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('autoComplete', 'email');
});
it('supports required attribute', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toBeRequired();
});
it('supports readOnly attribute', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('readOnly');
});
it('supports maxLength attribute', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('maxLength', '50');
});
it('supports pattern attribute', () => {
- render();
+ render();
const input = screen.getByRole('textbox');
expect(input).toHaveAttribute('pattern', '[0-9]*');
});
diff --git a/packages/raystack/components/input/index.tsx b/packages/raystack/components/input/index.tsx
new file mode 100644
index 000000000..f376f8cdb
--- /dev/null
+++ b/packages/raystack/components/input/index.tsx
@@ -0,0 +1 @@
+export { Input } from './input';
diff --git a/packages/raystack/components/input-field/input-field.module.css b/packages/raystack/components/input/input.module.css
similarity index 100%
rename from packages/raystack/components/input-field/input-field.module.css
rename to packages/raystack/components/input/input.module.css
diff --git a/packages/raystack/components/input-field/input-field.tsx b/packages/raystack/components/input/input.tsx
similarity index 94%
rename from packages/raystack/components/input-field/input-field.tsx
rename to packages/raystack/components/input/input.tsx
index 5cfce4aff..edccca5b7 100644
--- a/packages/raystack/components/input-field/input-field.tsx
+++ b/packages/raystack/components/input/input.tsx
@@ -3,7 +3,7 @@ import { cva, cx, type VariantProps } from 'class-variance-authority';
import { ReactNode, RefObject } from 'react';
import { Chip } from '../chip';
import { useFieldContext } from '../field';
-import styles from './input-field.module.css';
+import styles from './input.module.css';
const inputWrapper = cva(styles['input-wrapper'], {
variants: {
@@ -22,7 +22,7 @@ const inputWrapper = cva(styles['input-wrapper'], {
}
});
-export interface InputFieldProps
+export interface InputProps
extends Omit,
VariantProps {
disabled?: boolean;
@@ -37,7 +37,7 @@ export interface InputFieldProps
containerRef?: RefObject;
}
-export function InputField({
+export function Input({
className,
disabled,
placeholder,
@@ -53,7 +53,7 @@ export function InputField({
containerRef,
required,
...props
-}: InputFieldProps) {
+}: InputProps) {
const fieldContext = useFieldContext();
const resolvedRequired = required ?? fieldContext?.required;
@@ -114,4 +114,4 @@ export function InputField({
);
}
-InputField.displayName = 'InputField';
+Input.displayName = 'Input';
diff --git a/packages/raystack/components/search/__tests__/search.test.tsx b/packages/raystack/components/search/__tests__/search.test.tsx
index 1daffa263..ed9430f00 100644
--- a/packages/raystack/components/search/__tests__/search.test.tsx
+++ b/packages/raystack/components/search/__tests__/search.test.tsx
@@ -196,8 +196,8 @@ describe('Search', () => {
});
});
- describe('InputField Props', () => {
- it('passes className to input field', () => {
+ describe('Input Props', () => {
+ it('passes className to input', () => {
render();
const input = screen.getByRole('textbox');
expect(input).toHaveClass('custom-search');
diff --git a/packages/raystack/components/search/search.tsx b/packages/raystack/components/search/search.tsx
index e79fcab6e..23a3ed5b2 100644
--- a/packages/raystack/components/search/search.tsx
+++ b/packages/raystack/components/search/search.tsx
@@ -2,12 +2,12 @@
import { CrossCircledIcon, MagnifyingGlassIcon } from '@radix-ui/react-icons';
import { IconButton } from '../icon-button';
-import { InputField } from '../input-field';
-import { InputFieldProps } from '../input-field/input-field';
+import { Input } from '../input';
+import { InputProps } from '../input/input';
import styles from './search.module.css';
-export interface SearchProps extends Omit {
+export interface SearchProps extends Omit {
showClearButton?: boolean;
onClear?: () => void;
variant?: 'default' | 'borderless';
@@ -48,7 +48,7 @@ export function Search({
return (
- }
trailingIcon={trailingIconWithClear}
placeholder={placeholder}
diff --git a/packages/raystack/figma/input.figma.tsx b/packages/raystack/figma/input.figma.tsx
index 53e63c581..b598e1187 100644
--- a/packages/raystack/figma/input.figma.tsx
+++ b/packages/raystack/figma/input.figma.tsx
@@ -1,9 +1,9 @@
import figma from '@figma/code-connect';
import { Field } from '../components/field';
-import { InputField } from '../components/input-field';
+import { Input } from '../components/input';
-figma.connect(InputField, '?node-id=1-297', {
- imports: ["import { Field, InputField } from '@raystack/apsara'"],
+figma.connect(Input, '?node-id=1-297', {
+ imports: ["import { Field, Input } from '@raystack/apsara'"],
props: {
prefix: figma.enum('Variant', {
Prefix: figma.textContent('Prefix')
@@ -46,10 +46,10 @@ figma.connect(InputField, '?node-id=1-297', {
if (label || description || optional) {
return (
-
+
);
}
- return ;
+ return ;
}
});
diff --git a/packages/raystack/index.tsx b/packages/raystack/index.tsx
index cd849b3b3..831fe2de3 100644
--- a/packages/raystack/index.tsx
+++ b/packages/raystack/index.tsx
@@ -44,7 +44,7 @@ export { Headline } from './components/headline';
export { IconButton } from './components/icon-button';
export { Image } from './components/image';
export { Indicator } from './components/indicator';
-export { InputField } from './components/input-field';
+export { Input } from './components/input';
export { Label } from './components/label';
export { Link } from './components/link';
export { List } from './components/list';