diff --git a/canon-docs/public/components.css b/canon-docs/public/components.css index e1cd4c9fad..cd32445165 100644 --- a/canon-docs/public/components.css +++ b/canon-docs/public/components.css @@ -278,21 +278,7 @@ } } -.canon-input-root { - font-family: var(--canon-font-regular); - flex-direction: column; - width: 100%; - display: flex; -} - -.canon-input-label { - font-size: var(--canon-font-size-caption); - font-weight: var(--canon-font-weight-regular); - color: var(--canon-text-primary); - margin-bottom: var(--canon-spacing-3xs); -} - -.canon-input-control { +.canon-Input { border-radius: var(--canon-border-radius-sm); border: 1px solid var(--canon-border-base); padding: var(--canon-spacing-sm); @@ -300,44 +286,62 @@ font-size: var(--canon-font-size-body); font-weight: var(--canon-font-weight-regular); color: var(--canon-text-primary); + width: 100%; transition: border-color .2s ease-in-out, outline-color .2s ease-in-out; } -.canon-input-control::placeholder { +.canon-Input::placeholder { color: var(--canon-text-secondary); } -.canon-input-control:hover { +.canon-Input:hover { border-color: var(--canon-border-hover); } -.canon-input-control:focus-visible { +.canon-Input:focus-visible { outline-color: var(--canon-border-selected); border-color: var(--canon-border-selected); outline-width: 0; } -.canon-input-control[data-invalid] { +.canon-Input[data-invalid] { border-color: var(--canon-error); } -.canon-input-control-sm { +.canon-Input--size-sm { height: 2rem; } -.canon-input-control-md { +.canon-Input--size-md { height: 2.5rem; } -.canon-input-description { +.canon-FieldRoot { + font-family: var(--canon-font-regular); + flex-direction: column; + width: 100%; + display: flex; +} + +.canon-FieldLabel { + font-size: var(--canon-font-size-caption); + font-weight: var(--canon-font-weight-regular); + color: var(--canon-text-primary); + margin-bottom: var(--canon-spacing-3xs); +} + +.canon-FieldDescription { font-size: var(--canon-font-size-caption); font-weight: var(--canon-font-weight-regular); color: var(--canon-text-secondary); - margin-top: var(--canon-spacing-3xs); + padding-top: var(--canon-spacing-3xs); + margin: 0; } -.canon-input-error { +.canon-FieldError { font-size: var(--canon-font-size-caption); + font-weight: var(--canon-font-weight-regular); color: var(--canon-error); - margin-top: var(--canon-spacing-3xs); + padding-top: var(--canon-spacing-3xs); + margin: 0; } diff --git a/canon-docs/src/app/(docs)/components/field/page.mdx b/canon-docs/src/app/(docs)/components/field/page.mdx new file mode 100644 index 0000000000..83029be506 --- /dev/null +++ b/canon-docs/src/app/(docs)/components/field/page.mdx @@ -0,0 +1,176 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { Tabs } from '@/components/Tabs'; +import { CodeBlock } from '@/components/CodeBlock'; +import { FieldPreview } from '@/snippets/field'; +import { BaseUI } from '@/components/HeadlessBanners/BaseUI'; + +# 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. + + string | string[] | null | Promise', + responsive: false, + }, + validationMode: { + type: ['onBlur', 'onChange'], + responsive: false, + }, + validationDebounceTime: { + type: 'number', + responsive: false, + }, + className: { + type: 'string', + responsive: false, + }, + style: { + type: 'CSSProperties', + responsive: false, + }, + }} +/> + +### Field.Label + +An accessible label that is automatically associated with the field control. Renders a `