diff --git a/canon-docs/src/app/(docs)/components/field/page.mdx b/canon-docs/src/app/(docs)/components/field/page.mdx
deleted file mode 100644
index 1526ce8c9f..0000000000
--- a/canon-docs/src/app/(docs)/components/field/page.mdx
+++ /dev/null
@@ -1,99 +0,0 @@
-import { PropsTable } from '@/components/PropsTable';
-import { Snippet } from '@/components/Snippet';
-import { Tabs } from '@/components/Tabs';
-import { CodeBlock } from '@/components/CodeBlock';
-import { FieldSnippet } from '@/snippets/stories-snippets';
-import { BaseUI } from '@/components/HeadlessBanners/BaseUI';
-import {
- fieldRootPropDefs,
- fieldLabelPropDefs,
- fieldDescriptionPropDefs,
- fieldErrorPropDefs,
-} from './props';
-
-# Field
-
-A wrapper around `Input` or `Select` component to add label, description and error messages..
-
- }
- code={` `}
-/>
-
-
-
- Usage
- Theming
-
-
-
- Name
-
- Visible on your profile
-
-`}
- />
-
-
- We recommend starting with our [global tokens](/theme/theming) to customize the library and align it with
- your brand. For additional flexibility, you can use the provided class names for each element listed below.
-
-
-
-
-`}
- />
-
-
-
-## API reference
-
-
-
-### Field.Root
-
-Groups all parts of the field. Renders a `
` element.
-
-
-
-### Field.Label
-
-An accessible label that is automatically associated with the field control. Renders a `
` element.
-
-
-
-### Field.Description
-
-A paragraph with additional information about the field. Renders a `` element.
-
-
-
-### Field.Error
-
-An error message displayed if the field control fails validation. Renders a `
` element.
-
-
-
-## Examples
-
-### With Label and Description
-
-Here's a simple input with a label and description.
-
-
}
- code={`
- Name
- Visible on your profile
-
- `}
-/>
diff --git a/canon-docs/src/app/(docs)/components/field/props.ts b/canon-docs/src/app/(docs)/components/field/props.ts
deleted file mode 100644
index aaadafee50..0000000000
--- a/canon-docs/src/app/(docs)/components/field/props.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { classNamePropDefs, stylePropDefs } from '../../../../utils/propDefs';
-import type { PropDef } from '../../../../utils/propDefs';
-
-export const fieldRootPropDefs: Record
= {
- name: {
- type: 'string',
- responsive: false,
- },
- disabled: {
- type: 'boolean',
- responsive: false,
- },
- invalid: {
- type: 'boolean',
- responsive: false,
- },
- validate: {
- type: 'enum',
- values: ['(value) => string | string[] | null | Promise'],
- responsive: false,
- },
- validationMode: {
- type: 'enum',
- values: ['onBlur', 'onChange'],
- responsive: false,
- },
- validationDebounceTime: {
- type: 'number',
- responsive: false,
- },
- ...classNamePropDefs,
- ...stylePropDefs,
-};
-
-export const fieldLabelPropDefs: Record = {
- ...classNamePropDefs,
- ...stylePropDefs,
-};
-
-export const fieldDescriptionPropDefs: Record = {
- ...classNamePropDefs,
- ...stylePropDefs,
-};
-
-export const fieldErrorPropDefs: Record = {
- match: {
- type: 'enum',
- values: [
- 'badInput',
- 'customError',
- 'patternMismatch',
- 'rangeOverflow',
- 'rangeUnderflow',
- 'stepMismatch',
- 'tooLong',
- 'tooShort',
- 'typeMismatch',
- 'valid',
- 'valueMissing',
- ],
- responsive: false,
- },
- forceShow: {
- type: 'boolean',
- responsive: false,
- },
- ...classNamePropDefs,
- ...stylePropDefs,
-};
diff --git a/canon-docs/src/app/(docs)/components/input/page.mdx b/canon-docs/src/app/(docs)/components/text-field/page.mdx
similarity index 51%
rename from canon-docs/src/app/(docs)/components/input/page.mdx
rename to canon-docs/src/app/(docs)/components/text-field/page.mdx
index 0ecaaa5409..bd5fa31025 100644
--- a/canon-docs/src/app/(docs)/components/input/page.mdx
+++ b/canon-docs/src/app/(docs)/components/text-field/page.mdx
@@ -2,19 +2,19 @@ import { PropsTable } from '@/components/PropsTable';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
-import { InputSnippet } from '@/snippets/stories-snippets';
+import { TextFieldSnippet } from '@/snippets/stories-snippets';
import { BaseUI } from '@/components/HeadlessBanners/BaseUI';
import { inputPropDefs } from './props';
-# Input
+# TextField
-A input component tfor your forms.
+A text field component for your forms.
}
- code={` `}
+ preview={ }
+ code={` `}
/>
@@ -24,9 +24,9 @@ A input component tfor your forms.
+
`}
/>
@@ -34,30 +34,40 @@ A input component tfor your forms.
We recommend starting with our [global tokens](/theme/theming) to customize the library and align it with
your brand. For additional flexibility, you can use the provided class names for each element listed below.
`}
+ code={` `}
/>
## API reference
-
-
## Examples
### Sizes
-Here's a simple input with a label and description.
+We support two different sizes: `small`, `medium`.
}
- code={`
-
-
- `}
+ preview={ }
+ code={`
+
+
+ `}
+/>
+
+### With description
+
+Here's a simple TextField with a description.
+
+ }
+ code={` `}
/>
diff --git a/canon-docs/src/app/(docs)/components/input/props.ts b/canon-docs/src/app/(docs)/components/text-field/props.ts
similarity index 61%
rename from canon-docs/src/app/(docs)/components/input/props.ts
rename to canon-docs/src/app/(docs)/components/text-field/props.ts
index 412ae23dd6..cafed21189 100644
--- a/canon-docs/src/app/(docs)/components/input/props.ts
+++ b/canon-docs/src/app/(docs)/components/text-field/props.ts
@@ -4,10 +4,20 @@ import type { PropDef } from '../../../../utils/propDefs';
export const inputPropDefs: Record = {
size: {
type: 'enum',
- values: ['sm', 'md'],
- default: 'md',
+ values: ['small', 'medium'],
+ default: 'medium',
responsive: false,
},
+ label: {
+ type: 'string',
+ },
+ description: {
+ type: 'string',
+ },
+ name: {
+ type: 'string',
+ required: true,
+ },
...classNamePropDefs,
...stylePropDefs,
};
diff --git a/canon-docs/src/snippets/stories-snippets.tsx b/canon-docs/src/snippets/stories-snippets.tsx
index 9dec825ad2..5c363d6fc7 100644
--- a/canon-docs/src/snippets/stories-snippets.tsx
+++ b/canon-docs/src/snippets/stories-snippets.tsx
@@ -5,12 +5,11 @@ import * as BoxStories from '../../../packages/canon/src/components/Box/Box.stor
import * as ButtonStories from '../../../packages/canon/src/components/Button/Button.stories';
import * as CheckboxStories from '../../../packages/canon/src/components/Checkbox/Checkbox.stories';
import * as ContainerStories from '../../../packages/canon/src/components/Container/Container.stories';
-import * as FieldStories from '../../../packages/canon/src/components/Field/Field.stories';
import * as GridStories from '../../../packages/canon/src/components/Grid/Grid.stories';
import * as HeadingStories from '../../../packages/canon/src/components/Heading/Heading.stories';
import * as IconButtonStories from '../../../packages/canon/src/components/IconButton/IconButton.stories';
import * as IconStories from '../../../packages/canon/src/components/Icon/Icon.stories';
-import * as InputStories from '../../../packages/canon/src/components/Input/Input.stories';
+import * as TextFieldStories from '../../../packages/canon/src/components/TextField/TextField.stories';
import * as TextStories from '../../../packages/canon/src/components/Text/Text.stories';
import * as FlexStories from '../../../packages/canon/src/components/Flex/Flex.stories';
import * as SelectStories from '../../../packages/canon/src/components/Select/Select.stories';
@@ -62,12 +61,12 @@ export const FlexSnippet = ({ story }: { story: keyof typeof FlexStories }) => {
return StoryComponent ? : null;
};
-export const FieldSnippet = ({
+export const TextFieldSnippet = ({
story,
}: {
- story: keyof typeof FieldStories;
+ story: keyof typeof TextFieldStories;
}) => {
- const stories = composeStories(FieldStories);
+ const stories = composeStories(TextFieldStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? : null;
@@ -109,17 +108,6 @@ export const IconSnippet = ({ story }: { story: keyof typeof IconStories }) => {
return StoryComponent ? : null;
};
-export const InputSnippet = ({
- story,
-}: {
- story: keyof typeof InputStories;
-}) => {
- const stories = composeStories(InputStories);
- const StoryComponent = stories[story as keyof typeof stories];
-
- return StoryComponent ? : null;
-};
-
export const TextSnippet = ({ story }: { story: keyof typeof TextStories }) => {
const stories = composeStories(TextStories);
const StoryComponent = stories[story as keyof typeof stories];
diff --git a/packages/canon/src/components/TextField/TextField.stories.tsx b/packages/canon/src/components/TextField/TextField.stories.tsx
index dd5558437b..ca33c28020 100644
--- a/packages/canon/src/components/TextField/TextField.stories.tsx
+++ b/packages/canon/src/components/TextField/TextField.stories.tsx
@@ -33,6 +33,9 @@ export const Default: Story = {
args: {
name: 'url',
placeholder: 'Enter a URL',
+ style: {
+ maxWidth: '300px',
+ },
},
};
@@ -71,7 +74,7 @@ export const Sizes: Story = {
description: 'Description',
},
render: args => (
-
+
diff --git a/packages/canon/src/components/TextField/TextField.tsx b/packages/canon/src/components/TextField/TextField.tsx
index ccea9e8c65..d4c95ae8b5 100644
--- a/packages/canon/src/components/TextField/TextField.tsx
+++ b/packages/canon/src/components/TextField/TextField.tsx
@@ -31,6 +31,7 @@ export const TextField = forwardRef(
label,
description,
name,
+ style,
...rest
} = props;
@@ -38,7 +39,11 @@ export const TextField = forwardRef(
const responsiveSize = useResponsiveValue(size);
return (
-
+
{label && (
{label}
)}