Skip to content

Commit 23539b4

Browse files
authored
DT-2821 - add invalid/error state to Select (#2606)
* add valid/error state to Select * fix a11y * add story * fix story
1 parent cfc45e6 commit 23539b4

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/lib/holocene/select/select.stories.svelte

+5
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,8 @@
6161
<Story name="Disabled and Selected" args={{ disabled: true, value: 'pizza' }} />
6262

6363
<Story name="Label Hidden" args={{ labelHidden: true }} />
64+
65+
<Story
66+
name="Invalid with error message"
67+
args={{ valid: false, error: 'This value is invalid' }}
68+
/>

src/lib/holocene/select/select.svelte

+10-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import { writable, type Writable } from 'svelte/store';
2525
2626
import { onMount, setContext } from 'svelte';
27+
import { twMerge } from 'tailwind-merge';
2728
2829
import type { ButtonStyles } from '$lib/holocene/button.svelte';
2930
import type { IconName } from '$lib/holocene/icon';
@@ -46,6 +47,8 @@
4647
menuClass?: string;
4748
variant?: ButtonStyles['variant'];
4849
required?: boolean;
50+
valid?: boolean;
51+
error?: string;
4952
};
5053
5154
export let label: string;
@@ -59,6 +62,8 @@
5962
export let menuClass: string | undefined = undefined;
6063
export let variant: ButtonStyles['variant'] = 'secondary';
6164
export let required = false;
65+
export let error = '';
66+
export let valid = true;
6267
6368
// We get the "true" value of this further down but before the mount happens we should have some kind of value
6469
const valueCtx = writable<T>(value);
@@ -106,7 +111,7 @@
106111
<Label class="pb-1" {label} hidden={labelHidden} for={id} {required} />
107112
{#key $labelCtx}
108113
<MenuButton
109-
class="w-full"
114+
class={twMerge('w-full', !valid ? 'border-danger' : undefined)}
110115
hasIndicator={!disabled}
111116
{disabled}
112117
controls="{id}-select"
@@ -136,6 +141,10 @@
136141
<Menu role="listbox" id="{id}-select" class={menuClass}>
137142
<slot />
138143
</Menu>
144+
145+
{#if error && !valid}
146+
<span class="text-xs text-danger">{error}</span>
147+
{/if}
139148
</MenuContainer>
140149

141150
<style lang="postcss">

0 commit comments

Comments
 (0)