SEARCH: remove meaningless chevrons (command-mode field icon, trailing row chevron) #254

Closed
opened 2026-09-27 18:05:27 +00:00 by kayg · 5 comments
Owner

Owner (2026-09-27): 'this arrow has no meaning in the search bar?' (screenshot: a lone '>' chevron).

Two chevrons carry no meaning:

  1. apps/web/src/lib/search/SearchField.svelte:247: in command mode the leading mode icon becomes ChevronRight ('>', a VS Code convention). Replace: keep the SAME search icon in search and command mode (the placeholder 'Run a command…' already names the mode); keep BotIcon for ask mode (it does add meaning).
  2. apps/web/src/lib/search/SearchResultRow.svelte:123: a trailing ChevronRight on every result row. The whole row is the click target and actions float on the row (Raycast style), so remove it and reclaim the space for the title/snippet.
    Check the rest of the app for other purely decorative chevrons on rows that are themselves the click target (lists, settings rows that open a sub-page on phone keep a chevron ONLY where it signals drill-in navigation, per iOS). Before/after crops (search, command mode, results) at 1440 and 390; attach, do not commit. Icon/label cap-height alignment rule applies.
Owner (2026-09-27): 'this arrow has no meaning in the search bar?' (screenshot: a lone '>' chevron). Two chevrons carry no meaning: 1. `apps/web/src/lib/search/SearchField.svelte:247`: in command mode the leading mode icon becomes ChevronRight ('>', a VS Code convention). Replace: keep the SAME search icon in search and command mode (the placeholder 'Run a command…' already names the mode); keep BotIcon for ask mode (it does add meaning). 2. `apps/web/src/lib/search/SearchResultRow.svelte:123`: a trailing ChevronRight on every result row. The whole row is the click target and actions float on the row (Raycast style), so remove it and reclaim the space for the title/snippet. Check the rest of the app for other purely decorative chevrons on rows that are themselves the click target (lists, settings rows that open a sub-page on phone keep a chevron ONLY where it signals drill-in navigation, per iOS). Before/after crops (search, command mode, results) at 1440 and 390; attach, do not commit. Icon/label cap-height alignment rule applies.
Author
Owner

Starting search-chevron cleanup on branch job/search-chevrons, based at 7b169436e5.

Starting search-chevron cleanup on branch job/search-chevrons, based at 7b169436e57ddda0e6a361a53b69aa90405470f.
Author
Owner

Audit evidence: SearchField.svelte switches the leading search glyph to ChevronRight in command mode, and SearchResultRow.svelte renders a 14 px ChevronRight that only appears on the active row. Other right-pointing chevrons are disclosure controls in the sidebar/file tree, breadcrumb separators, or linked-note drill-in navigation; the down chevrons open upload/calendar controls. I will keep those meaningful navigation and disclosure cues.

Audit evidence: `SearchField.svelte` switches the leading search glyph to ChevronRight in command mode, and `SearchResultRow.svelte` renders a 14 px ChevronRight that only appears on the active row. Other right-pointing chevrons are disclosure controls in the sidebar/file tree, breadcrumb separators, or linked-note drill-in navigation; the down chevrons open upload/calendar controls. I will keep those meaningful navigation and disclosure cues.
Author
Owner

Build finding after the required git merge dev: bun run build stopped in apps/web/src/lib/photos/PhotosView.svelte:44:8 with Identifier 'LinkIcon' has already been declared. The merged import block contains the duplicate binding. I am removing only the duplicate import in a separate build-fix commit; this does not change Photos behavior.

Build finding after the required `git merge dev`: `bun run build` stopped in `apps/web/src/lib/photos/PhotosView.svelte:44:8` with `Identifier 'LinkIcon' has already been declared`. The merged import block contains the duplicate binding. I am removing only the duplicate import in a separate build-fix commit; this does not change Photos behavior.
Author
Owner

Completed

  • Search mode and command mode now use the same Search icon. Ask mode keeps its Bot icon.
  • Removed the trailing decorative chevron from active search result rows.
  • Audited the remaining app chevrons. Kept those that mark disclosure, navigation, breadcrumbs, paging, menus, and back navigation.
  • After merging dev, the production build exposed a duplicate LinkIcon import in PhotosView.svelte. Removed the duplicate import so the merged build compiles.

Branch: job/search-chevrons
Head: 04ecbcbf2b9547032412df4357b61d312909b987
Push: git push origin job/search-chevrons → Everything up-to-date

Files

  • apps/web/src/lib/search/SearchField.svelte
  • apps/web/src/lib/search/SearchResultRow.svelte
  • apps/web/src/lib/photos/PhotosView.svelte (duplicate import cleanup after the dev merge)

Production E2E screenshots

Ran bun e2e/search.mjs --screenshots artifacts/search-chevrons/after against a production web build and the local server. Result: search e2e: ok. Each image compares before (left) and after (right).

Search before and after, 1440px

Search before and after, 390px

Command mode

Command mode before and after, 1440px

Command mode before and after, 390px

Results

Results before and after, 1440px

Results before and after, 390px

Final gates

$ cargo fmt --check
(exit 0; no output)

$ cargo clippy --all-targets -- -D warnings
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 20m 44s

$ cargo test
    Finished `test` profile [unoptimized + debuginfo] target(s) in 10m 41s
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.14s
Aggregate across 72 test-result rows: 1,306 passed; 0 failed; 12 ignored.

$ bun run check
$ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
svelte-check found 0 errors and 0 warnings

$ bun run test
 Test Files  84 passed (84)
      Tests  600 passed (600)
   Start at  21:48:22
   Duration  109.54s (transform 69%, import 12%, environment 10%, tests 6%, setup 2%)

Known gaps and decisions

  • The production build reports existing vendor use client directive warnings. Vitest reports non-fatal JSDOM scrollTo() and CSS parsing warnings.
  • The 12 ignored Cargo tests are existing ignored tests. No API changed, so no adversarial endpoint round was applicable.
  • No additional design decision was needed. Kept the remaining chevrons only where they communicate navigation or disclosure.
## Completed - Search mode and command mode now use the same Search icon. Ask mode keeps its Bot icon. - Removed the trailing decorative chevron from active search result rows. - Audited the remaining app chevrons. Kept those that mark disclosure, navigation, breadcrumbs, paging, menus, and back navigation. - After merging `dev`, the production build exposed a duplicate `LinkIcon` import in `PhotosView.svelte`. Removed the duplicate import so the merged build compiles. Branch: `job/search-chevrons` Head: `04ecbcbf2b9547032412df4357b61d312909b987` Push: `git push origin job/search-chevrons` → `Everything up-to-date` ## Files - `apps/web/src/lib/search/SearchField.svelte` - `apps/web/src/lib/search/SearchResultRow.svelte` - `apps/web/src/lib/photos/PhotosView.svelte` (duplicate import cleanup after the `dev` merge) ## Production E2E screenshots Ran `bun e2e/search.mjs --screenshots artifacts/search-chevrons/after` against a production web build and the local server. Result: `search e2e: ok`. Each image compares before (left) and after (right). ### Search ![Search before and after, 1440px](https://git.kayg.org/attachments/55cf5491-1a87-43b0-82e0-c504fc95e254) ![Search before and after, 390px](https://git.kayg.org/attachments/c175fab5-46c0-4a6d-9ac8-d7944c99a261) ### Command mode ![Command mode before and after, 1440px](https://git.kayg.org/attachments/b8008c63-f0cb-4bf1-974f-92d16c65996c) ![Command mode before and after, 390px](https://git.kayg.org/attachments/f5b09e49-73c9-452e-aa74-5fb0140bc64e) ### Results ![Results before and after, 1440px](https://git.kayg.org/attachments/02ea6ca1-a063-4690-8c6d-374573d4d744) ![Results before and after, 390px](https://git.kayg.org/attachments/88076feb-36af-4e39-ae79-8c57c4e32286) ## Final gates ```text $ cargo fmt --check (exit 0; no output) $ cargo clippy --all-targets -- -D warnings Finished `dev` profile [unoptimized + debuginfo] target(s) in 20m 44s $ cargo test Finished `test` profile [unoptimized + debuginfo] target(s) in 10m 41s test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.14s Aggregate across 72 test-result rows: 1,306 passed; 0 failed; 12 ignored. $ bun run check $ svelte-kit sync && svelte-check --tsconfig ./tsconfig.json svelte-check found 0 errors and 0 warnings $ bun run test Test Files 84 passed (84) Tests 600 passed (600) Start at 21:48:22 Duration 109.54s (transform 69%, import 12%, environment 10%, tests 6%, setup 2%) ``` ## Known gaps and decisions - The production build reports existing vendor `use client` directive warnings. Vitest reports non-fatal JSDOM `scrollTo()` and CSS parsing warnings. - The 12 ignored Cargo tests are existing ignored tests. No API changed, so no adversarial endpoint round was applicable. - No additional design decision was needed. Kept the remaining chevrons only where they communicate navigation or disclosure.
Author
Owner

Merged in 14de1c8f; reviewed the after captures (no chevrons, icon/text centred).

Merged in 14de1c8f; reviewed the after captures (no chevrons, icon/text centred).
kayg closed this issue 2026-09-27 19:58:02 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#254
No description provided.