fix contect page

This commit is contained in:
2026-06-06 16:33:26 +05:30
parent ab67fec091
commit a16d51f2fa
7 changed files with 718 additions and 17 deletions

View File

@@ -0,0 +1,59 @@
/**
* Office location data + map tile configuration for the Contact section map.
*
* Kept dependency-free (no Leaflet runtime import) so it can be safely consumed
* by both server and client modules. Types model `[lat, lng]` tuples that are
* directly compatible with Leaflet's `LatLngExpression`.
*/
/** A `[latitude, longitude]` coordinate pair. */
export type LatLng = [number, number];
export interface OfficeLocation {
/** Stable, unique key (used for React keys + analytics). */
readonly id: string;
/** Short city label, shown on the navigation buttons. */
readonly city: string;
/** Human-readable label shown in the marker popup + a11y fallback. */
readonly name: string;
/** `[latitude, longitude]`. */
readonly position: LatLng;
}
/** The three permanent office markers, ordered north-to-south is irrelevant — bounds are auto-fit. */
export const OFFICE_LOCATIONS: readonly OfficeLocation[] = [
{ id: "coimbatore", city: "Coimbatore", name: "Coimbatore Office", position: [11.0168, 76.9558] },
{ id: "bengaluru", city: "Bengaluru", name: "Bengaluru Office", position: [12.9716, 77.5946] },
{ id: "hyderabad", city: "Hyderabad", name: "Hyderabad Office", position: [17.385, 78.4867] },
];
export interface TileLayerConfig {
readonly url: string;
readonly attribution: string;
readonly maxZoom: number;
}
/**
* Esri "World Imagery" satellite basemap.
* Attribution is mandatory per Esri's terms of use.
* @see https://www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9
*/
export const ESRI_WORLD_IMAGERY: TileLayerConfig = {
url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
attribution:
'Imagery &copy; <a href="https://www.esri.com/" target="_blank" rel="noopener noreferrer">Esri</a>, Maxar, Earthstar Geographics &amp; the GIS User Community',
maxZoom: 19,
};
/** Padding (in px) applied when auto-fitting bounds so markers never touch the edges. */
export const MAP_FIT_PADDING: LatLng = [50, 50];
/** Cap the auto-fit zoom so two close offices don't zoom the map in too far. */
export const MAP_FIT_MAX_ZOOM = 7;
/** City-level zoom used when a single office is selected via the nav buttons. */
export const MAP_FOCUS_ZOOM = 13;
/** Initial center/zoom (roughly the centroid of the offices) used before bounds are fit. */
export const MAP_INITIAL_CENTER: LatLng = [14.0, 77.7];
export const MAP_INITIAL_ZOOM = 5;