diff --git a/docs/src/theme/ApiItem/index.jsx b/docs/src/theme/ApiItem/index.jsx
new file mode 100644
index 000000000..c80cc3987
--- /dev/null
+++ b/docs/src/theme/ApiItem/index.jsx
@@ -0,0 +1,212 @@
+import React, { useEffect, useState } from "react";
+import OriginalApiItem from "@theme-original/ApiItem";
+
+export default function ApiItemWrapper(props) {
+ const [feedback, setFeedback] = useState(null);
+ const [comment, setComment] = useState("");
+ const [plausibleLoaded, setPlausibleLoaded] = useState(false);
+
+ useEffect(() => {
+ if (!document.getElementById("plausible-script")) {
+ const script = document.createElement("script");
+ script.src = "https://plausible.io/js/plausible.js";
+ script.defer = true;
+ script.async = true;
+ script.dataset.domain = window.location.hostname;
+ script.id = "plausible-script";
+
+ script.onload = () => {
+ setPlausibleLoaded(true);
+ };
+
+ document.body.appendChild(script);
+ } else {
+ setPlausibleLoaded(true);
+ }
+ }, []);
+
+ const sendPlausibleEvent = (feedbackValue, commentText = "") => {
+ if (plausibleLoaded && typeof window.plausible === "function") {
+ console.log("Sending event:", feedbackValue, commentText);
+ window.plausible("docs-feedback", {
+ props: {
+ feedback: feedbackValue,
+ comment: commentText,
+ page: window.location.pathname,
+ },
+ });
+ } else {
+ console.warn("Plausible not loaded yet. Event skipped.");
+ }
+ };
+
+ const handleYes = () => {
+ setFeedback("yes");
+ sendPlausibleEvent("yes");
+ };
+
+ const handleNo = () => {
+ setFeedback("no");
+ sendPlausibleEvent("no");
+ };
+
+ const handleSubmitComment = () => {
+ sendPlausibleEvent("no", comment);
+ setFeedback("submitted");
+ };
+
+ return (
+ <>
+
+ Was this page useful? +
++ Help us improve this page +
++ Thanks for your feedback! 🎉 +
+