feedback-vos 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,393 @@
1
+ 'use strict';
2
+
3
+ var phosphorReact = require('phosphor-react');
4
+ var react = require('@headlessui/react');
5
+ var react$1 = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var html2canvas = require('html2canvas');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var html2canvas__default = /*#__PURE__*/_interopDefault(html2canvas);
12
+
13
+ // src/lib/svg-assets.ts
14
+ var bugImageUrl = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuNzUwMDcgNEM4Ljc1MDA3IDMgOC4wMDAwNyAwIDYuMzEyMDcgMEM0LjYyNDA3IDAgNC43NTAwNyAyIDUuNzUwMDcgMkM2Ljc1MDA3IDIgNi43NTAwNyA0IDYuNzUwMDcgNUM2Ljc1MDA3IDYgNy43NTAwNyA0IDcuNzUwMDcgNFpNMy41NjcwNyA1LjcyQzQuNTY3MDcgNC43MiAzLjgxNzA3IDEuNzIgMi4xMjkwNyAxLjcyQzAuNDQxMDY4IDEuNzIgMC41NjcwNjggMy43MiAxLjU2NzA3IDMuNzJDMi41NjcwNyAzLjcyIDIuNTY3MDcgNS43MiAyLjU2NzA3IDYuNzJDMi41NjcwNyA3LjcyIDMuNTY3MDcgNS43MiAzLjU2NzA3IDUuNzJaIiBmaWxsPSIjQUE4REQ4Ii8+CjxwYXRoIGQ9Ik0yOS45NDIgMzIuODU2QzMwLjEzMSAzMy42NjQgMzEuMTY5IDM1LjEzNiAzMS45NzQgMzQuOTQ3QzMyLjc4IDM0Ljc1NyAzMy4wNTEgMzIuOTc2IDMyLjg2MiAzMi4xN0MzMi42NzMgMzEuMzYyIDMxLjg2NCAzMC44NjMgMzEuMDU4IDMxLjA1M0MzMC4yNTMgMzEuMjQzIDI5Ljc1MiAzMi4wNSAyOS45NDIgMzIuODU2Wk0yNC41MDggMzMuNTA1QzI0LjUxMSAzNC4zMzUgMjUuMTg5IDM2LjAwMyAyNi4wMTcgMzZDMjYuODQ1IDM1Ljk5NiAyNy41MTEgMzQuMzIzIDI3LjUwOCAzMy40OTRDMjcuNTA1IDMyLjY2NSAyNi44MzEgMzEuOTk3IDI2LjAwMyAzMS45OTlDMjUuMTc1IDMyLjAwMyAyNC41MDUgMzIuNjc2IDI0LjUwOCAzMy41MDVaTTE5LjIzNyAzMS4wNTlDMTguOTExIDMxLjgyMyAxOC44NzIgMzMuNjIyIDE5LjYzMyAzMy45NDlDMjAuMzk2IDM0LjI3MyAyMS42NyAzMy4wMDIgMjEuOTk2IDMyLjIzOUMyMi4zMjEgMzEuNDc3IDIxLjk2OCAzMC41OTYgMjEuMjA3IDMwLjI2OUMyMC40NDUgMjkuOTQ0IDE5LjU2NCAzMC4yOTYgMTkuMjM3IDMxLjA1OVpNMTQuMjA2IDIwLjAxOUMxMy4zOTQgMjAuMTkxIDExLjg5OCAyMS4xOTIgMTIuMDY3IDIyLjAwMkMxMi4yNCAyMi44MTIgMTQuMDEyIDIzLjEyNiAxNC44MjQgMjIuOTU1QzE1LjYzNSAyMi43ODQgMTYuMTUzIDIxLjk4OCAxNS45ODQgMjEuMTc4QzE1LjgxMiAyMC4zNjggMTUuMDE5IDE5Ljg0OCAxNC4yMDYgMjAuMDE5Wk0xMi4xNjkgMTUuMDE5QzExLjM1NyAxNS4xOTEgOS44NjEwNCAxNi4xOTIgMTAuMDMgMTcuMDAyQzEwLjIwMyAxNy44MTIgMTEuOTc1IDE4LjEyNiAxMi43ODcgMTcuOTU1QzEzLjU5OCAxNy43ODQgMTQuMTE2IDE2Ljk4OCAxMy45NDcgMTYuMTc4QzEzLjc3NSAxNS4zNjggMTIuOTgxIDE0Ljg0OCAxMi4xNjkgMTUuMDE5WiIgZmlsbD0iIzc0NEVBQSIvPgo8cGF0aCBkPSJNMjcuNTc5MSAzNEMzMC40MSAzNCAzMi41MDUgMzMuMTIzIDMyLjg0NSAzMi45NzNDMzUuMTE2MSAzMS45NjMgMzYuMTM4MSAyOS4zMDQgMzUuMTI5MSAyNy4wMzRDMzQuMTMwMSAyNC43ODQgMzEuNTEzMSAyMy43NTkgMjkuMjU3MSAyNC43MkMyOS4xMjQxIDI0Ljc3IDI3LjQ2NDEgMjUuMzY5IDI1LjkxNDEgMjQuNjQ4QzI0LjA2MzEgMjMuNzg3IDIyLjkxOTEgMjEuMzM5IDIyLjI4NjEgMTkuNDM5QzIyLjE0MjEgMTkuMDA5IDIxLjkwMTEgMTguMTY1IDIxLjYgMTcuMTIzQzE5LjczNDEgMTAuNjUyIDE4Ljc2ODEgOC44Mzc5OSAxNy42MTcxIDcuMzAyOTlDMTMuOTA2IDIuMzUxOTkgOC4wMjUwNSAyLjAwNjk5IDUuMTM0MDUgMi41ODY5OUMyLjY5NzA1IDMuMDczOTkgMS4xMTYwNSA1LjQ0NDk5IDEuNjA0MDUgNy44ODE5OUMyLjA5MjA1IDEwLjMyIDQuNDY0MDUgMTEuOTAyIDYuOTAwMDUgMTEuNDEyQzcuMDYyMDUgMTEuMzg2IDkuMTA0MDUgMTEuMTA2IDEwLjMyNDEgMTIuNTgxQzEwLjk2NzEgMTMuODY4IDEyLjQwNDEgMTcuNzA5IDEyLjk1NDEgMTkuNjE1QzEzLjMwMDEgMjAuODE0IDEzLjU4MzEgMjEuNzg2IDEzLjc0ODEgMjIuMjgyQzE1LjUyMTEgMjcuNTk5IDE4LjQxNDEgMzEuMTc1IDIyLjM1MTEgMzIuOTExQzI0LjIwMzEgMzMuNzI5IDI2LjAwNTEgMzQgMjcuNTc5MSAzNFoiIGZpbGw9IiM5MjY2Q0MiLz4KPHBhdGggZD0iTTcuMDE3MDkgNkM3LjU2OTM3IDYgOC4wMTcwOSA1LjU1MjI4IDguMDE3MDkgNUM4LjAxNzA5IDQuNDQ3NzIgNy41NjkzNyA0IDcuMDE3MDkgNEM2LjQ2NDgxIDQgNi4wMTcwOSA0LjQ0NzcyIDYuMDE3MDkgNUM2LjAxNzA5IDUuNTUyMjggNi40NjQ4MSA2IDcuMDE3MDkgNloiIGZpbGw9IiMyMDIwMjQiLz4KPHBhdGggZD0iTTMxLjI1ODEgMzIuOTY0QzMxLjE2OTEgMzIuOTY0IDMxLjA3ODEgMzIuOTUyIDMwLjk4OTEgMzIuOTI4QzMwLjQ1NzEgMzIuNzggMzAuMTQ1MSAzMi4yMjkgMzAuMjkzMSAzMS42OTdDMzEuMDUwMSAyOC45NzUgMjkuNTIzMSAyNy4xNTUgMjkuNTA4MSAyNy4xMzdDMjkuMTQ5MSAyNi43MTggMjkuMTk2MSAyNi4wODYgMjkuNjE1MSAyNS43MjdDMzAuMDMzMSAyNS4zNjggMzAuNjY2MSAyNS40MTUgMzEuMDI1MSAyNS44MzRDMzEuMTE3MSAyNS45NDEgMzMuMjU5MSAyOC40OTQgMzIuMjIwMSAzMi4yMzFDMzIuMDk4MSAzMi42NzQgMzEuNjk1MSAzMi45NjQgMzEuMjU4MSAzMi45NjRaTTI0LjA1OTEgMzIuNDAxQzIzLjgxNDEgMzIuNDAxIDIzLjU2OTEgMzIuMzEyIDIzLjM3NTEgMzIuMTMxQzIyLjk3MjEgMzEuNzUzIDIyLjk1MTEgMzEuMTIgMjMuMzI4MSAzMC43MTdDMjQuODEzMSAyOS4xMyAyNC43ODExIDI2LjUyNCAyNC43ODAxIDI2LjQ5N0MyNC43NjQxIDI1Ljk0NSAyNS4xOTkxIDI1LjQ4NSAyNS43NTIxIDI1LjQ2OUMyNi4yOTQxIDI1LjQ2NCAyNi43NjUxIDI1Ljg4OCAyNi43ODAxIDI2LjQ0MUMyNi43ODQxIDI2LjU4IDI2Ljg1MzEgMjkuODc4IDI0Ljc4OTEgMzIuMDg1QzI0LjU5MjEgMzIuMjk1IDI0LjMyNTEgMzIuNDAxIDI0LjA1OTEgMzIuNDAxWk0xNS41MTcxIDIzLjcwNUMxNS4wMzcxIDIzLjcwNSAxNC42MTMxIDIzLjM1OCAxNC41MzIxIDIyLjg2OEMxNC40NDIxIDIyLjMyNCAxNC44MTAxIDIxLjgwOCAxNS4zNTUxIDIxLjcxOUMxOC40MjkxIDIxLjIwOSAyMC4xMjkxIDE5LjM0MiAyMC4xNDYxIDE5LjMyM0MyMC41MTExIDE4LjkxMyAyMS4xNDQxIDE4Ljg3NCAyMS41NTUxIDE5LjIzOUMyMS45NjcxIDE5LjYwNCAyMi4wMDgxIDIwLjIzMiAyMS42NDYxIDIwLjY0NUMyMS41NTkxIDIwLjc0NCAxOS40OTAxIDIzLjA2IDE1LjY4MjEgMjMuNjkxQzE1LjYyNjEgMjMuNzAxIDE1LjU3MTEgMjMuNzA1IDE1LjUxNzEgMjMuNzA1Wk0xOC40MzgxIDI4LjU2MkMxOC4wMTMxIDI4LjU2MiAxNy42MTkxIDI4LjI5IDE3LjQ4NDEgMjcuODY0QzE3LjMxODEgMjcuMzM4IDE3LjYxMDEgMjYuNzc1IDE4LjEzNjEgMjYuNjA5QzIwLjgyOTEgMjUuNzU2IDIyLjAxNjEgMjMuNzc5IDIyLjAyODEgMjMuNzU5QzIyLjMwODEgMjMuMjgyIDIyLjkyMDEgMjMuMTIyIDIzLjM5NjEgMjMuNDAyQzIzLjg3MzEgMjMuNjgxIDI0LjAzMjEgMjQuMjk1IDIzLjc1MzEgMjQuNzdDMjMuNjkwMSAyNC44NzggMjIuMTU4MSAyNy40MzMgMTguNzQwMSAyOC41MTRDMTguNjM5MSAyOC41NDcgMTguNTM3MSAyOC41NjIgMTguNDM4MSAyOC41NjJaTTEzLjgxOTEgMTcuODkyQzEzLjMyMzEgMTcuODkyIDEyLjg5MjEgMTcuNTIzIDEyLjgyODEgMTcuMDE3QzEyLjc1OTEgMTYuNDY5IDEzLjE0NzEgMTUuOTY5IDEzLjY5NTEgMTUuODk5QzE2LjM4NDEgMTUuNTU5IDE4LjM1MjEgMTMuOTI4IDE4LjM3MTEgMTMuOTExQzE4Ljc5MzEgMTMuNTU3IDE5LjQyNDEgMTMuNjA4IDE5Ljc3OTEgMTQuMDNDMjAuMTM1MSAxNC40NTEgMjAuMDg0MSAxNS4wOCAxOS42NjQxIDE1LjQzN0MxOS41NjcxIDE1LjUyIDE3LjI0NDEgMTcuNDY2IDEzLjk0NjEgMTcuODgzQzEzLjkwMzEgMTcuODg5IDEzLjg2MTEgMTcuODkyIDEzLjgxOTEgMTcuODkyWk0xMS45OTgxIDEzLjEyNUMxMS41NzMxIDEzLjEyNSAxMS4xNzkxIDEyLjg1MiAxMS4wNDQxIDEyLjQyNEMxMC44NzkxIDExLjg5NyAxMS4xNzExIDExLjMzNiAxMS42OTgxIDExLjE3QzE0LjgyODEgMTAuMTg3IDE1Ljk1MTEgOC40NzggMTUuOTk3MSA4LjQwNkMxNi4yOTIxIDcuOTQ0IDE2LjkwODEgNy44MDEgMTcuMzcyMSA4LjA5NEMxNy44MzcxIDguMzg2IDE3Ljk4MzEgOC45OTMgMTcuNjk2MSA5LjQ2QzE3LjYzNjEgOS41NTcgMTYuMTkwMSAxMS44NTYgMTIuMjk3MSAxMy4wNzlDMTIuMTk4MSAxMy4xMSAxMi4wOTcxIDEzLjEyNSAxMS45OTgxIDEzLjEyNVoiIGZpbGw9IiM3NDRFQUEiLz4KPC9zdmc+";
15
+ var ideaImageUrl = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMzUiIHZpZXdCb3g9IjAgMCAyMyAzNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIyLjUgMTAuOTJDMjIuNSAxNy4zNTkgMTcuNSAxOC4zNTkgMTcuNSAyNC4zNkMxNy41IDI3LjQ1OCAxNC4zNzcgMjcuNzE5IDEyIDI3LjcxOUM5Ljk0NyAyNy43MTkgNS40MTQgMjYuOTQgNS40MTQgMjQuMzU4QzUuNDE0IDE4LjM2IDAuNSAxNy4zNiAwLjUgMTAuOTJDMC41IDQuODg5IDUuNzg1IDAgMTEuNTgzIDBDMTcuMzgzIDAgMjIuNSA0Ljg4OSAyMi41IDEwLjkyWiIgZmlsbD0iI0ZGREQ4MyIvPgo8cGF0aCBkPSJNMTUuNjY3IDMyLjM2QzE1LjY2NyAzMy4xODggMTMuNDMzIDM0Ljg2IDExLjUgMzQuODZDOS41NjcwMSAzNC44NiA3LjMzMzAxIDMzLjE4OCA3LjMzMzAxIDMyLjM2QzcuMzMzMDEgMzEuNTMyIDkuNTY2MDEgMzEuODYgMTEuNSAzMS44NkMxMy40MzMgMzEuODYgMTUuNjY3IDMxLjUzMiAxNS42NjcgMzIuMzZaIiBmaWxsPSIjQ0NENkREIi8+CjxwYXRoIGQ9Ik0xNi4yMDcgMTAuMTUzQzE1LjgxNiA5Ljc2MTk5IDE1LjE4NCA5Ljc2MTk5IDE0Ljc5MyAxMC4xNTNMMTEuNSAxMy40NDZMOC4yMDcwMSAxMC4xNTNDNy44MTYwMSA5Ljc2MTk5IDcuMTg0MDEgOS43NjE5OSA2Ljc5MzAxIDEwLjE1M0M2LjQwMjAxIDEwLjU0NCA2LjQwMjAxIDExLjE3NiA2Ljc5MzAxIDExLjU2N0wxMC41IDE1LjI3NFYyNS44NkMxMC41IDI2LjQxMyAxMC45NDggMjYuODYgMTEuNSAyNi44NkMxMi4wNTIgMjYuODYgMTIuNSAyNi40MTMgMTIuNSAyNS44NlYxNS4yNzRMMTYuMjA3IDExLjU2N0MxNi41OTggMTEuMTc2IDE2LjU5OCAxMC41NDQgMTYuMjA3IDEwLjE1M1oiIGZpbGw9IiNGRkNDNEQiLz4KPHBhdGggZD0iTTE3LjUgMzAuODZDMTcuNSAzMS45NjQgMTYuNjA0IDMyLjg2IDE1LjUgMzIuODZIOC41QzcuMzk2IDMyLjg2IDYuNSAzMS45NjQgNi41IDMwLjg2VjI0Ljg2SDE3LjVWMzAuODZaIiBmaWxsPSIjOTlBQUI1Ii8+CjxwYXRoIGQ9Ik01LjQ5OSAzMS44NkM1LjAxOSAzMS44NiA0LjU5NSAzMS41MTMgNC41MTQgMzEuMDI0QzQuNDIzIDMwLjQ4IDQuNzkxIDI5Ljk2NCA1LjMzNiAyOS44NzRMMTcuMzM2IDI3Ljg3NEMxNy44OCAyNy43NzYgMTguMzk2IDI4LjE1MSAxOC40ODYgMjguNjk2QzE4LjU3NyAyOS4yNCAxOC4yMDkgMjkuNzU2IDE3LjY2NCAyOS44NDZMOS42NjQgMzEuODQ2QzkuNjA5IDMxLjg1NiA5LjU1MyAzMS44NiA1LjQ5OSAzMS44NlpNNS40OTkgMjcuODZDNS4wMTkgMjcuODYgNC41OTUgMjcuNTEzIDQuNTE0IDI3LjAyNEM0LjQyMyAyNi40OCA0Ljc5MSAyNS45NjQgNS4zMzYgMjUuODc0TDE3LjMzNiAyMy44NzRDMTcuODggMjMuNzc3IDE4LjM5NiAyNC4xNTEgMTguNDg2IDI0LjY5NkMxOC41NzcgMjUuMjQgMTguMjA5IDI1Ljc1NiAxNy42NjQgMjUuODQ2TDkuNjY0IDI3Ljg0NkM5LjYwOSAyNy44NTYgOS41NTMgMjcuODYgNS40OTkgMjcuODZaIiBmaWxsPSIjQ0NENkREIi8+Cjwvc3ZnPg==";
16
+ var thoughtImageUrl = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzNiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM1LjE2NjYgMTAuODc1QzM1LjE2NjYgNy4wMDkgMzIuMDMyNiAzLjg3NSAyOC4xNjY2IDMuODc1QzI2Ljk5OTYgMy44NzUgMjUuOTAxNiA0LjE2NSAyNC45MzQ2IDQuNjY5QzIyLjg1MjYgMS44NDIgMTkuNTA5NiAwIDE1LjcyOTYgMEMxMC41OTc2IDAgNi4yNTQ2MyAzLjM4IDQuODA2NjMgOC4wMzZDMi4xNDg2MyA4LjY1MyAwLjE2NjYyNiAxMS4wMyAwLjE2NjYyNiAxMy44NzVDMC4xNjY2MjYgMTYuODU0IDIuMzQwNjMgMTkuMzIgNS4xODc2MyAxOS43ODhDNS40MDM2MyAyMy43MzcgOC42NjQ2MyAyNi44NzUgMTIuNjY2NiAyNi44NzVDMTQuODQyNiAyNi44NzUgMTYuNzk2NiAyNS45NDIgMTguMTY2NiAyNC40NjJDMTkuNTM2NiAyNS45NDIgMjEuNDg5NiAyNi44NzUgMjMuNjY2NiAyNi44NzVDMjcuODA5NiAyNi44NzUgMzEuMTY2NiAyMy41MTggMzEuMTY2NiAxOS4zNzVDMzEuMTY2NiAxOC42NjUgMzEuMDYxNiAxNy45ODEgMzAuODc3NiAxNy4zM0MzMy4zOTY2IDE2LjI3MSAzNS4xNjY2IDEzLjc4IDM1LjE2NjYgMTAuODc1WiIgZmlsbD0iIzg1QzhGOCIvPgo8cGF0aCBkPSJNNC4xNjY2MyAzMi44NzVDNS44MjM0OCAzMi44NzUgNy4xNjY2MyAzMS41MzE5IDcuMTY2NjMgMjkuODc1QzcuMTY2NjMgMjguMjE4MSA1LjgyMzQ4IDI2Ljg3NSA0LjE2NjYzIDI2Ljg3NUMuNTA5NzcgMjYuODc1IDEuMTY2NjMgMjguMjE4MSAxLjE2NjYzIDI5Ljg3NUMxLjE2NjYzIDMxLjUzMTkgMi41MDk3NyAzMi44NzUgNC4xNjY2MyAzMi44NzVaIiBmaWxsPSIjODVDOEY4Ii8+Cjwvc3ZnPg==";
17
+ function CloseButton() {
18
+ return /* @__PURE__ */ jsxRuntime.jsx(react.Popover.Button, { className: "top-5 right-5 absolute text-zinc-400 hover:text-zinc-100", title: "Close feedback form", children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.X, { weight: "bold", className: "w-4 h-4" }) });
19
+ }
20
+ function FeedbackTypeStep({ onFeedbackTypeChanged }) {
21
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
22
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { children: [
23
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl leading-6", children: "Please give us your feedback!" }),
24
+ /* @__PURE__ */ jsxRuntime.jsx(CloseButton, {})
25
+ ] }),
26
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex py-8 gap-2 w-full", children: Object.entries(feedbackTypes).map(([key, value]) => {
27
+ return /* @__PURE__ */ jsxRuntime.jsxs(
28
+ "button",
29
+ {
30
+ className: "bg-zinc-800 rounded py-5 w-24 flex1 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none",
31
+ type: "button",
32
+ onClick: () => onFeedbackTypeChanged(key),
33
+ children: [
34
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: value.image.source, alt: value.image.alt }),
35
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: value.title })
36
+ ]
37
+ },
38
+ key
39
+ );
40
+ }) })
41
+ ] });
42
+ }
43
+ function Loading() {
44
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-4 h-4 flex items-center justify-center overflow-hidden ", children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.CircleNotch, { weight: "bold", className: "w-4 h-4 animate-spin" }) });
45
+ }
46
+ function ScreenshotButton({
47
+ screenshot,
48
+ onScreenshotTook
49
+ }) {
50
+ const [isTakenScreenshot, setIsTakenScreenShot] = react$1.useState(false);
51
+ async function handleTakeScreenshot() {
52
+ setIsTakenScreenShot(true);
53
+ const canvas = await html2canvas__default.default(document.querySelector("html"));
54
+ const base64image = canvas.toDataURL("image/png");
55
+ onScreenshotTook(base64image);
56
+ setIsTakenScreenShot(false);
57
+ }
58
+ if (screenshot) {
59
+ return /* @__PURE__ */ jsxRuntime.jsx(
60
+ "button",
61
+ {
62
+ type: "button",
63
+ className: "p-1 w-10 h-10 rounded-md border-transparent flex \r\n justify-end items-end text-zinc-400 hover:text-zinc-100 transition-colors",
64
+ onClick: () => onScreenshotTook(null),
65
+ style: {
66
+ backgroundImage: `url(${screenshot})`,
67
+ backgroundPosition: "right bottom",
68
+ backgroundSize: 180
69
+ },
70
+ children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Trash, { weight: "fill" })
71
+ }
72
+ );
73
+ }
74
+ return /* @__PURE__ */ jsxRuntime.jsx(
75
+ "button",
76
+ {
77
+ type: "button",
78
+ className: "p-2 bg-zinc-800 rounded-md border-transparent hover:bg-zinc-700\r\n transitions-colors focus:outline-none focus:ring-2\r\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500",
79
+ onClick: handleTakeScreenshot,
80
+ children: isTakenScreenshot ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Camera, { weight: "bold", className: "w-6 h-6" })
81
+ }
82
+ );
83
+ }
84
+
85
+ // src/lib/integrations/notion.ts
86
+ async function sendToNotion(config, data) {
87
+ const { apiKey, databaseId } = config;
88
+ const { type, comment, screenshot } = data;
89
+ const typeMap = {
90
+ BUG: "Bug",
91
+ IDEA: "Idea",
92
+ OTHER: "Other"
93
+ };
94
+ const properties = {
95
+ Type: {
96
+ select: {
97
+ name: typeMap[type]
98
+ }
99
+ },
100
+ Comment: {
101
+ rich_text: [
102
+ {
103
+ text: {
104
+ content: comment
105
+ }
106
+ }
107
+ ]
108
+ }
109
+ };
110
+ const children = [];
111
+ if (screenshot) {
112
+ children.push({
113
+ object: "block",
114
+ type: "paragraph",
115
+ paragraph: {
116
+ rich_text: [
117
+ {
118
+ text: {
119
+ content: "Screenshot provided (see comment for details)"
120
+ }
121
+ }
122
+ ]
123
+ }
124
+ });
125
+ properties.Screenshot = {
126
+ rich_text: [
127
+ {
128
+ text: {
129
+ content: screenshot.substring(0, 2e3)
130
+ // Truncate if too long
131
+ }
132
+ }
133
+ ]
134
+ };
135
+ }
136
+ const response = await fetch("https://api.notion.com/v1/pages", {
137
+ method: "POST",
138
+ headers: {
139
+ "Authorization": `Bearer ${apiKey}`,
140
+ "Content-Type": "application/json",
141
+ "Notion-Version": "2022-06-28"
142
+ },
143
+ body: JSON.stringify({
144
+ parent: {
145
+ database_id: databaseId
146
+ },
147
+ properties,
148
+ children
149
+ })
150
+ });
151
+ if (!response.ok) {
152
+ const error = await response.text();
153
+ throw new Error(`Notion API error: ${error}`);
154
+ }
155
+ }
156
+
157
+ // src/lib/integrations/github.ts
158
+ async function sendToGitHub(config, data) {
159
+ const { token, owner, repo } = config;
160
+ const { type, comment, screenshot } = data;
161
+ const title = `[${type}] Feedback`;
162
+ let body = `**Type:** ${type}
163
+
164
+ **Comment:**
165
+ ${comment}`;
166
+ if (screenshot) {
167
+ body += `
168
+
169
+ **Screenshot:**
170
+ ![Screenshot](${screenshot})`;
171
+ }
172
+ const response = await fetch(
173
+ `https://api.github.com/repos/${owner}/${repo}/issues`,
174
+ {
175
+ method: "POST",
176
+ headers: {
177
+ "Authorization": `token ${token}`,
178
+ "Accept": "application/vnd.github.v3+json",
179
+ "Content-Type": "application/json"
180
+ },
181
+ body: JSON.stringify({
182
+ title,
183
+ body,
184
+ labels: ["feedback", type.toLowerCase()]
185
+ })
186
+ }
187
+ );
188
+ if (!response.ok) {
189
+ const error = await response.text();
190
+ throw new Error(`GitHub API error: ${error}`);
191
+ }
192
+ }
193
+ function FeedbackContentStep({
194
+ feedbackType,
195
+ onFeedbackRestartRequest,
196
+ onFeedbackSent,
197
+ integration,
198
+ notionConfig,
199
+ githubConfig
200
+ }) {
201
+ const [screenshot, setScreenshot] = react$1.useState(null);
202
+ const feedbackTypeData = feedbackTypes[feedbackType];
203
+ const [comment, setComment] = react$1.useState("");
204
+ const [isSendingFeedback, setIsSendingFeedback] = react$1.useState(false);
205
+ async function handleSubmitFeedback(e) {
206
+ e.preventDefault();
207
+ setIsSendingFeedback(true);
208
+ try {
209
+ const feedbackData = {
210
+ type: feedbackType,
211
+ comment,
212
+ screenshot
213
+ };
214
+ if (integration === "notion" && notionConfig) {
215
+ await sendToNotion(notionConfig, feedbackData);
216
+ } else if (integration === "github" && githubConfig) {
217
+ await sendToGitHub(githubConfig, feedbackData);
218
+ } else {
219
+ throw new Error("Invalid integration configuration");
220
+ }
221
+ setIsSendingFeedback(false);
222
+ onFeedbackSent();
223
+ } catch (error) {
224
+ console.error("Error sending feedback:", error);
225
+ setIsSendingFeedback(false);
226
+ alert("Failed to send feedback. Please try again.");
227
+ }
228
+ }
229
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
230
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { children: [
231
+ /* @__PURE__ */ jsxRuntime.jsx(
232
+ "button",
233
+ {
234
+ type: "button",
235
+ className: "absolute top-5 left-5 text-zinc-400 hover:text-zinc-100",
236
+ onClick: onFeedbackRestartRequest,
237
+ children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.ArrowLeft, { weight: "bold", className: "w-4 h-4" })
238
+ }
239
+ ),
240
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xl leading-6 flex items-center gap-2 mt-2", children: [
241
+ /* @__PURE__ */ jsxRuntime.jsx(
242
+ "img",
243
+ {
244
+ src: feedbackTypeData.image.source,
245
+ alt: feedbackTypeData.image.alt,
246
+ className: "w-6 h-6"
247
+ }
248
+ ),
249
+ feedbackTypeData.title
250
+ ] }),
251
+ /* @__PURE__ */ jsxRuntime.jsx(CloseButton, {})
252
+ ] }),
253
+ /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmitFeedback, className: "my-4 w-full", children: [
254
+ /* @__PURE__ */ jsxRuntime.jsx(
255
+ "textarea",
256
+ {
257
+ className: "min-w-[384px] w-full min-h-[112px] text-sm \r\n placeholder-zinc-400 text-zinc-100 border-zinc-600 bg-transparent rounded-md \r\n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\r\n scrollbar-thumb-zinc-700 scrollbar-track-transparent scrollbar-thin",
258
+ placeholder: "Tell in detail what is happening",
259
+ onChange: (e) => setComment(e.target.value)
260
+ }
261
+ ),
262
+ /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: " flex gap-2 mt-2", children: [
263
+ /* @__PURE__ */ jsxRuntime.jsx(
264
+ ScreenshotButton,
265
+ {
266
+ screenshot,
267
+ onScreenshotTook: setScreenshot
268
+ }
269
+ ),
270
+ /* @__PURE__ */ jsxRuntime.jsx(
271
+ "button",
272
+ {
273
+ type: "submit",
274
+ disabled: comment.length === 0 || isSendingFeedback,
275
+ className: "p-2 bg-brand-500 rounded-md border-transparent flex-1 justify-center\r\n items-center text-sm hover:bg-brand-300 focus:outline-none focus:ring-2\r\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500\r\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\r\n disabled:hover:bg-brand-500",
276
+ children: isSendingFeedback ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : "Send feedback"
277
+ }
278
+ )
279
+ ] })
280
+ ] })
281
+ ] });
282
+ }
283
+ function FeedbackSuccessStep({ onFeedbackRestartRequest }) {
284
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
285
+ /* @__PURE__ */ jsxRuntime.jsx("header", { children: /* @__PURE__ */ jsxRuntime.jsx(CloseButton, {}) }),
286
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center py-10 w-[304px]", children: [
287
+ /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "41", height: "40", viewBox: "0 0 41 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
288
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M38.5 34C38.5 36.209 36.709 38 34.5 38H6.5C4.291 38 2.5 36.209 2.5 34V6C2.5 3.791 4.291 2 6.5 2H34.5C36.709 2 38.5 3.791 38.5 6V34Z", fill: "#77B255" }),
289
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M31.78 8.36202C30.624 7.61102 29.076 7.94002 28.322 9.09802L17.436 25.877L12.407 21.227C11.393 20.289 9.81103 20.352 8.87403 21.365C7.93703 22.379 7.99903 23.961 9.01303 24.898L16.222 31.564C16.702 32.009 17.312 32.229 17.918 32.229C18.591 32.229 19.452 31.947 20.017 31.09C20.349 30.584 32.517 11.82 32.517 11.82C33.268 10.661 32.938 9.11302 31.78 8.36202Z", fill: "white" })
290
+ ] }),
291
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl mt-2", children: "We appreciate the feedback" }),
292
+ /* @__PURE__ */ jsxRuntime.jsx(
293
+ "button",
294
+ {
295
+ type: "button",
296
+ onClick: onFeedbackRestartRequest,
297
+ className: "py-2 px-6 mt-6 bg-zinc-800 rounded-md border-transparent text-sm leading-6 hover:bg-zinc-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500 transition-colors",
298
+ children: "I want to send another"
299
+ }
300
+ )
301
+ ] })
302
+ ] });
303
+ }
304
+ var feedbackTypes = {
305
+ BUG: {
306
+ title: "Bug",
307
+ image: {
308
+ source: bugImageUrl,
309
+ alt: "A purple caterpillar image"
310
+ }
311
+ },
312
+ IDEA: {
313
+ title: "Idea",
314
+ image: {
315
+ source: ideaImageUrl,
316
+ alt: "A Lamp image"
317
+ }
318
+ },
319
+ OTHER: {
320
+ title: "Other",
321
+ image: {
322
+ source: thoughtImageUrl,
323
+ alt: "A thought balloon image"
324
+ }
325
+ }
326
+ };
327
+ function WidgetForm({ integration, notionConfig, githubConfig }) {
328
+ const [feedbackType, setFeedbackType] = react$1.useState(null);
329
+ const [feedbackSent, setFeedbackSent] = react$1.useState(false);
330
+ function handleRestartFeedback() {
331
+ setFeedbackSent(false);
332
+ setFeedbackType(null);
333
+ }
334
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-zinc-900 p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto", children: [
335
+ feedbackSent ? /* @__PURE__ */ jsxRuntime.jsx(FeedbackSuccessStep, { onFeedbackRestartRequest: handleRestartFeedback }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: !feedbackType ? /* @__PURE__ */ jsxRuntime.jsx(FeedbackTypeStep, { onFeedbackTypeChanged: setFeedbackType }) : /* @__PURE__ */ jsxRuntime.jsx(
336
+ FeedbackContentStep,
337
+ {
338
+ feedbackType,
339
+ onFeedbackRestartRequest: handleRestartFeedback,
340
+ onFeedbackSent: () => setFeedbackSent(true),
341
+ integration,
342
+ notionConfig,
343
+ githubConfig
344
+ }
345
+ ) }),
346
+ /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "text-xs text-neutral-400", children: [
347
+ "Built with \u{1F49C} by",
348
+ " ",
349
+ /* @__PURE__ */ jsxRuntime.jsx(
350
+ "a",
351
+ {
352
+ className: "underline underline-offset-2",
353
+ href: "https://github.com/klaas-sysop",
354
+ children: "Klaas Sysop"
355
+ }
356
+ )
357
+ ] })
358
+ ] });
359
+ }
360
+ function Widget({
361
+ integration,
362
+ notionConfig,
363
+ githubConfig,
364
+ position = "bottom-right"
365
+ }) {
366
+ const positionClasses = {
367
+ "bottom-right": "bottom-4 right-4 md:bottom-8 md:right-8",
368
+ "bottom-left": "bottom-4 left-4 md:bottom-8 md:left-8",
369
+ "top-right": "top-4 right-4 md:top-8 md:right-8",
370
+ "top-left": "top-4 left-4 md:top-8 md:left-4"
371
+ };
372
+ return /* @__PURE__ */ jsxRuntime.jsxs(react.Popover, { className: `absolute ${positionClasses[position]} flex flex-col items-end`, children: [
373
+ /* @__PURE__ */ jsxRuntime.jsx(react.Popover.Panel, { children: /* @__PURE__ */ jsxRuntime.jsx(
374
+ WidgetForm,
375
+ {
376
+ integration,
377
+ notionConfig,
378
+ githubConfig
379
+ }
380
+ ) }),
381
+ /* @__PURE__ */ jsxRuntime.jsxs(react.Popover.Button, { className: "bg-brand-500 rounded-full px-3 h-12 text-white flex items-center group", children: [
382
+ /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.ChatTeardropDots, { className: "w-6 h-6" }),
383
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "max-w-0 overflow-hidden group-hover:max-w-xs transition-all duration-500 ease-linear", children: [
384
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pl-2" }),
385
+ "Feedback"
386
+ ] })
387
+ ] })
388
+ ] });
389
+ }
390
+
391
+ exports.Widget = Widget;
392
+ //# sourceMappingURL=index.js.map
393
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/svg-assets.ts","../src/components/CloseButton.tsx","../src/components/WidgetForm/Steps/FeedbackTypeStep.tsx","../src/components/Loading.tsx","../src/components/ScreenshotButton.tsx","../src/lib/integrations/notion.ts","../src/lib/integrations/github.ts","../src/components/WidgetForm/Steps/FeedbackContentStep.tsx","../src/components/WidgetForm/Steps/FeedbackSuccessStep.tsx","../src/components/WidgetForm/index.tsx","../src/components/Widget.tsx"],"names":["jsx","Popover","X","jsxs","Fragment","CircleNotch","useState","html2canvas","Trash","Camera","ArrowLeft","ChatTeardropDots"],"mappings":"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","file":"index.js","sourcesContent":["// SVG files as data URLs (base64 encoded)\r\nexport const bugImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuNzUwMDcgNEM4Ljc1MDA3IDMgOC4wMDAwNyAwIDYuMzEyMDcgMEM0LjYyNDA3IDAgNC43NTAwNyAyIDUuNzUwMDcgMkM2Ljc1MDA3IDIgNi43NTAwNyA0IDYuNzUwMDcgNUM2Ljc1MDA3IDYgNy43NTAwNyA0IDcuNzUwMDcgNFpNMy41NjcwNyA1LjcyQzQuNTY3MDcgNC43MiAzLjgxNzA3IDEuNzIgMi4xMjkwNyAxLjcyQzAuNDQxMDY4IDEuNzIgMC41NjcwNjggMy43MiAxLjU2NzA3IDMuNzJDMi41NjcwNyAzLjcyIDIuNTY3MDcgNS43MiAyLjU2NzA3IDYuNzJDMi41NjcwNyA3LjcyIDMuNTY3MDcgNS43MiAzLjU2NzA3IDUuNzJaIiBmaWxsPSIjQUE4REQ4Ii8+CjxwYXRoIGQ9Ik0yOS45NDIgMzIuODU2QzMwLjEzMSAzMy42NjQgMzEuMTY5IDM1LjEzNiAzMS45NzQgMzQuOTQ3QzMyLjc4IDM0Ljc1NyAzMy4wNTEgMzIuOTc2IDMyLjg2MiAzMi4xN0MzMi42NzMgMzEuMzYyIDMxLjg2NCAzMC44NjMgMzEuMDU4IDMxLjA1M0MzMC4yNTMgMzEuMjQzIDI5Ljc1MiAzMi4wNSAyOS45NDIgMzIuODU2Wk0yNC41MDggMzMuNTA1QzI0LjUxMSAzNC4zMzUgMjUuMTg5IDM2LjAwMyAyNi4wMTcgMzZDMjYuODQ1IDM1Ljk5NiAyNy41MTEgMzQuMzIzIDI3LjUwOCAzMy40OTRDMjcuNTA1IDMyLjY2NSAyNi44MzEgMzEuOTk3IDI2LjAwMyAzMS45OTlDMjUuMTc1IDMyLjAwMyAyNC41MDUgMzIuNjc2IDI0LjUwOCAzMy41MDVaTTE5LjIzNyAzMS4wNTlDMTguOTExIDMxLjgyMyAxOC44NzIgMzMuNjIyIDE5LjYzMyAzMy45NDlDMjAuMzk2IDM0LjI3MyAyMS42NyAzMy4wMDIgMjEuOTk2IDMyLjIzOUMyMi4zMjEgMzEuNDc3IDIxLjk2OCAzMC41OTYgMjEuMjA3IDMwLjI2OUMyMC40NDUgMjkuOTQ0IDE5LjU2NCAzMC4yOTYgMTkuMjM3IDMxLjA1OVpNMTQuMjA2IDIwLjAxOUMxMy4zOTQgMjAuMTkxIDExLjg5OCAyMS4xOTIgMTIuMDY3IDIyLjAwMkMxMi4yNCAyMi44MTIgMTQuMDEyIDIzLjEyNiAxNC44MjQgMjIuOTU1QzE1LjYzNSAyMi43ODQgMTYuMTUzIDIxLjk4OCAxNS45ODQgMjEuMTc4QzE1LjgxMiAyMC4zNjggMTUuMDE5IDE5Ljg0OCAxNC4yMDYgMjAuMDE5Wk0xMi4xNjkgMTUuMDE5QzExLjM1NyAxNS4xOTEgOS44NjEwNCAxNi4xOTIgMTAuMDMgMTcuMDAyQzEwLjIwMyAxNy44MTIgMTEuOTc1IDE4LjEyNiAxMi43ODcgMTcuOTU1QzEzLjU5OCAxNy43ODQgMTQuMTE2IDE2Ljk4OCAxMy45NDcgMTYuMTc4QzEzLjc3NSAxNS4zNjggMTIuOTgxIDE0Ljg0OCAxMi4xNjkgMTUuMDE5WiIgZmlsbD0iIzc0NEVBQSIvPgo8cGF0aCBkPSJNMjcuNTc5MSAzNEMzMC40MSAzNCAzMi41MDUgMzMuMTIzIDMyLjg0NSAzMi45NzNDMzUuMTE2MSAzMS45NjMgMzYuMTM4MSAyOS4zMDQgMzUuMTI5MSAyNy4wMzRDMzQuMTMwMSAyNC43ODQgMzEuNTEzMSAyMy43NTkgMjkuMjU3MSAyNC43MkMyOS4xMjQxIDI0Ljc3IDI3LjQ2NDEgMjUuMzY5IDI1LjkxNDEgMjQuNjQ4QzI0LjA2MzEgMjMuNzg3IDIyLjkxOTEgMjEuMzM5IDIyLjI4NjEgMTkuNDM5QzIyLjE0MjEgMTkuMDA5IDIxLjkwMTEgMTguMTY1IDIxLjYgMTcuMTIzQzE5LjczNDEgMTAuNjUyIDE4Ljc2ODEgOC44Mzc5OSAxNy42MTcxIDcuMzAyOTlDMTMuOTA2IDIuMzUxOTkgOC4wMjUwNSAyLjAwNjk5IDUuMTM0MDUgMi41ODY5OUMyLjY5NzA1IDMuMDczOTkgMS4xMTYwNSA1LjQ0NDk5IDEuNjA0MDUgNy44ODE5OUMyLjA5MjA1IDEwLjMyIDQuNDY0MDUgMTEuOTAyIDYuOTAwMDUgMTEuNDEyQzcuMDYyMDUgMTEuMzg2IDkuMTA0MDUgMTEuMTA2IDEwLjMyNDEgMTIuNTgxQzEwLjk2NzEgMTMuODY4IDEyLjQwNDEgMTcuNzA5IDEyLjk1NDEgMTkuNjE1QzEzLjMwMDEgMjAuODE0IDEzLjU4MzEgMjEuNzg2IDEzLjc0ODEgMjIuMjgyQzE1LjUyMTEgMjcuNTk5IDE4LjQxNDEgMzEuMTc1IDIyLjM1MTEgMzIuOTExQzI0LjIwMzEgMzMuNzI5IDI2LjAwNTEgMzQgMjcuNTc5MSAzNFoiIGZpbGw9IiM5MjY2Q0MiLz4KPHBhdGggZD0iTTcuMDE3MDkgNkM3LjU2OTM3IDYgOC4wMTcwOSA1LjU1MjI4IDguMDE3MDkgNUM4LjAxNzA5IDQuNDQ3NzIgNy41NjkzNyA0IDcuMDE3MDkgNEM2LjQ2NDgxIDQgNi4wMTcwOSA0LjQ0NzcyIDYuMDE3MDkgNUM2LjAxNzA5IDUuNTUyMjggNi40NjQ4MSA2IDcuMDE3MDkgNloiIGZpbGw9IiMyMDIwMjQiLz4KPHBhdGggZD0iTTMxLjI1ODEgMzIuOTY0QzMxLjE2OTEgMzIuOTY0IDMxLjA3ODEgMzIuOTUyIDMwLjk4OTEgMzIuOTI4QzMwLjQ1NzEgMzIuNzggMzAuMTQ1MSAzMi4yMjkgMzAuMjkzMSAzMS42OTdDMzEuMDUwMSAyOC45NzUgMjkuNTIzMSAyNy4xNTUgMjkuNTA4MSAyNy4xMzdDMjkuMTQ5MSAyNi43MTggMjkuMTk2MSAyNi4wODYgMjkuNjE1MSAyNS43MjdDMzAuMDMzMSAyNS4zNjggMzAuNjY2MSAyNS40MTUgMzEuMDI1MSAyNS44MzRDMzEuMTE3MSAyNS45NDEgMzMuMjU5MSAyOC40OTQgMzIuMjIwMSAzMi4yMzFDMzIuMDk4MSAzMi42NzQgMzEuNjk1MSAzMi45NjQgMzEuMjU4MSAzMi45NjRaTTI0LjA1OTEgMzIuNDAxQzIzLjgxNDEgMzIuNDAxIDIzLjU2OTEgMzIuMzEyIDIzLjM3NTEgMzIuMTMxQzIyLjk3MjEgMzEuNzUzIDIyLjk1MTEgMzEuMTIgMjMuMzI4MSAzMC43MTdDMjQuODEzMSAyOS4xMyAyNC43ODExIDI2LjUyNCAyNC43ODAxIDI2LjQ5N0MyNC43NjQxIDI1Ljk0NSAyNS4xOTkxIDI1LjQ4NSAyNS43NTIxIDI1LjQ2OUMyNi4yOTQxIDI1LjQ2NCAyNi43NjUxIDI1Ljg4OCAyNi43ODAxIDI2LjQ0MUMyNi43ODQxIDI2LjU4IDI2Ljg1MzEgMjkuODc4IDI0Ljc4OTEgMzIuMDg1QzI0LjU5MjEgMzIuMjk1IDI0LjMyNTEgMzIuNDAxIDI0LjA1OTEgMzIuNDAxWk0xNS41MTcxIDIzLjcwNUMxNS4wMzcxIDIzLjcwNSAxNC42MTMxIDIzLjM1OCAxNC41MzIxIDIyLjg2OEMxNC40NDIxIDIyLjMyNCAxNC44MTAxIDIxLjgwOCAxNS4zNTUxIDIxLjcxOUMxOC40MjkxIDIxLjIwOSAyMC4xMjkxIDE5LjM0MiAyMC4xNDYxIDE5LjMyM0MyMC41MTExIDE4LjkxMyAyMS4xNDQxIDE4Ljg3NCAyMS41NTUxIDE5LjIzOUMyMS45NjcxIDE5LjYwNCAyMi4wMDgxIDIwLjIzMiAyMS42NDYxIDIwLjY0NUMyMS41NTkxIDIwLjc0NCAxOS40OTAxIDIzLjA2IDE1LjY4MjEgMjMuNjkxQzE1LjYyNjEgMjMuNzAxIDE1LjU3MTEgMjMuNzA1IDE1LjUxNzEgMjMuNzA1Wk0xOC40MzgxIDI4LjU2MkMxOC4wMTMxIDI4LjU2MiAxNy42MTkxIDI4LjI5IDE3LjQ4NDEgMjcuODY0QzE3LjMxODEgMjcuMzM4IDE3LjYxMDEgMjYuNzc1IDE4LjEzNjEgMjYuNjA5QzIwLjgyOTEgMjUuNzU2IDIyLjAxNjEgMjMuNzc5IDIyLjAyODEgMjMuNzU5QzIyLjMwODEgMjMuMjgyIDIyLjkyMDEgMjMuMTIyIDIzLjM5NjEgMjMuNDAyQzIzLjg3MzEgMjMuNjgxIDI0LjAzMjEgMjQuMjk1IDIzLjc1MzEgMjQuNzdDMjMuNjkwMSAyNC44NzggMjIuMTU4MSAyNy40MzMgMTguNzQwMSAyOC41MTRDMTguNjM5MSAyOC41NDcgMTguNTM3MSAyOC41NjIgMTguNDM4MSAyOC41NjJaTTEzLjgxOTEgMTcuODkyQzEzLjMyMzEgMTcuODkyIDEyLjg5MjEgMTcuNTIzIDEyLjgyODEgMTcuMDE3QzEyLjc1OTEgMTYuNDY5IDEzLjE0NzEgMTUuOTY5IDEzLjY5NTEgMTUuODk5QzE2LjM4NDEgMTUuNTU5IDE4LjM1MjEgMTMuOTI4IDE4LjM3MTEgMTMuOTExQzE4Ljc5MzEgMTMuNTU3IDE5LjQyNDEgMTMuNjA4IDE5Ljc3OTEgMTQuMDNDMjAuMTM1MSAxNC40NTEgMjAuMDg0MSAxNS4wOCAxOS42NjQxIDE1LjQzN0MxOS41NjcxIDE1LjUyIDE3LjI0NDEgMTcuNDY2IDEzLjk0NjEgMTcuODgzQzEzLjkwMzEgMTcuODg5IDEzLjg2MTEgMTcuODkyIDEzLjgxOTEgMTcuODkyWk0xMS45OTgxIDEzLjEyNUMxMS41NzMxIDEzLjEyNSAxMS4xNzkxIDEyLjg1MiAxMS4wNDQxIDEyLjQyNEMxMC44NzkxIDExLjg5NyAxMS4xNzExIDExLjMzNiAxMS42OTgxIDExLjE3QzE0LjgyODEgMTAuMTg3IDE1Ljk1MTEgOC40NzggMTUuOTk3MSA4LjQwNkMxNi4yOTIxIDcuOTQ0IDE2LjkwODEgNy44MDEgMTcuMzcyMSA4LjA5NEMxNy44MzcxIDguMzg2IDE3Ljk4MzEgOC45OTMgMTcuNjk2MSA5LjQ2QzE3LjYzNjEgOS41NTcgMTYuMTkwMSAxMS44NTYgMTIuMjk3MSAxMy4wNzlDMTIuMTk4MSAxMy4xMSAxMi4wOTcxIDEzLjEyNSAxMS45OTgxIDEzLjEyNVoiIGZpbGw9IiM3NDRFQUEiLz4KPC9zdmc+';\r\n\r\nexport const ideaImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMzUiIHZpZXdCb3g9IjAgMCAyMyAzNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIyLjUgMTAuOTJDMjIuNSAxNy4zNTkgMTcuNSAxOC4zNTkgMTcuNSAyNC4zNkMxNy41IDI3LjQ1OCAxNC4zNzcgMjcuNzE5IDEyIDI3LjcxOUM5Ljk0NyAyNy43MTkgNS40MTQgMjYuOTQgNS40MTQgMjQuMzU4QzUuNDE0IDE4LjM2IDAuNSAxNy4zNiAwLjUgMTAuOTJDMC41IDQuODg5IDUuNzg1IDAgMTEuNTgzIDBDMTcuMzgzIDAgMjIuNSA0Ljg4OSAyMi41IDEwLjkyWiIgZmlsbD0iI0ZGREQ4MyIvPgo8cGF0aCBkPSJNMTUuNjY3IDMyLjM2QzE1LjY2NyAzMy4xODggMTMuNDMzIDM0Ljg2IDExLjUgMzQuODZDOS41NjcwMSAzNC44NiA3LjMzMzAxIDMzLjE4OCA3LjMzMzAxIDMyLjM2QzcuMzMzMDEgMzEuNTMyIDkuNTY2MDEgMzEuODYgMTEuNSAzMS44NkMxMy40MzMgMzEuODYgMTUuNjY3IDMxLjUzMiAxNS42NjcgMzIuMzZaIiBmaWxsPSIjQ0NENkREIi8+CjxwYXRoIGQ9Ik0xNi4yMDcgMTAuMTUzQzE1LjgxNiA5Ljc2MTk5IDE1LjE4NCA5Ljc2MTk5IDE0Ljc5MyAxMC4xNTNMMTEuNSAxMy40NDZMOC4yMDcwMSAxMC4xNTNDNy44MTYwMSA5Ljc2MTk5IDcuMTg0MDEgOS43NjE5OSA2Ljc5MzAxIDEwLjE1M0M2LjQwMjAxIDEwLjU0NCA2LjQwMjAxIDExLjE3NiA2Ljc5MzAxIDExLjU2N0wxMC41IDE1LjI3NFYyNS44NkMxMC41IDI2LjQxMyAxMC45NDggMjYuODYgMTEuNSAyNi44NkMxMi4wNTIgMjYuODYgMTIuNSAyNi40MTMgMTIuNSAyNS44NlYxNS4yNzRMMTYuMjA3IDExLjU2N0MxNi41OTggMTEuMTc2IDE2LjU5OCAxMC41NDQgMTYuMjA3IDEwLjE1M1oiIGZpbGw9IiNGRkNDNEQiLz4KPHBhdGggZD0iTTE3LjUgMzAuODZDMTcuNSAzMS45NjQgMTYuNjA0IDMyLjg2IDE1LjUgMzIuODZIOC41QzcuMzk2IDMyLjg2IDYuNSAzMS45NjQgNi41IDMwLjg2VjI0Ljg2SDE3LjVWMzAuODZaIiBmaWxsPSIjOTlBQUI1Ii8+CjxwYXRoIGQ9Ik01LjQ5OSAzMS44NkM1LjAxOSAzMS44NiA0LjU5NSAzMS41MTMgNC41MTQgMzEuMDI0QzQuNDIzIDMwLjQ4IDQuNzkxIDI5Ljk2NCA1LjMzNiAyOS44NzRMMTcuMzM2IDI3Ljg3NEMxNy44OCAyNy43NzYgMTguMzk2IDI4LjE1MSAxOC40ODYgMjguNjk2QzE4LjU3NyAyOS4yNCAxOC4yMDkgMjkuNzU2IDE3LjY2NCAyOS44NDZMOS42NjQgMzEuODQ2QzkuNjA5IDMxLjg1NiA5LjU1MyAzMS44NiA1LjQ5OSAzMS44NlpNNS40OTkgMjcuODZDNS4wMTkgMjcuODYgNC41OTUgMjcuNTEzIDQuNTE0IDI3LjAyNEM0LjQyMyAyNi40OCA0Ljc5MSAyNS45NjQgNS4zMzYgMjUuODc0TDE3LjMzNiAyMy44NzRDMTcuODggMjMuNzc3IDE4LjM5NiAyNC4xNTEgMTguNDg2IDI0LjY5NkMxOC41NzcgMjUuMjQgMTguMjA5IDI1Ljc1NiAxNy42NjQgMjUuODQ2TDkuNjY0IDI3Ljg0NkM5LjYwOSAyNy44NTYgOS41NTMgMjcuODYgNS40OTkgMjcuODZaIiBmaWxsPSIjQ0NENkREIi8+Cjwvc3ZnPg==';\r\n\r\nexport const thoughtImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzNiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM1LjE2NjYgMTAuODc1QzM1LjE2NjYgNy4wMDkgMzIuMDMyNiAzLjg3NSAyOC4xNjY2IDMuODc1QzI2Ljk5OTYgMy44NzUgMjUuOTAxNiA0LjE2NSAyNC45MzQ2IDQuNjY5QzIyLjg1MjYgMS44NDIgMTkuNTA5NiAwIDE1LjcyOTYgMEMxMC41OTc2IDAgNi4yNTQ2MyAzLjM4IDQuODA2NjMgOC4wMzZDMi4xNDg2MyA4LjY1MyAwLjE2NjYyNiAxMS4wMyAwLjE2NjYyNiAxMy44NzVDMC4xNjY2MjYgMTYuODU0IDIuMzQwNjMgMTkuMzIgNS4xODc2MyAxOS43ODhDNS40MDM2MyAyMy43MzcgOC42NjQ2MyAyNi44NzUgMTIuNjY2NiAyNi44NzVDMTQuODQyNiAyNi44NzUgMTYuNzk2NiAyNS45NDIgMTguMTY2NiAyNC40NjJDMTkuNTM2NiAyNS45NDIgMjEuNDg5NiAyNi44NzUgMjMuNjY2NiAyNi44NzVDMjcuODA5NiAyNi44NzUgMzEuMTY2NiAyMy41MTggMzEuMTY2NiAxOS4zNzVDMzEuMTY2NiAxOC42NjUgMzEuMDYxNiAxNy45ODEgMzAuODc3NiAxNy4zM0MzMy4zOTY2IDE2LjI3MSAzNS4xNjY2IDEzLjc4IDM1LjE2NjYgMTAuODc1WiIgZmlsbD0iIzg1QzhGOCIvPgo8cGF0aCBkPSJNNC4xNjY2MyAzMi44NzVDNS44MjM0OCAzMi44NzUgNy4xNjY2MyAzMS41MzE5IDcuMTY2NjMgMjkuODc1QzcuMTY2NjMgMjguMjE4MSA1LjgyMzQ4IDI2Ljg3NSA0LjE2NjYzIDI2Ljg3NUMuNTA5NzcgMjYuODc1IDEuMTY2NjMgMjguMjE4MSAxLjE2NjYzIDI5Ljg3NUMxLjE2NjYzIDMxLjUzMTkgMi41MDk3NyAzMi44NzUgNC4xNjY2MyAzMi44NzVaIiBmaWxsPSIjODVDOEY4Ii8+Cjwvc3ZnPg==';\r\n\r\n","'use client'\r\n\r\nimport { Popover } from \"@headlessui/react\";\r\nimport { X } from \"phosphor-react\";\r\n\r\nexport function CloseButton() {\r\n return (\r\n <Popover.Button className=\"top-5 right-5 absolute text-zinc-400 hover:text-zinc-100\" title=\"Close feedback form\">\r\n <X weight=\"bold\" className=\"w-4 h-4\"/>\r\n </Popover.Button>\r\n )\r\n}\r\n\r\n","'use client'\r\n\r\nimport { FeedbackType, feedbackTypes } from \"..\";\r\nimport { CloseButton } from \"../../CloseButton\";\r\n\r\ninterface FeedbackTypeStepProps {\r\n onFeedbackTypeChanged: (type: FeedbackType) => void;\r\n}\r\n\r\nexport function FeedbackTypeStep({ onFeedbackTypeChanged }: FeedbackTypeStepProps) {\r\n return (\r\n <>\r\n <header>\r\n <span className=\"text-xl leading-6\">Please give us your feedback!</span>\r\n <CloseButton />\r\n </header>\r\n <div className=\"flex py-8 gap-2 w-full\">\r\n {\r\n Object.entries(feedbackTypes).map(([key, value]) => {\r\n return (\r\n <button\r\n key={key}\r\n className=\"bg-zinc-800 rounded py-5 w-24 flex1 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none\"\r\n type=\"button\"\r\n onClick={() => onFeedbackTypeChanged(key as FeedbackType)}\r\n >\r\n <img src={value.image.source} alt={value.image.alt}></img>\r\n <span>{value.title}</span>\r\n </button>\r\n )\r\n })\r\n }\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\n","'use client'\r\n\r\nimport { CircleNotch } from 'phosphor-react';\r\n\r\nexport function Loading() {\r\n return (\r\n <div className=\"w-4 h-4 flex items-center justify-center overflow-hidden \">\r\n <CircleNotch weight=\"bold\" className=\"w-4 h-4 animate-spin\" />\r\n </div>\r\n )\r\n}\r\n\r\n","'use client'\r\n\r\nimport html2canvas from 'html2canvas';\r\nimport { Camera, Trash } from 'phosphor-react';\r\nimport { useState } from 'react';\r\nimport { Loading } from './Loading';\r\n\r\ninterface ScreenshotButtonProps {\r\n screenshot: string | null;\r\n onScreenshotTook: (screenshot: string | null) => void;\r\n}\r\n\r\nexport function ScreenshotButton({\r\n screenshot,\r\n onScreenshotTook,\r\n}: ScreenshotButtonProps) {\r\n const [isTakenScreenshot, setIsTakenScreenShot] = useState(false)\r\n \r\n async function handleTakeScreenshot() {\r\n setIsTakenScreenShot(true);\r\n const canvas = await html2canvas(document.querySelector('html')!);\r\n const base64image = canvas.toDataURL('image/png');\r\n onScreenshotTook(base64image);\r\n setIsTakenScreenShot(false);\r\n }\r\n \r\n if (screenshot) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"p-1 w-10 h-10 rounded-md border-transparent flex \r\n justify-end items-end text-zinc-400 hover:text-zinc-100 transition-colors\"\r\n onClick={() => onScreenshotTook(null)}\r\n style={{\r\n backgroundImage: `url(${screenshot})`,\r\n backgroundPosition: 'right bottom',\r\n backgroundSize: 180,\r\n }}\r\n >\r\n <Trash weight=\"fill\" />\r\n </button>\r\n )\r\n }\r\n \r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"p-2 bg-zinc-800 rounded-md border-transparent hover:bg-zinc-700\r\n transitions-colors focus:outline-none focus:ring-2\r\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500\"\r\n onClick={handleTakeScreenshot}\r\n >\r\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className=\"w-6 h-6\" />}\r\n </button>\r\n )\r\n}\r\n\r\n","import { FeedbackType } from '../../types';\r\n\r\ninterface NotionConfig {\r\n apiKey: string;\r\n databaseId: string;\r\n}\r\n\r\ninterface FeedbackData {\r\n type: FeedbackType;\r\n comment: string;\r\n screenshot: string | null;\r\n}\r\n\r\nexport async function sendToNotion(\r\n config: NotionConfig,\r\n data: FeedbackData\r\n): Promise<void> {\r\n const { apiKey, databaseId } = config;\r\n const { type, comment, screenshot } = data;\r\n\r\n // Map feedback type to Notion select value\r\n const typeMap: Record<FeedbackType, string> = {\r\n BUG: 'Bug',\r\n IDEA: 'Idea',\r\n OTHER: 'Other',\r\n };\r\n\r\n // Build the page properties\r\n const properties: any = {\r\n Type: {\r\n select: {\r\n name: typeMap[type],\r\n },\r\n },\r\n Comment: {\r\n rich_text: [\r\n {\r\n text: {\r\n content: comment,\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n\r\n // Add screenshot if provided\r\n const children: any[] = [];\r\n if (screenshot) {\r\n // Notion doesn't support data URIs directly, so we'll add it as a paragraph with note\r\n // For production, you'd want to upload the image to a CDN first\r\n children.push({\r\n object: 'block',\r\n type: 'paragraph',\r\n paragraph: {\r\n rich_text: [\r\n {\r\n text: {\r\n content: 'Screenshot provided (see comment for details)',\r\n },\r\n },\r\n ],\r\n },\r\n });\r\n \r\n // Add screenshot as a file property if the database has that field\r\n // Note: This requires the screenshot to be uploaded to a public URL first\r\n // For now, we'll store the data URI in a text field\r\n properties.Screenshot = {\r\n rich_text: [\r\n {\r\n text: {\r\n content: screenshot.substring(0, 2000), // Truncate if too long\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const response = await fetch('https://api.notion.com/v1/pages', {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json',\r\n 'Notion-Version': '2022-06-28',\r\n },\r\n body: JSON.stringify({\r\n parent: {\r\n database_id: databaseId,\r\n },\r\n properties,\r\n children,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.text();\r\n throw new Error(`Notion API error: ${error}`);\r\n }\r\n}\r\n\r\n","import { FeedbackType } from '../../types';\r\n\r\ninterface GitHubConfig {\r\n token: string;\r\n owner: string;\r\n repo: string;\r\n}\r\n\r\ninterface FeedbackData {\r\n type: FeedbackType;\r\n comment: string;\r\n screenshot: string | null;\r\n}\r\n\r\nexport async function sendToGitHub(\r\n config: GitHubConfig,\r\n data: FeedbackData\r\n): Promise<void> {\r\n const { token, owner, repo } = config;\r\n const { type, comment, screenshot } = data;\r\n\r\n // Build issue title\r\n const title = `[${type}] Feedback`;\r\n\r\n // Build issue body\r\n let body = `**Type:** ${type}\\n\\n**Comment:**\\n${comment}`;\r\n\r\n // Add screenshot as base64 image in body if provided\r\n if (screenshot) {\r\n body += `\\n\\n**Screenshot:**\\n![Screenshot](${screenshot})`;\r\n }\r\n\r\n const response = await fetch(\r\n `https://api.github.com/repos/${owner}/${repo}/issues`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `token ${token}`,\r\n 'Accept': 'application/vnd.github.v3+json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n title,\r\n body,\r\n labels: ['feedback', type.toLowerCase()],\r\n }),\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const error = await response.text();\r\n throw new Error(`GitHub API error: ${error}`);\r\n }\r\n}\r\n\r\n","'use client'\r\n\r\nimport {ArrowLeft} from 'phosphor-react';\r\nimport { FormEvent, useState } from 'react';\r\nimport { FeedbackType, feedbackTypes } from '..';\r\nimport { CloseButton } from '../../CloseButton';\r\nimport {Loading} from '../../Loading';\r\nimport { ScreenshotButton } from '../../ScreenshotButton';\r\nimport { sendToNotion } from '../../../lib/integrations/notion';\r\nimport { sendToGitHub } from '../../../lib/integrations/github';\r\nimport { NotionConfig, GitHubConfig } from '../../../types';\r\n\r\ninterface FeedbackContentStepProps {\r\n feedbackType: FeedbackType;\r\n onFeedbackRestartRequest: () => void;\r\n onFeedbackSent: () => void;\r\n integration: 'notion' | 'github';\r\n notionConfig?: NotionConfig;\r\n githubConfig?: GitHubConfig;\r\n}\r\n\r\nexport function FeedbackContentStep({\r\n feedbackType,\r\n onFeedbackRestartRequest,\r\n onFeedbackSent,\r\n integration,\r\n notionConfig,\r\n githubConfig,\r\n}: FeedbackContentStepProps) {\r\n const [screenshot, setScreenshot] = useState<string | null>(null);\r\n const feedbackTypeData = feedbackTypes[feedbackType];\r\n const [comment, setComment] = useState('');\r\n const[isSendingFeedback, setIsSendingFeedback] = useState(false);\r\n\r\n async function handleSubmitFeedback(e: FormEvent) {\r\n e.preventDefault();\r\n setIsSendingFeedback(true);\r\n \r\n try {\r\n const feedbackData = {\r\n type: feedbackType,\r\n comment,\r\n screenshot,\r\n };\r\n\r\n if (integration === 'notion' && notionConfig) {\r\n await sendToNotion(notionConfig, feedbackData);\r\n } else if (integration === 'github' && githubConfig) {\r\n await sendToGitHub(githubConfig, feedbackData);\r\n } else {\r\n throw new Error('Invalid integration configuration');\r\n }\r\n \r\n setIsSendingFeedback(false);\r\n onFeedbackSent();\r\n } catch (error) {\r\n console.error('Error sending feedback:', error);\r\n setIsSendingFeedback(false);\r\n // TODO: Show error message to user\r\n alert('Failed to send feedback. Please try again.');\r\n }\r\n }\r\n \r\n return (\r\n <>\r\n <header>\r\n <button\r\n type=\"button\"\r\n className=\"absolute top-5 left-5 text-zinc-400 hover:text-zinc-100\"\r\n onClick={onFeedbackRestartRequest}\r\n >\r\n <ArrowLeft weight=\"bold\" className=\"w-4 h-4\" />\r\n </button>\r\n\r\n <span className=\"text-xl leading-6 flex items-center gap-2 mt-2\">\r\n <img\r\n src={feedbackTypeData.image.source}\r\n alt={feedbackTypeData.image.alt}\r\n className=\"w-6 h-6\"\r\n />\r\n {feedbackTypeData.title}\r\n </span>\r\n <CloseButton />\r\n </header>\r\n <form onSubmit={handleSubmitFeedback} className=\"my-4 w-full\">\r\n <textarea\r\n className=\"min-w-[384px] w-full min-h-[112px] text-sm \r\n placeholder-zinc-400 text-zinc-100 border-zinc-600 bg-transparent rounded-md \r\n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\r\n scrollbar-thumb-zinc-700 scrollbar-track-transparent scrollbar-thin\"\r\n placeholder=\"Tell in detail what is happening\"\r\n onChange={(e) => setComment(e.target.value)}\r\n />\r\n <footer className=\" flex gap-2 mt-2\">\r\n <ScreenshotButton\r\n screenshot={screenshot}\r\n onScreenshotTook={setScreenshot}\r\n />\r\n <button\r\n type=\"submit\"\r\n disabled={comment.length === 0 || isSendingFeedback}\r\n className=\"p-2 bg-brand-500 rounded-md border-transparent flex-1 justify-center\r\n items-center text-sm hover:bg-brand-300 focus:outline-none focus:ring-2\r\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500\r\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\r\n disabled:hover:bg-brand-500\"\r\n >\r\n {isSendingFeedback? <Loading/> : \"Send feedback\"}\r\n </button>\r\n </footer>\r\n </form>\r\n </>\r\n )\r\n}\r\n\r\n","'use client'\r\n\r\nimport { CloseButton } from '../../CloseButton';\r\n\r\ninterface FeedbackSuccessStepProps {\r\n onFeedbackRestartRequest: () => void;\r\n}\r\n\r\nexport function FeedbackSuccessStep({ onFeedbackRestartRequest }: FeedbackSuccessStepProps) {\r\n return (\r\n <>\r\n <header>\r\n <CloseButton />\r\n </header>\r\n\r\n <div className=\"flex flex-col items-center py-10 w-[304px]\">\r\n <svg width=\"41\" height=\"40\" viewBox=\"0 0 41 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M38.5 34C38.5 36.209 36.709 38 34.5 38H6.5C4.291 38 2.5 36.209 2.5 34V6C2.5 3.791 4.291 2 6.5 2H34.5C36.709 2 38.5 3.791 38.5 6V34Z\" fill=\"#77B255\"/>\r\n <path d=\"M31.78 8.36202C30.624 7.61102 29.076 7.94002 28.322 9.09802L17.436 25.877L12.407 21.227C11.393 20.289 9.81103 20.352 8.87403 21.365C7.93703 22.379 7.99903 23.961 9.01303 24.898L16.222 31.564C16.702 32.009 17.312 32.229 17.918 32.229C18.591 32.229 19.452 31.947 20.017 31.09C20.349 30.584 32.517 11.82 32.517 11.82C33.268 10.661 32.938 9.11302 31.78 8.36202Z\" fill=\"white\"/>\r\n </svg>\r\n \r\n <span className=\"text-xl mt-2\">We appreciate the feedback</span>\r\n\r\n <button \r\n type=\"button\"\r\n onClick={onFeedbackRestartRequest}\r\n className=\"py-2 px-6 mt-6 bg-zinc-800 rounded-md border-transparent text-sm leading-6 hover:bg-zinc-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500 transition-colors\"\r\n >\r\n I want to send another\r\n </button>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\n","'use client'\r\n\r\nimport { bugImageUrl, ideaImageUrl, thoughtImageUrl } from '../../lib/svg-assets';\r\nimport { useState } from 'react';\r\nimport { FeedbackTypeStep } from './Steps/FeedbackTypeStep';\r\nimport { FeedbackContentStep } from './Steps/FeedbackContentStep';\r\nimport { FeedbackSuccessStep } from './Steps/FeedbackSuccessStep';\r\nimport { FeedbackType, NotionConfig, GitHubConfig } from '../../types';\r\n\r\nexport const feedbackTypes = {\r\n BUG: {\r\n title: 'Bug',\r\n image: {\r\n source: bugImageUrl,\r\n alt: 'A purple caterpillar image',\r\n },\r\n },\r\n IDEA: {\r\n title: 'Idea',\r\n image: {\r\n source: ideaImageUrl,\r\n alt: 'A Lamp image',\r\n },\r\n },\r\n OTHER: {\r\n title: 'Other',\r\n image: {\r\n source: thoughtImageUrl,\r\n alt: 'A thought balloon image',\r\n },\r\n },\r\n}\r\n\r\nexport type { FeedbackType };\r\n\r\ninterface WidgetFormProps {\r\n integration: 'notion' | 'github';\r\n notionConfig?: NotionConfig;\r\n githubConfig?: GitHubConfig;\r\n}\r\n\r\nexport function WidgetForm({ integration, notionConfig, githubConfig }: WidgetFormProps) {\r\n const [feedbackType, setFeedbackType] = useState<FeedbackType | null>(null)\r\n const [feedbackSent, setFeedbackSent] = useState(false)\r\n \r\n function handleRestartFeedback() {\r\n setFeedbackSent(false); \r\n setFeedbackType(null);\r\n }\r\n \r\n return (\r\n <div className=\"bg-zinc-900 p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto\">\r\n {feedbackSent ? (\r\n <FeedbackSuccessStep onFeedbackRestartRequest={handleRestartFeedback} />\r\n ) : (\r\n <>\r\n {!feedbackType ? (\r\n <FeedbackTypeStep onFeedbackTypeChanged={setFeedbackType} />\r\n ) : (\r\n <FeedbackContentStep\r\n feedbackType={feedbackType}\r\n onFeedbackRestartRequest={handleRestartFeedback}\r\n onFeedbackSent={() => setFeedbackSent(true)}\r\n integration={integration}\r\n notionConfig={notionConfig}\r\n githubConfig={githubConfig}\r\n />\r\n )}\r\n </>\r\n )}\r\n <footer className=\"text-xs text-neutral-400\">\r\n Built with 💜 by{' '}\r\n <a\r\n className=\"underline underline-offset-2\"\r\n href=\"https://github.com/klaas-sysop\"\r\n >\r\n Klaas Sysop\r\n </a>\r\n </footer>\r\n </div>\r\n )\r\n}\r\n\r\n","'use client'\r\n\r\nimport { ChatTeardropDots } from 'phosphor-react';\r\nimport { Popover } from '@headlessui/react';\r\nimport { WidgetForm } from './WidgetForm';\r\nimport { WidgetProps } from '../types';\r\n\r\nexport function Widget({ \r\n integration, \r\n notionConfig, \r\n githubConfig,\r\n position = 'bottom-right'\r\n}: WidgetProps) {\r\n const positionClasses = {\r\n 'bottom-right': 'bottom-4 right-4 md:bottom-8 md:right-8',\r\n 'bottom-left': 'bottom-4 left-4 md:bottom-8 md:left-8',\r\n 'top-right': 'top-4 right-4 md:top-8 md:right-8',\r\n 'top-left': 'top-4 left-4 md:top-8 md:left-4',\r\n };\r\n\r\n return (\r\n <Popover className={`absolute ${positionClasses[position]} flex flex-col items-end`}>\r\n <Popover.Panel>\r\n <WidgetForm \r\n integration={integration}\r\n notionConfig={notionConfig}\r\n githubConfig={githubConfig}\r\n />\r\n </Popover.Panel>\r\n <Popover.Button className=\"bg-brand-500 rounded-full px-3 h-12 text-white flex items-center group\">\r\n <ChatTeardropDots className=\"w-6 h-6\" />\r\n <span className=\"max-w-0 overflow-hidden group-hover:max-w-xs transition-all duration-500 ease-linear\">\r\n <span className=\"pl-2\"></span>\r\n Feedback\r\n </span>\r\n </Popover.Button>\r\n </Popover>\r\n )\r\n}\r\n\r\n"]}