//
// Copyright 2022 DXOS.org
//
import '@dxos-theme';
import { type StoryObj, type Meta } from '@storybook/react';
import React from 'react';
import { baseSurface, modalSurface, activeSurface, mx, surfaceShadow } from '@dxos/react-ui-theme';
import { type MessageValence } from '@dxos/react-ui-types';
import {
type CheckboxProps,
Input,
type PinInputProps,
type SwitchProps,
type TextInputProps,
type TextAreaProps,
} from './Input';
import { withTheme } from '../../testing';
type VariantMap = {
text: TextInputProps;
pin: PinInputProps;
textarea: TextAreaProps;
checkbox: CheckboxProps;
switch: SwitchProps;
};
type Variant = { [K in keyof VariantMap]: { type: K } & VariantMap[K] }[keyof VariantMap];
type BaseProps = Partial<{
kind: keyof VariantMap;
label: string;
labelVisuallyHidden: boolean;
description: string;
descriptionVisuallyHidden: boolean;
validationValence: MessageValence;
validationMessage: string;
}>;
const Wrapper = ({
kind,
label,
description,
labelVisuallyHidden,
descriptionVisuallyHidden,
validationValence,
validationMessage,
...props
}: BaseProps) => {
return (
{label}
{kind === 'text' && }
{kind === 'pin' && }
{kind === 'textarea' && }
{kind === 'checkbox' && }
{kind === 'switch' && }
{validationMessage && (
<>
{validationMessage}{' '}
>
)}
{description}
);
};
const DefaultStory = (props: BaseProps) => {
return (
);
};
const meta: Meta = {
title: 'ui/react-ui-core/Input',
component: Input.Root,
render: DefaultStory,
decorators: [withTheme],
parameters: { chromatic: { disableSnapshot: false } },
};
export default meta;
type Story = StoryObj;
export const Default: Story = {
args: {
kind: 'text',
label: 'Hello',
placeholder: 'This is an input',
disabled: false,
description: undefined,
labelVisuallyHidden: false,
descriptionVisuallyHidden: false,
validationMessage: '',
validationValence: undefined,
},
};
export const DensityFine: Story = {
args: {
kind: 'text',
label: 'This is an Input with a density value of ‘fine’',
placeholder: 'This is a density:fine input',
disabled: false,
description: undefined,
labelVisuallyHidden: false,
descriptionVisuallyHidden: false,
validationMessage: '',
validationValence: undefined,
density: 'fine',
},
};
export const Subdued: Story = {
args: {
kind: 'text',
label: 'Hello',
placeholder: 'This is a subdued input',
disabled: false,
description: undefined,
labelVisuallyHidden: false,
descriptionVisuallyHidden: false,
validationMessage: '',
validationValence: undefined,
variant: 'subdued',
},
};
export const Disabled: Story = {
args: {
kind: 'text',
label: 'Disabled',
placeholder: 'This is a disabled input',
disabled: true,
},
};
export const LabelVisuallyHidden: Story = {
args: {
kind: 'text',
label: 'The label is for screen readers',
labelVisuallyHidden: true,
placeholder: 'The label for this input exists but is only read by screen readers',
},
};
export const InputWithDescription: Story = {
args: {
kind: 'text',
label: 'Described input',
placeholder: 'This input has an accessible description',
description: 'This helper text is accessibly associated with the input.',
},
};
export const InputWithErrorAndDescription: Story = {
args: {
kind: 'text',
label: 'Described invalid input',
placeholder: 'This input has both an accessible description and a validation error',
description: 'This description is identified separately in the accessibility tree.',
validationValence: 'error',
validationMessage: 'The input has an error.',
},
};
export const InputWithValidationAndDescription: Story = {
args: {
kind: 'text',
label: 'Described input with validation message',
placeholder: 'This input is styled to express a validation valence',
description: 'This description is extra.',
validationValence: 'success',
validationMessage: 'This validation message is really part of the description.',
},
};
export const TextArea: Story = {
args: {
kind: 'textarea',
label: 'This input is a text area input',
description: 'Type a long paragraph',
placeholder: 'Lorem ipsum dolor sit amet',
},
};
export const PinInput: Story = {
args: {
kind: 'pin',
label: 'This input is a PIN-style input',
length: 6,
description: 'Type in secret you received',
placeholder: '••••••',
},
};
export const Checkbox: Story = {
args: {
kind: 'checkbox',
label: 'This is a checkbox',
description: 'It’s checked, indeterminate, or unchecked',
size: 5,
},
};
export const Switch = {
args: {
kind: 'switch',
label: 'This is a switch',
description: 'It’s either off... or on.',
},
};