From ab4413190113ab9b88705c98e5b0852c13bacc20 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Sat, 4 Jul 2026 20:00:04 +0000
Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20[UX=20improvement]=20?=
=?UTF-8?q?Improve=20search=20field=20clear=20button=20interaction?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: yeboster <23556525+yeboster@users.noreply.github.com>
---
.Jules/palette.md | 4 ++++
src/routes/profile/+page.svelte | 18 +++++++++++-------
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/.Jules/palette.md b/.Jules/palette.md
index d6d129bc..4d2ffd8a 100644
--- a/.Jules/palette.md
+++ b/.Jules/palette.md
@@ -2,3 +2,7 @@
**Learning:** Async buttons that handle errors often fail to reset their error state on subsequent attempts. This leads to a confusing UX where a successful retry still displays the error icon, making the user believe the action failed again.
**Action:** Always ensure that error flags (e.g., `hasError`) are reset at the _start_ of the async operation, not just set in the `catch` block.
+
+## 2024-10-25 - Conditional Trailing Icons in SMUI Textfields
+**Learning:** Trailing icons (like clear buttons) inside SMUI `Textfield` components remain focusable and take up layout space even when they shouldn't be active (e.g., when a search input is empty).
+**Action:** Conditionally render the icon element (e.g., `{#if search !== ''}`) to remove it from the focus order and dynamically bind the `withTrailingIcon` property to the same condition so the layout updates correctly. Use descriptive `aria-label`s like "clear search" instead of generic names.
diff --git a/src/routes/profile/+page.svelte b/src/routes/profile/+page.svelte
index 7f290736..391ccfc6 100644
--- a/src/routes/profile/+page.svelte
+++ b/src/routes/profile/+page.svelte
@@ -17,6 +17,8 @@
$: if (search !== '') {
domainsFiltered = domains.filter((domain) => isFuzzyMatch(domain.name, search));
+ } else {
+ domainsFiltered = domains;
}
walletAddress.subscribe(async (address) => {
@@ -39,7 +41,7 @@
if (trimmedDomain.startsWith(trimmedSearch) || trimmedDomain.includes(trimmedSearch))
return true;
- else false;
+ else return false;
}
@@ -55,14 +57,16 @@
label="Search"
bind:value={search}
variant="outlined"
- withTrailingIcon
+ withTrailingIcon={search !== ''}
>
-
-
-
-
-
+ {#if search !== ''}
+
+
+
+
+
+ {/if}