Skip to content

Commit b7d97df

Browse files
chrisgervangclaude
andcommitted
fix(widgets): Polish GeocoderWidget styling to match glass theme
- Apply glass effect (backdrop blur, shadows, rounded corners) to geocoder container - Integrate input and dropdown button as a unified component - Replace triangle icon with SVG chevron that rotates when open - Hide dropdown button when history is empty - Add updateHTML() call after geocode to re-render with updated history - Use consistent system UI fonts for input and dropdown menu - Add example usage of GeocoderWidget in widgets example Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 15c9ebf commit b7d97df

File tree

4 files changed

+72
-18
lines changed

4 files changed

+72
-18
lines changed

examples/get-started/pure-js/widgets/app.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
CompassWidget,
99
ZoomWidget,
1010
FullscreenWidget,
11+
_GeocoderWidget as GeocoderWidget,
1112
DarkGlassTheme,
1213
LightGlassTheme
1314
} from '@deck.gl/widgets';
@@ -77,6 +78,7 @@ new Deck({
7778
widgets: [
7879
new ZoomWidget({style: widgetTheme}),
7980
new CompassWidget({style: widgetTheme}),
80-
new FullscreenWidget({style: widgetTheme})
81+
new FullscreenWidget({style: widgetTheme}),
82+
new GeocoderWidget({style: widgetTheme})
8183
]
8284
});

modules/widgets/src/geocoder-widget.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ export class GeocoderWidget extends Widget<GeocoderWidgetProps> {
136136
this.addressText,
137137
this.props.apiKey
138138
);
139+
// Re-render to show updated history or error
140+
this.updateHTML();
139141
if (coordinates) {
140142
this.setViewState(coordinates);
141143
}

modules/widgets/src/lib/components/dropdown-menu.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,15 @@ export const DropdownMenu = (props: DropdownMenuProps) => {
3535
setIsOpen(false);
3636
};
3737

38+
// Don't render anything if there are no menu items
39+
if (props.menuItems.length === 0) {
40+
return null;
41+
}
42+
3843
return (
3944
<div className="deck-widget-dropdown-container" ref={dropdownRef} style={props.style}>
4045
<button className="deck-widget-dropdown-button" onClick={toggleDropdown}>
41-
46+
<span className={`deck-widget-dropdown-icon ${isOpen ? 'open' : ''}`} />
4247
</button>
4348
{isOpen && (
4449
<ul className="deck-widget-dropdown-menu">

modules/widgets/src/stylesheet.css

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -266,21 +266,37 @@
266266
/* Geocoder styles */
267267
.deck-widget .deck-widget-geocoder {
268268
pointer-events: auto;
269+
position: relative;
269270
display: flex;
270271
align-items: center;
271272
flex-wrap: wrap;
273+
background: var(--button-stroke, rgba(255, 255, 255, 0.3));
274+
border-radius: var(--button-corner-radius, 8px);
275+
box-shadow: var(--button-shadow, 0px 0px 8px 0px rgba(0, 0, 0, 0.25));
276+
padding: 1px;
277+
gap: 1px;
272278
}
273279

274280
.deck-widget .deck-widget-geocoder-input {
275281
flex: 1 1 auto;
276282
min-width: 200px;
283+
height: calc(var(--button-size, 28px) - 2px);
277284
margin: 0;
278-
padding: 8px;
285+
padding: 0 8px;
279286
box-sizing: border-box;
280287
background: var(--button-background, #fff);
288+
backdrop-filter: var(--button-backdrop-filter, unset);
281289
color: var(--button-text, rgb(24, 24, 26));
282-
border: 1px solid var(--button-stroke, rgba(255, 255, 255, 0.3));
283-
border-radius: var(--button-corner-radius, 8px);
290+
border: var(--button-inner-stroke, unset);
291+
border-radius: calc(var(--button-corner-radius, 8px) - 1px);
292+
border-top-right-radius: 0;
293+
border-bottom-right-radius: 0;
294+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
295+
font-size: 13px;
296+
}
297+
298+
.deck-widget .deck-widget-geocoder-input:focus {
299+
outline: none;
284300
}
285301

286302
.deck-widget .deck-widget-geocoder-input::placeholder {
@@ -294,49 +310,78 @@
294310
font-size: 0.875em;
295311
}
296312

313+
/* When dropdown is not present, input should have full rounded corners */
314+
.deck-widget .deck-widget-geocoder-input:last-child {
315+
border-top-right-radius: calc(var(--button-corner-radius, 8px) - 1px);
316+
border-bottom-right-radius: calc(var(--button-corner-radius, 8px) - 1px);
317+
}
318+
297319
/* Dropdown menu styles */
298320
.deck-widget .deck-widget-dropdown-container {
299-
position: relative;
321+
position: static;
300322
display: inline-block;
301323
}
302324

303325
.deck-widget .deck-widget-dropdown-button {
304-
width: 30px;
305-
height: 30px;
326+
width: calc(var(--button-size, 28px) - 2px);
327+
height: calc(var(--button-size, 28px) - 2px);
306328
display: flex;
307329
align-items: center;
308330
justify-content: center;
309331
padding: 0;
310332
cursor: pointer;
311333
background: var(--button-background, #fff);
312-
color: var(--button-icon-idle, rgba(97, 97, 102, 1));
313-
border: 1px solid var(--button-stroke, rgba(255, 255, 255, 0.3));
314-
border-radius: var(--button-corner-radius, 8px);
334+
backdrop-filter: var(--button-backdrop-filter, unset);
335+
border: var(--button-inner-stroke, unset);
336+
border-radius: calc(var(--button-corner-radius, 8px) - 1px);
337+
border-top-left-radius: 0;
338+
border-bottom-left-radius: 0;
339+
outline: none;
315340
}
316341

317-
.deck-widget .deck-widget-dropdown-button:hover {
318-
color: var(--button-icon-hover, rgba(24, 24, 26, 1));
342+
.deck-widget .deck-widget-dropdown-icon {
343+
width: 12px;
344+
height: 12px;
345+
background-color: var(--button-icon-idle, rgba(97, 97, 102, 1));
346+
mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="black"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"/></svg>');
347+
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="black"><path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"/></svg>');
348+
mask-size: contain;
349+
-webkit-mask-size: contain;
350+
transition: transform 0.2s ease;
351+
}
352+
353+
.deck-widget .deck-widget-dropdown-icon.open {
354+
transform: rotate(180deg);
355+
}
356+
357+
.deck-widget .deck-widget-dropdown-button:hover .deck-widget-dropdown-icon {
358+
background-color: var(--button-icon-hover, rgba(24, 24, 26, 1));
319359
}
320360

321361
.deck-widget .deck-widget-dropdown-menu {
322362
position: absolute;
323-
top: 100%;
324-
right: 100%;
325-
min-width: 200px;
363+
top: calc(100% + var(--menu-gap, 4px));
364+
left: 1px;
365+
right: 1px;
326366
margin: 0;
327367
padding: 4px 0;
328368
list-style: none;
329369
z-index: 1000;
330370
background: var(--button-background, #fff);
331-
border: 1px solid var(--button-stroke, rgba(255, 255, 255, 0.3));
371+
backdrop-filter: var(--button-backdrop-filter, unset);
372+
border: var(--button-inner-stroke, unset);
332373
border-radius: var(--button-corner-radius, 8px);
333374
box-shadow: var(--button-shadow, 0px 0px 8px 0px rgba(0, 0, 0, 0.25));
375+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
376+
font-size: 13px;
334377
}
335378

336379
.deck-widget .deck-widget-dropdown-item {
337-
padding: 4px 8px;
380+
padding: 8px 12px;
338381
cursor: pointer;
339382
white-space: nowrap;
383+
overflow: hidden;
384+
text-overflow: ellipsis;
340385
color: var(--button-text, rgb(24, 24, 26));
341386
}
342387

0 commit comments

Comments
 (0)