fix(ui): point import controls inward and give Google Maps its own mark

Every import button in the client wore an outgoing arrow, so the control that
pulls a booking or a place list in looked like it was about to send something
out. The places-import sheet managed to contradict itself inside one screen:
Download in the header, Upload on the row below it, Upload again on the file
step. Imports now take Download, or FileDown where the button opens a file
picker; genuine uploads and the desktop drop zones keep Upload.

The mobile places-import entry point wore an ellipsis, which promises a menu.

The "open in Google Maps" buttons drew the four-segment Google *search* G,
flattened to one colour — a glyph that reads as "run a search". They get a map
pin instead, factored into one component so the desktop and mobile copies stop
drifting apart.

Closes #2005
Closes #2006
This commit is contained in:
Maurice
2026-08-21 12:47:15 +02:00
committed by Maurice
parent ec3017f9cc
commit df139a2d96
13 changed files with 103 additions and 30 deletions
@@ -447,7 +447,7 @@ describe('PackingListPanel', () => {
const { container } = render(<PackingListPanel tripId={1} items={[]} />);
// Click the Import button (Upload icon in the header)
const importBtn = container.querySelector('svg.lucide-upload')?.closest('button');
const importBtn = container.querySelector('svg.lucide-download')?.closest('button');
expect(importBtn).toBeTruthy();
await user.click(importBtn!);
@@ -538,7 +538,7 @@ describe('PackingListPanel', () => {
const { container } = render(<PackingListPanel tripId={1} items={[]} />);
// Open import modal
const importBtn = container.querySelector('svg.lucide-upload')?.closest('button');
const importBtn = container.querySelector('svg.lucide-download')?.closest('button');
await user.click(importBtn!);
await screen.findByText('Import Packing List');
@@ -655,7 +655,7 @@ describe('PackingListPanel', () => {
const { container } = render(<PackingListPanel tripId={1} items={[]} />);
// Open import modal
const importBtn = container.querySelector('svg.lucide-upload')?.closest('button');
const importBtn = container.querySelector('svg.lucide-download')?.closest('button');
await user.click(importBtn!);
await screen.findByText('Import Packing List');
@@ -929,7 +929,7 @@ describe('PackingListPanel', () => {
const { container } = render(<PackingListPanel tripId={1} items={[]} />);
// Open import modal
const importBtn = container.querySelector('svg.lucide-upload')?.closest('button');
const importBtn = container.querySelector('svg.lucide-download')?.closest('button');
await user.click(importBtn!);
await screen.findByText('Import Packing List');
@@ -1215,7 +1215,7 @@ describe('PackingListPanel', () => {
const { container } = render(<PackingListPanel tripId={1} items={[]} />);
// Open import modal
const importBtn = container.querySelector('svg.lucide-upload')?.closest('button');
const importBtn = container.querySelector('svg.lucide-download')?.closest('button');
await user.click(importBtn!);
await screen.findByText('Import Packing List');
@@ -1500,7 +1500,7 @@ describe('PackingListPanel', () => {
const { container } = render(<PackingListPanel tripId={1} items={[]} />);
// Open import modal
const importBtn = container.querySelector('svg.lucide-upload')?.closest('button');
const importBtn = container.querySelector('svg.lucide-download')?.closest('button');
await user.click(importBtn!);
await screen.findByText('Import Packing List');