# Custom JavaScript events

{% hint style="warning" %}
**We do not support code customizations**. This guide offers a basic reference for developers. Always test code changes on unpublished theme copies. For assistance, we recommend reaching out to a [verified Fluorescent partner](https://partners.fluorescent.co/).
{% endhint %}

For Stiletto, we've introduced **custom events** so developers can easily add their own functionality to the theme without needing to edit the theme's JavaScript files.

Use the **`custom-events.js`** file included in the theme to add all your custom scripts in one place and effortlessly hook into Stiletto's JavaScript.

{% hint style="info" %}
For intermediate developers, Stiletto also includes an unminified `theme.js` file that can be enabled to [edit the theme JavaScript](https://help.fluorescent.co/stiletto/for-developers/edit-theme-javascript) directly.
{% endhint %}

## Enable custom events

***

To enable custom events, you need to update the **`theme-globals.liquid`** to import the **`custom-events.js`** file that you'll be using for your scripts.

<details>

<summary><mark style="color:blue;"><strong>STEPS</strong></mark></summary>

1. Open the **`theme-globals.liquid`** file in the **Snippets** folder.
2. Find the **`useCustomevents`** variable and set it to **`true`**.

   ```jsx
   <div data-gb-custom-block data-tag="assign" data-useCustomEvents='false'></div>
   ```

</details>

&#x20;

## **Add scripts to custom-events.js**

***

Once you've enabled custom events, you can start adding your custom scripts to the **`custom-events.js`** file.

<details>

<summary><mark style="color:blue;"><strong>STEPS</strong></mark></summary>

1. Open the **`custom-events.js`** in the **Assets** folder
2. Add your scripts using the available exposed events or start from scratch and use this file to create something new.

</details>

&#x20;

## **Use exposed events**

***

We've listed all exposed events within the **`custom-events.js`** file so you can easily use and edit them there.

The following **exposed events** are available to use as a blueprint to get started:

### **Item added to cart**

This event fires when an item is added to the cart. The AJAX cart must be enabled for this event to be exposed. The product object is passed within the detail object.

```jsx
document.addEventListener("cart:item-added", function (evt) {
  console.log("Item added to the cart");
  console.log(evt.detail.product);
});

```

### **Cart updated**

This event fires when the cart has been updated. The AJAX cart must be enabled for the event to be exposed. The cart object is passed within the detail object.

```jsx
document.addEventListener("cart:updated", function (evt) {
  console.log("Cart updated");
  console.log(evt.detail.cart);
});
```

### **Cart error**

This event fires when an error occurs with adding an item to the cart. This error typically occurs when a product is unavailable due to insufficient stock. The error message is passed within the detail object.

```jsx
document.addEventListener("cart:error", function (evt) {
  console.log("Cart error");
  console.log(evt.detail.errorMessage);
});
```

### **Quick cart opened**

This event fires when the quick cart is opened. The AJAX cart must be enabled for the event to be exposed. The cart object is passed within the detail object.

```jsx
document.addEventListener("quick-cart:open", function (evt) {
  console.log("Quick cart opened");
  console.log(evt.detail.cart);
});
```

### **Quick cart closed**

This event fires when the quick cart is closed. The AJAX cart must be enabled for the event to be exposed.

```jsx
document.addEventListener("quick-cart:close", function () {
  console.log("Quick cart closed");
});
```

### **Product variant changed**

This event fires when an a variant product is selected. A **Variant selector** block must be enabled on the product template or featured product section for the event to be exposed. The selected variant object is passed within the detail object.

```jsx
document.addEventListener("product:variant-change", function (evt) {
  console.log("Product variant changed");
  console.log(evt.detail.variant);
});
```

### **Product quantity updated**

This event fires when the product quantity is updated. A **Quantity selector** block must be enabled on the product template or featured product section for the event to be exposed. The quantity and selected variant objects are passed within the detail object.

```jsx
document.addEventListener("product:quantity-update", function (evt) {
  console.log("Product quantity updated");
  console.log(evt.detail.quantity, evt.detail.variant);
});
```

### Quick view loaded

This event fires when a quick view modal is opened. The **Enable quick view** setting must be enabled.

```jsx
document.addEventListener("quick-view:loaded", function () {
  console.log("Quick view loaded");
});
```

&#x20;

## Refresh quick cart and cart count

***

The following event can be used to refresh the quick cart and header cart count:

`apps:product-added-to-cart`

For example:

```javascript
var event = new CustomEvent('apps:product-added-to-cart');
document.dispatchEvent(event);
```

&#x20;

{% hint style="info" %}
**How's Stiletto working for you?**

We built Stiletto with developers in mind. We're looking to create relationships with third-party developers using our themes and want to hear from you about what you're building.&#x20;

Please feel free to reach out with questions or introduce yourself by e-mailing us at <developers@fluorescent.co>
{% endhint %}

&#x20;

> **Related links**
>
> [Edit theme JavaScript](https://help.fluorescent.co/stiletto/general/editing-themes)\
> [Custom Liquid](https://help.fluorescent.co/stiletto/for-developers/custom-liquid)\
> [Custom CSS](https://help.fluorescent.co/stiletto/for-developers/custom-css)\
> [Custom fonts](https://help.fluorescent.co/stiletto/for-developers/custom-fonts)
