0 comments on “ECS EC2 Instances and Auto Scaling”

ECS EC2 Instances and Auto Scaling

To update an EC2 instance image for the SaaS servers:

  • Go to Cloud Formation for the cluster to be updated (find it under ECS Configuration | CloudFormation stack).
  • Create a Change Set:
    • standard, use existing template.
    • provide a description “updating instance AMI”
    • for LatestECSOptimizedAMI enter /aws/service/ecs/optimized-ami/amazon-linux-2023/arm64/recommended/image_id
    • Keep everything else unchanged
    • On the last page to review the change set it should show the new AMI ID
      Use this , versus guessing from the AMI picker under the Launch Template editor
    • Create the change set, validate it, and deploy it.
    • This should create a new launch template version (it will not deploy or set to default)

To deploy the new instances:

  • Go to EC2 Launch Template
  • Review the newest version on the list, make sure it has the new AMI ID
  • Set the new version of the template to the default version
  • Go to EC2 Auto Scaling Groups
  • Find Instance Refresh and execute that

This should roll the instances to the new template with the new AMI in place.

KEEP TRACK OF THE PRIOR DEFAULT LAUNCH TEMPLATE ID.
You may need to set the launch template back to the prior valid version of the launch template ID and refresh instances to roll back to the older template if something goes wrong.

When this was done in August 2026, the Auto Scaling Group had some invalid subnets attached. This kept launching EC2 instances that would not auto-attach to the target group and load balancer. This took the production SaaS offline for 5-10 minutes until the services were rolled back. LUCKILY some of the replacement instances randomly picked the right subnet and it worked. It turned out not to be an AMI issue, so the roll back to the prior default only helped by pure change – but it highlights the importance of being able to quickly reset the state of the instances.

It also highlighted the fact that the ASG can deem an instance health if it booted and is running, but the ALB and associated Target Group may still deem the instance “unhealthy” and not allow anything to connect to it making the fault-tolerant scaling group a bit of a false sense of security.

EC2 Auto Scaling Groups

Manages the number of EC2 hosts available.
Here you can run an instance refresh to use the defined launch template and default version of the template to replace running EC2 hosts with new hosts.
If configured properly these should automatically attach to the target groups which then are automatically picked up by the ECS SaaS service.
* The Scaling Group determines which subnets the launched EC2 instances attach to. For the production server this must be the PRIVATE subnets (slp-saas-private-1d), the public cluster subnets will not work.

EC2 Launch Templates

define the general characteristics of the host instance.
This includes the OS image (AMI).
Latest versions are setup to use Amazon Linux 2023.
* see note on CloudFormation below for picking the AMI

Manually launching a new instance via EC2 Launch Templates should auto-connect to the EC2 Target Group and then the ECS Infrastructure stack of Container Instances if the launch template is configured correctly (and connecting to the proper subnet).

EC2 Target Groups

(ecs-slp-saas-production) will automatically connect to EC2 instances via the associated EC2 application load balancer (slp-saas-production). The ALB is connected to the target group by the HTTPS:443 listener.
Should not need to be changed.

EC2 Application Load Balancer

Routes traffic and balances it between multiple EC2 hosts as needed.
Should not need to be changed.

Cloud Formation

Creates a template for building connected AWS resources into an IT stack.
You can use Cloud Formation to create a change set and have it automatically search and find the latest compatible AMI.
for LatestECSOptimizedAMI enter /aws/service/ecs/optimized-ami/amazon-linux-2023/arm64/recommended/image_id

0 comments on “Update The Default Locator Style”

Update The Default Locator Style

Goal: Refine the existing Default Locator Style.

Overview

The Default Locator Style lives in the project relative directory: wp-content/plugins/style-gallery-service/assets/styles/Default

Update the attached stylesheet.scss as needed to make the visual changes requested.

Only update settings.json settings if absolutely necessary to change Store Locator Plus® settings related to the layout (layout, resultslayout, searchlayout, maplayout, bubblelayout).

With the wpslp Docker container running on a local development environment the HTML with the rendered [slplus] shortcode output can be referenced at http://localhost/sample-page/

Fix The Results Layout CSS

The current CSS is not properly separating the Website and Directions links when rendered in the resultslayout shortcode.
Add modern CSS rules to stack the Website and Directions links with a gap between them.
This should work similar to the Material UI Stack component with <Stack direction=”row” space={2}>.

A screenshot of the current results layout on a default WordPress plugin install is shown below:

v260724.01 Default results layout

Modernize The Search Layout CSS

Update the CSS that impacts the search layout elements to present a modern interface.

All input elements should have a consistent height such as the address input, the radius selector, and the find button.

The find button…

  • should have more padding
  • text needs to remain centered
  • inherit the WordPress theme default colors (if available) remember users can place this on sites with different themes
  • Should right align with the right edge of the address input box
v2607.24.01 Default search layout

In the image below the Search By Name feature is enabled, the Address Input label has been set to “Address” and the Address Input Placeholder has been set to “Enter a zip code or address.”. This also has the Category Selector set to Cascading Drop Down.

The category drop down selections should be bound by the same right and left margins as the rest of the SLP rendered area in the #sl_div DIV tag and should not push beyond the right side edge of the map as is shown below.

v2607.24.01 Default search layout with the category selector, store name input activated, address label set to Address, and an address input placeholder set.

HTML Example

The following is an example of the rendered slplus shortcode on a WordPress site employing the Twenty Twenty-Four theme using the Default locator style.

<div id="sl_div"><form id="searchForm" class="slp_search_form" action="" onsubmit="cslmap.searchLocations(); return false;"><div class="slp_search_container"><div id="address_search" class="slp search_box">        <input class="label_text length_10" type="hidden" id="nameSearch" name="nameSearch" size="50" value="">    <div id="addy_in_address" class="search_item"><input class="label_empty" type="text" id="addressInput" name="addressInput" size="50" value=""></div>    <input type="hidden" id="addressInputCity" name="addressInputCity" value="">    <input type="hidden" id="addressInputState" name="addressInputState" value="">    <input type="hidden" id="addressInputCountry" name="addressInputCountry" value="">                    <div class="search_item">        <div id="addy_in_radius"><label for="radiusSelect" class="text length_6">Within</label><select id="radiusSelect"><option value="10">10 miles</option><option value="25">25 miles</option><option value="50">50 miles</option><option value="100">100 miles</option><option value="200" selected="selected">200 miles</option><option value="500">500 miles</option></select></div>        <div id="radius_in_submit"><input type="submit" class="slp_ui_button" value="Find" id="addressSubmit"></div>    </div>        </div><input type="hidden" name="ignore_radius" id="ignore_radius" value="0"></div></form><div id="map" class="slp_map" style="position: relative; overflow: hidden;"><div style="height: 100%; width: 100%; position: absolute; top: 0px; left: 0px; background-color: rgb(229, 227, 223);"><div><button draggable="false" aria-label="Keyboard shortcuts" title="Keyboard shortcuts" type="button" style="background: none; display: block; border: medium; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; z-index: 1000002; outline-offset: 3px; right: 0px; bottom: 0px; transform: translateX(100%);"></button></div><div tabindex="0" aria-label="Map" aria-roledescription="map" role="region" aria-describedby="70C71316-2CD2-452D-82B5-8A7F1AFD4D42" style="position: absolute; height: 100%; width: 100%; padding: 0px; border-width: 0px; margin: 0px; left: 0px; top: 0px;"><div id="70C71316-2CD2-452D-82B5-8A7F1AFD4D42" style="display: none;"><div class="LGLeeN-keyboard-shortcuts-view"><table><tbody><tr><td><kbd aria-label="Left arrow">←</kbd></td><td aria-label="Move left.">Move left</td></tr><tr><td><kbd aria-label="Right arrow">→</kbd></td><td aria-label="Move right.">Move right</td></tr><tr><td><kbd aria-label="Up arrow">↑</kbd></td><td aria-label="Move up.">Move up</td></tr><tr><td><kbd aria-label="Down arrow">↓</kbd></td><td aria-label="Move down.">Move down</td></tr><tr><td><kbd>+</kbd></td><td aria-label="Zoom in.">Zoom in</td></tr><tr><td><kbd>-</kbd></td><td aria-label="Zoom out.">Zoom out</td></tr><tr><td><kbd>Home</kbd></td><td aria-label="Jump left by 75%.">Jump left by 75%</td></tr><tr><td><kbd>End</kbd></td><td aria-label="Jump right by 75%.">Jump right by 75%</td></tr><tr><td><kbd>Page Up</kbd></td><td aria-label="Jump up by 75%.">Jump up by 75%</td></tr><tr><td><kbd>Page Down</kbd></td><td aria-label="Jump down by 75%.">Jump down by 75%</td></tr></tbody></table></div></div></div><div class="gm-style" style="position: absolute; z-index: 0; left: 0px; top: 0px; height: 100%; width: 100%; padding: 0px; border-width: 0px; margin: 0px;"><div style="position: absolute; z-index: 0; left: 0px; top: 0px; height: 100%; width: 100%; padding: 0px; border-width: 0px; margin: 0px; cursor: url(&quot;https://maps.gstatic.com/mapfiles/openhand_8_8.cur&quot;), default; touch-action: pan-x pan-y;"><div style="z-index: 1; position: absolute; left: 50%; top: 50%; width: 100%; will-change: transform; transform: translate(0px, 0px);"><div style="position: absolute; left: 0px; top: 0px; z-index: 100; width: 100%;"><div style="position: absolute; left: 0px; top: 0px; z-index: 0;"><div style="position: absolute; z-index: 988; transform: matrix(1, 0, 0, 1, -79, -68);"><div style="position: absolute; left: -256px; top: 0px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: -512px; top: 0px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: -512px; top: -256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: -256px; top: -256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: 0px; top: -256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: 0px; top: 0px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: 0px; top: 256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: -256px; top: 256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: -512px; top: 256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: 256px; top: -256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: 256px; top: 0px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div><div style="position: absolute; left: 256px; top: 256px; width: 256px; height: 256px;"><div style="width: 256px; height: 256px;"></div></div></div></div></div><div style="position: absolute; left: 0px; top: 0px; z-index: 101; width: 100%;"></div><div style="position: absolute; left: 0px; top: 0px; z-index: 102; width: 100%;"></div><div style="position: absolute; left: 0px; top: 0px; z-index: 103; width: 100%;"><div style="position: absolute; left: 0px; top: 0px; z-index: -1;"><div style="position: absolute; z-index: 988; transform: matrix(1, 0, 0, 1, -79, -68);"><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: 0px; top: 0px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: -256px; top: 0px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: -256px; top: -256px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: 0px; top: -256px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: 256px; top: -256px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: 256px; top: 0px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: 256px; top: 256px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: 0px; top: 256px;"></div><div style="width: 256px; height: 256px; overflow: hidden; position: absolute; left: -256px; top: 256px;"></div></div></div></div><div style="position: absolute; left: 0px; top: 0px; z-index: 0;"><div style="position: absolute; z-index: 988; transform: matrix(1, 0, 0, 1, -79, -68);"><div style="position: absolute; left: 256px; top: 256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1140!3i1653!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=55895" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: 0px; top: 0px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1139!3i1652!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=85651" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: 0px; top: -256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1139!3i1651!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=85203" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: 0px; top: 256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1139!3i1653!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=86099" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: -256px; top: 256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1138!3i1653!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=15704" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: -512px; top: 256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1137!3i1653!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=76380" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: 256px; top: -256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1140!3i1651!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=54999" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: 256px; top: 0px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1140!3i1652!4i256!2m3!1e0!2sm!3i788554264!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=55447" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: -256px; top: 0px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1138!3i1652!4i256!2m3!1e0!2sm!3i788554360!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=64482" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: -256px; top: -256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1138!3i1651!4i256!2m3!1e0!2sm!3i788554360!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=64034" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: -512px; top: -256px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1137!3i1651!4i256!2m3!1e0!2sm!3i788554360!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=124710" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div><div style="position: absolute; left: -512px; top: 0px; width: 256px; height: 256px; transition: opacity 200ms linear;"><img draggable="false" alt="" role="presentation" src="https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i12!2i1137!3i1652!4i256!2m3!1e0!2sm!3i788554360!3m13!2sen!3sUS!5e18!12m5!1e68!2m2!1sset!2sRoadmap!4e2!12m3!1e37!2m1!1ssmartmaps!4e0!5m2!1e3!5f2!23i46991212!23i47054750&amp;key=AIzaSyD56nFj-MfcfDv57q3iQ0_vtmMOyWcZHHY&amp;token=125158" style="width: 256px; height: 256px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px; max-width: none;"></div></div></div></div><div style="z-index: 3; position: absolute; height: 100%; width: 100%; padding: 0px; border-width: 0px; margin: 0px; left: 0px; top: 0px; touch-action: pan-x pan-y;"><div style="z-index: 4; position: absolute; left: 50%; top: 50%; width: 100%; will-change: transform; transform: translate(0px, 0px);"><div style="position: absolute; left: 0px; top: 0px; z-index: 104; width: 100%;"></div><div style="position: absolute; left: 0px; top: 0px; z-index: 105; width: 100%;"></div><div style="position: absolute; left: 0px; top: 0px; z-index: 106; width: 100%;"><slot></slot><span id="408CEBF9-D483-4810-BF74-036DA102A992" aria-live="polite" style="position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0px; overflow: hidden; clip-path: inset(100%); white-space: nowrap; border: 0px;"></span><span id="maps-aria-25856356-9AFA-4F73-8064-99838B3C5D5A" style="display: none;">To activate drag with keyboard, press Alt + Enter. Once in keyboard drag state, use the arrow keys to move the marker. To complete the drag, press the Enter key. To cancel, press Escape.</span><div><gmp-advanced-marker aria-label="Le Farfalle" title="Le Farfalle" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" tabindex="0" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-201px, 147px); z-index: 147; will-change: transform; position: absolute; left: 0px;" position="32.7807728,-79.9344433" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Le Farfalle" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="AZUR" title="AZUR" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-201px, 148px); z-index: 148; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7802326,-79.934364" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="AZUR" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="167 Raw Oyster Bar" title="167 Raw Oyster Bar" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-198px, 151px); z-index: 151; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7794733,-79.9332978" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="167 Raw Oyster Bar" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Bay Street Biergarten" title="Bay Street Biergarten" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-192px, 108px); z-index: 108; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7920249,-79.9314688" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Bay Street Biergarten" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="The Ordinary" title="The Ordinary" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-218px, 107px); z-index: 107; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7922383,-79.940407" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="The Ordinary" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Vern's" title="Vern's" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-234px, 106px); z-index: 106; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7923451,-79.9456817" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Vern's" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Charleston Harbor Fish House" title="Charleston Harbor Fish House" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-120px, 123px); z-index: 123; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7875756,-79.9067241" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Charleston Harbor Fish House" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="The Archer" title="The Archer" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-231px, 71px); z-index: 71; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8024512,-79.9448398" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="The Archer" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Vicious Biscuit MT P" title="Vicious Biscuit MT P" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-59px, 94px); z-index: 94; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7958457,-79.885748" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Vicious Biscuit MT P" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Graze" title="Graze" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-67px, 67px); z-index: 67; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8036194,-79.8883514" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Graze" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Coleman Public House" title="Coleman Public House" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-54px, 95px); z-index: 95; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.795646,-79.8840862" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Coleman Public House" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Vickery's Bar &amp; Grill" title="Vickery's Bar &amp; Grill" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-51px, 107px); z-index: 107; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.792123,-79.8829594" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Vickery's Bar &amp; Grill" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Water's Edge" title="Water's Edge" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-48px, 105px); z-index: 105; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7927498,-79.8818621" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Water's Edge" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Tavern N Table" title="Tavern N Table" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-45px, 106px); z-index: 106; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7923824,-79.8809977" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Tavern N Table" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Nico" title="Nico" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-41px, 110px); z-index: 110; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7913618,-79.8796997" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Nico" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Shem Creek Crab House" title="Shem Creek Crab House" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-37px, 104px); z-index: 104; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7929802,-79.8782472" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Shem Creek Crab House" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Post House" title="Post House" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-33px, 125px); z-index: 125; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7870805,-79.8768768" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Post House" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Page's Okra Grill" title="Page's Okra Grill" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-34px, 112px); z-index: 112; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7907617,-79.8772127" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Page's Okra Grill" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Langdon's Restaurant &amp; Wine Bar" title="Langdon's Restaurant &amp; Wine Bar" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-34px, 46px); z-index: 46; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8098161,-79.8770554" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Langdon's Restaurant &amp; Wine Bar" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Red Drum" title="Red Drum" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(-1px, 104px); z-index: 104; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.7929632,-79.865819" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Red Drum" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Nautica Bowls" title="Nautica Bowls" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(21px, -57px); z-index: -57; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8394062,-79.8582839" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Nautica Bowls" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Wendy's" title="Wendy's" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(19px, -60px); z-index: -60; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8403093,-79.8589141" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Wendy's" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Verde" title="Verde" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(22px, -57px); z-index: -57; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8395041,-79.8578856" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Verde" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Waffle House" title="Waffle House" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(18px, -62px); z-index: -62; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8410679,-79.8593983" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Waffle House" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Moe's Southwest Grill" title="Moe's Southwest Grill" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(22px, -59px); z-index: -59; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8400488,-79.8577849" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Moe's Southwest Grill" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Dog and Duck" title="Dog and Duck" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(23px, -61px); z-index: -61; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8407263,-79.8574178" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Dog and Duck" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Starbucks Coffee Company" title="Starbucks Coffee Company" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(27px, -61px); z-index: -61; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.840512,-79.8563047" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Starbucks Coffee Company" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Fuji Sushi Bar &amp; Grill" title="Fuji Sushi Bar &amp; Grill" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(29px, -60px); z-index: -60; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8403567,-79.8555168" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Fuji Sushi Bar &amp; Grill" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Amalfi's Italian Restaurant" title="Amalfi's Italian Restaurant" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(32px, -56px); z-index: -56; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8393079,-79.854356" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Amalfi's Italian Restaurant" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Chik-Fil-A" title="Chik-Fil-A" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(28px, -66px); z-index: -66; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8420234,-79.8559943" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Chik-Fil-A" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="McAlister's Deli" title="McAlister's Deli" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(30px, -64px); z-index: -64; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.841572,-79.855324" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="McAlister's Deli" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Rio Chico Mexican Restaurant" title="Rio Chico Mexican Restaurant" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(34px, -64px); z-index: -64; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8414179,-79.8538569" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Rio Chico Mexican Restaurant" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="The Wine Bar" title="The Wine Bar" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(34px, -65px); z-index: -65; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.841671,-79.85379" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="The Wine Bar" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Hutto Seafood Kitchen" title="Hutto Seafood Kitchen" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(31px, -69px); z-index: -69; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8430127,-79.8549817" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Hutto Seafood Kitchen" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="All American Sports Bar" title="All American Sports Bar" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(33px, -69px); z-index: -69; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8430944,-79.8540784" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="All American Sports Bar" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Bamboo Garden Restaurant" title="Bamboo Garden Restaurant" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(33px, -71px); z-index: -71; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8434294,-79.8540498" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Bamboo Garden Restaurant" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="SeeWee Restaurant" title="SeeWee Restaurant" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(89px, -21px); z-index: -21; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.829123,-79.8349483" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="SeeWee Restaurant" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Burtons Bar and Grill" title="Burtons Bar and Grill" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(101px, -26px); z-index: -26; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8306966,-79.8308407" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Burtons Bar and Grill" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Ye Olde Fashion" title="Ye Olde Fashion" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(104px, -29px); z-index: -29; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8315348,-79.8299087" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Ye Olde Fashion" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Basil Thai" title="Basil Thai" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(139px, 6px); z-index: 6; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8213063,-79.8176758" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Basil Thai" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Crave Kitchen &amp; Cocktails" title="Crave Kitchen &amp; Cocktails" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(140px, 3px); z-index: 3; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.822333,-79.8173879" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Crave Kitchen &amp; Cocktails" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="SOL Mt. Pleasant" title="SOL Mt. Pleasant" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(127px, -47px); z-index: -47; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8365643,-79.8217315" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="SOL Mt. Pleasant" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Sena Cafe" title="Sena Cafe" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(143px, -53px); z-index: -53; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8384893,-79.8164855" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Sena Cafe" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Abbracci" title="Abbracci" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(211px, -135px); z-index: -135; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.862059,-79.793122" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Abbracci" style="max-width: none;"></div></gmp-advanced-marker><gmp-advanced-marker aria-label="Mellow Mushroom" title="Mellow Mushroom" role="button" slot="VyEnES-internal-visible-gmp-advanced-markers" style="touch-action: pan-x pan-y; pointer-events: auto; cursor: pointer; transform: translate(-50%, -100%) translate(234px, -151px); z-index: -151; will-change: transform; position: absolute; left: 0px;" tabindex="-1" position="32.8665989,-79.7851024" class="yNHHyP-marker-view"><div><img src="http://localhost/wp-content/plugins/store-locator-plus/images/icons/bulb_azure.png" alt="Mellow Mushroom" style="max-width: none;"></div></gmp-advanced-marker></div></div><div style="position: absolute; left: 0px; top: 0px; z-index: 107; width: 100%;"></div></div></div><div class="gm-style-moc" style="z-index: 4; position: absolute; height: 100%; width: 100%; padding: 0px; border-width: 0px; margin: 0px; left: 0px; top: 0px; transition-property: opacity, display; transition-behavior: allow-discrete; opacity: 0; display: none;"><p class="gm-style-mot"></p></div></div><iframe aria-hidden="true" frameborder="0" tabindex="-1" style="z-index: -1; position: absolute; width: 100%; height: 100%; top: 0px; left: 0px; border: medium; opacity: 0;"></iframe><div style="pointer-events: none; width: 100%; height: 100%; box-sizing: border-box; position: absolute; z-index: 1000002; opacity: 0; border: 2px solid rgb(26, 115, 232);"></div><div></div><div></div><div></div><div></div><div><button draggable="false" aria-label="Toggle fullscreen view" title="Toggle fullscreen view" type="button" aria-pressed="false" class="gm-control-active gm-fullscreen-control" style="background: rgb(255, 255, 255); border: 0px; margin: 10px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; border-radius: 2px; height: 40px; width: 40px; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; overflow: hidden; top: 0px; right: 0px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2018%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M0%200v6h2V2h4V0zm16%200h-4v2h4v4h2V0zm0%2016h-4v2h6v-6h-2zM2%2012H0v6h6v-2H2z%22/%3E%3C/svg%3E" alt="" style="height: 18px; width: 18px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2018%22%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22M0%200v6h2V2h4V0zm16%200h-4v2h4v4h2V0zm0%2016h-4v2h6v-6h-2zM2%2012H0v6h6v-2H2z%22/%3E%3C/svg%3E" alt="" style="height: 18px; width: 18px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2018%22%3E%3Cpath%20fill%3D%22%23111%22%20d%3D%22M0%200v6h2V2h4V0zm16%200h-4v2h4v4h2V0zm0%2016h-4v2h6v-6h-2zM2%2012H0v6h6v-2H2z%22/%3E%3C/svg%3E" alt="" style="height: 18px; width: 18px;"></button></div><div></div><div></div><div></div><div></div><div><div class="gmnoprint gm-bundled-control gm-bundled-control-on-bottom" draggable="false" data-control-width="40" data-control-height="225" style="margin: 10px; -webkit-user-select: none; position: absolute; bottom: 239px; right: 40px;"><div class="gmnoprint" data-control-width="40" data-control-height="40" style="display: none; position: absolute;"><div style="background-color: rgb(255, 255, 255); box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; border-radius: 2px; width: 40px; height: 40px;"><button draggable="false" aria-label="Rotate map clockwise" title="Rotate map clockwise" type="button" class="gm-control-active" style="background: none; display: none; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; left: 0px; top: 0px; overflow: hidden; width: 40px; height: 40px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%200h24v24H0z%22/%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12.06%209.06%204-4-4-4-1.41%201.41%201.59%201.59h-.18c-2.3%200-4.6.88-6.35%202.64-3.52%203.51-3.52%209.21%200%2012.72%201.5%201.5%203.4%202.36%205.36%202.58v-2.02c-1.44-.21-2.84-.86-3.95-1.97-2.73-2.73-2.73-7.17%200-9.9%201.37-1.37%203.16-2.05%204.95-2.05h.17l-1.59%201.59zm8.94%203c-.19-1.74-.88-3.32-1.91-4.61l-1.43%201.43c.69.92%201.15%202%201.32%203.18zm-7.94%207.92V22c1.74-.19%203.32-.88%204.61-1.91l-1.43-1.43c-.91.68-2%201.15-3.18%201.32m4.6-2.74%201.43%201.43c1.04-1.29%201.72-2.88%201.91-4.61h-2.02c-.17%201.18-.64%202.27-1.32%203.18%22/%3E%3C/svg%3E" style="width: 20px; height: 20px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%200h24v24H0z%22/%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22m12.06%209.06%204-4-4-4-1.41%201.41%201.59%201.59h-.18c-2.3%200-4.6.88-6.35%202.64-3.52%203.51-3.52%209.21%200%2012.72%201.5%201.5%203.4%202.36%205.36%202.58v-2.02c-1.44-.21-2.84-.86-3.95-1.97-2.73-2.73-2.73-7.17%200-9.9%201.37-1.37%203.16-2.05%204.95-2.05h.17l-1.59%201.59zm8.94%203c-.19-1.74-.88-3.32-1.91-4.61l-1.43%201.43c.69.92%201.15%202%201.32%203.18zm-7.94%207.92V22c1.74-.19%203.32-.88%204.61-1.91l-1.43-1.43c-.91.68-2%201.15-3.18%201.32m4.6-2.74%201.43%201.43c1.04-1.29%201.72-2.88%201.91-4.61h-2.02c-.17%201.18-.64%202.27-1.32%203.18%22/%3E%3C/svg%3E" style="width: 20px; height: 20px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%200h24v24H0z%22/%3E%3Cpath%20fill%3D%22%23111%22%20d%3D%22m12.06%209.06%204-4-4-4-1.41%201.41%201.59%201.59h-.18c-2.3%200-4.6.88-6.35%202.64-3.52%203.51-3.52%209.21%200%2012.72%201.5%201.5%203.4%202.36%205.36%202.58v-2.02c-1.44-.21-2.84-.86-3.95-1.97-2.73-2.73-2.73-7.17%200-9.9%201.37-1.37%203.16-2.05%204.95-2.05h.17l-1.59%201.59zm8.94%203c-.19-1.74-.88-3.32-1.91-4.61l-1.43%201.43c.69.92%201.15%202%201.32%203.18zm-7.94%207.92V22c1.74-.19%203.32-.88%204.61-1.91l-1.43-1.43c-.91.68-2%201.15-3.18%201.32m4.6-2.74%201.43%201.43c1.04-1.29%201.72-2.88%201.91-4.61h-2.02c-.17%201.18-.64%202.27-1.32%203.18%22/%3E%3C/svg%3E" style="width: 20px; height: 20px;"></button><div style="position: relative; overflow: hidden; width: 30px; height: 1px; margin: 0px 5px; background-color: rgb(230, 230, 230); display: none;"></div><button draggable="false" aria-label="Rotate map counterclockwise" title="Rotate map counterclockwise" type="button" class="gm-control-active" style="background: none; display: none; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; left: 0px; top: 0px; overflow: hidden; width: 40px; height: 40px; transform: scaleX(-1);"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%200h24v24H0z%22/%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12.06%209.06%204-4-4-4-1.41%201.41%201.59%201.59h-.18c-2.3%200-4.6.88-6.35%202.64-3.52%203.51-3.52%209.21%200%2012.72%201.5%201.5%203.4%202.36%205.36%202.58v-2.02c-1.44-.21-2.84-.86-3.95-1.97-2.73-2.73-2.73-7.17%200-9.9%201.37-1.37%203.16-2.05%204.95-2.05h.17l-1.59%201.59zm8.94%203c-.19-1.74-.88-3.32-1.91-4.61l-1.43%201.43c.69.92%201.15%202%201.32%203.18zm-7.94%207.92V22c1.74-.19%203.32-.88%204.61-1.91l-1.43-1.43c-.91.68-2%201.15-3.18%201.32m4.6-2.74%201.43%201.43c1.04-1.29%201.72-2.88%201.91-4.61h-2.02c-.17%201.18-.64%202.27-1.32%203.18%22/%3E%3C/svg%3E" style="width: 20px; height: 20px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%200h24v24H0z%22/%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22m12.06%209.06%204-4-4-4-1.41%201.41%201.59%201.59h-.18c-2.3%200-4.6.88-6.35%202.64-3.52%203.51-3.52%209.21%200%2012.72%201.5%201.5%203.4%202.36%205.36%202.58v-2.02c-1.44-.21-2.84-.86-3.95-1.97-2.73-2.73-2.73-7.17%200-9.9%201.37-1.37%203.16-2.05%204.95-2.05h.17l-1.59%201.59zm8.94%203c-.19-1.74-.88-3.32-1.91-4.61l-1.43%201.43c.69.92%201.15%202%201.32%203.18zm-7.94%207.92V22c1.74-.19%203.32-.88%204.61-1.91l-1.43-1.43c-.91.68-2%201.15-3.18%201.32m4.6-2.74%201.43%201.43c1.04-1.29%201.72-2.88%201.91-4.61h-2.02c-.17%201.18-.64%202.27-1.32%203.18%22/%3E%3C/svg%3E" style="width: 20px; height: 20px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22none%22%20d%3D%22M0%200h24v24H0z%22/%3E%3Cpath%20fill%3D%22%23111%22%20d%3D%22m12.06%209.06%204-4-4-4-1.41%201.41%201.59%201.59h-.18c-2.3%200-4.6.88-6.35%202.64-3.52%203.51-3.52%209.21%200%2012.72%201.5%201.5%203.4%202.36%205.36%202.58v-2.02c-1.44-.21-2.84-.86-3.95-1.97-2.73-2.73-2.73-7.17%200-9.9%201.37-1.37%203.16-2.05%204.95-2.05h.17l-1.59%201.59zm8.94%203c-.19-1.74-.88-3.32-1.91-4.61l-1.43%201.43c.69.92%201.15%202%201.32%203.18zm-7.94%207.92V22c1.74-.19%203.32-.88%204.61-1.91l-1.43-1.43c-.91.68-2%201.15-3.18%201.32m4.6-2.74%201.43%201.43c1.04-1.29%201.72-2.88%201.91-4.61h-2.02c-.17%201.18-.64%202.27-1.32%203.18%22/%3E%3C/svg%3E" style="width: 20px; height: 20px;"></button><div style="position: relative; overflow: hidden; width: 30px; height: 1px; margin: 0px 5px; background-color: rgb(230, 230, 230); display: none;"></div><button draggable="false" aria-label="Tilt map" title="Tilt map" type="button" class="gm-tilt gm-control-active" style="background: none; display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; top: 0px; left: 0px; overflow: hidden; width: 40px; height: 40px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2016%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M0%2016h8V9H0zm10%200h8V9h-8zM0%207h8V0H0zm10-7v7h8V0z%22/%3E%3C/svg%3E" style="width: 18px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2016%22%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22M0%2016h8V9H0zm10%200h8V9h-8zM0%207h8V0H0zm10-7v7h8V0z%22/%3E%3C/svg%3E" style="width: 18px;"><img alt="" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2016%22%3E%3Cpath%20fill%3D%22%23111%22%20d%3D%22M0%2016h8V9H0zm10%200h8V9h-8zM0%207h8V0H0zm10-7v7h8V0z%22/%3E%3C/svg%3E" style="width: 18px;"></button></div></div><gmp-internal-camera-control data-control-width="40" data-control-height="40" draggable="false" class="gmnoprint" style="position: absolute; cursor: pointer; -webkit-user-select: none; left: 0px; top: 0px;"><button draggable="false" aria-label="Map camera controls" title="Map camera controls" type="button" class="gm-control-active" aria-expanded="false" aria-controls="A9E47EA0-A67B-492C-B7AA-C024575B0326" style="background: 6px center / 28px auto no-repeat rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; width: 40px; height: 40px; border-radius: 50%; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12%2019.175%202.125-2.125%201.425%201.4L12%2022l-3.55-3.55%201.425-1.4zM4.825%2012l2.125%202.125-1.4%201.425L2%2012l3.55-3.55%201.4%201.425zm14.35%200L17.05%209.875l1.4-1.425L22%2012l-3.55%203.55-1.4-1.425zM12%204.825%209.875%206.95%208.45%205.55%2012%202l3.55%203.55-1.425%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12%2019.175%202.125-2.125%201.425%201.4L12%2022l-3.55-3.55%201.425-1.4zM4.825%2012l2.125%202.125-1.4%201.425L2%2012l3.55-3.55%201.4%201.425zm14.35%200L17.05%209.875l1.4-1.425L22%2012l-3.55%203.55-1.4-1.425zM12%204.825%209.875%206.95%208.45%205.55%2012%202l3.55%203.55-1.425%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%231a73e8%22%20d%3D%22m12%2019.175%202.125-2.125%201.425%201.4L12%2022l-3.55-3.55%201.425-1.4zM4.825%2012l2.125%202.125-1.4%201.425L2%2012l3.55-3.55%201.4%201.425zm14.35%200L17.05%209.875l1.4-1.425L22%2012l-3.55%203.55-1.4-1.425zM12%204.825%209.875%206.95%208.45%205.55%2012%202l3.55%203.55-1.425%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23d1d1d1%22%20d%3D%22m12%2019.175%202.125-2.125%201.425%201.4L12%2022l-3.55-3.55%201.425-1.4zM4.825%2012l2.125%202.125-1.4%201.425L2%2012l3.55-3.55%201.4%201.425zm14.35%200L17.05%209.875l1.4-1.425L22%2012l-3.55%203.55-1.4-1.425zM12%204.825%209.875%206.95%208.45%205.55%2012%202l3.55%203.55-1.425%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button><menu id="A9E47EA0-A67B-492C-B7AA-C024575B0326" style="list-style: none; padding: 0px; display: none; position: absolute; z-index: 999999; margin: 10px; width: 140px; height: 140px; right: 100%; top: -60px;"><li><button draggable="false" aria-label="Move up" title="Move up" type="button" class="gm-control-active" style="background: 6px center / 28px auto no-repeat rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; width: 40px; height: 40px; border-radius: 50%; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; top: 0px; left: 50%; transform: translateX(-50%);"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12%2010.8-4.6%204.6L6%2014l6-6%206%206-1.4%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22m12%2010.8-4.6%204.6L6%2014l6-6%206%206-1.4%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12%2010.8-4.6%204.6L6%2014l6-6%206%206-1.4%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23d1d1d1%22%20d%3D%22m12%2010.8-4.6%204.6L6%2014l6-6%206%206-1.4%201.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button></li><li><button draggable="false" aria-label="Move left" title="Move left" type="button" class="gm-control-active" style="background: 6px center / 28px auto no-repeat rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; width: 40px; height: 40px; border-radius: 50%; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; bottom: 50%; left: 0px; transform: translateY(50%);"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m14%2018-6-6%206-6%201.4%201.4-4.6%204.6%204.6%204.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22m14%2018-6-6%206-6%201.4%201.4-4.6%204.6%204.6%204.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m14%2018-6-6%206-6%201.4%201.4-4.6%204.6%204.6%204.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23d1d1d1%22%20d%3D%22m14%2018-6-6%206-6%201.4%201.4-4.6%204.6%204.6%204.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button></li><li><button draggable="false" aria-label="Move right" title="Move right" type="button" class="gm-control-active" style="background: 6px center / 28px auto no-repeat rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; width: 40px; height: 40px; border-radius: 50%; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; bottom: 50%; right: 0px; transform: translateY(50%);"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M12.6%2012%208%207.4%209.4%206l6%206-6%206L8%2016.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22M12.6%2012%208%207.4%209.4%206l6%206-6%206L8%2016.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M12.6%2012%208%207.4%209.4%206l6%206-6%206L8%2016.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23d1d1d1%22%20d%3D%22M12.6%2012%208%207.4%209.4%206l6%206-6%206L8%2016.6z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button></li><li><button draggable="false" aria-label="Move down" title="Move down" type="button" class="gm-control-active" style="background: 6px center / 28px auto no-repeat rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; width: 40px; height: 40px; border-radius: 50%; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; bottom: 0px; left: 50%; transform: translateX(-50%);"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12%2015.4-6-6L7.4%208l4.6%204.6L16.6%208%2018%209.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23333%22%20d%3D%22m12%2015.4-6-6L7.4%208l4.6%204.6L16.6%208%2018%209.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12%2015.4-6-6L7.4%208l4.6%204.6L16.6%208%2018%209.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22m12%2015.4-6-6L7.4%208l4.6%204.6L16.6%208%2018%209.4z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button></li><li><button draggable="false" aria-label="Zoom in" title="Zoom in" type="button" class="gm-control-active" style="background: 6px center / 28px auto no-repeat rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; overflow: hidden; width: 40px; height: 40px; border-radius: 50%; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; top: 0px; right: 0px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23666%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23333%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23111%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23d1d1d1%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button></li><li><button draggable="false" aria-label="Zoom out" title="Zoom out" type="button" class="gm-control-active" style="background: 6px center / 28px auto no-repeat rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; overflow: hidden; width: 40px; height: 40px; border-radius: 50%; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; bottom: 0px; right: 0px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23666%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23333%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23111%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23d1d1d1%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button></li></menu></gmp-internal-camera-control><button draggable="false" aria-label="Drag Pegman onto the map to open Street View" title="Drag Pegman onto the map to open Street View" type="button" class="gm-svpc" dir="ltr" data-control-width="40" data-control-height="40" style="background: rgb(255, 255, 255); border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: absolute; cursor: pointer; -webkit-user-select: none; --pegman-scaleX: 1; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; border-radius: 2px; width: 40px; height: 40px; left: 0px; top: 72px;"><div style="position: absolute; left: 50%; top: 50%; transform: scaleX(var(--pegman-scaleX));"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2023%2038%22%3E%3Cpath%20d%3D%22M16.6%2038.1h-5.5l-.2-2.9-.2%202.9H5.2L5%2025.3l-.8%202a1.53%201.53%200%2001-1.9.9l-1.2-.4a1.58%201.58%200%2001-1-1.9v-.1c.3-.9%203.1-11.2%203.1-11.2a2.66%202.66%200%20012.3-2l.6-.5a6.93%206.93%200%20014.7-12%206.8%206.8%200%20014.9%202%207%207%200%20012%204.9%206.65%206.65%200%2001-2.2%205l.7.5a2.78%202.78%200%20012.4%202s2.9%2011.2%202.9%2011.3a1.53%201.53%200%2001-.9%201.9l-1.3.4a1.63%201.63%200%2001-1.9-.9l-.7-1.8zm-3.6-2h1.7l.2-15.8%201.9-.3%202.4%206.3.3-.1c-.2-.8-.8-3.2-2.8-10.9a.63.63%200%2000-.6-.5h-.6l-1.1-.9h-1.9l-.3-2a4.83%204.83%200%20003.5-4.7A4.78%204.78%200%200011%202.3h-.2a4.9%204.9%200%2000-1.4%209.6l-.3%202H7.2l-1%20.9h-.6a.74.74%200%2000-.6.5c-2%207.5-2.7%2010-3%2010.9l.3.1L4.8%2020l1.9.3.2%2015.8h1.6l.6-8.4a1.52%201.52%200%20011.5-1.4%201.5%201.5%200%20011.5%201.4zm6.6-9.7%22%20style%3D%22isolation%3Aisolate%22%20fill%3D%22%23333%22%20opacity%3D%22.7%22/%3E%3Cpath%20d%3D%22m5.9%2013.6%201.1-.9h7.8l1.2.9%22%20fill%3D%22%23ce592c%22/%3E%3Cellipse%20cx%3D%2210.9%22%20cy%3D%2213.1%22%20rx%3D%222.7%22%20ry%3D%22.3%22%20style%3D%22isolation%3Aisolate%22%20fill%3D%22%23ce592c%22%20opacity%3D%22.5%22/%3E%3Cpath%20d%3D%22m20.6%2026.1-2.9-11.3a1.71%201.71%200%2000-1.6-1.2H5.7a1.69%201.69%200%2000-1.5%201.3L1.1%2026.2a.61.61%200%2000.3.7l1.1.4a.61.61%200%2000.7-.3l2.7-6.7.2%2016.8h3.6l.6-9.3a.47.47%200%2001.44-.5h.06c.4%200%20.4.2.5.5l.6%209.3h3.6l.2-16.8%202.5%206.6a.52.52%200%2000.66.31l1.2-.40000000000001a.57.57%200%2000.5-.7Z%22%20fill%3D%22%23fdbf2d%22/%3E%3Cpath%20d%3D%22m7%2013.6%203.9%206.7%203.9-6.7%22%20style%3D%22isolation%3Aisolate%22%20fill%3D%22%23cf572e%22%20opacity%3D%22.6%22/%3E%3Ccircle%20cx%3D%2210.9%22%20cy%3D%227%22%20r%3D%225.9%22%20fill%3D%22%23fdbf2d%22/%3E%3C/svg%3E" alt="Street View Pegman Control" style="height: 30px; width: 30px; position: absolute; transform: translate(-50%, -50%); pointer-events: none;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2038%22%3E%3Cpath%20d%3D%22m22%2026.6-2.9-11.3a2.78%202.78%200%2000-2.4-2l-.7-.5a6.82%206.82%200%20002.2-5%206.9%206.9%200%2000-13.8%200%207%207%200%20002.2%205.1l-.6.5a2.55%202.55%200%2000-2.3%202s-3%2011.1-3%2011.2v.1a1.58%201.58%200%20001%201.9l1.2.4a1.63%201.63%200%20001.9-.9l.8-2%20.2%2012.8h11.3l.2-12.6.7%201.8a1.54%201.54%200%20001.5%201%201.09%201.09%200%2000.5-.1l1.3-.4a1.85%201.85%200%2000.7-2Zm-1.2.9-1.2.4a.61.61%200%2001-.7-.3L16.4%2021l-.2%2016.8H6.8L6.6%2021l-2.7%206.7a.52.52%200%2001-.66.31l-1.1-.4a.52.52%200%2001-.31-.66l3.1-11.3a1.69%201.69%200%20011.5-1.3h.2l1-.9h2.3a5.9%205.9%200%20113.2%200h2.3l1.1.9h.2a1.71%201.71%200%20011.6%201.2l2.9%2011.3a.84.84%200%2001-.4.7Z%22%20fill%3D%22%23333%22%20fill-opacity%3D%22.2%22/%3E%26quot%3B%3C/svg%3E" alt="Pegman is on top of the Map" style="height: 30px; width: 30px; position: absolute; transform: translate(-50%, -50%); pointer-events: none; display: none;"><img alt="Street View Pegman Control" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2040%2050%22%3E%3Cpath%20d%3D%22m34-30.4-2.9-11.3a2.78%202.78%200%2000-2.4-2l-.7-.5a6.82%206.82%200%20002.2-5%206.9%206.9%200%2000-13.8%200%207%207%200%20002.2%205.1l-.6.5a2.55%202.55%200%2000-2.3%202s-3%2011.1-3%2011.2v.1a1.58%201.58%200%20001%201.9l1.2.4a1.63%201.63%200%20001.9-.9l.8-2%20.2%2012.8h11.3l.2-12.6.7%201.8a1.54%201.54%200%20001.5%201%201.09%201.09%200%2000.5-.1l1.3-.4a1.85%201.85%200%2000.7-2Zm-1.2.9-1.2.4a.61.61%200%2001-.7-.3L28.4-36l-.2%2016.8h-9.4L18.6-36l-2.7%206.7a.52.52%200%2001-.66.31l-1.1-.4a.52.52%200%2001-.31-.66l3.1-11.3a1.69%201.69%200%20011.5-1.3h.2l1-.9h2.3a5.9%205.9%200%20113.2%200h2.3l1.1.9h.2a1.71%201.71%200%20011.6%201.2l2.9%2011.3a.84.84%200%2001-.4.7ZM34%2029.6l-2.9-11.3a2.78%202.78%200%2000-2.4-2l-.7-.5a6.82%206.82%200%20002.2-5%206.9%206.9%200%2000-13.8%200%207%207%200%20002.2%205.1l-.6.5a2.55%202.55%200%2000-2.3%202s-3%2011.1-3%2011.2v.1a1.58%201.58%200%20001%201.9l1.2.4a1.63%201.63%200%20001.9-.9l.8-2%20.2%2012.8h11.3l.2-12.6.7%201.8a1.54%201.54%200%20001.5%201%201.09%201.09%200%2000.5-.1l1.3-.4a1.85%201.85%200%2000.7-2Zm-1.2.9-1.2.4a.61.61%200%2001-.7-.3L28.4%2024l-.2%2016.8h-9.4L18.6%2024l-2.7%206.7a.52.52%200%2001-.66.31l-1.1-.4a.52.52%200%2001-.31-.66l3.1-11.3a1.69%201.69%200%20011.5-1.3h.2l1-.9h2.3a5.9%205.9%200%20113.2%200h2.3l1.1.9h.2a1.71%201.71%200%20011.6%201.2l2.9%2011.3a.84.84%200%2001-.4.7Z%22%20fill%3D%22%23333%22%20fill-opacity%3D%22.2%22/%3E%3Cpath%20d%3D%22M15.4%2038.8h-4a1.64%201.64%200%2001-1.4-1.1l-3.1-8a.9.9%200%2001-.5.1l-1.4.1a1.62%201.62%200%2001-1.6-1.4L2.3%2015.4l1.6-1.3a6.87%206.87%200%2001-3-4.6A7.14%207.14%200%20012%204%207.6%207.6%200%20016.7.9%207.14%207.14%200%200112.2%202a7.28%207.28%200%20012.3%209.6l2.1-.1.1%201c0%20.2.1.5.1.8a2.41%202.41%200%20011%201s1.9%203.2%202.8%204.9c.7%201.2%202.1%204.2%202.8%205.9a2.1%202.1%200%2001-.8%202.6l-.6.4a1.63%201.63%200%2001-1.5.2l-.6-.3a8.93%208.93%200%2000.5%201.3%207.91%207.91%200%20001.8%202.6l.6.3v4.6l-4.5-.1a7.32%207.32%200%2001-2.5-1.5zm-10-19.2%203.5%209.8%202.9%207.5h1.6V35l-1.9-9.4%203.1%205.4a8.24%208.24%200%20003.8%203.8h2.1v-1.4a14%2014%200%2001-2.2-3.1%2044.55%2044.55%200%2001-2.2-8L14.8%2016l3.2%205.6c.6%201.1%202.1%203.6%202.8%204.9l.6-.4c-.8-1.6-2.1-4.6-2.8-5.8-.9-1.7-2.8-4.9-2.8-4.9a.54.54%200%2000-.4-.3l-.7-.1-.1-.7a4.33%204.33%200%2000-.1-.5l-5.3.3%202.2-1.9a4.3%204.3%200%2000.9-1%205.17%205.17%200%2000.8-4%205.67%205.67%200%2000-2.2-3.4%205.09%205.09%200%2000-4-.8%205.67%205.67%200%2000-3.4%202.2%205.17%205.17%200%2000-.8%204%205.67%205.67%200%20002.2%203.4%203.13%203.13%200%20001%20.5l1.6.6-3.2%202.6%201%2011.5h.4z%22%20fill%3D%22%23333%22/%3E%3Cpath%20d%3D%22m3.35%2015.9%201.1%2012.5a.39.39%200%2000.36.42h.14l1.4-.1a.66.66%200%2000.5-.4l-.2-3.8-3.3-8.6Z%22%20fill%3D%22%23fdbf2d%22/%3E%3Cpath%20d%3D%22m5.2%2028.8%201.1-.1a.66.66%200%2000.5-.4l-.2-3.8-1.2-3.1Z%22%20fill%3D%22%23ce592b%22%20fill-opacity%3D%22.25%22/%3E%3Cpath%20d%3D%22m21.4%2035.70000000000001-3.8-1.2-2.7-7.8L12%2015.5l3.4-2.9c.2%202.4%202.2%2014.1%203.7%2017.1%200%200%201.3%202.6%202.3%203.1zM13%2027.6l-2-.3%202.5%2010.1.9.4v-2.9%22%20fill%3D%22%23e5892b%22/%3E%3Cpath%20d%3D%22M17.8%2025.4c-.4-1.5-.7-3.1-1.1-4.8-.1-.4-.1-.7-.2-1.1l-1.1-2-1.7-1.6s.9%205%202.4%207.1a19.12%2019.12%200%20001.7%202.4Z%22%20style%3D%22isolation%3Aisolate%22%20fill%3D%22%23cf572e%22%20opacity%3D%22.6%22/%3E%3Cpath%20d%3D%22M14.4%2037.8h-3a.43.43%200%2001-.4-.4l-3-7.8-1.7-4.8-3-9%208.9-.4s2.9%2011.3%204.3%2014.4c1.9%204.1%203.1%204.7%205%205.8h-3.2s-4.1-1.2-5.9-7.7a.59.59%200%2000-.6-.4.62.62%200%2000-.3.7s.5%202.4.9%203.6a34.87%2034.87%200%20002%206%22%20fill%3D%22%23fdbf2d%22/%3E%3Cpath%20d%3D%22m15.4%2012.7-3.3%202.9-8.9.4%203.3-2.7%22%20fill%3D%22%23ce592b%22/%3E%3Cpath%20d%3D%22m9.1%2021.1%201.4-6.2-5.9.5%22%20style%3D%22isolation%3Aisolate%22%20fill%3D%22%23cf572e%22%20opacity%3D%22.6%22/%3E%3Cpath%20d%3D%22M12%2013.5a4.75%204.75%200%2001-2.6%201.1c-1.5.3-2.9.2-2.9%200s1.1-.6%202.7-1%22%20fill%3D%22%23bb3d19%22/%3E%3Ccircle%20cx%3D%227.92%22%20cy%3D%228.19%22%20r%3D%226.3%22%20fill%3D%22%23fdbf2d%22/%3E%3Cpath%20d%3D%22M4.7%2013.6a6.21%206.21%200%20008.4-1.9v-.1a8.89%208.89%200%2001-8.4%202%22%20fill%3D%22%23ce592b%22%20fill-opacity%3D%22.25%22/%3E%3Cpath%20d%3D%22m21.2%2027.2.6-.4a1.09%201.09%200%2000.4-1.3c-.7-1.5-2.1-4.6-2.8-5.8-.9-1.7-2.8-4.9-2.8-4.9a1.6%201.6%200%2000-2.17-.65l-.23.15a1.68%201.68%200%2000-.4%202.1s2.3%203.9%203.1%205.3c.6%201%202.1%203.7%202.9%205.1a.94.94%200%20001.24.49z%22%20fill%3D%22%23fdbf2d%22/%3E%3Cpath%20d%3D%22M19.4%2019.8c-.9-1.7-2.8-4.9-2.8-4.9a1.6%201.6%200%2000-2.17-.65l-.23.15-.3.3c1.1%201.5%202.9%203.8%203.9%205.4%201.1%201.8%202.9%205%203.8%206.7l.1-.1a1.09%201.09%200%2000.4-1.3%2057.67%2057.67%200%2000-2.7-5.6Z%22%20fill%3D%22%23ce592b%22%20fill-opacity%3D%22.25%22/%3E%3C/svg%3E" style="display: none; height: 40px; width: 40px; position: absolute; transform: translate(-60%, -45%); pointer-events: none;"></div></button><div class="gmnoprint" data-control-width="40" data-control-height="81" style="position: absolute; left: 0px; top: 144px;"><div draggable="false" style="-webkit-user-select: none; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; border-radius: 2px; cursor: pointer; background-color: rgb(255, 255, 255); width: 40px; height: 81px;"><button draggable="false" aria-label="Zoom in" title="Zoom in" type="button" class="gm-control-active" style="background: rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; overflow: hidden; width: 40px; height: 40px; top: 0px; left: 0px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23666%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23333%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23111%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23d1d1d1%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M440-440H200v-80h240v-240h80v240h240v80H520v240h-80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button><div style="position: relative; overflow: hidden; width: 30px; height: 1px; margin: 0px 5px; background-color: rgb(230, 230, 230); top: 0px;"></div><button draggable="false" aria-label="Zoom out" title="Zoom out" type="button" class="gm-control-active" style="background: rgb(255, 255, 255); display: block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; overflow: hidden; width: 40px; height: 40px; top: 0px; left: 0px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23666%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23333%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23111%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22%23d1d1d1%22%20viewBox%3D%220%20-960%20960%20960%22%3E%3Cpath%20d%3D%22M200-440v-80h560v80z%22/%3E%3C/svg%3E" alt="" style="height: 28px; width: 28px;"></button></div></div></div></div><div><div style="margin: 0px 5px; z-index: 1000000; position: absolute; left: 0px; bottom: 0px;"><a target="_blank" rel="noopener" title="Open this area in Google Maps (opens a new window)" aria-label="Open this area in Google Maps (opens a new window)" href="https://maps.google.com/maps?ll=32.823047,-79.865392&amp;z=12&amp;t=m&amp;hl=en&amp;gl=US&amp;mapclient=apiv3" style="display: inline;"><div style="width: 66px; height: 26px;"><img alt="Google" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2069%2029%22%3E%3Cg%20fill%3D%22%23fff%22%20stroke%3D%22%23fff%22%20stroke-width%3D%221.5%22%20opacity%3D%22.6%22%3E%3Cpath%20d%3D%22m17.4706%207.33616.5412-.54112-.5519-.53011c-1.3636-1.30974-3.2017-2.31971-5.7591-2.31971-4.6137%200-8.50262%203.75517-8.50262%208.39578%200%204.6407%203.88892%208.3958%208.50262%208.3958%202.4704%200%204.3765-.8188%205.8732-2.3679%201.5695-1.5729%202.0216-3.7363%202.0216-5.4119%200-.5232-.044-1.0254-.1295-1.4529l-.1206-.6029h-8.3947v3.5942h4.8301c-.1724.5966-.4321%201.0286-.7491%201.3461-.6288.6214-1.5823%201.3094-3.331%201.3094-2.65245%200-4.73598-2.1312-4.73598-4.8099%200-2.67861%202.08353-4.80981%204.73598-4.80981%201.4362%200%202.4752.5607%203.257%201.29229l.5298.49574.513-.51303z%22/%3E%3Cpath%20d%3D%22M24.8656%2020.7286c3.089%200%205.6036-2.4192%205.6036-5.6692%200-3.2681-2.5162-5.66929-5.6036-5.66929-3.0873%200-5.6035%202.40119-5.6035%205.66929%200%203.25%202.5145%205.6692%205.6035%205.6692Zm0-7.9004c1.014%200%201.9766.837%201.9766%202.2312%200%201.3805-.9653%202.2311-1.9766%202.2311-1.0099%200-1.9765-.8574-1.9765-2.2311%200-1.3874.9639-2.2312%201.9765-2.2312Z%22/%3E%3Cpath%20d%3D%22M35.7511%2017.2905h-.0042c-1.0099%200-1.9766-.8574-1.9766-2.2311%200-1.3874.964-2.2312%201.9766-2.2312%201.0139%200%201.9765.837%201.9765%202.2312%200%201.3845-.968%202.2368-1.9723%202.2311Zm-.0124%203.4381c3.089%200%205.6035-2.4192%205.6035-5.6692%200-3.2681-2.5162-5.66929-5.6035-5.66929-3.0874%200-5.6036%202.40119-5.6036%205.66929%200%203.2508%202.5236%205.6692%205.6036%205.6692Z%22/%3E%3Cpath%20d%3D%22M51.953%2010.4357v-.74997h-3.5531v.12253c-.55-.26178-1.2022-.42639-1.9191-.42639-2.8837%200-5.464%202.51793-5.464%205.69393%200%202.1269%201.164%203.9479%202.8033%204.9137l-.0658.0273-1.8806.7802-.6929.2874.2876.6928c.6228%201.5004%202.2776%203.3697%205.0535%203.3697%201.4105%200%202.787-.4145%203.814-1.4093%201.0332-1.0009%201.6171-2.4965%201.6171-4.4653zm-7.2194%209.9844-.0002-.0005c.5552.2005%201.1446.309%201.7474.309.6808%200%201.3058-.1467%201.841-.3891-.0876.3891-.2417.671-.4252.8682-.2812.3022-.7202.5011-1.3747.5011-.91190000000001%200-1.5201-.6476-1.7883-1.2887Zm1.9361-7.5919c.9722%200%201.878.8483%201.878%202.2558%200%201.3796-.8956%202.2147-1.878%202.2147-1.0428%200-1.993-.8738-1.993-2.2147%200-1.3754.9595-2.2558%201.993-2.2558Zm9.069-7.60737v-.75h-3.6599V20.4412h3.6599z%22/%3E%3Cpath%20d%3D%22m63.9128%2016.0614-.6183-.4122-.4179.6145c-.4562.6709-1.0102%201.0432-1.8025%201.0432-.4306%200-.7595-.0981-1.0197-.2622-.07-.0441-.1383-.0951-.2046-.1536l5.6999-2.3625.6825-.283L65.9596%2013.5589l-.219-.5514c-.4528-1.2075-1.8899-3.60918-4.9128-3.60918-2.9833%200-5.3244%202.36358-5.3244%205.66928%200%203.1475%202.3222%205.6693%205.5625%205.6693%202.6043%200%204.1111-1.5991%204.7283-2.5156l.421-.625L65.5882%2017.1783zm-2.5667-3.2103-1.9353.8015c.3795-.5743%201.0107-.8572%201.4909-.8572.1653%200%20.3136.0207.4444.0557Z%22/%3E%3C/g%3E%3Cpath%20fill%3D%22%234285f4%22%20d%3D%22M11.7008%2019.9868c-4.21304%200-7.75262-3.4328-7.75262-7.6458%200-4.21297%203.53958-7.64578%207.75262-7.64578%202.3323%200%203.9912.91159%205.2395%202.11061l-1.47%201.47003c-.8952-.83767-2.1106-1.49467-3.7695-1.49467-3.07972%200-5.48598%202.48016-5.48598%205.55981%200%203.0797%202.40626%205.5599%205.48598%205.5599%201.9956%200%203.1289-.8048%203.8598-1.5275.5995-.5996.9855-1.4537%201.1333-2.628h-4.9931v-2.0942h7.0298c.0739.3695.115.8212.115%201.3058%200%201.5685-.427%203.5067-1.8067%204.8864-1.3469%201.3961-3.0551%202.1434-5.3381%202.1434%22/%3E%3Cpath%20fill%3D%22%23e94235%22%20d%3D%22M29.7192%2015.0594c0%202.8333-2.1763%204.9192-4.8536%204.9192-2.6772%200-4.8535-2.0859-4.8535-4.9192%200-2.8498%202.1763-4.9193%204.8535-4.9193%202.6773%200%204.8536%202.0695%204.8536%204.9193m-2.127%200c0-1.7739-1.2648-2.9812-2.7266-2.9812s-2.7265%201.2155-2.7265%202.9812c0%201.7492%201.2647%202.9811%202.7265%202.9811s2.7266-1.2237%202.7266-2.9811%22/%3E%3Cpath%20fill%3D%22%23fabb05%22%20d%3D%22M40.5922%2015.0594c0%202.8333-2.1763%204.9192-4.8535%204.9192-2.6691%200-4.8536-2.0859-4.8536-4.9192%200-2.8498%202.1763-4.9193%204.8536-4.9193%202.6772%200%204.8535%202.0695%204.8535%204.9193m-2.1188%200c0-1.7739-1.2647-2.9812-2.7265-2.9812s-2.7266%201.2155-2.7266%202.9812c0%201.7492%201.2648%202.9811%202.7266%202.9811%201.4618.0082%202.7265-1.2237%202.7265-2.9811%22/%3E%3Cpath%20fill%3D%22%234285f4%22%20d%3D%22M51.203%2010.4357v8.8366c0%203.6382-2.1435%205.1246-4.6811%205.1246-2.3899%200-3.8188-1.6014-4.3609-2.9072l1.8807-.7802c.3367.8048%201.158%201.7493%202.4802%201.7493%201.626%200%202.628-1.0101%202.628-2.8908v-.7063h-.074c-.4845.5995-1.4207%201.1169-2.5951%201.1169-2.4637%200-4.714-2.1434-4.714-4.9028%200-2.7758%202.2585-4.9439%204.714-4.9439%201.1744%200%202.1106.5256%202.5951%201.1004h.074v-.7966zm-1.9053%204.6483c0-1.7328-1.158-3.0058-2.628-3.0058-1.4947%200-2.743%201.2647-2.743%203.0058%200%201.7164%201.2483%202.9647%202.743%202.9647%201.47%200%202.628-1.2483%202.628-2.9647%22/%3E%3Cpath%20fill%3D%22%2334a853%22%20d%3D%22M54.9887%205.22083V19.6912h-2.1599V5.22083z%22/%3E%3Cpath%20fill%3D%22%23e94235%22%20d%3D%22m63.4968%2016.6854%201.6754%201.1169c-.5421.8049-1.8478%202.1846-4.1063%202.1846-2.8004%200-4.8125-2.1599-4.8125-4.9193%200-2.9237%202.0367-4.9193%204.5744-4.9193%202.554%200%203.8023%202.0285%204.213%203.129l.2217.5584-6.5782%202.7266c.501.9855%201.2894%201.4946%202.3898%201.4946%201.1005%200%201.8643-.5502%202.4227-1.3715m-5.1656-1.7739%204.4019-1.8231c-.2464-.616-.9691-1.043-1.8314-1.043-1.1005%200-2.628.9691-2.5705%202.8661%22/%3E%3C/svg%3E" draggable="false" style="position: absolute; left: 0px; top: 0px; width: 66px; height: 26px; -webkit-user-select: none; border: 0px; padding: 0px; margin: 0px;"></div></a></div></div><div></div><div><div style="display: inline-flex; position: absolute; right: 0px; bottom: 0px;"><div class="gmnoprint" style="z-index: 1000001;"><div draggable="false" class="gm-style-cc" style="-webkit-user-select: none; position: relative; height: 14px; line-height: 14px;"><div style="opacity: 0.7; width: 100%; height: 100%; position: absolute;"><div style="width: 1px;"></div><div style="background-color: rgb(245, 245, 245); width: auto; height: 100%; margin-left: 1px;"></div></div><div style="position: relative; padding-right: 6px; padding-left: 6px; box-sizing: border-box; font-family: Roboto, Arial, sans-serif; font-size: 10px; color: rgb(0, 0, 0); white-space: nowrap; direction: ltr; text-align: right; vertical-align: middle; display: inline-block;"><button draggable="false" aria-label="Keyboard shortcuts" title="Keyboard shortcuts" type="button" style="background: none; display: inline-block; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; color: rgb(0, 0, 0); font-family: inherit; line-height: inherit;">Keyboard shortcuts</button></div></div></div><div class="gmnoprint" style="z-index: 1000001;"><div draggable="false" class="gm-style-cc" style="-webkit-user-select: none; position: relative; height: 14px; line-height: 14px;"><div style="opacity: 0.7; width: 100%; height: 100%; position: absolute;"><div style="width: 1px;"></div><div style="background-color: rgb(245, 245, 245); width: auto; height: 100%; margin-left: 1px;"></div></div><div style="position: relative; padding-right: 6px; padding-left: 6px; box-sizing: border-box; font-family: Roboto, Arial, sans-serif; font-size: 10px; color: rgb(0, 0, 0); white-space: nowrap; direction: ltr; text-align: right; vertical-align: middle; display: inline-block;"><button draggable="false" aria-label="Map Data" title="Map Data" type="button" style="background: none; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; color: rgb(0, 0, 0); font-family: inherit; line-height: inherit; display: none;">Map Data</button><span style="">Map data ©2026 Google</span></div></div></div><div class="gmnoscreen"><div style="font-family: Roboto, Arial, sans-serif; font-size: 11px; color: rgb(0, 0, 0); direction: ltr; text-align: right; background-color: rgb(245, 245, 245);">Map data ©2026 Google</div></div><button draggable="false" aria-label="Map Scale: 2 km per 62 pixels" title="Map Scale: 2 km per 62 pixels" type="button" class="gm-style-cc" aria-describedby="19A0EF2D-1921-43FB-87C8-507ACA5CCAB3" style="background: none; display: none; border: 0px; margin: 0px; padding: 0px; text-transform: none; appearance: none; position: relative; cursor: pointer; -webkit-user-select: none; height: 14px; line-height: 14px;"><div style="opacity: 0.7; width: 100%; height: 100%; position: absolute;"><div style="width: 1px;"></div><div style="background-color: rgb(245, 245, 245); width: auto; height: 100%; margin-left: 1px;"></div></div><div style="position: relative; padding-right: 6px; padding-left: 6px; box-sizing: border-box; font-family: Roboto, Arial, sans-serif; font-size: 10px; color: rgb(0, 0, 0); white-space: nowrap; direction: ltr; text-align: right; vertical-align: middle; display: inline-block;"><span style="color: rgb(0, 0, 0);">2 km&nbsp;</span><div style="position: relative; display: inline-block; height: 8px; bottom: -1px; width: 66px;"><div style="width: 100%; height: 4px; position: absolute; left: 0px; top: 0px;"></div><div style="width: 4px; height: 8px; left: 0px; top: 0px;"></div><div style="width: 4px; height: 8px; position: absolute; right: 0px; bottom: 0px;"></div><div style="position: absolute; background-color: rgb(0, 0, 0); height: 2px; left: 1px; bottom: 1px; right: 1px;"></div><div style="position: absolute; width: 2px; height: 6px; left: 1px; top: 1px; background-color: rgb(0, 0, 0);"></div><div style="width: 2px; height: 6px; position: absolute; background-color: rgb(0, 0, 0); bottom: 1px; right: 1px;"></div></div></div><span id="19A0EF2D-1921-43FB-87C8-507ACA5CCAB3" style="display: none;">Click to toggle between metric and imperial units</span></button><div class="gmnoprint gm-style-cc" draggable="false" style="z-index: 1000001; -webkit-user-select: none; position: relative; height: 14px; line-height: 14px;"><div style="opacity: 0.7; width: 100%; height: 100%; position: absolute;"><div style="width: 1px;"></div><div style="background-color: rgb(245, 245, 245); width: auto; height: 100%; margin-left: 1px;"></div></div><div style="position: relative; padding-right: 6px; padding-left: 6px; box-sizing: border-box; font-family: Roboto, Arial, sans-serif; font-size: 10px; color: rgb(0, 0, 0); white-space: nowrap; direction: ltr; text-align: right; vertical-align: middle; display: inline-block;"><a aria-label="Terms (opens in new tab)" href="https://www.google.com/intl/en_US/help/terms_maps.html" target="_blank" rel="noopener" style="text-decoration: none; cursor: pointer; color: rgb(0, 0, 0);">Terms</a></div></div><div draggable="false" class="gm-style-cc" style="-webkit-user-select: none; position: relative; height: 14px; line-height: 14px;"><div style="opacity: 0.7; width: 100%; height: 100%; position: absolute;"><div style="width: 1px;"></div><div style="background-color: rgb(245, 245, 245); width: auto; height: 100%; margin-left: 1px;"></div></div><div style="position: relative; padding-right: 6px; padding-left: 6px; box-sizing: border-box; font-family: Roboto, Arial, sans-serif; font-size: 10px; color: rgb(0, 0, 0); white-space: nowrap; direction: ltr; text-align: right; vertical-align: middle; display: inline-block;"><a target="_blank" rel="noopener" title="Report errors in the road map or imagery to Google" dir="ltr" href="https://www.google.com/maps/@32.8230468,-79.8653921,12z/data=!10m1!1e1!12b1?source=apiv3&amp;rapsrc=apiv3" style="font-family: Roboto, Arial, sans-serif; font-size: 10px; text-decoration: none; position: relative; color: rgb(0, 0, 0);">Report a map error</a></div></div></div></div></div></div></div><div id="slp_tagline" class="store_locator_plus tagline">search provided by <a href="https://wordpress.storelocatorplus.com/" target="_blank">Store Locator Plus®</a></div><div id="map_sidebar" class="slp_results_container"><div class="results_wrapper" id="slp_results_wrapper_10451"><div id="slp_results_10451" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10451">
        
        <span class="location_name">Le Farfalle  </span>
        <span class="location_distance">0.2 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10451">
        
        <span class="slp_result_address slp_result_street">15 Beaufain St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Charleston, SC 29401</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10451">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/le-farfalle/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=15%20Beaufain%20St%2C%20Charleston%2C%20SC%2C%2029401%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10440"><div id="slp_results_10440" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10440">
        
        <span class="location_name">AZUR  </span>
        <span class="location_distance">0.3 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10440">
        
        <span class="slp_result_address slp_result_street">159 Market St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Charleston, SC 29401</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10440">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/azur/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=159%20Market%20St%2C%20Charleston%2C%20SC%2C%2029401%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10437"><div id="slp_results_10437" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10437">
        
        <span class="location_name">167 Raw Oyster Bar  </span>
        <span class="location_distance">0.3 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10437">
        
        <span class="slp_result_address slp_result_street">193 King St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Charleston, SC 29401</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10437">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/167-raw-oyster-bar/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=193%20King%20St%2C%20Charleston%2C%20SC%2C%2029401%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10442"><div id="slp_results_10442" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10442">
        
        <span class="location_name">Bay Street Biergarten  </span>
        <span class="location_distance">0.6 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10442">
        
        <span class="slp_result_address slp_result_street">549 E Bay St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Charleston, SC 29403</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10442">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/bay-street-biergarten/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=549%20E%20Bay%20St%2C%20Charleston%2C%20SC%2C%2029403%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10466"><div id="slp_results_10466" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10466">
        
        <span class="location_name">The Ordinary  </span>
        <span class="location_distance">0.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10466">
        
        <span class="slp_result_address slp_result_street">544 King St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Charleston, SC 29403</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10466">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/the-ordinary/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=544%20King%20St%2C%20Charleston%2C%20SC%2C%2029403%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10469"><div id="slp_results_10469" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10469">
        
        <span class="location_name">Vern's  </span>
        <span class="location_distance">1.0 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10469">
        
        <span class="slp_result_address slp_result_street">41 Bogard St A</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Charleston, SC 29403</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10469">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/verns/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=41%20Bogard%20St%20A%2C%20Charleston%2C%20SC%2C%2029403%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10444"><div id="slp_results_10444" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10444">
        
        <span class="location_name">Charleston Harbor Fish House  </span>
        <span class="location_distance">1.5 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10444">
        
        <span class="slp_result_address slp_result_street">32 Patriots Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10444">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/charleston-harbor-fish-house/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=32%20Patriots%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10465"><div id="slp_results_10465" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10465">
        
        <span class="location_name">The Archer  </span>
        <span class="location_distance">1.5 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10465">
        
        <span class="slp_result_address slp_result_street">601 Meeting St Ste. 140</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Charleston, SC 29403</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10465">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/the-archer/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=601%20Meeting%20St%20Ste.%20140%2C%20Charleston%2C%20SC%2C%2029403%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10470"><div id="slp_results_10470" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10470">
        
        <span class="location_name">Vicious Biscuit MT P  </span>
        <span class="location_distance">2.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10470">
        
        <span class="slp_result_address slp_result_street">409 W Coleman Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10470">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/vicious-biscuit-mt-p/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=409%20W%20Coleman%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock">7 AM - 230 PM</span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10449"><div id="slp_results_10449" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10449">
        
        <span class="location_name">Graze  </span>
        <span class="location_distance">2.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10449">
        
        <span class="slp_result_address slp_result_street">863 Houston Northcutt Blvs</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10449">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/graze/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=863%20Houston%20Northcutt%20Blvs%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10445"><div id="slp_results_10445" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10445">
        
        <span class="location_name">Coleman Public House  </span>
        <span class="location_distance">2.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10445">
        
        <span class="slp_result_address slp_result_street">427 W Coleman Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10445">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/coleman-public-house/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=427%20W%20Coleman%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10471"><div id="slp_results_10471" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10471">
        
        <span class="location_name">Vickery's Bar &amp; Grill  </span>
        <span class="location_distance">2.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10471">
        
        <span class="slp_result_address slp_result_street">1313 Shrimp Boat Ln</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10471">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/vickerys-bar-grill/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1313%20Shrimp%20Boat%20Ln%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10473"><div id="slp_results_10473" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10473">
        
        <span class="location_name">Water's Edge  </span>
        <span class="location_distance">3.0 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10473">
        
        <span class="slp_result_address slp_result_street">1407 Shrimp Boat Lane</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10473">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/waters-edge/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1407%20Shrimp%20Boat%20Lane%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10464"><div id="slp_results_10464" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10464">
        
        <span class="location_name">Tavern N Table  </span>
        <span class="location_distance">3.0 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10464">
        
        <span class="slp_result_address slp_result_street">100 Church St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10464">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/tavern-n-table/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=100%20Church%20St%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10454"><div id="slp_results_10454" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10454">
        
        <span class="location_name">Nico  </span>
        <span class="location_distance">3.1 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10454">
        
        <span class="slp_result_address slp_result_street">201 Coleman Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10454">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/nico/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=201%20Coleman%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10461"><div id="slp_results_10461" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10461">
        
        <span class="location_name">Shem Creek Crab House  </span>
        <span class="location_distance">3.2 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10461">
        
        <span class="slp_result_address slp_result_street">508 Mill St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10461">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/shem-creek-crab-house/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=508%20Mill%20St%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10456"><div id="slp_results_10456" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10456">
        
        <span class="location_name">Post House  </span>
        <span class="location_distance">3.2 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10456">
        
        <span class="slp_result_address slp_result_street">101 Pitt St</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10456">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/post-house/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=101%20Pitt%20St%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10455"><div id="slp_results_10455" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10455">
        
        <span class="location_name">Page's Okra Grill  </span>
        <span class="location_distance">3.2 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10455">
        
        <span class="slp_result_address slp_result_street">302 Coleman Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10455">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/pages-okra-grill/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=302%20Coleman%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10450"><div id="slp_results_10450" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10450">
        
        <span class="location_name">Langdon's Restaurant &amp; Wine Bar  </span>
        <span class="location_distance">3.7 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10450">
        
        <span class="slp_result_address slp_result_street">778 Shelmore Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10450">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/langdons-restaurant-wine-bar/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=778%20Shelmore%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10457"><div id="slp_results_10457" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10457">
        
        <span class="location_name">Red Drum  </span>
        <span class="location_distance">3.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10457">
        
        <span class="slp_result_address slp_result_street">803 Coleman Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10457">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/red-drum/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=803%20Coleman%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10453"><div id="slp_results_10453" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10453">
        
        <span class="location_name">Nautica Bowls  </span>
        <span class="location_distance">5.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10453">
        
        <span class="slp_result_address slp_result_street">608-F Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10453">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/nautica-bowls/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=608-F%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10474"><div id="slp_results_10474" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10474">
        
        <span class="location_name">Wendy's  </span>
        <span class="location_distance">5.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10474">
        
        <span class="slp_result_address slp_result_street">596 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10474">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/wendys/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=596%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10468"><div id="slp_results_10468" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10468">
        
        <span class="location_name">Verde  </span>
        <span class="location_distance">5.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10468">
        
        <span class="slp_result_address slp_result_street">616-A Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10468">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/verde/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=616-A%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10472"><div id="slp_results_10472" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10472">
        
        <span class="location_name">Waffle House  </span>
        <span class="location_distance">5.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10472">
        
        <span class="slp_result_address slp_result_street">609 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10472">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/waffle-house/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=609%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10482"><div id="slp_results_10482" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10482">
        
        <span class="location_name">Moe's Southwest Grill  </span>
        <span class="location_distance">5.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10482">
        
        <span class="slp_result_address slp_result_street">612 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country" style="display: none;"></span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10482">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/moes-southwest-grill/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=612%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10447"><div id="slp_results_10447" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10447">
        
        <span class="location_name">Dog and Duck  </span>
        <span class="location_distance">5.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10447">
        
        <span class="slp_result_address slp_result_street">624 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2">Suite A</span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10447">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/dog-and-duck/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=624%20Long%20Point%20Rd%2C%20Suite%20A%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10463"><div id="slp_results_10463" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10463">
        
        <span class="location_name">Starbucks Coffee Company  </span>
        <span class="location_distance">5.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10463">
        
        <span class="slp_result_address slp_result_street">636-A Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10463">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/starbucks-coffee-company/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=636-A%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10448"><div id="slp_results_10448" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10448">
        
        <span class="location_name">Fuji Sushi Bar &amp; Grill  </span>
        <span class="location_distance">5.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10448">
        
        <span class="slp_result_address slp_result_street">644 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10448">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/fuji-sushi-bar-grill-2/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=644%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10439"><div id="slp_results_10439" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10439">
        
        <span class="location_name">Amalfi's Italian Restaurant  </span>
        <span class="location_distance">5.9 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10439">
        
        <span class="slp_result_address slp_result_street">664 E Long Point Road</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone">Phone 843-793-4265</span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10439">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/amalfis-italian-restaurant-2/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=664%20E%20Long%20Point%20Road%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock">Mon - Sat : 11A - 10P
Sun: 11A - 930P</span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10479"><div id="slp_results_10479" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10479">
        
        <span class="location_name">Chik-Fil-A  </span>
        <span class="location_distance">6.0 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10479">
        
        <span class="slp_result_address slp_result_street">653 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country" style="display: none;"></span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10479">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/chik-fil-a/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=653%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10481"><div id="slp_results_10481" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10481">
        
        <span class="location_name">McAlister's Deli  </span>
        <span class="location_distance">6.0 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10481">
        
        <span class="slp_result_address slp_result_street">644-A Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country" style="display: none;"></span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10481">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/mcalisters-deli-2/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=644-A%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10458"><div id="slp_results_10458" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10458">
        
        <span class="location_name">Rio Chico Mexican Restaurant  </span>
        <span class="location_distance">6.1 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10458">
        
        <span class="slp_result_address slp_result_street">660 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10458">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/rio-chico-mexican-restaurant/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=660%20Long%20Point%20Rd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10467"><div id="slp_results_10467" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10467">
        
        <span class="location_name">The Wine Bar  </span>
        <span class="location_distance">6.1 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10467">
        
        <span class="slp_result_address slp_result_street">664 Long Point Rd</span>
        <span class="slp_result_address slp_result_street2">Unit G</span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10467">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/the-wine-bar-2/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=664%20Long%20Point%20Rd%2C%20Unit%20G%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10480"><div id="slp_results_10480" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10480">
        
        <span class="location_name">Hutto Seafood Kitchen  </span>
        <span class="location_distance">6.1 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10480">
        
        <span class="slp_result_address slp_result_street">536 Belle Station Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country" style="display: none;"></span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10480">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/hutto-seafood-kitchen/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=536%20Belle%20Station%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10477"><div id="slp_results_10477" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10477">
        
        <span class="location_name">All American Sports Bar  </span>
        <span class="location_distance">6.1 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10477">
        
        <span class="slp_result_address slp_result_street">545 Belle Station Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country" style="display: none;"></span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10477">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/all-american-sports-bar/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=545%20Belle%20Station%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10478"><div id="slp_results_10478" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10478">
        
        <span class="location_name">Bamboo Garden Restaurant  </span>
        <span class="location_distance">6.1 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10478">
        
        <span class="slp_result_address slp_result_street">553 Belle Station Blvd</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country" style="display: none;"></span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone">Phone (843) 849-8477</span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10478">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/bamboo-garden-restaurant/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=553%20Belle%20Station%20Blvd%2C%20Mount%20Pleasant%2C%20SC%2C%2029464" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10459"><div id="slp_results_10459" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10459">
        
        <span class="location_name">SeeWee Restaurant  </span>
        <span class="location_distance">6.5 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10459">
        
        <span class="slp_result_address slp_result_street">1808 N highway 17</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Awendaw, SC 29429</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10459">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/seewee-restaurant/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1808%20N%20highway%2017%2C%20Awendaw%2C%20SC%2C%2029429%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10443"><div id="slp_results_10443" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10443">
        
        <span class="location_name">Burtons Bar and Grill  </span>
        <span class="location_distance">6.7 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10443">
        
        <span class="slp_result_address slp_result_street">1875 N Highway 17</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10443">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/burtons-bar-and-grill/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1875%20N%20Highway%2017%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10475"><div id="slp_results_10475" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10475">
        
        <span class="location_name">Ye Olde Fashion  </span>
        <span class="location_distance">6.8 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10475">
        
        <span class="slp_result_address slp_result_street">Hwy 17 N</span>
        <span class="slp_result_address slp_result_street2">Johnnie Dodds</span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10475">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/ye-olde-fashion-2/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=Hwy%2017%20N%2C%20Johnnie%20Dodds%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10441"><div id="slp_results_10441" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10441">
        
        <span class="location_name">Basil Thai  </span>
        <span class="location_distance">7.1 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10441">
        
        <span class="slp_result_address slp_result_street">1465 Long Grove Dr</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10441">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/basil-thai/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1465%20Long%20Grove%20Dr%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10446"><div id="slp_results_10446" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10446">
        
        <span class="location_name">Crave Kitchen &amp; Cocktails  </span>
        <span class="location_distance">7.2 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10446">
        
        <span class="slp_result_address slp_result_street">1968 Riviera Dr</span>
        <span class="slp_result_address slp_result_street2">Unit O</span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10446">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/crave-kitchen-cocktails/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1968%20Riviera%20Dr%2C%20Unit%20O%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10462"><div id="slp_results_10462" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10462">
        
        <span class="location_name">SOL Mt. Pleasant  </span>
        <span class="location_distance">7.4 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10462">
        
        <span class="slp_result_address slp_result_street">1101 Stockade Ln</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10462">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/sol-mt-pleasant/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1101%20Stockade%20Ln%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10460"><div id="slp_results_10460" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10460">
        
        <span class="location_name">Sena Cafe  </span>
        <span class="location_distance">7.7 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10460">
        
        <span class="slp_result_address slp_result_street">2170 Snyder Cir #117</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29464</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10460">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/sena-cafe-2/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=2170%20Snyder%20Cir%20%23117%2C%20Mount%20Pleasant%2C%20SC%2C%2029464%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10438"><div id="slp_results_10438" class="results_entry location_primary 0">
    <div class="results_row_left_column" id="slp_left_cell_10438">
        
        <span class="location_name">Abbracci  </span>
        <span class="location_distance">9.7 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10438">
        
        <span class="slp_result_address slp_result_street">1146 Muhlenbbergia Dr</span>
        <span class="slp_result_address slp_result_street2">Ste 103</span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29466</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10438">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/abbracci-3/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=1146%20Muhlenbbergia%20Dr%2C%20Ste%20103%2C%20Mount%20Pleasant%2C%20SC%2C%2029466%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock" style="display: none;"></span>
        
        
        
        
        
    </div>
</div></div><div class="results_wrapper" id="slp_results_wrapper_10452"><div id="slp_results_10452" class="results_entry location_primary ">
    <div class="results_row_left_column" id="slp_left_cell_10452">
        
        <span class="location_name">Mellow Mushroom  </span>
        <span class="location_distance">10.3 miles</span>
        
    </div>
    <div class="results_row_center_column location_secondary" id="slp_center_cell_10452">
        
        <span class="slp_result_address slp_result_street">3110 N Highway 17</span>
        <span class="slp_result_address slp_result_street2" style="display: none;"></span>
        <span class="slp_result_address slp_result_citystatezip">Mount Pleasant, SC 29466</span>
        <span class="slp_result_address slp_result_country">United States</span>
        <div class="contact_info">
            <span class="slp_result_address slp_result_phone" style="display: none;"></span>
            <span class="slp_result_address slp_result_fax" style="display: none;"></span>
        </div>
        
    </div>
    <div class="results_row_right_column location_tertiary" id="slp_right_cell_10452">
        
        <div class="online_info">
        <span class="slp_result_contact slp_result_website"><a href="http://localhost/store-page/mellow-mushroom/" target="_self" class="storelocatorlink">Website</a><br></span>
        <span class="slp_result_contact slp_result_email" style="display: none;"></span>
        <span class="slp_result_contact slp_result_directions"><a href="https://maps.google.com/maps?saddr=Charleston%20SC&amp;daddr=3110%20N%20Highway%2017%2C%20Mount%20Pleasant%2C%20SC%2C%2029466%2C%20United%20States" target="_blank" class="storelocatorlink">Directions</a></span>
        </div>
        <span class="slp_result_contact slp_result_hours textblock">11 AM - 10 PM</span>
        
        
        
        
        
    </div>
</div></div></div></div>

Additional Info

For this task only the local files in the style-gallery-service plugin will be updated. A system administrator will put the changes into production following the process in “How Locator Styles Work” noted in the linked article below.

0 comments on “How Locator Styles Work”

How Locator Styles Work

The following information explains how the Locator Style server works and the process used to change the styles.

Locator Styles Server

Locator Styles provides a way for users of the Store Locator Plus® app to load a style definition from the Store Locator Plus® style server.

The Style Server URL is: https://storelocatorplus.com/wp-json/wp/v2/slp_style_gallery
This is a standard WordPress site with a custom plugin named style-gallery-service that provides REST endpoints for processing queries about Locator Styles.

Locator Styles are a custom post type with an key set to ‘slp_style_gallery’.

slp_style_gallery attributes include:

  • post content : the HTML-like description of the style that is rendered in the Style selector in the Store Locator Plus® plugin on the Style page.
  • custom fields : this include a set of Store Locator Plus® settings (csl-slplus-options and csl-slplus-options_nojs WordPress option JSON object keys) as the name and the value is the value of the option that will be set when the style is selected.
    • css : the option key that is provided on ALL Locator Styles which is the CSS that is used when the Store Locator Plus map or directory display is rendered on the users website
    • layout : an HTML + WordPress shortcode string that is processed to generate the overall wireframe of the Store Locator Plus display with a user site.
      • Default: [slp_search][slp_map][slp_results]
    • searchlayout : an HTML + WordPress shortcode string that is processed to generate the HTML output for the [slp_search] shortcode
    • resultslayout : an HTML + WordPress shortcode string that is processed to generate the HTML output for the [slp_results] shortcode
    • maplayout : an HTML + WordPress shortcode string that is processed to generate the HTML output for the [slp_map] shortcode
    • bubblelayout: an HTML + WordPress shortcode string that is processed to generate the HTML output for the Google Maps info bubble that appears when a user clicks on a map icon
    • google_map_style : Google Maps specific JSON map styling for embedded styles.

Fetching Style Data

\SLP_Service::get_styles – fetches styles from the style server.

  • via $this->get_and_validate_json_response( $this->slplus->url_main_slp_site . ‘/’ . SLP_Style_Manager::REST_ENDPOINT . $style_selector . $request_params );
  • $this->slplus->url_main_slp_site = https://storelocatorplus.com
  • SLP_Style_Manager::REST_ENDPOINT = ‘wp-json/wp/v2/slp_style_gallery’

Building A Locator Style

Crafting The Initial CSS and settings.json

To help keep track of the settings and the more complex CSS construction, files are stored in the style-gallery-service plugin.

The wp-content/plugins/style-gallery-service/assets/styles directory contains a subdirectory for each Locator Style.
The subdirectories correspond to Locator Styles (slp_style_gallery) posts on the main Store Locator Plus® website.
Each subdirectory has content that includes:

settings.json : a JSON file the represents all the settings this Locator Style will change when activated on a user’s Store Locator Plus® plugin or SaaS account.

An example settings.json for the Default Locator Style follows:

{
  "CustomFields": {
    "bubblelayout": "<div id=\"slp_info_bubble_[slp_location id]\" class=\"slp_info_bubble [slp_location featured]\">\n    <span id=\"slp_bubble_name\"><strong>[slp_location name  suffix  br]</strong></span>\n    <span id=\"slp_bubble_address\">[slp_location address       suffix  br]</span>\n    <span id=\"slp_bubble_address2\">[slp_location address2      suffix  br]</span>\n    <span id=\"slp_bubble_city\">[slp_location city          suffix  comma]</span>\n    <span id=\"slp_bubble_state\">[slp_location state suffix    space]</span>\n    <span id=\"slp_bubble_zip\">[slp_location zip suffix  br]</span>\n    <span id=\"slp_bubble_country\"><span id=\"slp_bubble_country\">[slp_location country       suffix  br]</span></span>\n    <span id=\"slp_bubble_directions\">[html br ifset directions]\n    [slp_option label_directions wrap directions]</span>\n    <span id=\"slp_bubble_website\">[html br ifset url][slp_location web_link][html br ifset url]</span>\n    <span id=\"slp_bubble_email\">[slp_location email         wrap    mailto ][slp_option label_email ifset email][html closing_anchor ifset email][html br ifset email]</span>\n    <span id=\"slp_bubble_phone\">[html br ifset phone]\n    <span class=\"location_detail_label\">[slp_option   label_phone   ifset   phone]</span>[slp_location phone         suffix    br]</span>\n    <span id=\"slp_bubble_fax\"><span class=\"location_detail_label\">[slp_option   label_fax     ifset   fax  ]</span>[slp_location fax           suffix    br]<span>\n    <span id=\"slp_bubble_description\"><span id=\"slp_bubble_description\">[html br ifset description]\n    [slp_location description raw]</span>[html br ifset description]</span>\n    <span id=\"slp_bubble_hours\">[html br ifset hours]\n    <span class=\"location_detail_label\">[slp_option   label_hours   ifset   hours]</span>\n    <span class=\"location_detail_hours\">[slp_location hours         suffix    br]</span></span>\n    <span id=\"slp_bubble_img\">[html br ifset img]\n    [slp_location image         wrap    img]</span>\n    <span id=\"slp_tags\">[slp_location tags]</span>\n</div>",
    "dropdown_style": "none",
    "google_map_style": "[]",
    "label_phone": "Phone",
    "layout": "<div id=\"sl_div\">[slp_search][slp_map][slp_results]</div>",
    "loading_indicator": "",
    "map_height": "480",
    "map_height_units": "px",
    "map_width": "100",
    "map_width_units": "%",
    "maplayout": "[slp_mapcontent][slp_maptagline]",
    "no_homeicon_at_start": "1",
    "pagination_enabled": "0",
    "results_header": "",
    "results_no_wrapper": "0",
    "resultslayout": "<div id=\"slp_results_[slp_location id]\" class=\"results_entry location_primary [slp_location featured]\">\n    <div class=\"results_row_left_column\"   id=\"slp_left_cell_[slp_location id]\"   >\n        [slp_addon section=primary position=first]\n        <span class=\"location_name\">[slp_location name] [slp_location uml_buttons] [slp_location gfi_buttons]</span>\n        <span class=\"location_distance\">[slp_location distance_1] [slp_location distance_unit]</span>\n        [slp_addon section=primary position=last]\n    </div>\n    <div class=\"results_row_center_column location_secondary\" id=\"slp_center_cell_[slp_location id]\" >\n        [slp_addon section=secondary position=first]\n        <span class=\"slp_result_address slp_result_street\">[slp_location address]</span>\n        <span class=\"slp_result_address slp_result_street2\">[slp_location address2]</span>\n        <span class=\"slp_result_address slp_result_citystatezip\">[slp_location city_state_zip]</span>\n        <span class=\"slp_result_address slp_result_country\">[slp_location country]</span>\n        <div class=\"contact_info\">\n            <span class=\"slp_result_address slp_result_phone\">[slp_location phone_with_label]</span>\n            <span class=\"slp_result_address slp_result_fax\">[slp_location fax]</span>\n        </div>\n        [slp_addon section=secondary position=last]\n    </div>\n    <div class=\"results_row_right_column location_tertiary\"  id=\"slp_right_cell_[slp_location id]\"  >\n        [slp_addon section=tertiary position=first]\n        <div class=\"online_info\">\n        <span class=\"slp_result_contact slp_result_website\">[slp_location web_link]</span>\n        <span class=\"slp_result_contact slp_result_email\">[slp_location email_link]</span>\n        <span class=\"slp_result_contact slp_result_directions\"><a href=\"https://[slp_option map_domain]/maps?saddr=[slp_location search_address]&daddr=[slp_location location_address]\" target=\"_blank\" class=\"storelocatorlink\">[slp_location directions_text]</a></span>\n        </div>\n        <span class=\"slp_result_contact slp_result_hours textblock\">[slp_location hours]</span>\n        [slp_location pro_tags]\n        [slp_location iconarray wrap=\"fullspan\"]\n        [slp_location eventiconarray wrap=\"fullspan\"]\n        [slp_location socialiconarray wrap=\"fullspan\"]\n        [slp_addon section=tertiary position=last]\n    </div>\n</div>",
    "search_by_name": "0",
    "searchlayout": "<div id=\"address_search\" class=\"slp search_box\">\n    [slp_addon location=\"very_top\"]\n    [slp_search_element input_with_label=\"name\"]\n    [slp_search_element input_with_label=\"address\"]\n    [slp_search_element dropdown_with_label=\"city\"]\n    [slp_search_element dropdown_with_label=\"state\"]\n    [slp_search_element dropdown_with_label=\"country\"]\n    [slp_search_element selector_with_label=\"tag\"]\n    [slp_search_element dropdown_with_label=\"category\"]\n    [slp_search_element dropdown_with_label=\"gfl_form_id\"]\n    [slp_addon location=\"before_radius_submit\"]\n    <div class=\"search_item\">\n        [slp_search_element dropdown_with_label=\"radius\"]\n        [slp_search_element button=\"submit\"]\n    </div>\n    [slp_addon location=\"after_radius_submit\"]\n    [slp_addon location=\"very_bottom\"]\n</div>\n",
    "show_country": "1",
    "show_hours": "1",
    "show_icon_array": "0",
    "tag_output_processing": "as_entered"
  }
}

stylesheet.scss : the SCSS (Sass CSS compiler) file that compiles into stylesheet.min.css.
It is a separate file so we can use SCSS to build more sophisticated stylesheets in a managed fashion as well as to share CSS constructs between different locator styles if desired.

An example stylesheet.scss for the Default Locator Style follows:

.store_locator_plus {
  // -- Meta
  #style_name {
    content: "Default"
  }
  #style_version {
    content: "2502.21.01"
  }

  .container {
    &.fluid {
      max-width: 100%;
    }

    .grid-list-lg {
      padding: 16px;
    }
  }

  .card {
    display: block;
    border-radius: 2px;
    min-width: 0;
    position: relative;
    text-decoration: none;

    -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2),
    0 2px 2px rgba(0, 0, 0, 0.14),
    0 3px 1px -2px rgba(0, 0, 0, 0.12);
    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2),
    0 2px 2px rgba(0, 0, 0, 0.14),
    0 3px 1px -2px rgba(0, 0, 0, 0.12);

    &__title {
      -webkit-box-align: center;
      -ms-flex-align: center;
      align-items: center;
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      -ms-flex-wrap: wrap;
      flex-wrap: wrap;
      padding: 16px;

      &--primary {
        padding-top: 24px;
      }
    }
  }

  .headline {
    font-size: 24px !important;
    font-weight: 400;
    line-height: 32px !important;
    letter-spacing: normal !important;
  }

  &.tagline {
    font-size: 0.75em;
    text-align: right;
  }

  // Search forms
  .slp_search_form {
    .search_box {
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
      align-items: flex-start;
      align-content: stretch;

      .search_item {
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: flex-start;
        flex: 1 0 auto;
        min-width: 1em;
        margin-bottom: 0.25em;
        width: 100%;

        label {
          text-align: right;
          margin-right: 0.25em;
          flex-basis: 20%;
        }

        input[type="text"] {
          min-width: 1em;
          flex-basis: 80%;

          &.label_empty {
            flex-basis: 100%;
          }
        }

        div {
          flex: 1 0 50%;
          display: flex;
          flex-direction: row;
          flex-wrap: nowrap;
          justify-content: flex-start;
        }

        #addy_in_radius {
          label {
            flex-basis: 40%;
          }

          select,
          span.ui-widget {
            flex-basis: 60%;
            display: flex;
            flex-direction: row;
            align-items: center;
            padding: 0.25em;

            span {
              display: inline-block;
            }
          }
        }

        #radius_in_submit {
          display: flex;
          flex-direction: row-reverse;
        }

        .slp_ui_button {
          margin: 0.25em 0;
          padding: 0.25em;
        }
      }
    }
  }

  // -- Results
  .slp_results_container {
    .results_wrapper {
      margin: 0.5em 0;
      padding: 0.5em;
      border: solid 1px lightgrey;
      border-radius: 0.5em;

      &:hover {
        background-color: lightgrey;
        border: solid 1px lightgrey;
        cursor: pointer;
      }

      .location_name {
        font-size: 1.15em;
      }

      .location_distance {
        float: right;
        vertical-align: text-top;
        color: grey;
      }

      .contact_info,
      .online_info {
        display: flex;
      }
    }
  }

  //-- Map
  div#map {
    img {
      background-color: transparent;
      box-shadow: none;
      border: none;
      max-width: none;
      opacity: 1.0;

      &[src='http://maps.gstatic.com/mapfiles/iws3.png'] {
        display: none;
      }
    }

    div {
      overflow: visible;
    }

    .gm-style-cc > div {
      word-wrap: normal;
    }
  }
  // Widgets and form elements
  #slp_widget\[city\],
  #map_box_map {
    display: none;
  }

  #map_box_image {
    display: block;
  }

  // -- Map | Bubble | Outermost Wrapper
  .slp_bubble_level_6 {
    .slp_bubble_level_1 {
      color: black;
    }
  }

  // -- Directory
  .slp_directory {
    &.landing_page {
      .results_entry {
        margin-bottom: 1.5em;
      }
    }
  }
}

Note the starting CSS rules:

.store_locator_plus {
  // -- Meta
  #style_name {
    content: "Default"
  }
  #style_version {
    content: "2502.21.01"
  }

The #style_name should always match the name of the Locator Style (the post name).
When the file is changed the #style_version should be updated to match the SLP standard version semver-like system of YYMM.DD.## for the date and iteration number of the latest change to the file.

stylesheet.min.css : the resulting CSS code that ends up in the Locator Style custom meta field named “css”.
This is kept separate from settings.json to keep settings.json from being bloated with the CSS code.

Putting The Style Into Production

Once the settings have been defined and the new CSS style is ready, it is time to put the updates in production.

  • Login to the main Store Locator Plus® website.
  • Go to Locator Styles on the sidebar
  • To create a new style:
    • Add Post
      • Enter a reasonable, but short, description.
      • Add a screen shot.
    • Add custom meta fields
      • The css file should contain the contents of the stylesheet.min.css that was generated.
      • All other settings name in the settings.json should be added as individual Custom Meta fields. With the example above:
        • dropdown_style set to “none”
        • google_map_style set to “[]”
        • label_phone set to “Phone”
        • etc.
  • To update an existing style:
    • Select the style to be changed and edit it.
    • If the CSS changed , replace the existing screenshot.
    • Compare the settings.json CustomFields and update fields that changed. Add any new custom fields.

0 comments on “Locations Table : React Conversion”

Locations Table : React Conversion

Goal: replace the legacy locations management table written in PHP and jQuery with a modern React component preferably MUI DataGridPro.

Legacy Locations Management Table

Rendering The UI

Rendering of the PHP page in WordPress is routed via this path:
– WordPress admin menu “Locations” (WordPress plugin) or “Location Details” (SaaS) for menu_items[‘slp_manage_locations’]
– Admin Menu calls \SLP_Admin_UI::renderLocationsPage to render the page.
– Calls \SLP_Admin_Locations::display

This renders the location manage page which has several tab panels.
Each tab panel is added or augmented with the slp_build_locations_panels custom WordPress hook.
The Locations Management Table is added with a hook priority of 10 that calls \SLP_Admin_Locations::addListLocationsSetting

When the page renders it goes inside an HTML div (tab panel) that is exposed when a user clicks on the List menu item in the horizontal tab menu that is currently rendered as a React component on the same page.

The List Locations Tab Panel Content

This page is comprised of HTML from the following methods:

  • \SLP_Admin_Locations::create_string_location_table_start –
    starting HTML wrappers for the locations table
  • \SLP_Notifications_Manager::get_html –
    renders a notification or “SnackBar” style notices manager if any notification messages are on the notifications array.
  • The ‘manage_locations_table’ \SLP_Setting object rendered by \SLP_Settings_manage_locations_table
    Draws the main locations data grid / table.
  • \SLP_Admin_Locations::create_string_location_table_end –
    ending HTML wrappers for the locations table

\SLP_Admin_Locations::create_string_location_table_start calls the following methods:

  • \SLP_Admin_Locations::set_location_query –
    Manages the SLP database queries.
    • Adds location query modifiers for the where clause via the custom hook slp_manage_location_where
      • Used by the Power plugin via \SLP_Power_Admin_Locations_Actions::process when action =
        • filter_by_category – to filter locations by category
        • show_uncoded – filter locations to those that are not geocoded (empty latitude or longitude fields)
        • filter_by_property – filter locations to match properties like name, zip code, country, state
    • Adds location query modifiers via \SLP_Admin_Locations::set_location_filter
    • Adds a sort order to the location results via \SLP_Admin_Locations::set_location_order
  • Executes the location query via \SLP_Data::get_SQL
  • Gets a total location count and stores it in \SLP_Admin_Locations::$total_locations_shown
  • Adjust the pagination starting page number if necessary storing the value in \SLP_Admin_Locations::$start


  • If no locations, adds a WordPress nonce with wp_nonce_field( ‘screen-options-nonce’, ‘screenoptionnonce’, false ) and shows the no locations message and returns.
  • If there are locations:
    • Outputs a hidden input field name=’start’ with the starting offset for pagination
    • If the page is rendered after a form post (processing the apply to all button) outputs a hidden input name=”apply_to_all” with a value=”1″
    • Outputs a div for the simulated pagination navigation block via \SLP_Admin_Locations::createstring_PanelManageTablePagination

\SLP_Settings_manage_locations_table main locations data grid rendering calls the following methods:

  • \SLP_Settings_manage_locations_table::display handles the main rendering which calls…
    • \SLP_Admin_Locations::display_manage_locations_table
      This is where the main HTML table is rendered that will be the primary object replaced by the MUI DataGridPro component.
      • Add the HTML input checkbox for each row, wired to a jQuery call to help managed checked/unchecked state.
      • Calls \SLP_Admin_Locations::display_column_headers to put field labels on top of the table columns.
      • Uses the custom filter slp_locations_manage_cssclass to apply custom CSS styling on rows for
        • invalid location entries via \SLP_Admin_Locations::filter_InvalidHighlight
        • locations with the private field set to true via \SLP_Admin_Locations::add_private_location_css
        • adds custom data specific styling via \SLP_Admin_Locations::customize_location_list_displayed_data
      • Managed the location data query, preparing the database layer for where clauses, sorting, etc.
      • Adds action buttons for edit, delete, etc to an Actions column which presents icons to modify data in each row
      • Loops through he list of returned locations records and displays rows of locations
        • Column data HTML output can be modified via the WordPress hook slp_column_data. This is used by these plugins:
          • Experience:
            • add_filter( ‘slp_column_data’, array( $this, ‘filter_FieldDataToManageLocations’ ), 90, 3 );
          • Power:
            • add_filter( ‘slp_column_data’, array( $this, ‘customize_location_list_displayed_data’ ), 20, 3 );
            • add_filter( ‘slp_column_data’, array( $this, ‘extend_location_columns’ ), 90, 3 );
          • Premier:
            • add_filter( ‘slp_column_data’, array( $this, ‘checkmark_territory_bounds’ ), 20, 3 );
          • Store-Locator-Plus:
            • add_filter( ‘slp_column_data’, array( $this, ‘customize_location_list_displayed_data’ ), 10, 3 );

Task : Replace The Manage Locations PHP and jQuery managed table with MUI DataGrid Pro

Licensing MUI DataGrid Pro

There is a license for MUI DataGrid Pro.
You can find an example in the HistoryTable React component in MySLP Dashboard (wp-content/plugins/myslp-dashboard/src/settings_history/HistoryTable.tsx).
The MySLP Dashboard plugin invokes the license in that component via import “@licensing/MuiLicense.js”;
This methodology can be copied for SLP.

Guidelines

  • Use the built-in DataGrid features for sorting, filtering, checkboxes to select row, pagination, and other extended features of the MUI component.
  • Extract the data manipulation elements from the legacy Store Locator Plus location management PHP code and integrate them into a location REST endpoint in the Store Locator Plus plugin.
    • The Store Locator Plus plugin already has REST endpoints for fetching location data
    • These existing endpoints may need to be augmented to accommodate all features of the manage locations table
    • Be sure to follow any custom WordPress hooks and filters employed to manipulate data
      • Pay special attention to hook and filters in the Experience, Power, and Premier plugins
  • Connect the interactions of the React LocationsTable component that was started in wp-content/plugins/store-locator-plus/src/LocationsTable/LocationsTable.tsx to the data display of the new MUI DataGrid Pro table for locations.
    • The LocationsTableHeader React component has been designed to interact with this data display table.
      • This component currently interacts with the legacy PHP and backend data processing interfaces.
      • Update the interactions as appropriate to take advantage of the new MUI Data Grid Pro features.
  • Locate the local AI knowledge and context files related to prior work on the location management interface, especially task summaries related to the LocationsTableHeader components.
    • Find $HOME/PhpstormProjects/workspace-sprocket/knowledge/ai-summaries/locations
  • Ask clarification questions before starting.
  • If unsure of any step in the process, pause and ask for guidance.
  • If any step of the process is not resolving in several turns, pause to explain the issue and proposed path forward and ask for guidance or assistance if needed.

Feedback Turn 1 : Store Locator Plus plugin version 2607.22.02

Tasks

  • ✅ Revert the action bar styling , see details below.
  • The per-row checkbox does not work, clicking the checkbox does not change the state of the checkbox UI on the row.
  • Pagination does not work. Reproduction:
    • Set page length to 10. Page 1-20 of 21 shown.
    • Click the > to move to the next page. Page redraws showing 1-10 again.
  • ✅ Fix Bulk Actions Categorize Slide Out Styling , see details below. Style is not correct.
  • ✅ The edit button on each row (in LocationsDataGrid) does not invoke an action.
  • ✅ Fix the add tags modal styling, see details below.
  • ✅ Drop the With These Properties option from the filter drop down (LocationsFilter)
    • Remove associated React code to show the slide out drawer and render the selectors.
  • ✅ Remove the LocationsSearch component from the LocationsTableHeader action bar.
    • Remove associated React code for display as well as related processing that is not in use by the DataGrid Pro implementation.

Revert The Action Bar Styling

The Manage Locations action bar (LocationsTableHeader component) style was changed.
The image below was what it looked like before the Codex GPT-5.6-Sol agent created the React version of the manage locations table.
This styling should have not been changed.

original action bar
Version 2607.22.01 – original manage locations action bar styling.

The revised action bar is shown here:

revised action bar
Version 2607.22.02 buttons colors changed.
  • Color scheme of apply, apply to all, and search buttons have changed.

Bulk Actions Categorize Slide Out Styling

  • The apply and apply to all are buttons not the top right as icons next to the close button.
  • The categories are following the WordPress hierarchy display
Version 2607.22.01 – original categorize panel styling
Version 2607.22.02 – Categories not hierarchical , button colors changed

Fix the add tags modal styling

v26072.22.01 – original styling
v2607.22.02 styling

For Review

With These Properties Filter Not Rendering

THIS IS NOT AN ACTIONABLE ITEM. This is a record of the changes made by the AI agent that produced a subpar result.

The “With These Properties” filter can be removed as MUI DataGrid Prod provides more advanced per-column filtering.

The drop down filter menu (rendered via the LocationsFilter component) no longer shows the slide out filter properties selector.

  • Select “With These Properties”
  • This should show a slide out drawer where a user can pick the properties to filter on (reference first image below), the drawer is not rendering on the visible UI surface (reference second image below).
v26072.22.01 – The With The Properties slide out UI is rendering.
Version 2607.22.02 – With These Properties slide out component is not rendering

Feedback Turn 2 : Store Locator Plus plugin version 2607.22.03

Tasks (Issues)

  • Click the per-row checkbox does not check the box.
    • Cannot select single rows in the DataGrid.
  • ✅ Pagination does not work.
    • Reproduction:
      • There are 25 locations
      • Set page length to 10. Page 1-20 of 21 shown.
      • Click the > to move to the next page. Page redraws showing 1-10 again.

Tasks (Improvements)

  • ✅ Separate the latitude and longitude after the business name into two new separate columns on the data grid.
    • Keep the name column pure with only the name rendered.
    • Add the latitude and longitude as separate columns as they are in the database.
    • This may require a back end change depending on how the REST data is procured.
  • ✅ Remember the state of the DataGrid columns.
    • The following properties of the DataGridPro should be remembered across page loads or table interactions:
      • Column Order
      • Hidden Columns
      • Filters
      • Sort Order
    • The state should be stored in the browser React state between page refreshes.
    • The state should make a REST call to store this state in the WordPress user meta as well.
      • This will likely require a new REST endpoint.
      • The meta key should start with the SLPLUS_PREFIX plus a name you deem appropriate (maybe csl-slplus-LocationsGridState)?
      • Use that user meta to remember the table state if the user moves off the page to another interface in WordPress and comes back.
      • This will also allow the table to remember the state if a user logs off and comes back the next day.
  • ✅ With DataGridPro there is an option to lock the table header (column names) and footer (pagination) and vertically scroll rows in between.
    • The display mode also appears to be able to match the height and width of the DataGridPro to the bounding box.
    • See the demo under the “Pro Version” header at https://mui.com/x/react-data-grid/

Feedback Turn 3 : Store Locator Plus plugin version 2607.23.01

Tasks (Issues)

  • ✅ Click the per-row checkbox does not check the box.
    • This issue has been a problem since Turn 1 and is going to need human intervention.
    • Cannot select single rows in the DataGrid.
    • The check/uncheck a single location does not work.

Tasks (Improvements)

  • ✅ Remove the LocationsFilter component from the LocationsTableHeader component.
    • The last remaining filter “Show Uncoded” is no longer needed now that latitude and longitude are on the column list.
  • Move the latitude and longitude column to be directly after the distance column on initial startup state.
  • ✅ When the DataGridPro meta data about column order, hide/show, or filters are in place add notification box above the table to let the user know “Custom table settings are in place. Some columns may be hidden or reordered.”

Feedback Turn 4 : Store Locator Plus plugin version 2607.23.02

Current (left) and preferred (right) notification box location.

Tasks (Improvements)

  • ✅ Move the notification box about custom columns to the top right.
  • ✅ Introduce a “Reset” button in the “Custom table settings” notification.
    • When the reset button is clicked, reset the DataGrid state back to the original defaults updating the stored state and related user meta in the process.
  • ✅ Add the built-in GridToolbarFilterButton and GridToolbarDensitySelector to the DataGridPro component in LocationsDataGrid.
  • Add the MUI Quick filter multi-field search to the DataGridPro by implementing the showToolbar property (see https://mui.com/x/react-data-grid/filtering/quick-filter/#system-QuickFilteringGrid.tsx)
  • ✅ Add an alternating row background to the data rows in the DataGridPro rendering.
  • ✅ The initial height for the DataGridPro component appears to be set according to the size of the slp-locations-grid or .react-wrapper div.
    • This element includes the LocationsTableHeader component and LocationsDataGrid component.
    • The height should be set by the available space in the outermost bounding layout element in LocationsDataGrid.

Observations

Actions to not need to be taken here. These are findings while reviewing the AI agent work.

  • To deal with styling issues with the React components, the AI Agent (Codex 5.6-Sol) added <div className=”react-wrapper”> to the LocationsTable component.
    • This would be more efficient by adding class=”react-wrapper” to the \SLP_Settings_manage_locations_table::display method that builds the div this React component attaches to.
      • Why? It creates one less HTML element the DOM processors need to navigate during processing.
  • Imports for React components are using “barrel imports” versus names imports.

Feedback Turn 5 : Store Locator Plus plugin version 2607.23.02

Tasks (Issues)

Tasks (Improvements)

  • ✅ Add the pin column setting to the state we remember about the data grid display. Store in local state and persistent user meta.
  • ✅ Move the Filters (GridToolbarFilterButton) and Density (GridToolbarDensitySelector) buttons after the Quick Filter search icon in the header.

Review

Task Summary

0 comments on “Accounting: Monthly History Data”

Accounting: Monthly History Data

Goal: Create a persistent accounting information data store using the built-in WordPress Multisite database surfaces.

The table should follow some standard rules that will allow us to implement CRUD operations via REST endpoints in the MySLP Dashboard plugin.

Tasks

  • One time task “Create Or Update The Database” when the MySLP Dashboard version indicates a change.
  • Create a Monthly Ledger User Interface to allow for manual CRUD operations on the slp_accounting_monthly_history table.

Monthly History Data : Environment

Environment

All accounting history data will reside in tables for the main WordPress super admin account.

The Main WordPress Super Admin account site ID is stored in the PHP constant SITE_ID_CURRENT_SITE and should be 1.
The database table prefix should come up as wp_ unlike user accounts that start with wp_<user_site_id>.

slp_accounting_monthly_history Table

The table should be named $wpdb->prefix . “slp_accounting_monthly_history” resulting in a table name of wp_slp_accounting_history.

slp_accounting_monthly_history Structure

  • ID – a unique ID to allow for explicit record I/O for CRUD operations.
  • KEY – a short string indicating the type of monthly data for example:
    • “SAAS_REVENUE”
    • “PLUGIN_REVENUE”
  • AMOUNT -an integer representing the numeric value for the key for example:
    • 3500 which may represent “35.00” or 35 dollars in our UI surfaces
  • DATE – a date and time for they entry representing the date this value represents NOT when the data was created or modified
  • YEAR – the 4-digit year represented by DATE
  • MONTH – the 2-digit month represented by DATE
  • DAY – the 2-digit day represented by DATE

slp_accounting_monthly_history Example Data

  • ID | KEY | AMOUNT | DATE | YEAR | MONTH | DAY
  • 1 | SAAS_REVENUE | 299000 | 2026-03-01 00:00:00 | 2026 | 03 | 31
  • 2 | SAAS_REVENUE | 302000 | 2026-04-01 00:00:00 | 2026 | 04 | 30
  • 3 | SAAS_REVENUE | 303000 | 2026-05-01 00:00:00 | 2026 | 05 | 31

slp_accounting_monthly_history Data Use Case

This Accounting Monthly History Data interface will run various monthly cron jobs to collect data and store it in this table.
We will use this data to product things like monthly revenue graphs for the SaaS Account Overview dashboard.
The graph will show SaaS Revenue from active accounts on a monthly basis.

We will do the same providing a manual process to add other revenue such as WordPress plugin revenue under “PLUGIN_REVENUE” keys.

We will allow for users to change the Line Chart revenue graph to show “monthly” or “yearly” graphs.
Future data keys may warrant daily graphs.

Task: Create Or Update The Database

When the MySLP Dashboard module version (plugin version) changes, run a database “create or update” hook to create the table or modify it as needed.

Copy the design pattern in the Store Locator Plus plugin in the \SLP_Admin_Activation class.
wp-content/plugins/store-locator-plus/include/module/admin/SLP_Admin_Activation.php
This is fired from \SLPlus::initialize_after_plugins_loaded
When the Store Locator Plus version reported is newer than the installed version for the plugin (see version_compare( $this->installed_version, SLPLUS_VERSION, ‘<‘ )) , the MySLP Dashboard should follow that pattern.

Task: Monthly Ledger User Interface

Admin Menu

  • Add a submenu with the label “Monthly Ledger” under the “Accounting” admin sidebar menu we created in \MySLP::create_network_admin_menu.
		$this->menu_hooks[ MYSLP_ACCOUNTING_MENU_SLUG ] =
			add_menu_page( __( 'Accounting', 'myslp' ),
				__( 'Accounting', 'myslp' ),
				'manage_network_options',
				MYSLP_ACCOUNTING_MENU_SLUG,
				array( $this, 'render_accounting_page' ),
				SLPlus::menu_icon,
				1.50
			);

Initial User Interface

  • Add a new My MySLP_Account_MonthlyLedger PHP React loader and helper class.
    Follow the design pattern of \MySLP_Accounting in wp-content/plugins/myslp-dashboard/include/accounting/MySLP_Accounting.php
    Place it in the same directory as MySLP_Accounting.php as a sibling.
  • Create a new React component that allows basic CRUD operations on the slp_accounting_monthly_history Table.
    Attach it to the MySLP_Account_MonthlyLedger PHP React loader.
    Follow the UI design pattern of the AccountingPanel React component at wp-content/plugins/myslp-dashboard/src/accounting/accounting.tsx
    Use a MUI X DataGridPro component as the primary table interface.
    Allow for pagination, starting with a default page length of 25 records.
    Sort the records by DATE descending on initial load so we see newer records at the top.
    Provide an add record interface where a user can enter the KEY, AMOUNT, DATE.
    Provide an inline edit record interface on the DataGridPro table to allow users to click on they KEY, AMOUNT, or DATE field on an existing record and change it.
    Provide a delete option for each record.

Data Interface

Use REST for all CRUD operations and to fetch the initial data set.

When records are added the backend data interface should:

  • Ensure all keys entered are trimmed (no leading/trailing spaces) and are shifted to uppercase.
  • AMOUNT is stored only as an integer.
  • DATE field needs to allow for flexible input converting text input into a best guess for the date to be stored as a date-time entry in the database. Examples:
    • “05/2026” is May 2026 which should be recorded as the date time 2026-05-01 00:00:00
    • “05/01/2026” is May 1st 2026 which should be recorded as the date time 2026-05-01 00:00:00
    • “May 2026” is May 2026 which should be recorded as the date time 2026-05-01 00:00:00
    • Allow for various separators such as / or – or .
      • 05-01-2026 is the same as 05/01/2026
      • 05.01.2026 is the same as 05/01/2026
    • Use standard Date/Time JavaScript or React libraries for data manipulation.
    • The manipulation can be not the front-end (React/JavaScript) before communicating with the REST endpoint.
  • The backend should do basic sanitation before recording data.

The “Buffer” For Overages

Legacy billing was sometimes strict on the overage policy. The revised automated report, not so much as there is a 100 views “free buffer” on overages.

2026 : Jan | Feb | Mar | April | May

Acct IDSpreadsheetNew50
BRmarket0 – 0 – 15 – 0 – 200 – 0 – 15 – 0 – ?
MKbevis0 – 0 – 5 – 0 – 00 – 0 – 0 – 55
TKESeck0 – 0 – 0 – 5 – 00 – 0 – 0 – 0 – 0
Arbor0 – 0 – 0 – 0 – 350 – 0 – 0 – 0 – 35
UWS0 – 20 – 25 – 45 – 11515 – 20 – 25 – 45 – 115
Gary10 – 15 – 20 – 25 – 250 – 15 – 20 – 20 – 25

The actual billing and monthly views do not always match.

Part of this is the monthly view total is triggered when the Stripe billing renews.
When a Stripe renewal is successful the SLP SaaS platform records the current view count to a permanent record of views for the previous customer billing period (prior month).
The system is imperfect and need refinement as Stripe sometimes needs to reprocess subscription renewals for a myriad of reasons.
As such the view tally is sometimes recorded more than once and reset more than once.
This impacts the total view count recorded for the month as well as the billing.

Starting in June 2026, we are using the new monthly views report as the source of truth.
This may not be perfect during the period we work to resolve these corner cases with Stripe renewals.
The map views will never be OVER actual usage.
Worst case, we bill a little LESS due to this issue.

Overages remain billed at $5 for a block of 1,000 extra views.
As an unofficial policy while we work toward resolution, all accounts now have a “100 free overage views” allowed on their account.
Thus, if an account is over views we don’t charge for the block until the new block gets 101+ views.
Examples:
limit is 5,000 – actual views is 5099 – billing is 0 extra blocks as 99 is under the 100 grace = $0
limit is 5,000 – actual views is 5250 – billing is 1 extra block at 250 exceeds the 100 grace = $5

limit is 5,000 – actual views is 8099 – billing is 3 extra block as 99 is under the 100 grace = $15

limit is 5,000 – actual views is 8250 – billing is 4 extra blocks = $20
(1 extra block: up to 6,000 views, 2: up to 7,000 views, 3: up to 8,000 views, 4: up to 9,000 views) = $20

As a result, months prior to June 2026 may not align with billing and view count.

0 comments on “Create Accounting Dashboard”

Create Accounting Dashboard

Goal: Create an accounting dashboard for the Store Locator Plus® SaaS application.

Primary Module: MySLP Dashboard (myslp-dashboard)
git repo: https://github.com/Store-Locator-Plus/myslp-dashboard

We are creating a full Store Locator Plus accounting dashboard to track both the SaaS platform as well as WordPress plugin sales.

Sales Data

The primary source of truth for sales data will come from Stripe.
Any references to PayPal payments or accounts can be considered legacy information and can be left out of the accounting panel.

Payment Module: MySLP Payments (myslp-payments)
git repo: https://github.com/Store-Locator-Plus/myslp-payments.git

The payment module holds the Stripe API module and related code for payment system communications.

User Interface

Stage 1 : Accounting Overview Scaffolding

Accounting Sidebar Menu

A new sidebar menu should be created in WordPress for super admin users only.
\MySLP::create_network_admin_menu should be used to create and attach the menu.
Follow the design pattern for the configure menu option, code snippet follows:

		$this->menu_hooks[ MYSLP_CONFIG_MENU_SLUG ] =
			add_menu_page( __( 'Configure', 'myslp' ),
				__( 'Configure', 'myslp' ),
				'manage_network_options',
				MYSLP_CONFIG_MENU_SLUG,
				array( $this, 'render_configuration_page' ),
				SLPlus::menu_icon,
				1.30
			);

Account Page Rendering

Unlike the main configure menu page that is rendered via \MySLP::render_configuration_page the new accounting module should load and render a React PHP helper class. We want this interface to be primarily React driven.

The WordPress PHP React Helper Class

Follow the \MySLP_Customer_Profile class for guidance on implementing a React user interface within WordPress.
I suggest creating a new class MySLP_Accounting in wp-content/plugins/myslp-dashboard/include/accounting.

The React AccountingPanel Component


The React components that \MySLP_Accounting loads with the help of the wp-scripts node package should live in wp-content/plugins/myslp-dashboard/src/accounting.
This directory should have a block.json and an accounting.tsx file.

block.json should probably look like this:

{
  "script": "file:profile.js"
}

The accounting.tsx TypeScript should contain the React accounting component.
This new React component should be named AccountingPanel.
It should follow the UX design pattern of the ProfilePanel component in wp-content/plugins/myslp-dashboard/src/profile/profile.tsx

The initial user interface will only have a single submenu (SLPTabsBar Tabs components) for the main page which should be labelled “Overview” which is already selected and open. It will render the AccountingOverviewPanel component noted below.

AccountingOverviewPanel Component

A supporting AccountingOverviewPanel React component should be created.
If the WordPress wp-scripts supports it, this can go in the same directory as the AccountingPanel component : if not place it in wp-content/plugins/myslp-dashboard/src/accounting_overview

This component should be a React Dashboard that shows overall accounting metrics.
To start with we will want to show the total number current active accounts and total amount of payments from those active accounts.
The ManageCustomers React component (wp-content/plugins/myslp-dashboard/src/manage_customers/manage_customers.tsx) displays this data in the AdminHeader children via a pair of Chips.
Use the same REST endpoints to fetch this data and display it.

The UX should try to follow the general design pattern at https://mui.com/material-ui/getting-started/templates/dashboard/.

Here is a screen shot of the Material UI Dashboard Template that is referenced.

For now we need the cards for:

  • Accounts in place of Users with the active count below. We will add a data table for historical trends and a graph below it in the future.
    Clicking on the user count in the account card should redirect the UX to load the Manage Customers page at /wp-admin/network/admin.php?page=customer_list
  • Payments in place of Conversions with the total payment amount below. This too will eventually have trends stored in a data table that we will create later.

AI Summary

Junie Pro Summary

Completed setup and implementation prep for the accounting dashboard work in myslp-dashboard, including running required start-revision on branch accounting.

• Implemented Stage 1 accounting UI scaffold: new Accounting admin page, React entrypoint, and overview metrics/cards with click-through to Manage Customers.

• Added new files: include/accounting/MySLP_Accounting.php, src/accounting/accounting.tsx, and src/accounting/block.json.

• Updated integration points in include/MySLP.php and constants/version metadata in myslp-dashboard.php and package.json.

• Validation status: lint checks for new files passed (only a non-blocking TS import style warning noted earlier), diff checks passed, and you confirmed npm install + npm run build succeeded locally with generated build/accounting/accounting.js and build/accounting/accounting.asset.php present.

• Environment note: Junie shell still lacks local php tooling and direct GitHub auth; you requested follow-up guidance on PAT-based auth after task completion.

Junie Release Notes
• Scope: No new product-code changes were made after the previously summarized accounting dashboard work in myslp-dashboard.
• Skills/Environment updates this session: Reloaded skills via Vendors/JetBrains/relink_skills.sh; available skills now include /wordpress-release-notes.
• Code impact since last implementation summary: None.
• Build/Test status: No additional build or test runs were performed after the earlier confirmed successful npm install and npm run build for myslp-dashboard.
Included Previously Completed Work (for continuity)
• Added Accounting admin page scaffold and React entry (include/accounting/MySLP_Accounting.php, src/accounting/accounting.tsx, src/accounting/block.json).
• Wired menu/render integration in include/MySLP.php and version bump artifacts from start-revision (myslp-dashboard.php, package.json).

0 comments on “Settings Interface Architecture”

Settings Interface Architecture

The Settings Interface architecture drives most of the legacy Store Locator Plus admin interfaces. These are the interfaces customers interact with most often, especially on the SaaS platform. It is the main component of the SLP Dashboard for SaaS.

It was originally written to manage the UI surfaces that present the myriad of settings (options) available to customers. It presents the “dials the users turn” to change how their store locator maps and directory presentations are configured. It grew to cover other admin UI interfaces including the Locations Interface.

Research Notes

About SLP_Settings

Extends SLP_Base_ReactObject which extends SLPlus_BaseClass_Object

SLP_Settings::render_settings_page

Outputs the HTML for settings pages, including the location details page (it uses the “settings” page construct). The output all ends up in a HTML element: <div class=’dashboard-wrapper’>…</div>.

General layout:

  • <div class=’dashboard-wrapper’>
    • <header id=”dashboard-header” class=”dashboard-header”> = React blue bar header
    • <div class=’dashboard-main store-locator-plus’>
      • <section class=’dashboard-content’>
        • <div id=’wpcsl_container’ …>
          • <form method=’post’ class=’slplus_settings_form’ …>
            • <div id=”main” class=”dashboard-content-inner panel-settings”>
            • <div id=”wpcsl-nav” class=”sub_navigation”> = from \SLP_Settings::sublevel_navbar
            • <div id=”content” class=”content js settings-content”>
The settings page header

The page header ends up in:

<header id="dashboard-header" class="dashboard-header"><!-- react slp_adminheader --></header>

Which is setup and managed with:

		// -- include the asset file to get the WordPress Scripts defined dependencies and version ID
		$asset = include SLPLUS_PLUGINDIR . 'build/slp_adminheader/script.asset.php';

		wp_enqueue_script( 'slp_adminheader', SLPLUS_PLUGINURL . '/build/slp_adminheader/script.js', $asset['dependencies'], $asset['version'], true );

		wp_add_inline_script( 'slp_adminheader', 'const slpReact = ' . wp_json_encode( $this->get_vars_for_react() ) . ';', 'before' );

Rendered via the React component at
wp-content/plugins/store-locator-plus/src/components/AdminHeader.js

That renders React Components:

  • <CssBaseline/>
  • <AdminHeader/>

Where <AdminHeader/> renders as:

  • <AppBar position=”sticky”>
    • <Toolbar>
      • <Typography variant=”h6″ component=”div”
        sx={{flexGrow: 1}}>{slpReact.pageName}</Typography>
      • {mainButtonGroup}
      • <Tooltip title={__(‘Documentation’, ‘store-locator-le’)}>
        • <IconButton … documentation … />
The settings page sub navbar (menu)

In the current version the header element DOES NOT contain the sub navbar.

It is rendered via SLP_Settings::sublevel_navbar deep inside the <div class=’dashboard-wrapper’>…</div> element.

React Update To Render Subnavbar

The goal is to render the \SLP_Settings::sublevel_navbar HTML output using React instead of the current PHP and HTML implementation.

The AdminHeader at wp-content/plugins/store-locator-plus/src/components/AdminHeader.js renders the top-of-page header with the page name and some interactive icon buttons.

The task is to add a submenu below the Toolbar that is comprised of the sections currently residing in $this->sections in the \SLP_Settings::sublevel_navbar method.  Using the $titleText ($section->name) within.  The wp_kses_post function current used to set $titleText is not necessary as the $section->name is already considered "clean".

The best way to get the variables into React so they are accessible in JavaScript is to modify the \SLP_Base_ReactObject::get_vars_for_react method.  Instead of attempting to override or extend the base \SLP_Base_ReactObject::get_vars_for_react method, add a filter in \SLP_Settings for slp_react_vars.   That will extend the react variable array via this return method on the end of the get_vars_for_react method:
apply_filters( 'slp_react_vars', $defaultVars );

You will find a good reference implementation of the slp_react_vars filter via:
\Customer_Profile_Site_Info::initialize - adds the filter for that class
\Customer_Profile_Site_Info::extendReactVars - extends the available JavaScript variables for React

In our case we are not extending MySLP variables, so the SLP_Settings::extendReactVars method should be more like this:
$vars['SLP']['sections'][] = array( 
'name' => $section->name,
'div_id' => ! empty( $section->div_id ) ? $section->div_id : $section->slug,
'link_id' => "wpcsl-option-{$div_id}"
);
This should be set up by looping through $this->sections in a new extendReactVars method in SLP_Settings.

This should create a horizontal navbar that shows and reveals each section by the div id. This may require further refinement as the current system uses outdated JavaScript and jQuery to hide and reveal subsequent divs by using the div IDS as noted in the link_id property.   For now we will assume that if React renders the components correctly the pre-existing JavaScript will take over.
Initial Results

Works on locations page.
Does not work on Settings page.
Spacing is not well defined, needs more space between menu items.

0 comments on “Locations Interface Architecture”

Locations Interface Architecture

The locations interface needs a major overhaul.

Let’s investigate the process and where we can start shimming some React components.

Research

Main Loader : Locations | Location Details (SaaS) Menu

Locations Page Header (UI)

The locations page is a bastardized combination of the SLP_Settings class and WP_List_Table.

The top-of-page header appears to be handled by SLP_Settings.
SLP_Settings extends SLP_Base_ReactObject
To start rendering the page is calls \SLP_Base_ReactObject::render with these attributes:
– $scriptHandle = ‘slp_settings’
– $scriptFilebase = ‘slp_settings’
This methodology ends up render the SLPSettingsPanel React component (wp-content/plugins/store-locator-plus/src/slp_settings/slp_settings.tsx)

That means the page header is rendering using the Reactionary standard <AdminHeader> for the page.
Currently SLP_Settings is only leverage the pageName property, but it also supports sections as a property which is the submenu.

With the 2606.26.01 release the Settings system uses the React AdminHeader menu.

\SLP_Settings::render_settings_page

  • $this->sections may have is_topmenu set, this indicates the top level menus in the app

Locations Card (Defunct?)

This may no longer be used: \SLP_Admin_Locations::create_location_details_box

SLP_Admin_Locations

extends WP_List_Table – this is already going to be a shit show. The WP_List_Table interface is from 1902. Maybe before that. It is awful.

Referenced by:

  • \MySLP_Admin::do_admin_startup()
    • Setting the screen property , probably not needed:
      SLP_Admin_Locations::get_instance()->screen = ‘store-locator-plus_page_slp_manage_locations’;
  • \SLP_Power_Pages_Admin::extend_location_edit()
    • Only if Store Pages is active, add an edit section to show an “edit Store Page” link
  • \SLP_Power_Pages_Admin::set_page_actions()
    • Add the recreate store page action hyperlink under each location on the table
  • \SLP_Actions::save_screen_options()
    • To save the screen options, which is currently only the page (table rows) length.
  • \SLP_Admin_Locations_Add::
    • initialize
    • extended_data_block – for extended data fields
  • \SLP_Admin_UI::renderLocationsPage
    • To render the UI
  • \SLP_Location_LoadFromWP::import
    • To only report back any URL the person puts in is invalid.
    • This is called from \SLP_Admin_Locations_Actions::process_actions when the current_action is load_from_wp
    • This is setup from \SLP_Admin_Locations_Load
  • \SLP_Settings_manage_locations_table::display
    • A shim for $this->settings->add_ItemToGroup( array(
      ‘group_params’ => $group_params,
      ‘type’ => ‘manage_locations_table’,
      ) );

SLP_Admin_Locations

Hooks & Filters Fired

  • slp_locations_manage_bulkactions : creates the list of bulk action dropdown items
    • SLP_Power_Admin_Locations
    • SLP_Experience_Admin
    • SLP_Power_Pages_Admin
  • slp_locations_manage_filters : The filter location drop down items
    • SLP_Power_Admin
  • slp_locations_manage_cssclass : Adds extra CSS classes
    • SLP_Experience_Admin
  • slp_column_data : Change the data rendered in a column
  • slp_manage_locations_actionbar_ui : modify the action bar on top of the table
  • slp_modify_admin_locations_script_data : modify the script data for the JavaScript on the page
  • slp_manage_location_columns
  • pls_manage_location_where
  • slp_manage_locations_buttons
  • slp_build_locations_panels

Not used:

  • slp_invalid_highlight
  • slp_edit_location_change_extended_data_info
  • slp_manage_expanded_location_columns

Screen for WP_List_Table

This is messing up the UI.
Let’s see if we can drop this, start peeling away layers to simplify this interface as we work toward a React version.

locations_per_page

  • Tracked via \SLPlus::$userMetaKeys
    • Stored in user meta via \SLP_AJAX::update_slp_user_meta
  • \SLP_Actions::init sets a filter on set-screen-option … it calls…
    • \SLP_Actions::save_screen_options … which only runs if the current page is slp_manage_locations… if so it calls…
      • \SLP_Admin_Locations::save_screen_options
        • Which returns the value of locations_per_page

Best option is to make this a React interface for page length / pagination

0 comments on “Twenty Twelve Theme Does Not Exist”

Twenty Twelve Theme Does Not Exist

The theme directory "twentytwelve" does not exist.

This issue comes up for older accounts where their wp_options table has their theme set to twentytwelve. If these accounts time out it does NOT flush the cookie (shit WordPress design) and when you re-visit the SaaS dashboard site (staging or production) you get the error message noted above.

0 comments on “google_maps script missing slp_core prerequisite”

google_maps script missing slp_core prerequisite

Notice: Function WP_Scripts::add was called incorrectly.

The script with the handle “google_maps” was enqueued with dependencies that are not registered: slp_core.

Reproduction


Dev Notes

SLP Architecture

slp_core (WordPress/wp-content/plugins/store-locator-plus/js/slp_core.js)

slp_core is the WordPress handle for the slp_core.js file.
slp_core.js is the primary Google maps interface between WordPress and JavaScript

Where the slp_core is found in store-locator-plus v2603.03.01

slp_core references in slp v2603.03.01

slp_core is REGISTERED here: \SLP_Actions::wp_enqueue_scripts
slp_core is currently only enqueued here: \SLP_UI::render_shortcode


google_maps (Google public Google Map JavaScript loader)

This loads a URL similar to:
https://maps.googleapis.com/maps/api/js?libraries=geometry,marker&v=quarterly&language=en&region=US&key=<GOOGLE_API_KEY>&loading=async

In the JavaScript this is referenced as google.maps.*

Google Maps is only enqueued here with the google_maps hook: \SLPlus::enqueue_google_maps_script
* @used-by \SLPlus::nqGoogleMaps
* @used-by \SLP_Actions::wp_enqueue_scripts
* @used-by \SLP_Admin_UI::initialize via the WordPress admin_enqueue_scripts hook

Non Admin Implementation

google_maps is used for users that are not logged in (non-admin) when rendering the SLPLUS shortcode.

This is managed via \SLP_UI::render_shortcode

\SLP_Power_UI::at_startup adds google_maps as a js_requirement (managed by \SLP_BaseClass_UI as part of normal UI interface management). This is likely unnecessary.

JavaScript References

  • SLP
    • js/slp_core.js
  • Power add on (slp-power)
    • slp-power_userinterface.js
  • Premier add on (slp-premier)
    • js/markerclusterer.js
    • slp-premier_userinterface.js
Admin Implementation

This is called on the slp_manage_locations (Location Details) admin page: \SLP_Admin_UI::initialize
via add_action( ‘admin_enqueue_scripts’, array( $this, ‘enqueue_slp_core_and_google_maps’ ) );

JavaScript References

  • SLP
    • js/slp_core.js
    • admin-locations-tab.js
  • Premier add on (slp-premier)
    • admin-locations-tab.js
    • admin-settings-tab.js
    • admin.js

AI Actions

Prompt

@amelia – We need to fix a script enqueue issue on the Location Details page
___
The script with the handle “google_maps” was enqueued with dependencies that are not registered: slp_core.
__

This error is caused because the WordPress script with the handle slp_core is not enqueued.

__

Option 1: We could enqueue this by calling \SLP_UI::render_shortcode

For the JavaScript in slp_core to be fully functional it requires localized variables.
Currently this only happens in \SLP_UI::render_shortcode
The problem is that \SLP_UI::render_shortcode has the extra overhead:
– Generating a large HTML output string
– Firing a slp_after_render_shortcode action
We only want the JavaScript variables configured and then localized via \SLP_UI::localize_script

If we use this method, we would need to bypass the HTML output and slp_after_render_shortcode action hook processing.

The best way to hook that would be to rewrite \SLP_Admin_UI::initialize to call a new method:
– Replace add_action( ‘admin_enqueue_scripts’, array( $this->slplus, ‘enqueue_google_maps_script’ ) );
– With add_action( ‘admin_enqueue_scripts’, array( $this, ‘enqueue_slp_core_and_google_maps’ ) );

Create a new method \SLP_UI::enqueue_slp_core
– Extracts the first chunk of \SLP_UI::render_shortcode up to the wp_enqueue_script( ‘slp_core’ );
– It needs to accept the parameters from \SLP_UI::render_shortcode

Create a new method \SLP_Admin_UI::enqueue_slp_core_and_google_maps
– call the new \SLP_UI::enqueue_slp_core method
– call \SLPlus::enqueue_google_maps_script

Update \SLP_UI::render_shortcode to call \SLP_UI::enqueue_slp_core to replace the code that was moved to the new \SLP_UI::enqueue_slp_core method

AI Results

\SLP_UI::register_slp_scripts_if_needed is a duplicate of \SLP_Actions::wp_enqueue_scripts.
This unnecessary extra code.
Duplicate code should be avoided when possible.

Created \SLP_UI::enqueue_slp_core with admin_safe flag resulting in inefficient architecture.
This is only called with the admin_safe flag from \SLP_Admin_UI::enqueue_slp_core_and_google_maps.
The register_slp_scripts_if_needed call in the admin_safe short circuit block can be put inline in the calling method as a call to \SLP_Actions::wp_enqueue_scripts.
The admin_safe only method localize_script_admin_safe could should be in SLP_Admin_UI as it is an admin only method: \SLP_Admin_UI::localize_script_admin_safe.
The wp_enqueue_script( ‘slp_core’ ); call can be in the calling method as well.
Returning the $attributes array is not necessary.

My fixes to the AI work:

Rip out the admin_safe short circuit from SLP_UI and place the equivalent code in SLP_Admin_UI as these updates only related to admin hooks. SLP_UI relates to non-admin code and should not have admin-only methods in there. Us nqGoogleMaps in admin as that can certainly load in async versus defer mode.

in SLP_Admin_UI

	public function enqueue_slp_core_and_google_maps( string $hook = '' ): void {
		$slp_actions = SLP_Actions::get_instance();
		$slp_actions->wp_enqueue_scripts(); // misnomer - registers the slp_core script

		$this->localize_script_admin_safe();
		wp_enqueue_script( 'slp_core' );

		$this->slplus->nqGoogleMaps( $hook );
	}

	/**
	 * Localize only the data needed for admin enqueue paths without invoking shortcode SmartOptions callbacks.
	 */
	private function localize_script_admin_safe(): void {
		$scriptData = array(
			'options'              => is_array( $this->slplus->options ) ? $this->slplus->options : array(),
			'environment'          => array(
				'addons'      => $this->slplus->AddOns->get_versions(),
				'slp_version' => SLPLUS_VERSION,
			),
			'plugin_url'           => SLPLUS_PLUGINURL,
			'ajaxurl'              => admin_url( 'admin-ajax.php' ),
			'nonce'                => wp_create_nonce( 'wp_rest' ),
			'apikey'               => SLPlus::get_instance()->get_apikey(),
			'rest_url'             => rest_url( 'store-locator-plus/v2/' ),
			'messages'             => $this->get_messages(),
			'shortcode_attributes' => $this->js_attributes,
		);

		ksort( $scriptData['options'] );
		wp_add_inline_script(
			'slp_core',
			'const slplus = ' . wp_json_encode( $scriptData )
		);
	}

	/**
	 * Set the messages for us in the JS array.
	 *
	 * @return string[]
	 */
	private function get_messages(): array {
		$messages = $this->slplus->Text->get_text_group( 'messages' );

		return apply_filters( 'slp_js_messages', $messages );
	}

In SLP_UI

Move the localize_script_admin_save to the SLP_Admin_UI module where it belongs. Have register_slp-scripts_if_needed method call SLP_Actions->wp_enqueue_scripts in SLP_Actions.

	private function register_slp_scripts_if_needed(): void {
		$slp_actions = SLP_Actions::get_instance();
		$slp_actions->wp_enqueue_scripts();
	}

Update

The latest update needs to be reviewed. It is calling enqueue_google_maps_script from \SLP_Admin_UI::initialize
With add_action( ‘admin_enqueue_scripts’, array( $this, ‘enqueue_slp_core_and_google_maps’ ) );

Need to look at Premier interfaces listed above for Google Maps interactions.

Settings | Map | Map Center Fallback

This should be showing the Google Map to show the map center.