# XWUIGISFilterPanel

Nested spec + location filter chrome for a map, standalone from `xwui-gis-map`: it emits a query object, the host applies it to whatever it is filtering.

Two independent sections. **Spec** is deal (sale/rent), then a type list scoped to that deal (residential/commercial/land groups), then type-dependent ranges (beds, baths, price, area). **Location** is a connected JSON tree - country → region → city → district - so picking a district fills its ancestors too, plus a multi-select mode and a custom geozone request. Either section can be hidden independently (`config.showSpec`, `config.showLocation`) for a host that only needs one.

Every change re-emits the whole `GISFilterQuery` on `querychange`, so a host wires one listener rather than tracking twelve fields itself. `geozone` fires when the user asks to draw a custom area (the host owns the draw surface, typically `xwui-gis-draw-toolbar` on the map); `flyto` fires with a bounding box when a location pick should recentre the map.

## Basic Usage

```html
<xwui-gis-filter-panel
  spec-label="Property"
  location-label="Location"
></xwui-gis-filter-panel>
```

```js
panel.addEventListener('querychange', (e) => {
  applyFilters(e.detail.query); // GISFilterQuery
});
```

## Events

| Event | Detail | Fires when |
|---|---|---|
| `querychange` | `{ query: GISFilterQuery }` | Any spec or location field changes. |
| `geozone` | `{ requested: true }` | The user asks to draw a custom area instead of picking a preset location. |
| `flyto` | `{ bbox: [number, number, number, number] }` | A location pick should recentre the map on that area. |

```api
```
