Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 1 addition & 24 deletions apps/admin/src/components/icons.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export interface IconProps {
interface IconProps {
size?: number
fill?: string
stroke?: string
Expand Down Expand Up @@ -50,7 +50,6 @@ export const Icons = {
d="M12 22s-7-7.5-7-13a7 7 0 1 1 14 0c0 5.5-7 13-7 13z M12 11a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"
/>
),
Map: (p) => <Icon {...p} paths={["M3 6l6-2 6 2 6-2v14l-6 2-6-2-6 2z", "M9 4v16", "M15 6v16"]} />,
Layers: (p) => (
<Icon {...p} paths={["M12 3l9 5-9 5-9-5z", "M3 13l9 5 9-5", "M3 18l9 5 9-5"]} />
),
Expand Down Expand Up @@ -85,15 +84,6 @@ export const Icons = {
BarChart: (p) => (
<Icon {...p} paths={["M3 3v18h18", "M7 16V10", "M11 16V6", "M15 16v-4", "M19 16V8"]} />
),
Settings: (p) => (
<Icon
{...p}
paths={[
"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z",
"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06A2 2 0 1 1 4.36 16.98l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06A2 2 0 1 1 7.04 4.36l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",
]}
/>
),
Inbox: (p) => (
<Icon
{...p}
Expand All @@ -105,15 +95,11 @@ export const Icons = {
),
Search: (p) => <Icon {...p} paths={["M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z", "M21 21l-4.35-4.35"]} />,
Plus: (p) => <Icon {...p} paths={["M12 5v14", "M5 12h14"]} />,
Bell: (p) => (
<Icon {...p} paths={["M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9", "M10.3 21a1.94 1.94 0 0 0 3.4 0"]} />
),
Check: (p) => <Icon {...p} d="M20 6L9 17l-5-5" />,
X: (p) => <Icon {...p} paths={["M18 6L6 18", "M6 6l12 12"]} />,
ChevronRight: (p) => <Icon {...p} d="M9 18l6-6-6-6" />,
ChevronLeft: (p) => <Icon {...p} d="M15 18l-6-6 6-6" />,
ChevronDown: (p) => <Icon {...p} d="M6 9l6 6 6-6" />,
ChevronUp: (p) => <Icon {...p} d="M18 15l-6-6-6 6" />,
ArrowUp: (p) => <Icon {...p} paths={["M12 19V5", "M5 12l7-7 7 7"]} />,
ArrowDown: (p) => <Icon {...p} paths={["M12 5v14", "M5 12l7 7 7-7"]} />,
ArrowRight: (p) => <Icon {...p} paths={["M5 12h14", "M12 5l7 7-7 7"]} />,
Expand Down Expand Up @@ -149,7 +135,6 @@ export const Icons = {
<Icon {...p} paths={["M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", "M15 3h6v6", "M10 14L21 3"]} />
),
Lock: (p) => <Icon {...p} paths={["M3 11h18v10H3z", "M7 11V7a5 5 0 0 1 10 0v4"]} />,
Bookmark: (p) => <Icon {...p} d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z" />,
FileText: (p) => (
<Icon
{...p}
Expand All @@ -162,13 +147,6 @@ export const Icons = {
]}
/>
),
Phone: (p) => (
<Icon
{...p}
d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"
/>
),
Sidebar: (p) => <Icon {...p} paths={["M3 4h18v16H3z", "M9 4v16"]} />,
Trash: (p) => (
<Icon
{...p}
Expand All @@ -185,7 +163,6 @@ export const Icons = {
Star: (p) => (
<Icon {...p} d="M12 2l3.09 6.26 6.91 1-5 4.87 1.18 6.87L12 17.77l-6.18 3.23L7 14.13l-5-4.87 6.91-1z" />
),
Filter: (p) => <Icon {...p} d="M22 3H2l8 9.46V19l4 2v-8.54z" />,
MoreH: (p) => <Icon {...p} paths={["M5 12h.01", "M12 12h.01", "M19 12h.01"]} sw={3} />,
CornerArr: (p) => <Icon {...p} paths={["M15 10l5 5-5 5", "M4 4v7a4 4 0 0 0 4 4h12"]} />,
Globe: (p) => (
Expand Down
25 changes: 16 additions & 9 deletions apps/admin/src/components/map/boundary-map.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import * as React from "react"
import L from "leaflet"

import { withCartoKey } from "@/lib/carto"
import { MAP_SETTLE_MS } from "@/lib/timing"

// Derived from Leaflet's own signature, so no direct @types/geojson dependency is needed.
type LeafletGeoJson = Parameters<typeof L.geoJSON>[0]
Expand All @@ -17,6 +18,12 @@ const TILE = {
subdomains: "abcd",
}

const TILE_MAX_ZOOM = 19
// maxZoom caps how far the fit zooms in, so a tiny place still shows its surroundings.
const FIT_OPTIONS: L.FitBoundsOptions = { padding: [12, 12], maxZoom: 13 }
const SHAPE_WEIGHT = 2
const SHAPE_FILL_OPACITY = 0.18

const LAYER_COLOR: Record<string, string> = {
place: "#5B8C6E",
county: "#3F7CAC",
Expand All @@ -25,7 +32,7 @@ const LAYER_COLOR: Record<string, string> = {
tribal: "#B0593F",
}

export interface BoundaryMapProps {
interface BoundaryMapProps {
geometry: { type: string; coordinates: unknown }
/** [west, south, east, north] */
bbox: [number, number, number, number]
Expand All @@ -49,17 +56,17 @@ export function BoundaryMap({ geometry, bbox, layer = "place" }: BoundaryMapProp
L.tileLayer(TILE.url, {
attribution: TILE.attribution,
subdomains: TILE.subdomains,
maxZoom: 19,
maxZoom: TILE_MAX_ZOOM,
detectRetina: true,
}).addTo(map)

const ro = new ResizeObserver(() => map.invalidateSize())
ro.observe(elRef.current)
const t0 = setTimeout(() => map.invalidateSize(), 60)
const resizeObserver = new ResizeObserver(() => map.invalidateSize())
resizeObserver.observe(elRef.current)
const settleTimer = setTimeout(() => map.invalidateSize(), MAP_SETTLE_MS)

return () => {
ro.disconnect()
clearTimeout(t0)
resizeObserver.disconnect()
clearTimeout(settleTimer)
map.remove()
mapRef.current = null
shapeRef.current = null
Expand All @@ -76,7 +83,7 @@ export function BoundaryMap({ geometry, bbox, layer = "place" }: BoundaryMapProp
const color = LAYER_COLOR[layer] ?? LAYER_COLOR.place
// L.geoJSON accepts a bare GeoJSON geometry object.
const shape = L.geoJSON(geometry as unknown as LeafletGeoJson, {
style: { color, weight: 2, fillColor: color, fillOpacity: 0.18 },
style: { color, weight: SHAPE_WEIGHT, fillColor: color, fillOpacity: SHAPE_FILL_OPACITY },
}).addTo(map)
shapeRef.current = shape

Expand All @@ -87,7 +94,7 @@ export function BoundaryMap({ geometry, bbox, layer = "place" }: BoundaryMapProp
[south, west],
[north, east],
],
{ padding: [12, 12], maxZoom: 13 },
FIT_OPTIONS,
)
}, [geometry, bbox, layer])

Expand Down
Loading