{
expect(screen.getByLabelText('Search')).toBeInTheDocument();
});
+
+ it('clears the search input when the clear button is clicked', async () => {
+ const user = userEvent.setup();
+ render(
+
+
+
+
+ );
+
+ const input = screen.getByLabelText('Search') as HTMLInputElement;
+ await user.type(input, 'hello');
+ expect(input.value).toBe('hello');
+
+ await user.click(screen.getByLabelText('Clear search'));
+ expect(input.value).toBe('');
+ });
});
describe('Zero State and Empty State', () => {
diff --git a/packages/raystack/components/data-table/components/search.tsx b/packages/raystack/components/data-table/components/search.tsx
index a7b909d5d..e91b0e05f 100644
--- a/packages/raystack/components/data-table/components/search.tsx
+++ b/packages/raystack/components/data-table/components/search.tsx
@@ -54,7 +54,7 @@ export function TableSearch({
diff --git a/packages/raystack/components/data-view-beta/components/search.tsx b/packages/raystack/components/data-view-beta/components/search.tsx
index 330692689..546fd57e3 100644
--- a/packages/raystack/components/data-view-beta/components/search.tsx
+++ b/packages/raystack/components/data-view-beta/components/search.tsx
@@ -54,7 +54,7 @@ export function DataViewSearch({
diff --git a/packages/raystack/components/input/input.module.css b/packages/raystack/components/input/input.module.css
index 0624db569..1d50278a8 100644
--- a/packages/raystack/components/input/input.module.css
+++ b/packages/raystack/components/input/input.module.css
@@ -87,7 +87,6 @@
.input-field:focus {
border-color: var(--rs-color-border-accent-emphasis);
- background: var(--rs-color-background-base-primary);
}
.input-field[data-disabled] {
diff --git a/packages/raystack/components/search/__tests__/search.test.tsx b/packages/raystack/components/search/__tests__/search.test.tsx
index ed9430f00..6321f2fdd 100644
--- a/packages/raystack/components/search/__tests__/search.test.tsx
+++ b/packages/raystack/components/search/__tests__/search.test.tsx
@@ -85,9 +85,9 @@ describe('Search', () => {
expect(screen.getByLabelText('Clear search')).toBeInTheDocument();
});
- it('hides clear button when no value', () => {
+ it('renders clear button regardless of value (CSS hides it when empty)', () => {
render();
- expect(screen.queryByLabelText('Clear search')).not.toBeInTheDocument();
+ expect(screen.getByLabelText('Clear search')).toBeInTheDocument();
});
it('calls onClear when clear button clicked', () => {
diff --git a/packages/raystack/components/search/search.module.css b/packages/raystack/components/search/search.module.css
index ae18df8cd..8925c770b 100644
--- a/packages/raystack/components/search/search.module.css
+++ b/packages/raystack/components/search/search.module.css
@@ -13,6 +13,10 @@
justify-content: center;
}
+.container:has(input:placeholder-shown) .clearButtonWrapper {
+ display: none;
+}
+
.clearButton {
color: var(--rs-color-foreground-base-tertiary);
}
diff --git a/packages/raystack/components/search/search.tsx b/packages/raystack/components/search/search.tsx
index 63335eeab..807ca7f1b 100644
--- a/packages/raystack/components/search/search.tsx
+++ b/packages/raystack/components/search/search.tsx
@@ -24,25 +24,24 @@ export function Search({
variant = 'default',
...props
}: SearchProps) {
- const trailingIconWithClear =
- showClearButton && value ? (
-
- {
- e.stopPropagation();
- if (!disabled && onClear) {
- onClear();
- }
- }}
- disabled={disabled}
- aria-label='Clear search'
- className={styles.clearButton}
- >
-
-
-
- ) : undefined;
+ const trailingIconWithClear = showClearButton ? (
+
+ {
+ e.stopPropagation();
+ if (!disabled && onClear) {
+ onClear();
+ }
+ }}
+ disabled={disabled}
+ aria-label='Clear search'
+ className={styles.clearButton}
+ >
+
+
+
+ ) : undefined;
return (