diff --git a/samples/boundaries-click/README.md b/samples/boundaries-click/README.md
new file mode 100644
index 00000000..813f357a
--- /dev/null
+++ b/samples/boundaries-click/README.md
@@ -0,0 +1,40 @@
+# Google Maps JavaScript Sample
+
+This sample is generated from @googlemaps/js-samples located at
+https://github.com/googlemaps-samples/js-api-samples.
+
+## Setup
+
+### Before starting run:
+
+`npm i`
+
+### Run an example on a local web server
+
+`cd samples/boundaries-click`
+`npm start`
+
+### Build an individual example
+
+`cd samples/boundaries-click`
+`npm run build`
+
+From 'samples':
+
+`npm run build --workspace=boundaries-click/`
+
+### Build all of the examples.
+
+From 'samples':
+
+`npm run build-all`
+
+### Run lint to check for problems
+
+`cd samples/boundaries-click`
+`npx eslint index.ts`
+
+## Feedback
+
+For feedback related to this sample, please open a new issue on
+[GitHub](https://github.com/googlemaps-samples/js-api-samples/issues).
diff --git a/samples/boundaries-click/index.html b/samples/boundaries-click/index.html
new file mode 100644
index 00000000..2da437a2
--- /dev/null
+++ b/samples/boundaries-click/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+ Handle Region Boundary Click Event
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/boundaries-click/index.ts b/samples/boundaries-click/index.ts
new file mode 100644
index 00000000..0249ccca
--- /dev/null
+++ b/samples/boundaries-click/index.ts
@@ -0,0 +1,153 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+// [START maps_boundaries_click_event]
+let innerMap;
+let featureLayer;
+let infoWindow;
+let lastInteractedFeatureIds = [];
+let lastClickedFeatureIds = [];
+
+// [START maps_boundaries_click_event_handler]
+function handleClick(/* MouseEvent */ e) {
+ lastClickedFeatureIds = e.features.map((f) => f.placeId);
+ lastInteractedFeatureIds = [];
+ featureLayer.style = applyStyle;
+ createInfoWindow(e);
+}
+
+function handleMouseMove(/* MouseEvent */ e) {
+ lastInteractedFeatureIds = e.features.map((f) => f.placeId);
+ featureLayer.style = applyStyle;
+}
+// [END maps_boundaries_click_event_handler]
+
+async function initMap() {
+ // Request needed libraries.
+ const { Map, InfoWindow } = (await google.maps.importLibrary(
+ 'maps'
+ )) as google.maps.MapsLibrary;
+
+ // Get the gmp-map element.
+ const mapElement = document.querySelector(
+ 'gmp-map'
+ ) as google.maps.MapElement;
+
+ // Get the inner map.
+ innerMap = mapElement.innerMap;
+
+ // Set map options.
+ innerMap.setOptions({
+ mapTypeControl: false,
+ });
+
+ //[START maps_boundaries_click_event_add_layer]
+ // Add the feature layer.
+ featureLayer = innerMap.getFeatureLayer(
+ google.maps.FeatureType.ADMINISTRATIVE_AREA_LEVEL_2
+ );
+
+ // Add the event listeners for the feature layer.
+ featureLayer.addListener('click', handleClick);
+ featureLayer.addListener('mousemove', handleMouseMove);
+
+ // Map event listener.
+ innerMap.addListener('mousemove', () => {
+ // If the map gets a mousemove, that means there are no feature layers
+ // with listeners registered under the mouse, so we clear the last
+ // interacted feature ids.
+ if (lastInteractedFeatureIds?.length) {
+ lastInteractedFeatureIds = [];
+ featureLayer.style = applyStyle;
+ }
+ });
+ //[END maps_boundaries_click_event_add_layer]
+
+ // Create the infowindow.
+ infoWindow = new InfoWindow({});
+ // Apply style on load, to enable clicking.
+ featureLayer.style = applyStyle;
+}
+
+// Helper function for the infowindow.
+async function createInfoWindow(event) {
+ let feature = event.features[0];
+ if (!feature.placeId) return;
+
+ // Update the info window.
+ // Get the place instance from the selected feature.
+ const place = await feature.fetchPlace();
+
+ // Create a new div to hold the text content.
+ let content = document.createElement('div');
+
+ // Get the text values.
+ let nameText = document.createElement('span');
+ nameText.textContent = `Display name: ${place.displayName}`;
+ let placeIdText = document.createElement('span');
+ placeIdText.textContent = `Place ID: ${feature.placeId}`;
+ let featureTypeText = document.createElement('span');
+ featureTypeText.textContent = `Feature type: ${feature.featureType}`;
+
+ // Append the text to the div.
+ content.appendChild(nameText);
+ content.appendChild(document.createElement('br'));
+ content.appendChild(placeIdText);
+ content.appendChild(document.createElement('br'));
+ content.appendChild(featureTypeText);
+
+ updateInfoWindow(content, event.latLng);
+}
+
+// [START maps_boundaries_click_event_style]
+// Define styles.
+// Stroke and fill with minimum opacity value.
+const styleDefault = {
+ strokeColor: '#810FCB',
+ strokeOpacity: 1.0,
+ strokeWeight: 2.0,
+ fillColor: 'white',
+ fillOpacity: 0.1, // Polygons must be visible to receive events.
+};
+// Style for the clicked polygon.
+const styleClicked = {
+ ...styleDefault,
+ fillColor: '#810FCB',
+ fillOpacity: 0.5,
+};
+// Style for polygon on mouse move.
+const styleMouseMove = {
+ ...styleDefault,
+ strokeWeight: 4.0,
+};
+
+// Apply styles using a feature style function.
+function applyStyle(/* FeatureStyleFunctionOptions */ params) {
+ const placeId = params.feature.placeId;
+ //@ts-ignore
+ if (lastClickedFeatureIds.includes(placeId)) {
+ return styleClicked;
+ }
+ //@ts-ignore
+ if (lastInteractedFeatureIds.includes(placeId)) {
+ return styleMouseMove;
+ }
+ return styleDefault;
+}
+// [END maps_boundaries_click_event_style]
+
+// Helper function to create an info window.
+function updateInfoWindow(content, center) {
+ infoWindow.setContent(content);
+ infoWindow.setPosition(center);
+ infoWindow.open({
+ map: innerMap,
+ shouldFocus: false,
+ });
+}
+
+initMap();
+// [END maps_boundaries_click_event]
diff --git a/samples/boundaries-click/package.json b/samples/boundaries-click/package.json
new file mode 100644
index 00000000..ffa9be78
--- /dev/null
+++ b/samples/boundaries-click/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "@js-api-samples/boundaries-click",
+ "version": "1.0.0",
+ "scripts": {
+ "build": "tsc && bash ../jsfiddle.sh boundaries-click && bash ../app.sh boundaries-click && bash ../docs.sh boundaries-click && npm run build:vite --workspace=. && bash ../dist.sh boundaries-click",
+ "test": "tsc && npm run build:vite --workspace=.",
+ "start": "tsc && vite build --base './' && vite",
+ "build:vite": "vite build --base './'",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+
+ }
+}
diff --git a/samples/boundaries-click/style.css b/samples/boundaries-click/style.css
new file mode 100644
index 00000000..3371171f
--- /dev/null
+++ b/samples/boundaries-click/style.css
@@ -0,0 +1,25 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+/* [START maps_boundaries_click_event] */
+/*
+ * Always set the map height explicitly to define the size of the div element
+ * that contains the map.
+ */
+gmp-map {
+ height: 100%;
+}
+
+/*
+ * Optional: Makes the sample page fill the window.
+ */
+html,
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+/* [END maps_boundaries_click_event] */
diff --git a/samples/boundaries-click/tsconfig.json b/samples/boundaries-click/tsconfig.json
new file mode 100644
index 00000000..366aabb0
--- /dev/null
+++ b/samples/boundaries-click/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "compilerOptions": {
+ "module": "esnext",
+ "target": "esnext",
+ "strict": true,
+ "noImplicitAny": false,
+ "lib": [
+ "es2015",
+ "esnext",
+ "es6",
+ "dom",
+ "dom.iterable"
+ ],
+ "moduleResolution": "Node",
+ "jsx": "preserve"
+ }
+}