feat: support size prop for input components

- DatePickerInput, NumberInput, Select, PasswordInput, TextInput
This commit is contained in:
Eric Liu 2020-07-20 20:29:50 -07:00
commit 331dc4a656
9 changed files with 60 additions and 11 deletions

View file

@ -8,6 +8,12 @@ const patterns = {
"Regular (d{1,2}/d{1,2}/d{4})": "d{1,2}/d{1,2}/d{4}", "Regular (d{1,2}/d{1,2}/d{4})": "d{1,2}/d{1,2}/d{4}",
}; };
const sizes = {
"Extra large size (xl)": "xl",
"Default size": undefined,
"Small size (sm)": "sm",
};
export const Default = () => ({ export const Default = () => ({
Component, Component,
props: { props: {
@ -19,6 +25,7 @@ export const Default = () => ({
datePickerInput: { datePickerInput: {
id: "date-picker-input-id", id: "date-picker-input-id",
name: "date-picker-input-name", name: "date-picker-input-name",
size: select("Field size (size)", sizes, undefined) || undefined,
labelText: text( labelText: text(
"Label text (labelText in <DatePickerInput>)", "Label text (labelText in <DatePickerInput>)",
"Date Picker label" "Date Picker label"
@ -63,6 +70,7 @@ export const Single = () => ({
}, },
datePickerInput: { datePickerInput: {
id: "date-picker-input-id", id: "date-picker-input-id",
size: select("Field size (size)", sizes, undefined) || undefined,
labelText: text( labelText: text(
"Label text (labelText in <DatePickerInput>)", "Label text (labelText in <DatePickerInput>)",
"Date Picker label" "Date Picker label"
@ -105,6 +113,7 @@ export const Range = () => ({
}, },
datePickerInput: { datePickerInput: {
id: "date-picker-input-id", id: "date-picker-input-id",
size: select("Field size (size)", sizes, undefined) || undefined,
labelText: text( labelText: text(
"Label text (labelText in <DatePickerInput>)", "Label text (labelText in <DatePickerInput>)",
"Date Picker label" "Date Picker label"

View file

@ -1,4 +1,5 @@
<script> <script>
export let size = undefined; // "sm" | "xl"
export let type = "text"; export let type = "text";
export let placeholder = ""; export let placeholder = "";
export let pattern = "\\d{1,2}\\/\\d{1,2}\\/\\d{4}"; export let pattern = "\\d{1,2}\\/\\d{1,2}\\/\\d{4}";
@ -51,7 +52,15 @@
<input <input
bind:this={ref} bind:this={ref}
data-invalid={invalid || undefined} data-invalid={invalid || undefined}
value={!$range ? $inputValue : undefined}
{id}
{name}
{placeholder}
{type}
{pattern}
{disabled}
class:bx--date-picker__input={true} class:bx--date-picker__input={true}
class={size && `bx--date-picker__input--${size}`}
on:input on:input
on:input={({ target }) => { on:input={({ target }) => {
updateValue({ type: 'input', value: target.value }); updateValue({ type: 'input', value: target.value });
@ -68,14 +77,7 @@
on:blur on:blur
on:blur={({ relatedTarget }) => { on:blur={({ relatedTarget }) => {
blurInput(relatedTarget); blurInput(relatedTarget);
}} }} />
{id}
{name}
{placeholder}
{type}
{pattern}
{disabled}
value={!$range ? $inputValue : undefined} />
{#if $hasCalendar} {#if $hasCalendar}
<Calendar16 <Calendar16
role="img" role="img"

View file

@ -1,11 +1,24 @@
import { withKnobs, text, boolean, number } from "@storybook/addon-knobs"; import {
withKnobs,
text,
boolean,
number,
select,
} from "@storybook/addon-knobs";
import Component from "./NumberInput.Story.svelte"; import Component from "./NumberInput.Story.svelte";
export default { title: "NumberInput", decorators: [withKnobs] }; export default { title: "NumberInput", decorators: [withKnobs] };
const sizes = {
"Extra large size (xl)": "xl",
"Default size": undefined,
"Small size (sm)": "sm",
};
export const Default = () => ({ export const Default = () => ({
Component, Component,
props: { props: {
size: select("Field size (size)", sizes, undefined) || undefined,
id: text("NumberInput id", "number-input-id"), id: text("NumberInput id", "number-input-id"),
name: text("NumberInput name", "number-input-name"), name: text("NumberInput name", "number-input-name"),
label: text("Label (label)", "Number Input label"), label: text("Label (label)", "Number Input label"),

View file

@ -1,4 +1,5 @@
<script> <script>
export let size = undefined; // "sm" | "xl"
export let value = ""; export let value = "";
export let step = 1; export let step = 1;
export let max = undefined; export let max = undefined;
@ -76,7 +77,8 @@
class:bx--number--readonly={readonly} class:bx--number--readonly={readonly}
class:bx--number--light={light} class:bx--number--light={light}
class:bx--number--nolabel={hideLabel} class:bx--number--nolabel={hideLabel}
class:bx--number--mobile={mobile}> class:bx--number--mobile={mobile}
class={size && `bx--number--${size}`}>
{#if mobile} {#if mobile}
{#if label} {#if label}
<label <label

View file

@ -1,12 +1,19 @@
import { withKnobs, text, boolean } from "@storybook/addon-knobs"; import { withKnobs, text, boolean, select } from "@storybook/addon-knobs";
import Component from "./Select.Story.svelte"; import Component from "./Select.Story.svelte";
export default { title: "Select", decorators: [withKnobs] }; export default { title: "Select", decorators: [withKnobs] };
const sizes = {
"Extra large size (xl)": "xl",
"Default size": undefined,
"Small size (sm)": "sm",
};
export const Default = () => ({ export const Default = () => ({
Component, Component,
props: { props: {
select: { select: {
size: select("Field size (size)", sizes, undefined) || undefined,
light: boolean("Light variant (light in <Select>)", false), light: boolean("Light variant (light in <Select>)", false),
inline: boolean( inline: boolean(
"Put control in-line with label (inline in <Select>)", "Put control in-line with label (inline in <Select>)",

View file

@ -1,4 +1,5 @@
<script> <script>
export let size = undefined; // "sm" | "xl"
export let selected = undefined; export let selected = undefined;
export let inline = false; export let inline = false;
export let light = false; export let light = false;
@ -68,6 +69,7 @@
{id} {id}
{name} {name}
class:bx--select-input={true} class:bx--select-input={true}
class={size && `bx--select-input--${size}`}
on:change={({ target }) => { on:change={({ target }) => {
selectedValue.set(target.value); selectedValue.set(target.value);
}} }}
@ -105,6 +107,7 @@
disabled={disabled || undefined} disabled={disabled || undefined}
aria-invalid={invalid || undefined} aria-invalid={invalid || undefined}
class:bx--select-input={true} class:bx--select-input={true}
class={size && `bx--select-input--${size}`}
on:change={({ target }) => { on:change={({ target }) => {
selectedValue.set(target.value); selectedValue.set(target.value);
}} }}

View file

@ -1,4 +1,5 @@
<script> <script>
export let size = undefined; // "sm" | "xl"
export let type = "password"; export let type = "password";
export let value = ""; export let value = "";
export let hidePasswordLabel = "Hide password"; export let hidePasswordLabel = "Hide password";
@ -70,6 +71,7 @@
class:bx--password-input={true} class:bx--password-input={true}
class:bx--text-input--light={light} class:bx--text-input--light={light}
class:bx--text-input--invalid={invalid} class:bx--text-input--invalid={invalid}
class={size && `bx--text-input--${size}`}
on:change on:change
on:input on:input
on:input={({ target }) => { on:input={({ target }) => {

View file

@ -3,9 +3,16 @@ import Component from "./TextInput.Story.svelte";
export default { title: "TextInput", decorators: [withKnobs] }; export default { title: "TextInput", decorators: [withKnobs] };
const sizes = {
"Extra large size (xl)": "xl",
"Default size": undefined,
"Small size (sm)": "sm",
};
export const Default = () => ({ export const Default = () => ({
Component, Component,
props: { props: {
size: select("Field size (size)", sizes, undefined) || undefined,
disabled: boolean("Disabled (disabled)", false), disabled: boolean("Disabled (disabled)", false),
light: boolean("Light variant (light)", false), light: boolean("Light variant (light)", false),
hideLabel: boolean("No label (hideLabel)", false), hideLabel: boolean("No label (hideLabel)", false),
@ -25,6 +32,7 @@ export const TogglePasswordVisibility = () => ({
Component, Component,
props: { props: {
story: "password-visibility", story: "password-visibility",
size: select("Field size (size)", sizes, undefined) || undefined,
disabled: boolean("Disabled (disabled)", false), disabled: boolean("Disabled (disabled)", false),
light: boolean("Light variant (light)", false), light: boolean("Light variant (light)", false),
hideLabel: boolean("No label (hideLabel)", false), hideLabel: boolean("No label (hideLabel)", false),
@ -62,6 +70,7 @@ export const ControlledTogglePasswordVisibility = () => ({
Component, Component,
props: { props: {
story: "controlled", story: "controlled",
size: select("Field size (size)", sizes, undefined) || undefined,
disabled: boolean("Disabled (disabled)", false), disabled: boolean("Disabled (disabled)", false),
light: boolean("Light variant (light)", false), light: boolean("Light variant (light)", false),
hideLabel: boolean("No label (hideLabel)", false), hideLabel: boolean("No label (hideLabel)", false),

View file

@ -1,4 +1,5 @@
<script> <script>
export let size = undefined; // "sm" | "xl"
export let type = ""; export let type = "";
export let value = ""; export let value = "";
export let placeholder = ""; export let placeholder = "";
@ -62,6 +63,7 @@
class:bx--text-input={true} class:bx--text-input={true}
class:bx--text-input--light={light} class:bx--text-input--light={light}
class:bx--text-input--invalid={invalid} class:bx--text-input--invalid={invalid}
class={size && `bx--text-input--${size}`}
on:change on:change
on:input on:input
on:input={({ target }) => { on:input={({ target }) => {