Reference image directly with react

How do I reference an image directly. What I mean is if I have

export default function ExamplePage() {
    return (
        <img src='some-image.png'>
    );
}

It will be a blank website with the image, instead of the image itself. I need to reference the image because this is used by the application to download images directly based on the GET parameters. How can I do this in react?

Testing for a particular date works locally, but not on GitHub

The task is to check if a certain date is a statutory holiday, by comparing a date against a list of known statutory holiday dates.

Here is the JSON list of stat holidays:

{
    "provinces": [
        {
            "name": "Ontario",
            "statutory": [
                {
                    "name": "Christmas",
                    "date": "2025-12-25"
                },
            ]
        ...

Here is the test:

describe("statHoliday", () => {
  test("should identify statutory holiday", () => {
    const statDay = new Date("2025-12-25T10:00:00.000");
    expect(isStatHoliday(statDay)).toBe(true);
  });
});

Here is the function to test the date:

function isStatHoliday(date) {
  const dateObject = new Date(date);
  const dateString = dateObject.toLocaleDateString();

  // "theProvince" here is set to Ontario 
  return !!theProvince.statutory.find(holiday => holiday.date === dateString);
}

When testing locally, this works fine. When I upload to GitHub, and the tests are run there, it fails:

Expected: true
Received: false

I assume this has something to do with time zones, specifically the routine toLocaleDateString(), but I’m not sure how to correct this. Locally, I am GMT-4, and I assume the GitHub server is in UTC?

Почему при последующих рендерах ширина правильная у второго элемента, а при первом нет? (ReactJS, useLayout, useRef) [closed]


Имеется такой код, при использовании useLayoutEffect, он должен подсчитать мне ширину каждого option, и при нажатии добавить ширину предшествующих элементов, чтобы выбрать текущий option, но при добавлении первых рендеров значение 2-го элемента 114, хотя должно быть 123, как это можно исправить?

import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";

type SelectProps = {
    options: string[]
}

const Select = ({
    options
}: SelectProps) => {
    const [currentOption, setCurrentOption] = useState(0);
    const ref = useRef(null);
    const [x, setX] = useState(0);
    const [widthElements, setWidthElements] = useState([0])
    const currentWidth = widthElements[currentOption + 1]
    
    const handleChangeOption = (index: number) => {
        setCurrentOption((prev) => prev = index)
        setX(widthElements.slice(0, index + 1).reduce((acc, el) => acc + el))
    }

    useLayoutEffect(() => {

        if (ref?.current?.children) {
            const widths = [...ref?.current?.children].map((value: HTMLElement) => value.offsetWidth)
            setWidthElements([0, ...widths])
        }
        console.log(widthElements)
        
    }, [currentWidth])
    
    
    return (
        <div className="relative bg-black-20 max-w-80 md:max-w-[368px] h-14 p-2 rounded-[0.5rem]">
            <div ref={ref} className="absolute flex z-1">
                {options.map((option, index) => (
                    <div
                        key={index + option}
                        className={`relative ${currentOption === index ? 'text-primary-50' : 'text-gray-300'} 
                        px-8 py-2 rounded-[0.5rem] link-regular text-xs md:text-base transition-all duration-200 ease-in-out
                        
                        `}
                        onClick={() => handleChangeOption(index)}
                    >
                        {option}
                    </div>
                ))}
            </div>
            <div className="relative w-full h-full overflow-hidden ">
               <div
                    style={{
                        width: currentWidth + 'px',
                        transform: `translateX(${x}px)`
                    }}
                    className={`absolute top-0 left-0 h-10 bg-primary-300 text-primary-50 rounded-[0.5rem]
                transition-all ease-in-out duration-200
            `} />

            </div>

        </div>)
}

export default Select;

how to overrides the components present in Puck editor and insert a new one from context

i was using puck editor for web builder and has some components , i created a chatBot component and context file , chatbot will return a html code and i will set that value in context value but i wnatthat code into my editor as soon i got that value , for example AI code is in editor of builder

clientEditor.tsx

"use client";

import type { Data } from "@measured/puck";
import { DropZone, Puck } from "@measured/puck";
import config from "../../../puck.config";
import { useEffect, useState } from "react";
import ChatBox from "../../../components/ChatBox/ChatBox";
import { useAppContext } from "../../../contexts/HtmlContext";



export function Client({ path, data }: { path: string; data: Partial<Data> }) {
  const [isOpen, setIsOpen] = useState(false);
  const { html } = useAppContext();

  function ToggleChatBox() {
    setIsOpen((prev) => !prev);
  }

  const [puckData, setPuckData] = useState<Partial<Data>>({});

  useEffect(() => {
    if (html) {
      const newData =
        typeof html === "string" ? JSON.parse(html) : html;
      setPuckData(newData);

    }
  }, [html]);

  return (
    <div>
      {isOpen && (
        <div className="chatbox-container">
          <ChatBox />
        </div>
      )}

      <button className="chatgpt-btn" onClick={ToggleChatBox}>
        {isOpen ? (
          <i className="bi bi-x-lg" style={{ fontSize: "24px" }}></i>
        ) : (
          <i className="bi bi-chat-dots-fill" style={{ fontSize: "24px" }}></i>
        )}
      </button>

      <Puck
        config={config}
        data={puckData}
        onPublish={async (data) => {
          await fetch("/puck/api", {
            method: "post",
            body: JSON.stringify({ data, path }),
          });
        }}
      />

     
    </div>
  );
}

chatBot.tsx


import React, { useRef } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import { useState } from "react";
import "./style.css";
import axios from "axios";
import { useAppContext } from "../../contexts/HtmlContext";

export default function ChatBox() {
  const [chatHistory, setChatHistory] = useState<
    { role: "user" | "ai"; text: string }[]
  >([]);
  const userMsg = useRef<HTMLInputElement>(null);
  const {  setHtml } = useAppContext();
  const [isReplied, setIsReplied] = useState(false);

  async function SubmitUserMsg() {
    if (!userMsg.current) {
      return;
    }

    const msg = userMsg.current.value;
    if (msg.trim().length <= 0) {
      return;
    }

    setChatHistory((prev) => [
      ...prev,
      { role: "user", text: msg },
      { role: "ai", text: "Thinking..." },
    ]);

    setIsReplied(false);
    userMsg.current.value = "";
    userMsg.current.focus();

    try {
      const res = await axios.post(`${process.env.NEXT_PUBLIC_URL}/api/chat`, {
        messages: msg,
      });
      if (res.data.isResponse) {
       
        if(res.data.isHtml){
          const blockData = {
            content: [
              {
                type: "RawHTMLBlock",
                props: {
                  html: res.data.AIreply,
                },
              },
            ],
          };
          setHtml(blockData);
          
          
            
              
         
        }
        setChatHistory((prev) => {
          const updated = [...prev];
          updated[updated.length - 1] = { role: "ai", text: res.data.AIreply };
          return updated;
        });

        setIsReplied(true);
      }
    } catch (e) {
        
      setChatHistory((prev) => {
        const updated = [...prev];
        updated[updated.length - 1] = {
          role: "ai",
          text: "Error in AI response",
        };
        return updated;
      });
    }
  }

  function copyToClipboard(text: string) {
    navigator.clipboard
      .writeText(text)
      .then(() => {

      })
      .catch((err) => {
        console.error("Failed to copy: ", err);
      });
  }

  return (
    <>
    <div id="webcrumbs" className="bg-white">
      <div className="container-lg rounded-3 shadow-lg p-0 overflow-hidden bg-gradient">
        <div className="bg-white bg-opacity-80 p-3 border-bottom">
          <div className="d-flex justify-content-between align-items-center">
            <div className="d-flex align-items-center">
              <div className="bg-primary rounded-circle d-flex align-items-center justify-content-center me-3 icon-container">
                <i className="bi bi-robot text-white"></i>
              </div>
              <div>
                <h5 className="mb-0 fw-bold text-dark">AI Assistant</h5>
              </div>
            </div>
          </div>
        </div>

        <div className="message-container p-3">
          {chatHistory.map((item, ind) => {
            if (item.role === "user") {
              return (
                <div className="d-flex mb-3 justify-content-end" key={ind}>
                  <div className="bg-white rounded-3 p-2 max-width-75 overflow-hidden">
                    <p className="mb-0 text-break">{item.text}</p>
                  </div>

                  <div className="bg-secondary rounded-circle d-flex align-items-center justify-content-center ms-3 icon-sm">
                    <i className="bi bi-person text-white"></i>
                  </div>
                </div>
              );
            } else {
              return (
                <div className="d-flex mb-3" key={ind}>
                  <div className="bg-primary rounded-circle d-flex align-items-center justify-content-center me-3 icon-sm">
                    <i className="bi bi-robot text-white"></i>
                  </div>
                  
                  <div className={isReplied ? 'ai-message-wrapper d-flex flex-column max-width-75' : 'd-flex flex-column max-width-75' }>
                    <div className="bg-white rounded-3 p-3 border shadow-sm w-100">
                      <p className="mb-0 text-dark">{item.text}</p>
                    </div>
                    <button className="copy-btn "
                      onClick={() => copyToClipboard(item.text)}
                    >
                      <i className="bi bi-clipboard"></i>
                    </button>
                  </div>
                </div>
              );
            }
          })}
        </div>

        <div className="bg-white bg-opacity-90 border-top p-3">
          <div className="d-flex align-items-center">
            <div className="position-relative flex-grow-1 me-2">
              <input
                onKeyDown={(e) => {
                  if (e.key === "Enter") {
                    e.preventDefault();
                    SubmitUserMsg();
                  }
                }}
                ref={userMsg}
                type="text"
                placeholder="Type your message..."
                className="form-control rounded-pill ps-3 pe-5 border-0 bg-light"
              />
              <button
                onClick={SubmitUserMsg}
                className="btn btn-primary position-absolute end-0 top-50 translate-middle-y rounded-circle p-0 d-flex align-items-center justify-content-center send-btn"
              >
                <i className="bi bi-send text-white"></i>
              </button>
            </div>
          </div>
        </div>
      </div>
    </div>

    </>
  );
}

puck.config.ts

import type { Config } from "@measured/puck";
import { DropZone } from "@measured/puck";
import Image from "next/image";
import React, { useState, useEffect } from "react";
import HTMLrender from "./components/HTMLrender";

type Props = {

  RawHTMLBlock: {
    html: string;
  };

};

export const config: Config<Props> = {
  components: {

    RawHTMLBlock: {
      render: HTMLrender,
      fields: {
        html: {
          type: "textarea",
          label: "HTML",
          
        },
      },
    },
}
}

Htmlrenderer.tsx

export default function HTMLrender({ html}: { html: string }) {
    console.log("HTMLrender component received html:", html);
    return (
        <div dangerouslySetInnerHTML={{ __html: html }} />
    )
}```

in console log
{
    "content": [
        {
            "type": "RawHTMLBlock",
            "props": {
                "html": "<button type="button" class="btn btn-primary">Click Me</button>"
            }
        }
    ]
}

Display UI only to the user (hide during screen sharing on Zoom or Google Meet)

I need a solution for:
I have a Chrome extension developed with React, and I want to add a new feature. When a user shares their screen on online platforms such as Zoom or Google Meet, the extension page should be invisible to the viewers watching the screen. However, the user sharing their screen and using the extension should still be able to see the extension page and perform tasks as needed.

How does the Grammarly Chrome extension work on Discord’s message/text field?

Does anyone know how grammarly extension managed to change discord’s message input/text field content, i need some help

i am creating a chrome extension that will modify the text inside the discord’s message input/text field (means if user typed ‘hellow’, my extension will remove the word ‘hellow’ from the discord’s message box and insert a new word ‘hello’ at that place). But looks like discord is using slate.js (a rich text editor) and slate store all the user typed words in a JSON like format in somewhere react’s virtual DOM i guess, that slate internal data looks like this this: [{“type”:”paragraph”,”children”:[{“text”:”hellow”}]}],

so even if my vanilla javascript extension code try to change the DOM input field’s content using “element.textContetnt = ‘new modifed text’“, it is not going to work, because as soon as user start typing another/next word, slate.js will revert all the DOM changes to its original JSON content (means everthing revert back to ‘hellow’ word), i have no idea how can i access that JSON data or react’s virtual DOM using my extension, i tried .innerHTML, .textContetnt, appendChild, execCommand, but seems like they are limited to DOM. but grammarly is easily changing/inserting new text when i click on red underlined words on message field on discord website

how these chrome extensions managed to easily modify react’s virtual DOM, i am new to this…

Show UI Only to User (Hide During Screen Sharing on Zoom/Google Meet)

I have a Chrome extension built with React. I want to add a new feature:

When the user shares their screen (on online platforms like Googlemet, etc) the extension should still be visible and usable only to the user, but should not be visible to others watching the shared screen.

So basically, the extension should open and work normally, but be hidden from screen sharing.

In your proposal, please tell me:
Is this possible? Yes or No?
Have you built something like this before?
What method or technique would you use to do this?

In Angular 19, on keydown event,Spacebar is not getting ignored

I am using Angular 19 keydown event on Textbox. It should allow only numbers and decimals up to 2 places. Valid numbers are: 123.45, 675.1, 12345 etc.

This works properly for all keys except Spacebar. Even though I have ignored it. On clicking Spacebar, 2 three times it inserts space in Textbox. My code is below:

onKeyDown = (event:KeyboardEvent): boolean {

const regex = new RegExp(/^[0-9.]*$/);  
if(!regex.test(event.key) && event.key.length === 1 && event.code !== "Space") {
    event.preventDefault();
    return false;
}     

const target = event.target as HTMLInputElement;
const start = target?.selectionStart || 0;
const value = target.value.substring(0,start)+event.key+target.value.substring(start);                                            

const newRegex = new RegExp(/^(0|[1-9]d*)?(.d{0,2})?$/
if(!newRegex.test(value) && event.key.length === 1 && event.code !== "Space") {
   event.preventDefault();
   return false;
}
return true;

}

Declaring state outside of a functional component

Is that a valid approach to move state logic out of function component code like this?

import { createStore } from 'solid-js/store'

const [user, setUser] = createStore(
  {name: 'Alice', params: {age: 25}},
)

const increaseAge = () => setUser('params', 'age', age => age + 1)

export default function UserProfile() {
  return (
    <div>
      <p>Name: {user.name}</p>
      <p>Age: {user.params.age}</p>
      <div>
        <button onClick={increaseAge}>Increase age</button>
      </div>
    </div>
  )
}

XMLHttpRequest to ReqRes API returns 401 Unauthorized despite correct GET URL”

I’m trying to fetch user data from the ReqRes API using plain JavaScript and XMLHttpRequest inside a basic HTML file. The API is public and should not require authentication for a simple GET request.

<!DOCTYPE html>
<html>
<body>
  <p id="output">Default text</p>
  <input id="user_number" placeholder="Enter User ID (e.g. 2)">
  <button onclick="update_user()">Submit</button>

  <script type="text/javascript">
     function update_user() {
      let user_number = document.getElementById("user_number").value;
      let httpRequest = new XMLHttpRequest();

       httpRequest.onreadystatechange = function () {
         if (this.readyState === 4) {
           if (this.status === 200) {
             let user_data = JSON.parse(this.responseText);
             document.getElementById("output").innerHTML =
               "Name: " + user_data.data.first_name + " " + user_data.data.last_name;
           } else {
             document.getElementById("output").innerHTML =
               "Error: " + this.status + " (" + this.statusText + ")";
           }
          }
       };

       httpRequest.open("GET", "https://reqres.in/api/users/" + user_number);
       httpRequest.send();
     }
   </script>
  </body>
 </html>

Even when I enter a valid user ID like 2, I keep getting:

Error: 401 (Unauthorized)
I’m not adding any headers or tokens.

The URL works fine directly in the browser:
https://reqres.in/api/users/2 returns valid JSON.

I’m serving the file using a local HTTP server (python -m http.server), not as a file:// URI.

Tested in multiple browsers — same issue.

What I’ve Tried:
Inspecting the Network tab → shows 401 status.

Confirmed that no Authorization header is being sent.

Tried using fetch() instead of XMLHttpRequest → same result.

Expected Result:
A 200 OK response and user data like:
{
“data”: {
“id”: 2,
“first_name”: “Janet”,

}
}

Question:
Why am I receiving a 401 Unauthorized error when calling a public GET endpoint on ReqRes, and how can I fix this?

Creating a website that imitates a desktop environment with internal web browser and various pages inspired by GTA 4/5’s eyefind.info

I have a concept for a website & am struggling to find resources that would help me execute the concept. I am somewhat familiar with HTML & have some experience with various WYSIWYG editors.

I would like to create a website that imitates a desktop environment w/ its own internal web browser, faux websites & search functionality. My inspiration for this concept is eyefind.info from the Grand Theft Auto series. The goal is to create a framework that imitates / parodies internet culture of the early 2000s. I want the user to feel as though they have logged onto their computer and are browsing the internet in this fictional world.

I have seen others create desktop environments for the purpose of personal portfolios etc., but these systems seem too complex for my needs. I simply want to create the facade or illusion of being logged in & browsing this fictional world’s web.

For those that have never played GTA 4/5, you can watch this video to see what I’m after. Basically, the user accesses a computer in game which brings up a page that imitates a generic early-2000s desktop. The user can then click on “Web” to bring up an overlay that imitates a web browser & scrolls independently of the “desktop” background. The user can then navigate the “internet” in various ways, either by clicking various links on the hub, utilizing search functionality or by manually inputting a “domain” name that will point to a specific page.

The domain & search functionalities do not need to communicate with the rest of the internet or search engines such as google, all “domains” and search queries will either point to an internal webpage, show search results for internal pages or simply return a generic error such as “this website does not exist” or “no results found”.

I apologize for the broad nature of this question & for not providing samples of previous attempts, I simply don’t know where to look to find the information I need to even begin a project like this.

Storybook/react/webpack5 unable to index

I have a project (node 24, react16, webpack5 & babel )and I’m trying to integrate it with storybook9; when I run the script npm run storybook

It throws:

...
Unable to index ./src/components/Button/stories/index.story.js:
  Error: Invariant failed: No matching indexer found for /Users/me/my-project/src/components/Button/stories/index.story.js
...

main.js

/** @type { import('@storybook/react-webpack5').StorybookConfig } */
const config = {
  stories: [ "../src/**/stories/index.story.@(js|jsx)" ],
  addons: [
    "@storybook/addon-docs",
    "@storybook/addon-webpack5-compiler-babel"
  ],
  framework: {
    name: "@storybook/react-webpack5",
    options: {
        fsCache: true,
        lazyCompilation: true,
      },
  },
};
export default config;

and my story file is

import React, { lazy } from 'react';
import { fn } from 'storybook/test';

import Button from '..';

const InnerComponent = lazy(() => new Promise((resolve) => {
  setTimeout(() => resolve(import('./mockComponent')), 1000);
}));
const Loader = () => <div>Loading...</div>;

export default {
  title: 'Button',
  component: Button,
  tags: ['autodocs'],
  args: {
    Loader,
    Component: InnerComponent,
  },
};

Am I missing something?

array.filter not returning array on click

i am trying to filter() an array using buttons instead of using an input fields when i use console.log() it return the information i want but when i use return nothing is happening

my array looks something like this

let rankList = [
{"invoice_no": "20174", 
"invoice_item_final_amount": 81.86, 
"invoice_total_tax": 40.98, 
"invoice_created_date": "5/31/2011", 
"invoice_customer": "David Lee", 
"invoice_project": "Project E", 
"invoice_tag": "food", 
"invoice_due_date": "6/6/2022", 
"invoice_status": "Paid"
}
...]

array = []

invoice_status can have serveral values eg, unpaid, paid

this is my function for filtering the array

function btnfilter(filter = null){
   let dataTable_filter = filter; 
   if(dataTable_filter != null){
      let temp_array = rankList.filter(function(object){
          return object.invoice_status === filter;
      });
      array = temp_array;
   }else{
      array = rankList;
   }
}

and i am trying to call btnfilter using the click event handler

const unpaidBtn = document.querySelector('[data-quickbtn="unpaid"]');
unpaidBtn?.addEventListener("click", () => {
   btnfilter("Unpaid");
})

but if i call the btnfilter() directly and change it to

function btnfilter(filter = "Unpaid"){
    let dataTable_filter = filter; 
    if(dataTable_filter != null){
        let temp_array = rankList.filter(function(object){
           return object.invoice_status === filter;
        });
       array = temp_array;
    }else{
    array = rankList;
}

}

it works but i cant get it to work on click button

sorry english is not my stongest subject

if i console.log() i get true results i wanting but the second i use return nothing works

JS Library for building queries graphically [closed]

I am trying to build a website which allows the non-technical user to query data via UI elements. This would include selecting values for keys with >/</>=/<=/==/!= etc., which is fairly easy, but also creating arbitrarily complex combinations of and/or groups (and not). This seems like a common pattern; are there any good JS frameworks/libraries (ideally react) that provide this kind of UI out of the box?

JavaScript cart checkout isn’t working properly

I’m using JavaScript for my jewelry e-commerce website for a functional checkout experience, but I’m stuck on where I went wrong since in my code since I’m new to computer programming. I’m having an issue with const $cartElement being declared but not read.

$(document).ready(function() {
  // cache jquery selector
  const $menuCartElement = $('.menu-cart');
  const $cartsItemsElement = $('.cart-list');
  const $cartElement = $('.cart');
  const $productElement = $('.product');
  // initialize cart items count
  let cart = [];

  //m function to add product to the cart
  function addToCart(productElement) {
    const $productElement = $(productElement);
    const productId = $productElement.data('product');
    const productName = $productElement.data('product-title').text();
    const productPrice = parseFloat($productElement.data('product-price').text().replace('$', ''));
    const productImage = $productElement.find('.product-img img').attr('src');

    let existingItem = cart.find(item => item.id === productId);

    if (existingItem) {
      existingItem.quantity += 1;
    } else {
      const newItem = {
        id: productId,
        name: productName,
        price: productPrice,
        image: productImage,
        quantity: 1
      };
      // Add new item to cart
      cart.push(newItem);
    }
    // Update cart count
    updateCartCount();
    // re-render cart items
    renderCartItems();
  }
  // function to update cart count
  function updateCartCount() {
    const itemcount = cart.reduce((total, item) => total + item.quantity, 0);
    $menuCartElement.find('.cart-count').text(itemcount);
  }

  // function to render cart items
  function renderCartItems() {
    //clear existing items
    $cartsItemsElement.empty();

    if (cart.length === 0) {
      //display image of empty cart
      $cartsItemsElement.html(`
          <div class="cart-empty">
            <img src="images/empty-cart.png" alt="Empty Cart">
            <p>Your Cart is Empty</p>
          </div>
        `);
    } else {
      // iterate through cart items and display them
      $.each(cart, function(index, item) {
        const $cartItemElement = $(`<div class="cart-item"></div`);
        $cartsItemsElement.html(`
             <img class="cart-item-image" src="${item.image}" alt="${item.name}">
             <div class="cart-item-desc">
               <div class="cart-item-title">${item.name}</div>
               <div class="cart-item-quantity">
                <button class="change-quanity" data-id="$(item.id)" data-action="decrease">-</button>
                <button class="change-quanity" data-id="${item.id}" data-action="increase">+</button>
                </div>
                </div>
                <div class="cart-item-price">$${(item.price * item.quantity).toFixed(2)}</div>
                <button class="cart-item-remove" data-id="${item.id}"><i class="fa-solid fa-trash"></i></button>
          `);
        $cartsItemsElement.append($cartItemElement);

      })




    }
    // Update cart count
    updateOrderSummaery();
  }

  // function to update order summary
  function updateOrderSummaery() {
    const subtotal = cart.reduce((total, item) => total + item.price * item.quantity, 0);
    const tax = subtotal * 0.15; // Assuming 15% tax
    const total = subtotal + tax;

    $('#total-price .cart-amout-value').text(`$${subtotal.toFixed(2)}`);
    $('#tax .cart-amount-value').text(`$${tax.toFixed(2)}`);
    $(`#final-price .cart-amount-value`).text(`$${total.toFixed(2)}`);
  }

  // event handler

  // event listener for adding product to the cart
  $productElement('.product-cart-btn').on('click', function() {
    const productElement = $(this).closest('.product');
    addToCart(productElement);

  })
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<!--==cart======================-->
<div class="cart">
  <h3 class="cart-title">Your Cart</h3>
  <div class="cart-list">
    <!--==app.js=========================-->
  </div>
  <div class="divider"></div>
  <div class="cart-action">
    <div class="cart-amount" id="total-price">
      <span>Subtotal</span>
      <span class="cart-amout-value">$0.00</span>
    </div>
    <div class="cart-amount" id="tax">
      <span>Tax included (15%)</span>
      <span class="cart-amount-value">$0.00</span>
    </div>
    <div class="cart-amount" id="final-price">
      <span>Total</span>
      <span class="cart-amount-value">$0.00</span>
    </div>
    <button class="cart-btn">Checkout</button>
  </div>
</div>

</div>

</div>
</section>