feedback-vos 1.0.34 → 1.0.36

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/svg-assets.ts","../src/lib/theme.ts","../src/components/CloseButton.tsx","../src/lib/translations.ts","../src/components/WidgetForm/Steps/FeedbackTypeStep.tsx","../src/components/Loading.tsx","../src/components/ScreenshotEditor.tsx","../src/components/ScreenshotButton.tsx","../src/components/FileUploadButton.tsx","../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","useRef","useState","useEffect","useCallback","ArrowCounterClockwise","Trash","Check","html2canvas","PencilSimple","Camera","translations","Paperclip","url","ArrowLeft","ChatTeardropDots"],"mappings":"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","file":"index.js","sourcesContent":["// SVG files as data URLs (base64 encoded)\nexport const bugImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuNzUwMDcgNEM4Ljc1MDA3IDMgOC4wMDAwNyAwIDYuMzEyMDcgMEM0LjYyNDA3IDAgNC43NTAwNyAyIDUuNzUwMDcgMkM2Ljc1MDA3IDIgNi43NTAwNyA0IDYuNzUwMDcgNUM2Ljc1MDA3IDYgNy43NTAwNyA0IDcuNzUwMDcgNFpNMy41NjcwNyA1LjcyQzQuNTY3MDcgNC43MiAzLjgxNzA3IDEuNzIgMi4xMjkwNyAxLjcyQzAuNDQxMDY4IDEuNzIgMC41NjcwNjggMy43MiAxLjU2NzA3IDMuNzJDMi41NjcwNyAzLjcyIDIuNTY3MDcgNS43MiAyLjU2NzA3IDYuNzJDMi41NjcwNyA3LjcyIDMuNTY3MDcgNS43MiAzLjU2NzA3IDUuNzJaIiBmaWxsPSIjQUE4REQ4Ii8+CjxwYXRoIGQ9Ik0yOS45NDIgMzIuODU2QzMwLjEzMSAzMy42NjQgMzEuMTY5IDM1LjEzNiAzMS45NzQgMzQuOTQ3QzMyLjc4IDM0Ljc1NyAzMy4wNTEgMzIuOTc2IDMyLjg2MiAzMi4xN0MzMi42NzMgMzEuMzYyIDMxLjg2NCAzMC44NjMgMzEuMDU4IDMxLjA1M0MzMC4yNTMgMzEuMjQzIDI5Ljc1MiAzMi4wNSAyOS45NDIgMzIuODU2Wk0yNC41MDggMzMuNTA1QzI0LjUxMSAzNC4zMzUgMjUuMTg5IDM2LjAwMyAyNi4wMTcgMzZDMjYuODQ1IDM1Ljk5NiAyNy41MTEgMzQuMzIzIDI3LjUwOCAzMy40OTRDMjcuNTA1IDMyLjY2NSAyNi44MzEgMzEuOTk3IDI2LjAwMyAzMS45OTlDMjUuMTc1IDMyLjAwMyAyNC41MDUgMzIuNjc2IDI0LjUwOCAzMy41MDVaTTE5LjIzNyAzMS4wNTlDMTguOTExIDMxLjgyMyAxOC44NzIgMzMuNjIyIDE5LjYzMyAzMy45NDlDMjAuMzk2IDM0LjI3MyAyMS42NyAzMy4wMDIgMjEuOTk2IDMyLjIzOUMyMi4zMjEgMzEuNDc3IDIxLjk2OCAzMC41OTYgMjEuMjA3IDMwLjI2OUMyMC40NDUgMjkuOTQ0IDE5LjU2NCAzMC4yOTYgMTkuMjM3IDMxLjA1OVpNMTQuMjA2IDIwLjAxOUMxMy4zOTQgMjAuMTkxIDExLjg5OCAyMS4xOTIgMTIuMDY3IDIyLjAwMkMxMi4yNCAyMi44MTIgMTQuMDEyIDIzLjEyNiAxNC44MjQgMjIuOTU1QzE1LjYzNSAyMi43ODQgMTYuMTUzIDIxLjk4OCAxNS45ODQgMjEuMTc4QzE1LjgxMiAyMC4zNjggMTUuMDE5IDE5Ljg0OCAxNC4yMDYgMjAuMDE5Wk0xMi4xNjkgMTUuMDE5QzExLjM1NyAxNS4xOTEgOS44NjEwNCAxNi4xOTIgMTAuMDMgMTcuMDAyQzEwLjIwMyAxNy44MTIgMTEuOTc1IDE4LjEyNiAxMi43ODcgMTcuOTU1QzEzLjU5OCAxNy43ODQgMTQuMTE2IDE2Ljk4OCAxMy45NDcgMTYuMTc4QzEzLjc3NSAxNS4zNjggMTIuOTgxIDE0Ljg0OCAxMi4xNjkgMTUuMDE5WiIgZmlsbD0iIzc0NEVBQSIvPgo8cGF0aCBkPSJNMjcuNTc5MSAzNEMzMC40MSAzNCAzMi41MDUgMzMuMTIzIDMyLjg0NSAzMi45NzNDMzUuMTE2MSAzMS45NjMgMzYuMTM4MSAyOS4zMDQgMzUuMTI5MSAyNy4wMzRDMzQuMTMwMSAyNC43ODQgMzEuNTEzMSAyMy43NTkgMjkuMjU3MSAyNC43MkMyOS4xMjQxIDI0Ljc3IDI3LjQ2NDEgMjUuMzY5IDI1LjkxNDEgMjQuNjQ4QzI0LjA2MzEgMjMuNzg3IDIyLjkxOTEgMjEuMzM5IDIyLjI4NjEgMTkuNDM5QzIyLjE0MjEgMTkuMDA5IDIxLjkwMTEgMTguMTY1IDIxLjYgMTcuMTIzQzE5LjczNDEgMTAuNjUyIDE4Ljc2ODEgOC44Mzc5OSAxNy42MTcxIDcuMzAyOTlDMTMuOTA2IDIuMzUxOTkgOC4wMjUwNSAyLjAwNjk5IDUuMTM0MDUgMi41ODY5OUMyLjY5NzA1IDMuMDczOTkgMS4xMTYwNSA1LjQ0NDk5IDEuNjA0MDUgNy44ODE5OUMyLjA5MjA1IDEwLjMyIDQuNDY0MDUgMTEuOTAyIDYuOTAwMDUgMTEuNDEyQzcuMDYyMDUgMTEuMzg2IDkuMTA0MDUgMTEuMTA2IDEwLjMyNDEgMTIuNTgxQzEwLjk2NzEgMTMuODY4IDEyLjQwNDEgMTcuNzA5IDEyLjk1NDEgMTkuNjE1QzEzLjMwMDEgMjAuODE0IDEzLjU4MzEgMjEuNzg2IDEzLjc0ODEgMjIuMjgyQzE1LjUyMTEgMjcuNTk5IDE4LjQxNDEgMzEuMTc1IDIyLjM1MTEgMzIuOTExQzI0LjIwMzEgMzMuNzI5IDI2LjAwNTEgMzQgMjcuNTc5MSAzNFoiIGZpbGw9IiM5MjY2Q0MiLz4KPHBhdGggZD0iTTcuMDE3MDkgNkM3LjU2OTM3IDYgOC4wMTcwOSA1LjU1MjI4IDguMDE3MDkgNUM4LjAxNzA5IDQuNDQ3NzIgNy41NjkzNyA0IDcuMDE3MDkgNEM2LjQ2NDgxIDQgNi4wMTcwOSA0LjQ0NzcyIDYuMDE3MDkgNUM2LjAxNzA5IDUuNTUyMjggNi40NjQ4MSA2IDcuMDE3MDkgNloiIGZpbGw9IiMyMDIwMjQiLz4KPHBhdGggZD0iTTMxLjI1ODEgMzIuOTY0QzMxLjE2OTEgMzIuOTY0IDMxLjA3ODEgMzIuOTUyIDMwLjk4OTEgMzIuOTI4QzMwLjQ1NzEgMzIuNzggMzAuMTQ1MSAzMi4yMjkgMzAuMjkzMSAzMS42OTdDMzEuMDUwMSAyOC45NzUgMjkuNTIzMSAyNy4xNTUgMjkuNTA4MSAyNy4xMzdDMjkuMTQ5MSAyNi43MTggMjkuMTk2MSAyNi4wODYgMjkuNjE1MSAyNS43MjdDMzAuMDMzMSAyNS4zNjggMzAuNjY2MSAyNS40MTUgMzEuMDI1MSAyNS44MzRDMzEuMTE3MSAyNS45NDEgMzMuMjU5MSAyOC40OTQgMzIuMjIwMSAzMi4yMzFDMzIuMDk4MSAzMi42NzQgMzEuNjk1MSAzMi45NjQgMzEuMjU4MSAzMi45NjRaTTI0LjA1OTEgMzIuNDAxQzIzLjgxNDEgMzIuNDAxIDIzLjU2OTEgMzIuMzEyIDIzLjM3NTEgMzIuMTMxQzIyLjk3MjEgMzEuNzUzIDIyLjk1MTEgMzEuMTIgMjMuMzI4MSAzMC43MTdDMjQuODEzMSAyOS4xMyAyNC43ODExIDI2LjUyNCAyNC43ODAxIDI2LjQ5N0MyNC43NjQxIDI1Ljk0NSAyNS4xOTkxIDI1LjQ4NSAyNS43NTIxIDI1LjQ2OUMyNi4yOTQxIDI1LjQ2NCAyNi43NjUxIDI1Ljg4OCAyNi43ODAxIDI2LjQ0MUMyNi43ODQxIDI2LjU4IDI2Ljg1MzEgMjkuODc4IDI0Ljc4OTEgMzIuMDg1QzI0LjU5MjEgMzIuMjk1IDI0LjMyNTEgMzIuNDAxIDI0LjA1OTEgMzIuNDAxWk0xNS41MTcxIDIzLjcwNUMxNS4wMzcxIDIzLjcwNSAxNC42MTMxIDIzLjM1OCAxNC41MzIxIDIyLjg2OEMxNC40NDIxIDIyLjMyNCAxNC44MTAxIDIxLjgwOCAxNS4zNTUxIDIxLjcxOUMxOC40MjkxIDIxLjIwOSAyMC4xMjkxIDE5LjM0MiAyMC4xNDYxIDE5LjMyM0MyMC41MTExIDE4LjkxMyAyMS4xNDQxIDE4Ljg3NCAyMS41NTUxIDE5LjIzOUMyMS45NjcxIDE5LjYwNCAyMi4wMDgxIDIwLjIzMiAyMS42NDYxIDIwLjY0NUMyMS41NTkxIDIwLjc0NCAxOS40OTAxIDIzLjA2IDE1LjY4MjEgMjMuNjkxQzE1LjYyNjEgMjMuNzAxIDE1LjU3MTEgMjMuNzA1IDE1LjUxNzEgMjMuNzA1Wk0xOC40MzgxIDI4LjU2MkMxOC4wMTMxIDI4LjU2MiAxNy42MTkxIDI4LjI5IDE3LjQ4NDEgMjcuODY0QzE3LjMxODEgMjcuMzM4IDE3LjYxMDEgMjYuNzc1IDE4LjEzNjEgMjYuNjA5QzIwLjgyOTEgMjUuNzU2IDIyLjAxNjEgMjMuNzc5IDIyLjAyODEgMjMuNzU5QzIyLjMwODEgMjMuMjgyIDIyLjkyMDEgMjMuMTIyIDIzLjM5NjEgMjMuNDAyQzIzLjg3MzEgMjMuNjgxIDI0LjAzMjEgMjQuMjk1IDIzLjc1MzEgMjQuNzdDMjMuNjkwMSAyNC44NzggMjIuMTU4MSAyNy40MzMgMTguNzQwMSAyOC41MTRDMTguNjM5MSAyOC41NDcgMTguNTM3MSAyOC41NjIgMTguNDM4MSAyOC41NjJaTTEzLjgxOTEgMTcuODkyQzEzLjMyMzEgMTcuODkyIDEyLjg5MjEgMTcuNTIzIDEyLjgyODEgMTcuMDE3QzEyLjc1OTEgMTYuNDY5IDEzLjE0NzEgMTUuOTY5IDEzLjY5NTEgMTUuODk5QzE2LjM4NDEgMTUuNTU5IDE4LjM1MjEgMTMuOTI4IDE4LjM3MTEgMTMuOTExQzE4Ljc5MzEgMTMuNTU3IDE5LjQyNDEgMTMuNjA4IDE5Ljc3OTEgMTQuMDNDMjAuMTM1MSAxNC40NTEgMjAuMDg0MSAxNS4wOCAxOS42NjQxIDE1LjQzN0MxOS41NjcxIDE1LjUyIDE3LjI0NDEgMTcuNDY2IDEzLjk0NjEgMTcuODgzQzEzLjkwMzEgMTcuODg5IDEzLjg2MTEgMTcuODkyIDEzLjgxOTEgMTcuODkyWk0xMS45OTgxIDEzLjEyNUMxMS41NzMxIDEzLjEyNSAxMS4xNzkxIDEyLjg1MiAxMS4wNDQxIDEyLjQyNEMxMC44NzkxIDExLjg5NyAxMS4xNzExIDExLjMzNiAxMS42OTgxIDExLjE3QzE0LjgyODEgMTAuMTg3IDE1Ljk1MTEgOC40NzggMTUuOTk3MSA4LjQwNkMxNi4yOTIxIDcuOTQ0IDE2LjkwODEgNy44MDEgMTcuMzcyMSA4LjA5NEMxNy44MzcxIDguMzg2IDE3Ljk4MzEgOC45OTMgMTcuNjk2MSA5LjQ2QzE3LjYzNjEgOS41NTcgMTYuMTkwMSAxMS44NTYgMTIuMjk3MSAxMy4wNzlDMTIuMTk4MSAxMy4xMSAxMi4wOTcxIDEzLjEyNSAxMS45OTgxIDEzLjEyNVoiIGZpbGw9IiM3NDRFQUEiLz4KPC9zdmc+';\n\nexport const ideaImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMzUiIHZpZXdCb3g9IjAgMCAyMyAzNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIyLjUgMTAuOTJDMjIuNSAxNy4zNTkgMTcuNSAxOC4zNTkgMTcuNSAyNC4zNkMxNy41IDI3LjQ1OCAxNC4zNzcgMjcuNzE5IDEyIDI3LjcxOUM5Ljk0NyAyNy43MTkgNS40MTQgMjYuOTQgNS40MTQgMjQuMzU4QzUuNDE0IDE4LjM2IDAuNSAxNy4zNiAwLjUgMTAuOTJDMC41IDQuODg5IDUuNzg1IDAgMTEuNTgzIDBDMTcuMzgzIDAgMjIuNSA0Ljg4OSAyMi41IDEwLjkyWiIgZmlsbD0iI0ZGREQ4MyIvPgo8cGF0aCBkPSJNMTUuNjY3IDMyLjM2QzE1LjY2NyAzMy4xODggMTMuNDMzIDM0Ljg2IDExLjUgMzQuODZDOS41NjcwMSAzNC44NiA3LjMzMzAxIDMzLjE4OCA3LjMzMzAxIDMyLjM2QzcuMzMzMDEgMzEuNTMyIDkuNTY2MDEgMzEuODYgMTEuNSAzMS44NkMxMy40MzMgMzEuODYgMTUuNjY3IDMxLjUzMiAxNS42NjcgMzIuMzZaIiBmaWxsPSIjQ0NENkREIi8+CjxwYXRoIGQ9Ik0xNi4yMDcgMTAuMTUzQzE1LjgxNiA5Ljc2MTk5IDE1LjE4NCA5Ljc2MTk5IDE0Ljc5MyAxMC4xNTNMMTEuNSAxMy40NDZMOC4yMDcwMSAxMC4xNTNDNy44MTYwMSA5Ljc2MTk5IDcuMTg0MDEgOS43NjE5OSA2Ljc5MzAxIDEwLjE1M0M2LjQwMjAxIDEwLjU0NCA2LjQwMjAxIDExLjE3NiA2Ljc5MzAxIDExLjU2N0wxMC41IDE1LjI3NFYyNS44NkMxMC41IDI2LjQxMyAxMC45NDggMjYuODYgMTEuNSAyNi44NkMxMi4wNTIgMjYuODYgMTIuNSAyNi40MTMgMTIuNSAyNS44NlYxNS4yNzRMMTYuMjA3IDExLjU2N0MxNi41OTggMTEuMTc2IDE2LjU5OCAxMC41NDQgMTYuMjA3IDEwLjE1M1oiIGZpbGw9IiNGRkNDNEQiLz4KPHBhdGggZD0iTTE3LjUgMzAuODZDMTcuNSAzMS45NjQgMTYuNjA0IDMyLjg2IDE1LjUgMzIuODZIOC41QzcuMzk2IDMyLjg2IDYuNSAzMS45NjQgNi41IDMwLjg2VjI0Ljg2SDE3LjVWMzAuODZaIiBmaWxsPSIjOTlBQUI1Ii8+CjxwYXRoIGQ9Ik01LjQ5OSAzMS44NkM1LjAxOSAzMS44NiA0LjU5NSAzMS41MTMgNC41MTQgMzEuMDI0QzQuNDIzIDMwLjQ4IDQuNzkxIDI5Ljk2NCA1LjMzNiAyOS44NzRMMTcuMzM2IDI3Ljg3NEMxNy44OCAyNy43NzYgMTguMzk2IDI4LjE1MSAxOC40ODYgMjguNjk2QzE4LjU3NyAyOS4yNCAxOC4yMDkgMjkuNzU2IDE3LjY2NCAyOS44NDZMOS42NjQgMzEuODQ2QzkuNjA5IDMxLjg1NiA5LjU1MyAzMS44NiA1LjQ5OSAzMS44NlpNNS40OTkgMjcuODZDNS4wMTkgMjcuODYgNC41OTUgMjcuNTEzIDQuNTE0IDI3LjAyNEM0LjQyMyAyNi40OCA0Ljc5MSAyNS45NjQgNS4zMzYgMjUuODc0TDE3LjMzNiAyMy44NzRDMTcuODggMjMuNzc3IDE4LjM5NiAyNC4xNTEgMTguNDg2IDI0LjY5NkMxOC41NzcgMjUuMjQgMTguMjA5IDI1Ljc1NiAxNy42NjQgMjUuODQ2TDkuNjY0IDI3Ljg0NkM5LjYwOSAyNy44NTYgOS41NTMgMjcuODYgNS40OTkgMjcuODZaIiBmaWxsPSIjQ0NENkREIi8+Cjwvc3ZnPg==';\n\nexport const thoughtImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzNiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM1LjE2NjYgMTAuODc1QzM1LjE2NjYgNy4wMDkgMzIuMDMyNiAzLjg3NSAyOC4xNjY2IDMuODc1QzI2Ljk5OTYgMy44NzUgMjUuOTAxNiA0LjE2NSAyNC45MzQ2IDQuNjY5QzIyLjg1MjYgMS44NDIgMTkuNTA5NiAwIDE1LjcyOTYgMEMxMC41OTc2IDAgNi4yNTQ2MyAzLjM4IDQuODA2NjMgOC4wMzZDMi4xNDg2MyA4LjY1MyAwLjE2NjYyNiAxMS4wMyAwLjE2NjYyNiAxMy44NzVDMC4xNjY2MjYgMTYuODU0IDIuMzQwNjMgMTkuMzIgNS4xODc2MyAxOS43ODhDNS40MDM2MyAyMy43MzcgOC42NjQ2MyAyNi44NzUgMTIuNjY2NiAyNi44NzVDMTQuODQyNiAyNi44NzUgMTYuNzk2NiAyNS45NDIgMTguMTY2NiAyNC40NjJDMTkuNTM2NiAyNS45NDIgMjEuNDg5NiAyNi44NzUgMjMuNjY2NiAyNi44NzVDMjcuODA5NiAyNi44NzUgMzEuMTY2NiAyMy41MTggMzEuMTY2NiAxOS4zNzVDMzEuMTY2NiAxOC42NjUgMzEuMDYxNiAxNy45ODEgMzAuODc3NiAxNy4zM0MzMy4zOTY2IDE2LjI3MSAzNS4xNjY2IDEzLjc4IDM1LjE2NjYgMTAuODc1WiIgZmlsbD0iIzg1QzhGOCIvPgo8cGF0aCBkPSJNNC4xNjY2MyAzMi44NzVDNS44MjM0OCAzMi44NzUgNy4xNjY2MyAzMS41MzE5IDcuMTY2NjMgMjkuODc1QzcuMTY2NjMgMjguMjE4MSA1LjgyMzQ4IDI2Ljg3NSA0LjE2NjYzIDI2Ljg3NUMuNTA5NzcgMjYuODc1IDEuMTY2NjMgMjguMjE4MSAxLjE2NjYzIDI5Ljg3NUMxLjE2NjYzIDMxLjUzMTkgMi41MDk3NyAzMi44NzUgNC4xNjY2MyAzMi44NzVaIiBmaWxsPSIjODVDOEY4Ii8+Cjwvc3ZnPg==';\n\n","import { Theme } from '../types';\n\nexport function getThemeClasses(theme: Theme) {\n return {\n // Background colors - light mode is now softer (gray-50 instead of white)\n bgPrimary: theme === 'dark' ? 'bg-zinc-900' : 'bg-gray-50',\n bgSecondary: theme === 'dark' ? 'bg-zinc-800' : 'bg-gray-100',\n bgTertiary: theme === 'dark' ? 'bg-zinc-700' : 'bg-gray-200',\n bgHover: theme === 'dark' ? 'hover:bg-zinc-600' : 'hover:bg-gray-200',\n bgHoverSecondary: theme === 'dark' ? 'hover:bg-zinc-700' : 'hover:bg-gray-200',\n \n // Text colors\n textPrimary: theme === 'dark' ? 'text-zinc-100' : 'text-gray-900',\n textSecondary: theme === 'dark' ? 'text-zinc-300' : 'text-gray-700',\n textTertiary: theme === 'dark' ? 'text-zinc-400' : 'text-gray-600',\n textMuted: theme === 'dark' ? 'text-neutral-400' : 'text-gray-500',\n \n // Border colors\n borderPrimary: theme === 'dark' ? 'border-zinc-700' : 'border-gray-300',\n borderSecondary: theme === 'dark' ? 'border-zinc-600' : 'border-gray-300',\n borderHover: theme === 'dark' ? 'hover:border-zinc-500' : 'hover:border-gray-400',\n \n // Canvas/Editor background\n canvasBg: theme === 'dark' ? 'bg-zinc-900' : 'bg-gray-200',\n \n // Overlay\n overlay: theme === 'dark' ? 'bg-black/80' : 'bg-black/60',\n \n // Focus ring offset\n focusRingOffset: theme === 'dark' ? 'focus:ring-offset-zinc-900' : 'focus:ring-offset-gray-50',\n \n // Button variants\n buttonSecondary: theme === 'dark' \n ? 'bg-zinc-800 hover:bg-zinc-700 text-zinc-100' \n : 'bg-gray-200 hover:bg-gray-300 text-gray-900',\n \n buttonTertiary: theme === 'dark'\n ? 'bg-zinc-700 hover:bg-zinc-600 text-zinc-100'\n : 'bg-gray-300 hover:bg-gray-400 text-gray-900',\n \n // Icon colors - make icons more visible (darker for better contrast)\n iconColor: theme === 'dark' ? 'text-zinc-100' : 'text-gray-900',\n };\n}\n\nexport function getDefaultTheme(): Theme {\n // Check environment variable (works in Next.js client-side)\n if (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_FEEDBACK_THEME === 'light') {\n return 'light';\n }\n return 'dark'; // Default to dark\n}\n","'use client'\n\nimport { Popover } from \"@headlessui/react\";\nimport { X } from \"phosphor-react\";\nimport { Theme } from \"../types\";\nimport { getThemeClasses } from \"../lib/theme\";\n\nexport function CloseButton({ className = \"\", title = \"Close feedback form\", theme = 'dark' }: { className?: string; title?: string; theme?: Theme }) {\n const themeClasses = getThemeClasses(theme);\n return (\n <Popover.Button className={`${themeClasses.textTertiary} ${theme === 'dark' ? 'hover:text-zinc-100' : 'hover:text-gray-900'} ${className}`} title={title}>\n <X weight=\"bold\" className=\"w-5 h-5\"/>\n </Popover.Button>\n )\n}\n\n","export type Language = 'en' | 'nl';\n\nexport const translations = {\n en: {\n widget: {\n button: 'Feedback',\n },\n form: {\n header: 'Please give us your feedback!',\n closeButton: 'Close feedback form',\n },\n types: {\n bug: 'Bug',\n idea: 'Idea',\n other: 'Other',\n },\n content: {\n placeholder: 'Tell in detail what is happening',\n sendButton: 'Send feedback',\n error: 'Failed to send feedback. Please try again.',\n },\n success: {\n message: 'We appreciate the feedback',\n sendAnother: 'I want to send another',\n },\n },\n nl: {\n widget: {\n button: 'Feedback',\n },\n form: {\n header: 'Geef ons je feedback!',\n closeButton: 'Feedback formulier sluiten',\n },\n types: {\n bug: 'Bug',\n idea: 'Idee',\n other: 'Anders',\n },\n content: {\n placeholder: 'Vertel in detail wat er gebeurt',\n sendButton: 'Feedback versturen',\n error: 'Feedback versturen mislukt. Probeer het opnieuw.',\n },\n success: {\n message: 'Bedankt voor je feedback',\n sendAnother: 'Ik wil nog een sturen',\n },\n },\n} as const;\n\nexport function getTranslations(lang: Language = 'en') {\n return translations[lang];\n}\n\n","'use client'\n\nimport { FeedbackType, getFeedbackTypes } from \"..\";\nimport { CloseButton } from \"../../CloseButton\";\nimport { Language, getTranslations } from \"../../../lib/translations\";\nimport { Theme } from \"../../../types\";\nimport { getThemeClasses } from \"../../../lib/theme\";\n\ninterface FeedbackTypeStepProps {\n onFeedbackTypeChanged: (type: FeedbackType) => void;\n language: Language;\n theme: Theme;\n}\n\nexport function FeedbackTypeStep({ onFeedbackTypeChanged, language, theme }: FeedbackTypeStepProps) {\n const t = getTranslations(language);\n const feedbackTypes = getFeedbackTypes(language);\n const themeClasses = getThemeClasses(theme);\n \n return (\n <>\n <header className=\"flex items-center justify-between w-full gap-2\">\n <span className={`text-lg md:text-xl leading-6 ${themeClasses.textPrimary}`}>{t.form.header}</span>\n <CloseButton title={t.form.closeButton} theme={theme} />\n </header>\n <div className=\"flex py-6 md:py-8 gap-2 md:gap-2 w-full justify-center md:justify-start flex-wrap\">\n {\n Object.entries(feedbackTypes).map(([key, value]) => {\n return (\n <button\n key={key}\n className={`${themeClasses.bgSecondary} rounded py-4 md:py-5 flex-1 min-w-[80px] md:w-24 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none transition-colors`}\n type=\"button\"\n onClick={() => onFeedbackTypeChanged(key as FeedbackType)}\n >\n <img src={value.image.source} alt={value.image.alt} className=\"w-5 h-5 md:w-6 md:h-6\"></img>\n <span className={`text-xs md:text-sm text-center ${themeClasses.textPrimary}`}>{value.title}</span>\n </button>\n )\n })\n }\n </div>\n </>\n )\n}\n\n","'use client'\n\nimport { CircleNotch } from 'phosphor-react';\n\nexport function Loading() {\n return (\n <div className=\"w-4 h-4 flex items-center justify-center overflow-hidden \">\n <CircleNotch weight=\"bold\" className=\"w-4 h-4 animate-spin\" />\n </div>\n )\n}\n\n","'use client'\n\nimport { X, Check, Trash, ArrowCounterClockwise } from 'phosphor-react';\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport { Theme } from '../types';\nimport { getThemeClasses } from '../lib/theme';\n\ninterface ScreenshotEditorProps {\n screenshot: string;\n onSave: (editedScreenshot: string) => void;\n onCancel: () => void;\n language: 'en' | 'nl';\n theme?: Theme;\n}\n\nexport function ScreenshotEditor({\n screenshot,\n onSave,\n onCancel,\n language,\n theme = 'dark',\n}: ScreenshotEditorProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const [color, setColor] = useState('#ef4444'); // red-500\n const [brushSize, setBrushSize] = useState(3);\n const [image, setImage] = useState<HTMLImageElement | null>(null);\n const themeClasses = getThemeClasses(theme);\n\n const t = {\n en: {\n save: 'Save',\n cancel: 'Cancel',\n clear: 'Clear',\n undo: 'Undo',\n },\n nl: {\n save: 'Opslaan',\n cancel: 'Annuleren',\n clear: 'Wissen',\n undo: 'Ongedaan maken',\n },\n }[language];\n\n const colors = [\n '#ef4444', // red-500\n '#f59e0b', // amber-500\n '#eab308', // yellow-500\n '#22c55e', // green-500\n '#3b82f6', // blue-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n '#ffffff', // white\n '#000000', // black\n ];\n\n // Load image when screenshot changes\n useEffect(() => {\n const img = new Image();\n img.onload = () => {\n setImage(img);\n if (canvasRef.current) {\n const canvas = canvasRef.current;\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(img, 0, 0);\n }\n }\n };\n img.src = screenshot;\n }, [screenshot]);\n\n const getCoordinates = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n\n const rect = canvas.getBoundingClientRect();\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n\n if ('touches' in e) {\n const touch = e.touches[0] || e.changedTouches[0];\n return {\n x: (touch.clientX - rect.left) * scaleX,\n y: (touch.clientY - rect.top) * scaleY,\n };\n } else {\n return {\n x: (e.clientX - rect.left) * scaleX,\n y: (e.clientY - rect.top) * scaleY,\n };\n }\n }, []);\n\n const startDrawing = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault();\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const { x, y } = getCoordinates(e);\n setIsDrawing(true);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.strokeStyle = color;\n ctx.lineWidth = brushSize;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n }, [color, brushSize, getCoordinates]);\n\n const draw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n if (!isDrawing) return;\n e.preventDefault();\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const { x, y } = getCoordinates(e);\n ctx.lineTo(x, y);\n ctx.stroke();\n }, [isDrawing, getCoordinates]);\n\n const stopDrawing = useCallback(() => {\n setIsDrawing(false);\n }, []);\n\n const clearCanvas = () => {\n const canvas = canvasRef.current;\n if (!canvas || !image) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0);\n };\n\n const undo = () => {\n const canvas = canvasRef.current;\n if (!canvas || !image) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // Redraw the base image (simple undo - clears all drawings)\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0);\n };\n\n const handleSave = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const editedScreenshot = canvas.toDataURL('image/png');\n onSave(editedScreenshot);\n };\n\n // Calculate canvas display size (max 600px width, maintain aspect ratio)\n const maxWidth = 600;\n const displayWidth = image ? Math.min(maxWidth, image.width) : maxWidth;\n const displayHeight = image ? (displayWidth / image.width) * image.height : 400;\n\n return (\n <div className={`fixed inset-0 z-50 flex items-center justify-center ${themeClasses.overlay} p-2 md:p-4`}>\n <div className={`${themeClasses.bgSecondary} rounded-lg shadow-xl max-w-4xl w-full max-h-[95vh] md:max-h-[90vh] overflow-auto`}>\n <div className={`sticky top-0 ${themeClasses.bgSecondary} border-b ${themeClasses.borderPrimary} p-2 md:p-4 flex items-center justify-between z-10 gap-2`}>\n <h3 className={`text-base md:text-lg font-semibold ${themeClasses.textPrimary} truncate`}>\n {language === 'nl' ? 'Teken op screenshot' : 'Draw on screenshot'}\n </h3>\n <div className=\"flex gap-1 md:gap-2 flex-shrink-0\">\n <button\n type=\"button\"\n onClick={undo}\n className={`p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`}\n title={t.undo}\n >\n <ArrowCounterClockwise weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n <button\n type=\"button\"\n onClick={clearCanvas}\n className={`p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`}\n title={t.clear}\n >\n <Trash weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n <button\n type=\"button\"\n onClick={onCancel}\n className={`p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`}\n title={t.cancel}\n >\n <X weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"p-1.5 md:p-2 bg-brand-500 hover:bg-brand-400 rounded-md text-white transition-colors touch-manipulation\"\n title={t.save}\n >\n <Check weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n </div>\n </div>\n\n <div className=\"p-3 md:p-4\">\n {/* Color picker */}\n <div className=\"mb-3 md:mb-4 flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4\">\n <label className={`text-xs md:text-sm ${themeClasses.textSecondary} whitespace-nowrap`}>\n {language === 'nl' ? 'Kleur:' : 'Color:'}\n </label>\n <div className=\"flex gap-1.5 md:gap-2 flex-wrap\">\n {colors.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setColor(c)}\n className={`w-7 h-7 md:w-8 md:h-8 rounded-full border-2 transition-all touch-manipulation ${\n color === c\n ? `${theme === 'dark' ? 'border-zinc-100' : 'border-gray-900'} scale-110`\n : `${themeClasses.borderSecondary} ${themeClasses.borderHover}`\n }`}\n style={{ backgroundColor: c }}\n title={c}\n />\n ))}\n </div>\n </div>\n\n {/* Brush size */}\n <div className=\"mb-3 md:mb-4 flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4\">\n <label className={`text-xs md:text-sm ${themeClasses.textSecondary} whitespace-nowrap`}>\n {language === 'nl' ? 'Grootte:' : 'Size:'}\n </label>\n <div className=\"flex items-center gap-2 w-full md:w-auto\">\n <input\n type=\"range\"\n min=\"1\"\n max=\"10\"\n value={brushSize}\n onChange={(e) => setBrushSize(Number(e.target.value))}\n className=\"flex-1 md:flex-none md:max-w-xs\"\n />\n <span className={`text-xs md:text-sm ${themeClasses.textTertiary} w-6 md:w-8 text-right`}>{brushSize}</span>\n </div>\n </div>\n\n {/* Canvas */}\n <div className={`flex justify-center ${themeClasses.canvasBg} rounded-lg p-2 md:p-4 overflow-auto`}>\n <canvas\n ref={canvasRef}\n onMouseDown={startDrawing}\n onMouseMove={draw}\n onMouseUp={stopDrawing}\n onMouseLeave={stopDrawing}\n onTouchStart={startDrawing}\n onTouchMove={draw}\n onTouchEnd={stopDrawing}\n className={`cursor-crosshair border ${themeClasses.borderPrimary} rounded touch-none`}\n style={{\n width: `${displayWidth}px`,\n height: `${displayHeight}px`,\n maxWidth: '100%',\n maxHeight: 'calc(95vh - 200px)',\n }}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","'use client'\n\nimport html2canvas from 'html2canvas';\nimport { Camera, Trash, X, PencilSimple } from 'phosphor-react';\nimport { useState } from 'react';\nimport { Loading } from './Loading';\nimport { ScreenshotEditor } from './ScreenshotEditor';\nimport { Language } from '../lib/translations';\nimport { Theme } from '../types';\nimport { getThemeClasses } from '../lib/theme';\n\ninterface ScreenshotButtonProps {\n screenshot: string | null;\n onScreenshotTook: (screenshot: string | null) => void;\n language?: Language;\n theme?: Theme;\n}\n\nexport function ScreenshotButton({\n screenshot,\n onScreenshotTook,\n language = 'en',\n theme = 'dark',\n}: ScreenshotButtonProps) {\n const [isTakenScreenshot, setIsTakenScreenShot] = useState(false);\n const [showEditor, setShowEditor] = useState(false);\n const [tempScreenshot, setTempScreenshot] = useState<string | null>(null);\n const themeClasses = getThemeClasses(theme);\n \n async function handleTakeScreenshot() {\n setIsTakenScreenShot(true);\n const canvas = await html2canvas(document.querySelector('html')!, {\n ignoreElements: (element) => {\n // Exclude the feedback widget from screenshots\n return element.hasAttribute('data-feedback-widget') || \n element.closest('[data-feedback-widget]') !== null;\n },\n });\n const base64image = canvas.toDataURL('image/png');\n onScreenshotTook(base64image);\n setIsTakenScreenShot(false);\n }\n\n function handleEditorSave(editedScreenshot: string) {\n onScreenshotTook(editedScreenshot);\n setShowEditor(false);\n setTempScreenshot(null);\n }\n\n function handleEditorCancel() {\n setShowEditor(false);\n setTempScreenshot(null);\n }\n\n function handleEditScreenshot() {\n if (screenshot) {\n setTempScreenshot(screenshot);\n setShowEditor(true);\n }\n }\n\n if (showEditor && (tempScreenshot || screenshot)) {\n return (\n <>\n <ScreenshotEditor\n screenshot={tempScreenshot || screenshot!}\n onSave={handleEditorSave}\n onCancel={handleEditorCancel}\n language={language}\n theme={theme}\n />\n {screenshot ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"relative group\">\n <div\n className={`p-1 w-10 h-10 rounded-md border ${themeClasses.borderSecondary} flex \n justify-end items-end relative overflow-hidden`}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'center',\n backgroundSize: 'cover',\n }}\n >\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors rounded-md\" />\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onScreenshotTook(null);\n }}\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10\"\n title={language === 'nl' ? 'Verwijderen' : 'Delete'}\n >\n <X weight=\"bold\" className=\"w-3 h-3 text-white\" />\n </button>\n </div>\n <button\n type=\"button\"\n onClick={handleEditScreenshot}\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transition-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n title={language === 'nl' ? 'Bewerk screenshot' : 'Edit screenshot'}\n >\n <PencilSimple weight=\"bold\" className={`w-5 h-5 ${themeClasses.textPrimary}`} />\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transition-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className={`w-6 h-6 ${themeClasses.iconColor}`} />}\n </button>\n )}\n </>\n );\n }\n\n if (screenshot) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"relative group\">\n <div\n className={`p-1 w-10 h-10 rounded-md border ${themeClasses.borderSecondary} flex \n justify-end items-end relative overflow-hidden`}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'center',\n backgroundSize: 'cover',\n }}\n >\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors rounded-md\" />\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onScreenshotTook(null);\n }}\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10\"\n title={language === 'nl' ? 'Verwijderen' : 'Delete'}\n >\n <X weight=\"bold\" className=\"w-3 h-3 text-white\" />\n </button>\n </div>\n <button\n type=\"button\"\n onClick={handleEditScreenshot}\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transition-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n title={language === 'nl' ? 'Bewerk screenshot' : 'Edit screenshot'}\n >\n <PencilSimple weight=\"bold\" className={`w-5 h-5 ${themeClasses.textPrimary}`} />\n </button>\n </div>\n )\n }\n \n return (\n <button\n type=\"button\"\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className={`w-6 h-6 ${themeClasses.iconColor}`} />}\n </button>\n )\n}\n\n","'use client'\n\nimport { Paperclip, X } from 'phosphor-react';\nimport { useRef, useState, useEffect } from 'react';\nimport { Theme } from '../types';\nimport { getThemeClasses } from '../lib/theme';\n\nexport interface UploadedFile {\n file: File;\n preview?: string; // For images\n id: string; // Unique identifier\n}\n\ninterface FileUploadButtonProps {\n files: UploadedFile[];\n onFilesChanged: (files: UploadedFile[]) => void;\n maxFileSize?: number; // in bytes, default 5MB\n maxTotalSize?: number; // in bytes, default 20MB\n acceptedTypes?: string; // e.g., \"image/*,.pdf,.doc,.docx\"\n language?: 'en' | 'nl';\n theme?: Theme;\n}\n\nconst DEFAULT_MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB\nconst DEFAULT_MAX_TOTAL_SIZE = 20 * 1024 * 1024; // 20MB\n\nexport function FileUploadButton({\n files,\n onFilesChanged,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n maxTotalSize = DEFAULT_MAX_TOTAL_SIZE,\n acceptedTypes = 'image/*,.pdf,.doc,.docx,.txt',\n language = 'en',\n theme = 'dark',\n}: FileUploadButtonProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [error, setError] = useState<string | null>(null);\n const themeClasses = getThemeClasses(theme);\n\n const translations = {\n en: {\n upload: 'Upload file',\n remove: 'Remove file',\n fileTooLarge: 'File is too large',\n totalSizeExceeded: 'Total file size exceeded',\n maxFileSize: 'Max file size:',\n maxTotalSize: 'Max total size:',\n files: 'files',\n },\n nl: {\n upload: 'Bestand uploaden',\n remove: 'Bestand verwijderen',\n fileTooLarge: 'Bestand is te groot',\n totalSizeExceeded: 'Totale bestandsgrootte overschreden',\n maxFileSize: 'Max bestandsgrootte:',\n maxTotalSize: 'Max totale grootte:',\n files: 'bestanden',\n },\n };\n\n const t = translations[language];\n\n function formatFileSize(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n function handleFileSelect(e: React.ChangeEvent<HTMLInputElement>) {\n setError(null);\n const selectedFiles = Array.from(e.target.files || []);\n \n if (selectedFiles.length === 0) return;\n\n const newFiles: UploadedFile[] = [];\n let totalSize = files.reduce((sum, f) => sum + f.file.size, 0);\n\n for (const file of selectedFiles) {\n // Check individual file size\n if (file.size > maxFileSize) {\n setError(`${t.fileTooLarge} (${file.name}): ${formatFileSize(file.size)} > ${formatFileSize(maxFileSize)}`);\n continue;\n }\n\n // Check total size\n if (totalSize + file.size > maxTotalSize) {\n setError(`${t.totalSizeExceeded} (${formatFileSize(maxTotalSize)})`);\n continue;\n }\n\n // Create preview for images\n let preview: string | undefined;\n if (file.type.startsWith('image/')) {\n preview = URL.createObjectURL(file);\n }\n\n newFiles.push({\n file,\n preview,\n id: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n });\n\n totalSize += file.size;\n }\n\n if (newFiles.length > 0) {\n onFilesChanged([...files, ...newFiles]);\n }\n\n // Reset input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }\n\n function handleRemoveFile(id: string) {\n const fileToRemove = files.find(f => f.id === id);\n if (fileToRemove?.preview) {\n URL.revokeObjectURL(fileToRemove.preview);\n }\n onFilesChanged(files.filter(f => f.id !== id));\n setError(null);\n }\n\n // Cleanup object URLs when files are removed or component unmounts\n useEffect(() => {\n return () => {\n files.forEach(file => {\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n }, [files]); // Cleanup when files change or component unmounts\n\n function handleButtonClick() {\n fileInputRef.current?.click();\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n type=\"button\"\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n onClick={handleButtonClick}\n title={t.upload}\n >\n <Paperclip weight=\"bold\" className={`w-6 h-6 ${themeClasses.iconColor}`} />\n </button>\n \n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n\n {files.map((uploadedFile) => (\n <div\n key={uploadedFile.id}\n className={`flex items-center gap-1 ${themeClasses.bgSecondary} rounded-md px-2 py-1 text-xs`}\n >\n {uploadedFile.preview ? (\n <img\n src={uploadedFile.preview}\n alt={uploadedFile.file.name}\n className=\"w-5 h-5 md:w-6 md:h-6 object-cover rounded flex-shrink-0\"\n />\n ) : (\n <Paperclip className={`w-3 h-3 md:w-4 md:h-4 flex-shrink-0 ${themeClasses.iconColor}`} />\n )}\n <span className={`${themeClasses.textSecondary} max-w-[80px] md:max-w-[100px] truncate`} title={uploadedFile.file.name}>\n {uploadedFile.file.name}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveFile(uploadedFile.id)}\n className={`${themeClasses.textTertiary} ${theme === 'dark' ? 'hover:text-zinc-100' : 'hover:text-gray-900'} transition-colors flex-shrink-0 touch-manipulation`}\n title={t.remove}\n >\n <X weight=\"bold\" className=\"w-3 h-3 md:w-4 md:h-4\" />\n </button>\n </div>\n ))}\n </div>\n \n {error && (\n <p className=\"text-xs text-red-400\">{error}</p>\n )}\n \n {files.length > 0 && (\n <p className={`text-xs ${themeClasses.textTertiary}`}>\n {files.length} {t.files} ({formatFileSize(files.reduce((sum, f) => sum + f.file.size, 0))} / {formatFileSize(maxTotalSize)})\n </p>\n )}\n </div>\n );\n}\n","import { FeedbackType, GitHubConfig } from '../../types';\nimport { UploadedFile } from '../../components/FileUploadButton';\n\ninterface FeedbackData {\n type: FeedbackType;\n comment: string;\n screenshot: string | null;\n files: UploadedFile[];\n}\n\n/**\n * Upload a file to repository and return the URL\n * This avoids the 65536 character limit by storing files in the repo\n */\nasync function uploadFileToRepo(\n token: string,\n owner: string,\n repo: string,\n file: File,\n folderPath: string,\n defaultBranch: string\n): Promise<string> {\n // Read file as base64\n const base64Content = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Remove data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.includes(',') ? result.split(',')[1] : result;\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n // Generate unique filename preserving extension\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(2, 9);\n const fileExtension = file.name.split('.').pop() || 'bin';\n const filename = `feedback-${timestamp}-${randomId}.${fileExtension}`;\n const path = `${folderPath}/${filename}`;\n\n // Upload to repository using GitHub Contents API\n const uploadUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n\n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: `Add feedback file: ${filename}`,\n content: base64Content,\n branch: defaultBranch,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.message || 'Unknown error';\n \n if (response.status === 409) {\n throw new Error(`File already exists: ${filename}`);\n } else if (response.status === 403) {\n throw new Error(`Permission denied for file: ${filename}`);\n } else if (response.status === 422) {\n throw new Error(`File too large or invalid: ${filename} - ${errorMessage}`);\n }\n \n throw new Error(`Failed to upload file ${filename} (${response.status}): ${errorMessage}`);\n }\n\n // Return the GitHub raw URL\n const rawUrl = `https://github.com/${owner}/${repo}/blob/${defaultBranch}/${path}?raw=true`;\n return rawUrl;\n}\n\n/**\n * Upload screenshot to repository and return the URL\n * This avoids the 65536 character limit by storing the image as a file\n */\nasync function uploadScreenshotToRepo(\n token: string,\n owner: string,\n repo: string,\n screenshot: string,\n screenshotPath?: string\n): Promise<string> {\n // Compress screenshot first\n const compressedScreenshot = await compressScreenshot(screenshot, 1920, 0.7);\n \n // Convert base64 data URL to binary\n const base64Data = compressedScreenshot.split(',')[1]; // Remove data:image/jpeg;base64, prefix\n const binaryData = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));\n \n // Get default branch from repository\n const repoResponse = await fetch(\n `https://api.github.com/repos/${owner}/${repo}`,\n {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n }\n );\n \n let defaultBranch = 'main';\n if (repoResponse.ok) {\n const repoData = await repoResponse.json();\n defaultBranch = repoData.default_branch || 'main';\n }\n \n // Use configured path or default to '.feedback-vos'\n const folderPath = screenshotPath || '.feedback-vos';\n \n // Generate unique filename\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(2, 9);\n const filename = `feedback-${timestamp}-${randomId}.jpg`;\n const path = `${folderPath}/${filename}`;\n \n // Convert binary to base64 for GitHub API\n const base64Content = btoa(String.fromCharCode(...binaryData));\n \n // Try to create the folder if it doesn't exist\n // Check if folder exists by trying to get it\n const folderCheckUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}`;\n \n try {\n const folderCheck = await fetch(folderCheckUrl, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n });\n \n // If folder doesn't exist (404), create it with a README.md file\n if (folderCheck.status === 404) {\n const readmeContent = btoa('# Feedback Screenshots\\n\\nThis folder contains screenshots from user feedback.\\n');\n try {\n const folderCreateResponse = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}/README.md`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: 'Create feedback screenshots folder',\n content: readmeContent,\n branch: defaultBranch,\n }),\n });\n \n if (!folderCreateResponse.ok) {\n const folderError = await folderCreateResponse.json().catch(() => ({}));\n console.warn('Could not create folder, proceeding with upload anyway:', folderError);\n } else {\n console.log(`Folder ${folderPath} created successfully`);\n }\n } catch (folderCreateError) {\n // Ignore errors creating folder - might already exist or permission issue\n console.warn('Could not create folder, proceeding with upload:', folderCreateError);\n }\n } else if (folderCheck.status === 200) {\n // Folder exists, check if it's actually a folder (should return array) or a file\n const folderData = await folderCheck.json().catch(() => null);\n if (folderData && !Array.isArray(folderData)) {\n // It's a file, not a folder - this will cause issues\n throw new Error(`Path \"${folderPath}\" exists as a file, not a folder. Please use a different path or remove the file.`);\n }\n console.log(`Folder ${folderPath} already exists`);\n }\n } catch (folderError) {\n // If it's our custom error, re-throw it\n if (folderError instanceof Error && folderError.message.includes('exists as a file')) {\n throw folderError;\n }\n // Ignore other folder errors - proceed with upload\n console.warn('Could not verify/create screenshots folder:', folderError);\n }\n \n // Upload to repository using GitHub Contents API\n const uploadUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n \n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: `Add feedback screenshot: ${filename}`,\n content: base64Content,\n branch: defaultBranch,\n }),\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.message || 'Unknown error';\n \n // Provide more helpful error messages\n if (response.status === 409) {\n throw new Error(`File already exists. This is unexpected - please try again.`);\n } else if (response.status === 403) {\n throw new Error(`Permission denied. Make sure your token has write access to the repository.`);\n } else if (response.status === 422) {\n throw new Error(`Validation failed: ${errorMessage}. The file might be too large.`);\n }\n \n throw new Error(`Failed to upload screenshot (${response.status}): ${errorMessage}`);\n }\n \n const uploadData = await response.json();\n \n // Return the GitHub blob URL with ?raw=true for direct image access in markdown\n // Format: https://github.com/owner/repo/blob/branch/path?raw=true\n // This URL will work in GitHub issues and markdown\n const rawUrl = `https://github.com/${owner}/${repo}/blob/${defaultBranch}/${path}?raw=true`;\n \n console.log(`Screenshot uploaded successfully to: ${rawUrl}`);\n \n // Return the raw URL (works better in GitHub issues)\n return rawUrl;\n}\n\n/**\n * Compress and resize screenshot to reduce size\n * GitHub Issues have a 65536 character limit for the body\n * This function only works in browser environments\n */\nfunction compressScreenshot(dataUrl: string, maxWidth: number = 1920, quality: number = 0.7): Promise<string> {\n return new Promise((resolve, reject) => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n reject(new Error('Screenshot compression only works in browser environments'));\n return;\n }\n\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n let width = img.width;\n let height = img.height;\n\n // Resize if too large\n if (width > maxWidth) {\n height = (height * maxWidth) / width;\n width = maxWidth;\n }\n\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('Could not get canvas context'));\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n \n // Convert to JPEG with compression (smaller than PNG)\n const compressedDataUrl = canvas.toDataURL('image/jpeg', quality);\n resolve(compressedDataUrl);\n };\n img.onerror = () => reject(new Error('Failed to load image'));\n img.src = dataUrl;\n });\n}\n\n/**\n * Verify that the repository exists and is accessible with the given token\n */\nasync function verifyRepositoryAccess(\n token: string,\n owner: string,\n repo: string\n): Promise<{ exists: boolean; hasIssues: boolean; error?: string }> {\n try {\n const response = await fetch(\n `https://api.github.com/repos/${owner}/${repo}`,\n {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n }\n );\n\n if (response.status === 404) {\n return { exists: false, hasIssues: false, error: 'Repository not found' };\n }\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n exists: false,\n hasIssues: false,\n error: errorData.message || `HTTP ${response.status}`,\n };\n }\n\n const repoData = await response.json();\n return {\n exists: true,\n hasIssues: repoData.has_issues !== false, // Default is true if not specified\n };\n } catch (error) {\n return {\n exists: false,\n hasIssues: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\nexport async function sendToGitHub(\n config: GitHubConfig,\n data: FeedbackData\n): Promise<void> {\n const { token, owner, repo, screenshotPath } = config;\n const { type, comment, screenshot, files } = data;\n\n // Validate configuration\n if (!token || !owner || !repo) {\n throw new Error('GitHub configuration is incomplete. Please provide token, owner, and repo.');\n }\n\n // Verify repository access before attempting to create issue\n const verification = await verifyRepositoryAccess(token, owner, repo);\n if (!verification.exists) {\n throw new Error(\n `Repository \"${owner}/${repo}\" not found or not accessible.\\n` +\n `Error: ${verification.error || 'Unknown error'}\\n\\n` +\n `Please verify:\\n` +\n `- Repository exists at https://github.com/${owner}/${repo}\\n` +\n `- Your token has access to this repository\\n` +\n `- Token has \"repo\" scope (for private) or \"public_repo\" scope (for public)`\n );\n }\n\n if (!verification.hasIssues) {\n throw new Error(\n `Issues are disabled for repository \"${owner}/${repo}\".\\n\\n` +\n `Please enable Issues in repository Settings → General → Features → Issues`\n );\n }\n\n // Get default branch from repository\n const repoResponse = await fetch(\n `https://api.github.com/repos/${owner}/${repo}`,\n {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n }\n );\n \n let defaultBranch = 'main';\n if (repoResponse.ok) {\n const repoData = await repoResponse.json();\n defaultBranch = repoData.default_branch || 'main';\n }\n\n // Use configured path or default to '.feedback-vos'\n const folderPath = screenshotPath || '.feedback-vos';\n\n // Ensure folder exists (similar to screenshot upload)\n const folderCheckUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}`;\n try {\n const folderCheck = await fetch(folderCheckUrl, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n });\n \n if (folderCheck.status === 404) {\n const readmeContent = btoa('# Feedback Files\\n\\nThis folder contains files from user feedback.\\n');\n try {\n await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}/README.md`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: 'Create feedback files folder',\n content: readmeContent,\n branch: defaultBranch,\n }),\n });\n } catch (folderCreateError) {\n console.warn('Could not create folder, proceeding with upload:', folderCreateError);\n }\n }\n } catch (folderError) {\n console.warn('Could not verify/create files folder:', folderError);\n }\n\n // Build issue title\n const title = `[${type}] Feedback`;\n\n // Limit comment length early to prevent body from being too long\n // GitHub's absolute limit is 65536 characters\n // Base body text: \"**Type:** ${type}\\n\\n**Comment:**\\n\" ≈ 30 chars\n // Screenshot URL: \"![Screenshot](url)\" ≈ 150 chars\n // Safety margin: 1000 chars\n // So max comment length: 65536 - 30 - 150 - 1000 = 64356\n const ABSOLUTE_MAX_LENGTH = 65536;\n const BASE_BODY_LENGTH = 50; // Approximate length of base text\n const SCREENSHOT_URL_LENGTH = 150; // Approximate length of screenshot markdown\n const SAFETY_MARGIN = 1000; // Safety margin for any additional formatting\n const MAX_COMMENT_LENGTH = ABSOLUTE_MAX_LENGTH - BASE_BODY_LENGTH - SCREENSHOT_URL_LENGTH - SAFETY_MARGIN;\n \n const limitedComment = comment.length > MAX_COMMENT_LENGTH \n ? comment.substring(0, MAX_COMMENT_LENGTH) + '\\n\\n... (comment truncated)'\n : comment;\n\n // Build issue body\n let body = `**Type:** ${type}\\n\\n**Comment:**\\n${limitedComment}`;\n\n // Upload screenshot to repository if provided\n // This avoids the 65536 character limit by storing the image as a file\n if (screenshot) {\n try {\n console.log('Uploading screenshot to repository...');\n console.log('Screenshot path:', folderPath);\n const screenshotUrl = await uploadScreenshotToRepo(token, owner, repo, screenshot, screenshotPath);\n console.log('Screenshot uploaded successfully, URL:', screenshotUrl);\n // Add screenshot reference (just the image, link is redundant)\n body += `\\n\\n**Screenshot:**\\n![Screenshot](${screenshotUrl})`;\n console.log('Body length after adding screenshot URL:', body.length);\n } catch (error) {\n // If upload fails, skip screenshot entirely (don't use base64 as it's too large)\n console.error('Failed to upload screenshot to repository:', error);\n // Don't add error message to body - just note that screenshot failed\n // This keeps the body short\n body += `\\n\\n**Screenshot:** Upload failed - screenshot not included.`;\n console.log('Body length after upload failure:', body.length);\n }\n }\n\n // Upload files to repository if provided\n if (files && files.length > 0) {\n const uploadedFileUrls: string[] = [];\n const failedFiles: string[] = [];\n\n for (const uploadedFile of files) {\n try {\n console.log(`Uploading file: ${uploadedFile.file.name}`);\n const fileUrl = await uploadFileToRepo(\n token,\n owner,\n repo,\n uploadedFile.file,\n folderPath,\n defaultBranch\n );\n uploadedFileUrls.push(fileUrl);\n console.log(`File uploaded successfully: ${fileUrl}`);\n } catch (error) {\n console.error(`Failed to upload file ${uploadedFile.file.name}:`, error);\n failedFiles.push(uploadedFile.file.name);\n }\n }\n\n // Add file references to body\n if (uploadedFileUrls.length > 0) {\n body += `\\n\\n**Uploaded Files:**\\n`;\n uploadedFileUrls.forEach((url, index) => {\n const fileName = files[index]?.file.name || 'Unknown';\n body += `- [${fileName}](${url})\\n`;\n });\n }\n\n if (failedFiles.length > 0) {\n body += `\\n\\n**Failed to upload:** ${failedFiles.join(', ')}`;\n }\n }\n \n // CRITICAL: Final safety check - ensure body is ALWAYS within limit before sending\n // GitHub's absolute limit is 65536 characters\n const SAFE_MAX_LENGTH = 65000; // Use 65000 as safe margin\n \n // Log body length for debugging\n console.log(`Issue body length before final check: ${body.length} characters`);\n \n // If body is too long, truncate it progressively\n if (body.length > SAFE_MAX_LENGTH) {\n console.warn(`Body is too long (${body.length}), truncating...`);\n \n // Calculate how much we need to reduce\n const excess = body.length - SAFE_MAX_LENGTH;\n \n // Find the comment section\n const commentStartMarker = '\\n\\n**Comment:**\\n';\n const commentStart = body.indexOf(commentStartMarker);\n const screenshotStart = body.indexOf('\\n\\n**Screenshot:**');\n \n if (commentStart > 0) {\n // Calculate comment boundaries\n const commentStartPos = commentStart + commentStartMarker.length;\n const commentEndPos = screenshotStart > 0 ? screenshotStart : body.length;\n const currentComment = body.substring(commentStartPos, commentEndPos);\n \n // Calculate new comment length (reduce by excess + safety margin)\n const newCommentLength = Math.max(100, currentComment.length - excess - 500);\n const truncatedComment = currentComment.substring(0, newCommentLength) + '\\n\\n... (truncated due to size limit)';\n \n // Rebuild body with truncated comment\n const beforeComment = body.substring(0, commentStartPos);\n const afterComment = screenshotStart > 0 ? body.substring(screenshotStart) : '';\n body = beforeComment + truncatedComment + afterComment;\n }\n }\n \n // Absolute final check - if still too long, force truncate aggressively\n if (body.length >= ABSOLUTE_MAX_LENGTH) {\n console.error(`Body STILL too long after truncation: ${body.length} characters. Force truncating.`);\n \n const baseText = `**Type:** ${type}\\n\\n**Comment:**\\n`;\n const maxCommentLength = ABSOLUTE_MAX_LENGTH - baseText.length - 1000; // Large margin for screenshot text\n \n // Use original comment, not limitedComment, to ensure we get a fresh truncation\n const safeComment = comment.substring(0, Math.max(100, maxCommentLength)) + '\\n\\n... (truncated due to size limit)';\n body = baseText + safeComment;\n \n // Remove screenshot if present (it will be added back if upload succeeds, but with URL not base64)\n const screenshotIndex = body.indexOf('\\n\\n**Screenshot:**');\n if (screenshotIndex > 0) {\n body = body.substring(0, screenshotIndex) + '\\n\\n**Screenshot:** Not included due to size limit.';\n }\n }\n \n // Final verification - ensure we're under the limit\n if (body.length >= ABSOLUTE_MAX_LENGTH) {\n // Emergency: use minimal body\n const minimalBase = `**Type:** ${type}\\n\\n**Comment:**\\n`;\n const maxSafeComment = ABSOLUTE_MAX_LENGTH - minimalBase.length - 100;\n const minimalComment = comment.substring(0, Math.max(50, maxSafeComment)) + '\\n\\n... (truncated)';\n body = minimalBase + minimalComment;\n }\n \n console.log(`Final issue body length: ${body.length} characters (limit: ${ABSOLUTE_MAX_LENGTH})`);\n \n // Final hard check - throw error if still too long (should never happen)\n if (body.length >= ABSOLUTE_MAX_LENGTH) {\n throw new Error(`CRITICAL: Cannot create issue - body is ${body.length} characters, exceeds GitHub limit of ${ABSOLUTE_MAX_LENGTH}.`);\n }\n\n const url = `https://api.github.com/repos/${owner}/${repo}/issues`;\n \n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n title,\n body,\n // Note: Labels must exist in the repository. If they don't exist, GitHub will ignore them.\n // You can create these labels in your repository settings if needed.\n labels: ['feedback', type.toLowerCase()],\n }),\n });\n\n if (!response.ok) {\n let errorMessage = `GitHub API error (${response.status}): `;\n \n try {\n const errorData = await response.json();\n errorMessage += errorData.message || JSON.stringify(errorData);\n \n // Provide helpful error messages for common issues\n if (response.status === 404) {\n errorMessage += `\\n\\nTrying to access: ${url}`;\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Repository \"${owner}/${repo}\" does not exist or is not accessible\\n`;\n errorMessage += `- Token does not have access to this repository\\n`;\n errorMessage += `- Check that owner and repo names are correct (case-sensitive)\\n`;\n errorMessage += `- Verify the repository URL: https://github.com/${owner}/${repo}\\n`;\n errorMessage += `- Make sure Issues are enabled in repository settings\\n`;\n errorMessage += `\\nTo debug:\\n`;\n errorMessage += `1. Visit https://github.com/${owner}/${repo} to verify it exists\\n`;\n errorMessage += `2. Check repository Settings → General → Features → Issues (must be enabled)\\n`;\n errorMessage += `3. Verify your token has \"repo\" scope (for private) or \"public_repo\" scope (for public)\\n`;\n errorMessage += `4. Test token access: curl -H \"Authorization: Bearer YOUR_TOKEN\" https://api.github.com/repos/${owner}/${repo}`;\n } else if (response.status === 401) {\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Invalid or expired GitHub token\\n`;\n errorMessage += `- Token does not have the required \"repo\" or \"public_repo\" scope\\n`;\n errorMessage += `- Generate a new token at https://github.com/settings/tokens`;\n } else if (response.status === 422) {\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Issue body is too long (maximum is 65536 characters)\\n`;\n errorMessage += `- Screenshot is too large - it will be automatically compressed\\n`;\n errorMessage += `- Try reducing the comment length or removing the screenshot\\n`;\n errorMessage += `- Invalid label names (labels must exist in the repository)`;\n } else if (response.status === 403) {\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Token does not have permission to create issues\\n`;\n errorMessage += `- Repository has issues disabled\\n`;\n errorMessage += `- Rate limit exceeded (check GitHub API rate limits)\\n`;\n errorMessage += `- Check repository Settings → General → Features → Issues`;\n }\n } catch (parseError) {\n const errorText = await response.text();\n errorMessage += errorText || 'Unknown error';\n }\n \n throw new Error(errorMessage);\n }\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to create GitHub issue: ${String(error)}`);\n }\n}\n\n","'use client'\n\nimport {ArrowLeft} from 'phosphor-react';\nimport { FormEvent, useState, useEffect } from 'react';\nimport { FeedbackType, getFeedbackTypes } from '..';\nimport { CloseButton } from '../../CloseButton';\nimport {Loading} from '../../Loading';\nimport { ScreenshotButton } from '../../ScreenshotButton';\nimport { FileUploadButton, UploadedFile } from '../../FileUploadButton';\nimport { sendToGitHub } from '../../../lib/integrations/github';\nimport { GitHubConfig, Theme } from '../../../types';\nimport { Language, getTranslations } from '../../../lib/translations';\nimport { getThemeClasses } from '../../../lib/theme';\n\ninterface FeedbackContentStepProps {\n feedbackType: FeedbackType;\n onFeedbackRestartRequest: () => void;\n onFeedbackSent: () => void;\n integration: 'github';\n githubConfig: GitHubConfig;\n language: Language;\n theme: Theme;\n}\n\nexport function FeedbackContentStep({\n feedbackType,\n onFeedbackRestartRequest,\n onFeedbackSent,\n integration,\n githubConfig,\n language,\n theme,\n}: FeedbackContentStepProps) {\n const t = getTranslations(language);\n const feedbackTypes = getFeedbackTypes(language);\n const themeClasses = getThemeClasses(theme);\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFile[]>([]);\n const feedbackTypeData = feedbackTypes[feedbackType];\n const [comment, setComment] = useState('');\n const[isSendingFeedback, setIsSendingFeedback] = useState(false);\n\n // Cleanup object URLs when component unmounts or files change\n useEffect(() => {\n return () => {\n uploadedFiles.forEach(file => {\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n }, [uploadedFiles]);\n\n async function handleSubmitFeedback(e: FormEvent) {\n e.preventDefault();\n setIsSendingFeedback(true);\n \n try {\n const feedbackData = {\n type: feedbackType,\n comment,\n screenshot,\n files: uploadedFiles,\n };\n\n if (integration === 'github') {\n await sendToGitHub(githubConfig, feedbackData);\n } else {\n throw new Error('Invalid integration configuration');\n }\n \n setIsSendingFeedback(false);\n onFeedbackSent();\n } catch (error) {\n console.error('Error sending feedback:', error);\n setIsSendingFeedback(false);\n // TODO: Show error message to user\n alert(t.content.error);\n }\n }\n \n return (\n <>\n <header className=\"relative w-full\">\n <button\n type=\"button\"\n className={`absolute top-0 left-0 ${themeClasses.textTertiary} ${theme === 'dark' ? 'hover:text-zinc-100' : 'hover:text-gray-900'} z-10 p-2 md:p-2.5`}\n onClick={onFeedbackRestartRequest}\n >\n <ArrowLeft weight=\"bold\" className=\"w-5 h-5 md:w-5 md:h-5\" />\n </button>\n\n <span className={`text-lg md:text-xl leading-6 flex items-center gap-2 pl-10 md:pl-12 pr-10 md:pr-12 ${themeClasses.textPrimary}`}>\n <img\n src={feedbackTypeData.image.source}\n alt={feedbackTypeData.image.alt}\n className=\"w-5 h-5 md:w-6 md:h-6\"\n />\n {feedbackTypeData.title}\n </span>\n <CloseButton className=\"absolute top-0 right-0 p-2 md:p-2.5\" title={t.form.closeButton} theme={theme} />\n </header>\n <form onSubmit={handleSubmitFeedback} className=\"my-3 md:my-4 w-full\">\n <textarea\n className={`w-full min-h-[100px] md:min-h-[112px] text-sm \n ${themeClasses.textPrimary} border-2 border-brand-500 bg-transparent rounded-md p-2 md:p-3\n ${theme === 'dark' ? 'placeholder:text-zinc-400' : 'placeholder:text-gray-500'}\n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\n ${theme === 'dark' ? 'scrollbar-thumb-zinc-700' : 'scrollbar-thumb-gray-400'} scrollbar-track-transparent scrollbar-thin`}\n placeholder={t.content.placeholder}\n onChange={(e) => setComment(e.target.value)}\n />\n <div className=\"mt-2\">\n <FileUploadButton\n files={uploadedFiles}\n onFilesChanged={setUploadedFiles}\n language={language}\n theme={theme}\n />\n </div>\n <footer className=\"flex gap-2 mt-3\">\n <ScreenshotButton\n screenshot={screenshot}\n onScreenshotTook={setScreenshot}\n language={language}\n theme={theme}\n />\n <button\n type=\"submit\"\n disabled={comment.length === 0 || isSendingFeedback}\n className={`p-2 bg-brand-500 rounded-md border-transparent flex-1 justify-center\n items-center text-sm hover:bg-brand-300 focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\n disabled:hover:bg-brand-500 flex text-white`}\n >\n {isSendingFeedback? <Loading/> : t.content.sendButton}\n </button>\n </footer>\n </form>\n </>\n )\n}\n\n","'use client'\n\nimport { CloseButton } from '../../CloseButton';\nimport { Language, getTranslations } from '../../../lib/translations';\nimport { Theme } from '../../../types';\nimport { getThemeClasses } from '../../../lib/theme';\n\ninterface FeedbackSuccessStepProps {\n onFeedbackRestartRequest: () => void;\n language: Language;\n theme: Theme;\n}\n\nexport function FeedbackSuccessStep({ onFeedbackRestartRequest, language, theme }: FeedbackSuccessStepProps) {\n const t = getTranslations(language);\n const themeClasses = getThemeClasses(theme);\n return (\n <>\n <header>\n <CloseButton title={t.form.closeButton} theme={theme} />\n </header>\n\n <div className=\"flex flex-col items-center py-8 md:py-10 w-full max-w-[304px] px-2\">\n <svg width=\"41\" height=\"40\" viewBox=\"0 0 41 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"w-10 h-10 md:w-[41px] md:h-[40px]\">\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\"/>\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\"/>\n </svg>\n \n <span className={`text-lg md:text-xl mt-2 text-center ${themeClasses.textPrimary}`}>{t.success.message}</span>\n\n <button \n type=\"button\"\n onClick={onFeedbackRestartRequest}\n className={`py-2 px-6 mt-6 ${themeClasses.buttonSecondary} rounded-md border-transparent text-sm leading-6 focus:outline-none focus:ring-2 focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500 transition-colors`}\n >\n {t.success.sendAnother}\n </button>\n </div>\n </>\n );\n}\n\n","'use client'\n\nimport { bugImageUrl, ideaImageUrl, thoughtImageUrl } from '../../lib/svg-assets';\nimport { useState } from 'react';\nimport { FeedbackTypeStep } from './Steps/FeedbackTypeStep';\nimport { FeedbackContentStep } from './Steps/FeedbackContentStep';\nimport { FeedbackSuccessStep } from './Steps/FeedbackSuccessStep';\nimport { FeedbackType, GitHubConfig, Theme } from '../../types';\nimport { Language, getTranslations } from '../../lib/translations';\nimport { getThemeClasses } from '../../lib/theme';\n\nexport function getFeedbackTypes(language: Language = 'en') {\n const t = getTranslations(language);\n return {\n BUG: {\n title: t.types.bug,\n image: {\n source: bugImageUrl,\n alt: 'A purple caterpillar image',\n },\n },\n IDEA: {\n title: t.types.idea,\n image: {\n source: ideaImageUrl,\n alt: 'A Lamp image',\n },\n },\n OTHER: {\n title: t.types.other,\n image: {\n source: thoughtImageUrl,\n alt: 'A thought balloon image',\n },\n },\n };\n}\n\nexport type { FeedbackType };\n\ninterface WidgetFormProps {\n integration: 'github';\n githubConfig: GitHubConfig;\n language: Language;\n theme: Theme;\n}\n\nexport function WidgetForm({ integration, githubConfig, language, theme }: WidgetFormProps) {\n const [feedbackType, setFeedbackType] = useState<FeedbackType | null>(null)\n const [feedbackSent, setFeedbackSent] = useState(false)\n const themeClasses = getThemeClasses(theme);\n \n function handleRestartFeedback() {\n setFeedbackSent(false); \n setFeedbackType(null);\n }\n \n return (\n <div className={`${themeClasses.bgPrimary} p-3 md:p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto md:min-w-[384px] max-w-md`}>\n {feedbackSent ? (\n <FeedbackSuccessStep onFeedbackRestartRequest={handleRestartFeedback} language={language} theme={theme} />\n ) : (\n <>\n {!feedbackType ? (\n <FeedbackTypeStep onFeedbackTypeChanged={setFeedbackType} language={language} theme={theme} />\n ) : (\n <FeedbackContentStep\n feedbackType={feedbackType}\n onFeedbackRestartRequest={handleRestartFeedback}\n onFeedbackSent={() => setFeedbackSent(true)}\n integration={integration}\n githubConfig={githubConfig}\n language={language}\n theme={theme}\n />\n )}\n </>\n )}\n <footer className={`text-xs ${themeClasses.textMuted} mt-2`}>\n <a\n className=\"underline underline-offset-2\"\n href=\"https://vossendesign.nl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Vossen Design\n </a>\n </footer>\n </div>\n )\n}\n\n","'use client'\n\nimport { ChatTeardropDots } from 'phosphor-react';\nimport { Popover } from '@headlessui/react';\nimport { WidgetForm } from './WidgetForm';\nimport { WidgetProps } from '../types';\nimport { getTranslations } from '../lib/translations';\nimport { getDefaultTheme } from '../lib/theme';\n\nfunction getDefaultLanguage(): 'en' | 'nl' {\n // Check environment variable (works in Next.js client-side)\n if (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_FEEDBACK_LANG === 'nl') {\n return 'nl';\n }\n return 'en';\n}\n\nfunction isWidgetEnabled(): boolean {\n // Check environment variable to enable/disable widget\n if (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_FEEDBACK_ENABLED !== undefined) {\n const enabled = process.env.NEXT_PUBLIC_FEEDBACK_ENABLED.toLowerCase();\n // Disable only if explicitly set to 'false' or '0'\n return enabled !== 'false' && enabled !== '0';\n }\n // Default to enabled for backward compatibility\n return true;\n}\n\nexport function Widget({ \n integration, \n githubConfig,\n position = 'bottom-right',\n language,\n theme,\n}: WidgetProps) {\n // Check if widget should be enabled\n if (!isWidgetEnabled()) {\n return null;\n }\n\n const finalLanguage = language || getDefaultLanguage();\n const finalTheme = theme || getDefaultTheme();\n const t = getTranslations(finalLanguage);\n const positionClasses = {\n 'bottom-right': 'bottom-4 right-4 md:bottom-8 md:right-8',\n 'bottom-left': 'bottom-4 left-4 md:bottom-8 md:left-8',\n 'top-right': 'top-4 right-4 md:top-8 md:right-8',\n 'top-left': 'top-4 left-4 md:top-8 md:left-4',\n };\n\n const isTop = position.includes('top');\n const isLeft = position.includes('left');\n \n const panelPositionClass = isTop \n ? 'absolute top-full mt-2' \n : 'absolute bottom-full mb-2';\n \n const panelAlignmentClass = isLeft \n ? 'left-0' \n : 'right-0';\n\n return (\n <div data-feedback-widget=\"true\" className={`fixed ${positionClasses[position]} z-50`}>\n <Popover className=\"relative\">\n <Popover.Panel className={`${panelPositionClass} ${panelAlignmentClass}`}>\n <WidgetForm \n integration={integration}\n githubConfig={githubConfig}\n language={finalLanguage}\n theme={finalTheme}\n />\n </Popover.Panel>\n <Popover.Button className=\"bg-brand-500 rounded-full px-3 md:px-3 h-12 text-white flex items-center group focus:outline-none shadow-lg hover:shadow-xl transition-shadow\">\n <ChatTeardropDots className=\"w-6 h-6 flex-shrink-0\" />\n <span className=\"max-w-0 overflow-hidden group-hover:max-w-xs md:group-hover:max-w-xs transition-all duration-500 ease-linear hidden md:block\">\n <span className=\"pl-2\"></span>\n {t.widget.button}\n </span>\n </Popover.Button>\n </Popover>\n </div>\n )\n}\n\n"]}
1
+ {"version":3,"sources":["../src/lib/svg-assets.ts","../src/lib/theme.ts","../src/components/CloseButton.tsx","../src/lib/translations.ts","../src/components/WidgetForm/Steps/FeedbackTypeStep.tsx","../src/components/Loading.tsx","../src/components/ScreenshotEditor.tsx","../src/components/ScreenshotButton.tsx","../src/components/FileUploadButton.tsx","../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","useRef","useState","useEffect","useCallback","ArrowCounterClockwise","Trash","Check","html2canvas","PencilSimple","Camera","translations","Paperclip","url","ArrowLeft","ChatTeardropDots"],"mappings":"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","file":"index.js","sourcesContent":["// SVG files as data URLs (base64 encoded)\nexport const bugImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuNzUwMDcgNEM4Ljc1MDA3IDMgOC4wMDAwNyAwIDYuMzEyMDcgMEM0LjYyNDA3IDAgNC43NTAwNyAyIDUuNzUwMDcgMkM2Ljc1MDA3IDIgNi43NTAwNyA0IDYuNzUwMDcgNUM2Ljc1MDA3IDYgNy43NTAwNyA0IDcuNzUwMDcgNFpNMy41NjcwNyA1LjcyQzQuNTY3MDcgNC43MiAzLjgxNzA3IDEuNzIgMi4xMjkwNyAxLjcyQzAuNDQxMDY4IDEuNzIgMC41NjcwNjggMy43MiAxLjU2NzA3IDMuNzJDMi41NjcwNyAzLjcyIDIuNTY3MDcgNS43MiAyLjU2NzA3IDYuNzJDMi41NjcwNyA3LjcyIDMuNTY3MDcgNS43MiAzLjU2NzA3IDUuNzJaIiBmaWxsPSIjQUE4REQ4Ii8+CjxwYXRoIGQ9Ik0yOS45NDIgMzIuODU2QzMwLjEzMSAzMy42NjQgMzEuMTY5IDM1LjEzNiAzMS45NzQgMzQuOTQ3QzMyLjc4IDM0Ljc1NyAzMy4wNTEgMzIuOTc2IDMyLjg2MiAzMi4xN0MzMi42NzMgMzEuMzYyIDMxLjg2NCAzMC44NjMgMzEuMDU4IDMxLjA1M0MzMC4yNTMgMzEuMjQzIDI5Ljc1MiAzMi4wNSAyOS45NDIgMzIuODU2Wk0yNC41MDggMzMuNTA1QzI0LjUxMSAzNC4zMzUgMjUuMTg5IDM2LjAwMyAyNi4wMTcgMzZDMjYuODQ1IDM1Ljk5NiAyNy41MTEgMzQuMzIzIDI3LjUwOCAzMy40OTRDMjcuNTA1IDMyLjY2NSAyNi44MzEgMzEuOTk3IDI2LjAwMyAzMS45OTlDMjUuMTc1IDMyLjAwMyAyNC41MDUgMzIuNjc2IDI0LjUwOCAzMy41MDVaTTE5LjIzNyAzMS4wNTlDMTguOTExIDMxLjgyMyAxOC44NzIgMzMuNjIyIDE5LjYzMyAzMy45NDlDMjAuMzk2IDM0LjI3MyAyMS42NyAzMy4wMDIgMjEuOTk2IDMyLjIzOUMyMi4zMjEgMzEuNDc3IDIxLjk2OCAzMC41OTYgMjEuMjA3IDMwLjI2OUMyMC40NDUgMjkuOTQ0IDE5LjU2NCAzMC4yOTYgMTkuMjM3IDMxLjA1OVpNMTQuMjA2IDIwLjAxOUMxMy4zOTQgMjAuMTkxIDExLjg5OCAyMS4xOTIgMTIuMDY3IDIyLjAwMkMxMi4yNCAyMi44MTIgMTQuMDEyIDIzLjEyNiAxNC44MjQgMjIuOTU1QzE1LjYzNSAyMi43ODQgMTYuMTUzIDIxLjk4OCAxNS45ODQgMjEuMTc4QzE1LjgxMiAyMC4zNjggMTUuMDE5IDE5Ljg0OCAxNC4yMDYgMjAuMDE5Wk0xMi4xNjkgMTUuMDE5QzExLjM1NyAxNS4xOTEgOS44NjEwNCAxNi4xOTIgMTAuMDMgMTcuMDAyQzEwLjIwMyAxNy44MTIgMTEuOTc1IDE4LjEyNiAxMi43ODcgMTcuOTU1QzEzLjU5OCAxNy43ODQgMTQuMTE2IDE2Ljk4OCAxMy45NDcgMTYuMTc4QzEzLjc3NSAxNS4zNjggMTIuOTgxIDE0Ljg0OCAxMi4xNjkgMTUuMDE5WiIgZmlsbD0iIzc0NEVBQSIvPgo8cGF0aCBkPSJNMjcuNTc5MSAzNEMzMC40MSAzNCAzMi41MDUgMzMuMTIzIDMyLjg0NSAzMi45NzNDMzUuMTE2MSAzMS45NjMgMzYuMTM4MSAyOS4zMDQgMzUuMTI5MSAyNy4wMzRDMzQuMTMwMSAyNC43ODQgMzEuNTEzMSAyMy43NTkgMjkuMjU3MSAyNC43MkMyOS4xMjQxIDI0Ljc3IDI3LjQ2NDEgMjUuMzY5IDI1LjkxNDEgMjQuNjQ4QzI0LjA2MzEgMjMuNzg3IDIyLjkxOTEgMjEuMzM5IDIyLjI4NjEgMTkuNDM5QzIyLjE0MjEgMTkuMDA5IDIxLjkwMTEgMTguMTY1IDIxLjYgMTcuMTIzQzE5LjczNDEgMTAuNjUyIDE4Ljc2ODEgOC44Mzc5OSAxNy42MTcxIDcuMzAyOTlDMTMuOTA2IDIuMzUxOTkgOC4wMjUwNSAyLjAwNjk5IDUuMTM0MDUgMi41ODY5OUMyLjY5NzA1IDMuMDczOTkgMS4xMTYwNSA1LjQ0NDk5IDEuNjA0MDUgNy44ODE5OUMyLjA5MjA1IDEwLjMyIDQuNDY0MDUgMTEuOTAyIDYuOTAwMDUgMTEuNDEyQzcuMDYyMDUgMTEuMzg2IDkuMTA0MDUgMTEuMTA2IDEwLjMyNDEgMTIuNTgxQzEwLjk2NzEgMTMuODY4IDEyLjQwNDEgMTcuNzA5IDEyLjk1NDEgMTkuNjE1QzEzLjMwMDEgMjAuODE0IDEzLjU4MzEgMjEuNzg2IDEzLjc0ODEgMjIuMjgyQzE1LjUyMTEgMjcuNTk5IDE4LjQxNDEgMzEuMTc1IDIyLjM1MTEgMzIuOTExQzI0LjIwMzEgMzMuNzI5IDI2LjAwNTEgMzQgMjcuNTc5MSAzNFoiIGZpbGw9IiM5MjY2Q0MiLz4KPHBhdGggZD0iTTcuMDE3MDkgNkM3LjU2OTM3IDYgOC4wMTcwOSA1LjU1MjI4IDguMDE3MDkgNUM4LjAxNzA5IDQuNDQ3NzIgNy41NjkzNyA0IDcuMDE3MDkgNEM2LjQ2NDgxIDQgNi4wMTcwOSA0LjQ0NzcyIDYuMDE3MDkgNUM2LjAxNzA5IDUuNTUyMjggNi40NjQ4MSA2IDcuMDE3MDkgNloiIGZpbGw9IiMyMDIwMjQiLz4KPHBhdGggZD0iTTMxLjI1ODEgMzIuOTY0QzMxLjE2OTEgMzIuOTY0IDMxLjA3ODEgMzIuOTUyIDMwLjk4OTEgMzIuOTI4QzMwLjQ1NzEgMzIuNzggMzAuMTQ1MSAzMi4yMjkgMzAuMjkzMSAzMS42OTdDMzEuMDUwMSAyOC45NzUgMjkuNTIzMSAyNy4xNTUgMjkuNTA4MSAyNy4xMzdDMjkuMTQ5MSAyNi43MTggMjkuMTk2MSAyNi4wODYgMjkuNjE1MSAyNS43MjdDMzAuMDMzMSAyNS4zNjggMzAuNjY2MSAyNS40MTUgMzEuMDI1MSAyNS44MzRDMzEuMTE3MSAyNS45NDEgMzMuMjU5MSAyOC40OTQgMzIuMjIwMSAzMi4yMzFDMzIuMDk4MSAzMi42NzQgMzEuNjk1MSAzMi45NjQgMzEuMjU4MSAzMi45NjRaTTI0LjA1OTEgMzIuNDAxQzIzLjgxNDEgMzIuNDAxIDIzLjU2OTEgMzIuMzEyIDIzLjM3NTEgMzIuMTMxQzIyLjk3MjEgMzEuNzUzIDIyLjk1MTEgMzEuMTIgMjMuMzI4MSAzMC43MTdDMjQuODEzMSAyOS4xMyAyNC43ODExIDI2LjUyNCAyNC43ODAxIDI2LjQ5N0MyNC43NjQxIDI1Ljk0NSAyNS4xOTkxIDI1LjQ4NSAyNS43NTIxIDI1LjQ2OUMyNi4yOTQxIDI1LjQ2NCAyNi43NjUxIDI1Ljg4OCAyNi43ODAxIDI2LjQ0MUMyNi43ODQxIDI2LjU4IDI2Ljg1MzEgMjkuODc4IDI0Ljc4OTEgMzIuMDg1QzI0LjU5MjEgMzIuMjk1IDI0LjMyNTEgMzIuNDAxIDI0LjA1OTEgMzIuNDAxWk0xNS41MTcxIDIzLjcwNUMxNS4wMzcxIDIzLjcwNSAxNC42MTMxIDIzLjM1OCAxNC41MzIxIDIyLjg2OEMxNC40NDIxIDIyLjMyNCAxNC44MTAxIDIxLjgwOCAxNS4zNTUxIDIxLjcxOUMxOC40MjkxIDIxLjIwOSAyMC4xMjkxIDE5LjM0MiAyMC4xNDYxIDE5LjMyM0MyMC41MTExIDE4LjkxMyAyMS4xNDQxIDE4Ljg3NCAyMS41NTUxIDE5LjIzOUMyMS45NjcxIDE5LjYwNCAyMi4wMDgxIDIwLjIzMiAyMS42NDYxIDIwLjY0NUMyMS41NTkxIDIwLjc0NCAxOS40OTAxIDIzLjA2IDE1LjY4MjEgMjMuNjkxQzE1LjYyNjEgMjMuNzAxIDE1LjU3MTEgMjMuNzA1IDE1LjUxNzEgMjMuNzA1Wk0xOC40MzgxIDI4LjU2MkMxOC4wMTMxIDI4LjU2MiAxNy42MTkxIDI4LjI5IDE3LjQ4NDEgMjcuODY0QzE3LjMxODEgMjcuMzM4IDE3LjYxMDEgMjYuNzc1IDE4LjEzNjEgMjYuNjA5QzIwLjgyOTEgMjUuNzU2IDIyLjAxNjEgMjMuNzc5IDIyLjAyODEgMjMuNzU5QzIyLjMwODEgMjMuMjgyIDIyLjkyMDEgMjMuMTIyIDIzLjM5NjEgMjMuNDAyQzIzLjg3MzEgMjMuNjgxIDI0LjAzMjEgMjQuMjk1IDIzLjc1MzEgMjQuNzdDMjMuNjkwMSAyNC44NzggMjIuMTU4MSAyNy40MzMgMTguNzQwMSAyOC41MTRDMTguNjM5MSAyOC41NDcgMTguNTM3MSAyOC41NjIgMTguNDM4MSAyOC41NjJaTTEzLjgxOTEgMTcuODkyQzEzLjMyMzEgMTcuODkyIDEyLjg5MjEgMTcuNTIzIDEyLjgyODEgMTcuMDE3QzEyLjc1OTEgMTYuNDY5IDEzLjE0NzEgMTUuOTY5IDEzLjY5NTEgMTUuODk5QzE2LjM4NDEgMTUuNTU5IDE4LjM1MjEgMTMuOTI4IDE4LjM3MTEgMTMuOTExQzE4Ljc5MzEgMTMuNTU3IDE5LjQyNDEgMTMuNjA4IDE5Ljc3OTEgMTQuMDNDMjAuMTM1MSAxNC40NTEgMjAuMDg0MSAxNS4wOCAxOS42NjQxIDE1LjQzN0MxOS41NjcxIDE1LjUyIDE3LjI0NDEgMTcuNDY2IDEzLjk0NjEgMTcuODgzQzEzLjkwMzEgMTcuODg5IDEzLjg2MTEgMTcuODkyIDEzLjgxOTEgMTcuODkyWk0xMS45OTgxIDEzLjEyNUMxMS41NzMxIDEzLjEyNSAxMS4xNzkxIDEyLjg1MiAxMS4wNDQxIDEyLjQyNEMxMC44NzkxIDExLjg5NyAxMS4xNzExIDExLjMzNiAxMS42OTgxIDExLjE3QzE0LjgyODEgMTAuMTg3IDE1Ljk1MTEgOC40NzggMTUuOTk3MSA4LjQwNkMxNi4yOTIxIDcuOTQ0IDE2LjkwODEgNy44MDEgMTcuMzcyMSA4LjA5NEMxNy44MzcxIDguMzg2IDE3Ljk4MzEgOC45OTMgMTcuNjk2MSA5LjQ2QzE3LjYzNjEgOS41NTcgMTYuMTkwMSAxMS44NTYgMTIuMjk3MSAxMy4wNzlDMTIuMTk4MSAxMy4xMSAxMi4wOTcxIDEzLjEyNSAxMS45OTgxIDEzLjEyNVoiIGZpbGw9IiM3NDRFQUEiLz4KPC9zdmc+';\n\nexport const ideaImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMzUiIHZpZXdCb3g9IjAgMCAyMyAzNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIyLjUgMTAuOTJDMjIuNSAxNy4zNTkgMTcuNSAxOC4zNTkgMTcuNSAyNC4zNkMxNy41IDI3LjQ1OCAxNC4zNzcgMjcuNzE5IDEyIDI3LjcxOUM5Ljk0NyAyNy43MTkgNS40MTQgMjYuOTQgNS40MTQgMjQuMzU4QzUuNDE0IDE4LjM2IDAuNSAxNy4zNiAwLjUgMTAuOTJDMC41IDQuODg5IDUuNzg1IDAgMTEuNTgzIDBDMTcuMzgzIDAgMjIuNSA0Ljg4OSAyMi41IDEwLjkyWiIgZmlsbD0iI0ZGREQ4MyIvPgo8cGF0aCBkPSJNMTUuNjY3IDMyLjM2QzE1LjY2NyAzMy4xODggMTMuNDMzIDM0Ljg2IDExLjUgMzQuODZDOS41NjcwMSAzNC44NiA3LjMzMzAxIDMzLjE4OCA3LjMzMzAxIDMyLjM2QzcuMzMzMDEgMzEuNTMyIDkuNTY2MDEgMzEuODYgMTEuNSAzMS44NkMxMy40MzMgMzEuODYgMTUuNjY3IDMxLjUzMiAxNS42NjcgMzIuMzZaIiBmaWxsPSIjQ0NENkREIi8+CjxwYXRoIGQ9Ik0xNi4yMDcgMTAuMTUzQzE1LjgxNiA5Ljc2MTk5IDE1LjE4NCA5Ljc2MTk5IDE0Ljc5MyAxMC4xNTNMMTEuNSAxMy40NDZMOC4yMDcwMSAxMC4xNTNDNy44MTYwMSA5Ljc2MTk5IDcuMTg0MDEgOS43NjE5OSA2Ljc5MzAxIDEwLjE1M0M2LjQwMjAxIDEwLjU0NCA2LjQwMjAxIDExLjE3NiA2Ljc5MzAxIDExLjU2N0wxMC41IDE1LjI3NFYyNS44NkMxMC41IDI2LjQxMyAxMC45NDggMjYuODYgMTEuNSAyNi44NkMxMi4wNTIgMjYuODYgMTIuNSAyNi40MTMgMTIuNSAyNS44NlYxNS4yNzRMMTYuMjA3IDExLjU2N0MxNi41OTggMTEuMTc2IDE2LjU5OCAxMC41NDQgMTYuMjA3IDEwLjE1M1oiIGZpbGw9IiNGRkNDNEQiLz4KPHBhdGggZD0iTTE3LjUgMzAuODZDMTcuNSAzMS45NjQgMTYuNjA0IDMyLjg2IDE1LjUgMzIuODZIOC41QzcuMzk2IDMyLjg2IDYuNSAzMS45NjQgNi41IDMwLjg2VjI0Ljg2SDE3LjVWMzAuODZaIiBmaWxsPSIjOTlBQUI1Ii8+CjxwYXRoIGQ9Ik01LjQ5OSAzMS44NkM1LjAxOSAzMS44NiA0LjU5NSAzMS41MTMgNC41MTQgMzEuMDI0QzQuNDIzIDMwLjQ4IDQuNzkxIDI5Ljk2NCA1LjMzNiAyOS44NzRMMTcuMzM2IDI3Ljg3NEMxNy44OCAyNy43NzYgMTguMzk2IDI4LjE1MSAxOC40ODYgMjguNjk2QzE4LjU3NyAyOS4yNCAxOC4yMDkgMjkuNzU2IDE3LjY2NCAyOS44NDZMOS42NjQgMzEuODQ2QzkuNjA5IDMxLjg1NiA5LjU1MyAzMS44NiA1LjQ5OSAzMS44NlpNNS40OTkgMjcuODZDNS4wMTkgMjcuODYgNC41OTUgMjcuNTEzIDQuNTE0IDI3LjAyNEM0LjQyMyAyNi40OCA0Ljc5MSAyNS45NjQgNS4zMzYgMjUuODc0TDE3LjMzNiAyMy44NzRDMTcuODggMjMuNzc3IDE4LjM5NiAyNC4xNTEgMTguNDg2IDI0LjY5NkMxOC41NzcgMjUuMjQgMTguMjA5IDI1Ljc1NiAxNy42NjQgMjUuODQ2TDkuNjY0IDI3Ljg0NkM5LjYwOSAyNy44NTYgOS41NTMgMjcuODYgNS40OTkgMjcuODZaIiBmaWxsPSIjQ0NENkREIi8+Cjwvc3ZnPg==';\n\nexport const thoughtImageUrl = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzNiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM1LjE2NjYgMTAuODc1QzM1LjE2NjYgNy4wMDkgMzIuMDMyNiAzLjg3NSAyOC4xNjY2IDMuODc1QzI2Ljk5OTYgMy44NzUgMjUuOTAxNiA0LjE2NSAyNC45MzQ2IDQuNjY5QzIyLjg1MjYgMS44NDIgMTkuNTA5NiAwIDE1LjcyOTYgMEMxMC41OTc2IDAgNi4yNTQ2MyAzLjM4IDQuODA2NjMgOC4wMzZDMi4xNDg2MyA4LjY1MyAwLjE2NjYyNiAxMS4wMyAwLjE2NjYyNiAxMy44NzVDMC4xNjY2MjYgMTYuODU0IDIuMzQwNjMgMTkuMzIgNS4xODc2MyAxOS43ODhDNS40MDM2MyAyMy43MzcgOC42NjQ2MyAyNi44NzUgMTIuNjY2NiAyNi44NzVDMTQuODQyNiAyNi44NzUgMTYuNzk2NiAyNS45NDIgMTguMTY2NiAyNC40NjJDMTkuNTM2NiAyNS45NDIgMjEuNDg5NiAyNi44NzUgMjMuNjY2NiAyNi44NzVDMjcuODA5NiAyNi44NzUgMzEuMTY2NiAyMy41MTggMzEuMTY2NiAxOS4zNzVDMzEuMTY2NiAxOC42NjUgMzEuMDYxNiAxNy45ODEgMzAuODc3NiAxNy4zM0MzMy4zOTY2IDE2LjI3MSAzNS4xNjY2IDEzLjc4IDM1LjE2NjYgMTAuODc1WiIgZmlsbD0iIzg1QzhGOCIvPgo8cGF0aCBkPSJNNC4xNjY2MyAzMi44NzVDNS44MjM0OCAzMi44NzUgNy4xNjY2MyAzMS41MzE5IDcuMTY2NjMgMjkuODc1QzcuMTY2NjMgMjguMjE4MSA1LjgyMzQ4IDI2Ljg3NSA0LjE2NjYzIDI2Ljg3NUMuNTA5NzcgMjYuODc1IDEuMTY2NjMgMjguMjE4MSAxLjE2NjYzIDI5Ljg3NUMxLjE2NjYzIDMxLjUzMTkgMi41MDk3NyAzMi44NzUgNC4xNjY2MyAzMi44NzVaIiBmaWxsPSIjODVDOEY4Ii8+Cjwvc3ZnPg==';\n\n","import { Theme } from '../types';\n\nexport function getThemeClasses(theme: Theme) {\n return {\n // Background colors - light mode is now softer (gray-50 instead of white)\n bgPrimary: theme === 'dark' ? 'bg-zinc-900' : 'bg-gray-50',\n bgSecondary: theme === 'dark' ? 'bg-zinc-800' : 'bg-gray-100',\n bgTertiary: theme === 'dark' ? 'bg-zinc-700' : 'bg-gray-200',\n bgHover: theme === 'dark' ? 'hover:bg-zinc-600' : 'hover:bg-gray-200',\n bgHoverSecondary: theme === 'dark' ? 'hover:bg-zinc-700' : 'hover:bg-gray-200',\n \n // Text colors\n textPrimary: theme === 'dark' ? 'text-zinc-100' : 'text-gray-900',\n textSecondary: theme === 'dark' ? 'text-zinc-300' : 'text-gray-700',\n textTertiary: theme === 'dark' ? 'text-zinc-400' : 'text-gray-600',\n textMuted: theme === 'dark' ? 'text-neutral-400' : 'text-gray-500',\n \n // Border colors\n borderPrimary: theme === 'dark' ? 'border-zinc-700' : 'border-gray-300',\n borderSecondary: theme === 'dark' ? 'border-zinc-600' : 'border-gray-300',\n borderHover: theme === 'dark' ? 'hover:border-zinc-500' : 'hover:border-gray-400',\n \n // Canvas/Editor background\n canvasBg: theme === 'dark' ? 'bg-zinc-900' : 'bg-gray-200',\n \n // Overlay\n overlay: theme === 'dark' ? 'bg-black/80' : 'bg-black/60',\n \n // Focus ring offset\n focusRingOffset: theme === 'dark' ? 'focus:ring-offset-zinc-900' : 'focus:ring-offset-gray-50',\n \n // Button variants\n buttonSecondary: theme === 'dark' \n ? 'bg-zinc-800 hover:bg-zinc-700 text-zinc-100' \n : 'bg-gray-200 hover:bg-gray-300 text-gray-900',\n \n buttonTertiary: theme === 'dark'\n ? 'bg-zinc-700 hover:bg-zinc-600 text-zinc-100'\n : 'bg-gray-300 hover:bg-gray-400 text-gray-900',\n \n // Icon colors - make icons more visible (darker for better contrast)\n iconColor: theme === 'dark' ? 'text-zinc-100' : 'text-gray-900',\n };\n}\n\nexport function getDefaultTheme(): Theme {\n // Check environment variable (works in Next.js client-side)\n if (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_FEEDBACK_THEME === 'light') {\n return 'light';\n }\n return 'dark'; // Default to dark\n}\n","'use client'\n\nimport { Popover } from \"@headlessui/react\";\nimport { X } from \"phosphor-react\";\nimport { Theme } from \"../types\";\nimport { getThemeClasses } from \"../lib/theme\";\n\nexport function CloseButton({ className = \"\", title = \"Close feedback form\", theme = 'dark' }: { className?: string; title?: string; theme?: Theme }) {\n const themeClasses = getThemeClasses(theme);\n return (\n <Popover.Button className={`${themeClasses.textTertiary} ${theme === 'dark' ? 'hover:text-zinc-100' : 'hover:text-gray-900'} ${className}`} title={title}>\n <X weight=\"bold\" className=\"w-5 h-5\"/>\n </Popover.Button>\n )\n}\n\n","export type Language = 'en' | 'nl';\n\nexport const translations = {\n en: {\n widget: {\n button: 'Feedback',\n },\n form: {\n header: 'Please give us your feedback!',\n closeButton: 'Close feedback form',\n },\n types: {\n bug: 'Bug',\n idea: 'Idea',\n other: 'Other',\n },\n content: {\n placeholder: 'Tell in detail what is happening',\n sendButton: 'Send feedback',\n error: 'Failed to send feedback. Please try again.',\n },\n success: {\n message: 'We appreciate the feedback',\n sendAnother: 'I want to send another',\n },\n },\n nl: {\n widget: {\n button: 'Feedback',\n },\n form: {\n header: 'Geef ons je feedback!',\n closeButton: 'Feedback formulier sluiten',\n },\n types: {\n bug: 'Bug',\n idea: 'Idee',\n other: 'Anders',\n },\n content: {\n placeholder: 'Vertel in detail wat er gebeurt',\n sendButton: 'Feedback versturen',\n error: 'Feedback versturen mislukt. Probeer het opnieuw.',\n },\n success: {\n message: 'Bedankt voor je feedback',\n sendAnother: 'Ik wil nog een sturen',\n },\n },\n} as const;\n\nexport function getTranslations(lang: Language = 'en') {\n return translations[lang];\n}\n\n","'use client'\n\nimport { FeedbackType, getFeedbackTypes } from \"..\";\nimport { CloseButton } from \"../../CloseButton\";\nimport { Language, getTranslations } from \"../../../lib/translations\";\nimport { Theme } from \"../../../types\";\nimport { getThemeClasses } from \"../../../lib/theme\";\n\ninterface FeedbackTypeStepProps {\n onFeedbackTypeChanged: (type: FeedbackType) => void;\n language: Language;\n theme: Theme;\n}\n\nexport function FeedbackTypeStep({ onFeedbackTypeChanged, language, theme }: FeedbackTypeStepProps) {\n const t = getTranslations(language);\n const feedbackTypes = getFeedbackTypes(language);\n const themeClasses = getThemeClasses(theme);\n \n return (\n <>\n <header className=\"flex items-center justify-between w-full gap-2\">\n <span className={`text-lg md:text-xl leading-6 ${themeClasses.textPrimary}`}>{t.form.header}</span>\n <CloseButton title={t.form.closeButton} theme={theme} />\n </header>\n <div className=\"flex py-6 md:py-8 gap-2 md:gap-2 w-full justify-center md:justify-start flex-wrap\">\n {\n Object.entries(feedbackTypes).map(([key, value]) => {\n return (\n <button\n key={key}\n className={`${themeClasses.bgSecondary} rounded py-4 md:py-5 flex-1 min-w-[80px] md:w-24 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none transition-colors`}\n type=\"button\"\n onClick={() => onFeedbackTypeChanged(key as FeedbackType)}\n >\n <img src={value.image.source} alt={value.image.alt} className=\"w-5 h-5 md:w-6 md:h-6\"></img>\n <span className={`text-xs md:text-sm text-center ${themeClasses.textPrimary}`}>{value.title}</span>\n </button>\n )\n })\n }\n </div>\n </>\n )\n}\n\n","'use client'\n\nimport { CircleNotch } from 'phosphor-react';\n\nexport function Loading() {\n return (\n <div className=\"w-4 h-4 flex items-center justify-center overflow-hidden \">\n <CircleNotch weight=\"bold\" className=\"w-4 h-4 animate-spin\" />\n </div>\n )\n}\n\n","'use client'\n\nimport { X, Check, Trash, ArrowCounterClockwise } from 'phosphor-react';\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport { Theme } from '../types';\nimport { getThemeClasses } from '../lib/theme';\n\ninterface ScreenshotEditorProps {\n screenshot: string;\n onSave: (editedScreenshot: string) => void;\n onCancel: () => void;\n language: 'en' | 'nl';\n theme?: Theme;\n}\n\nexport function ScreenshotEditor({\n screenshot,\n onSave,\n onCancel,\n language,\n theme = 'dark',\n}: ScreenshotEditorProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const [color, setColor] = useState('#ef4444'); // red-500\n const [brushSize, setBrushSize] = useState(3);\n const [image, setImage] = useState<HTMLImageElement | null>(null);\n const themeClasses = getThemeClasses(theme);\n\n const t = {\n en: {\n save: 'Save',\n cancel: 'Cancel',\n clear: 'Clear',\n undo: 'Undo',\n },\n nl: {\n save: 'Opslaan',\n cancel: 'Annuleren',\n clear: 'Wissen',\n undo: 'Ongedaan maken',\n },\n }[language];\n\n const colors = [\n '#ef4444', // red-500\n '#f59e0b', // amber-500\n '#eab308', // yellow-500\n '#22c55e', // green-500\n '#3b82f6', // blue-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n '#ffffff', // white\n '#000000', // black\n ];\n\n // Load image when screenshot changes\n useEffect(() => {\n const img = new Image();\n img.onload = () => {\n setImage(img);\n if (canvasRef.current) {\n const canvas = canvasRef.current;\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(img, 0, 0);\n }\n }\n };\n img.src = screenshot;\n }, [screenshot]);\n\n const getCoordinates = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n\n const rect = canvas.getBoundingClientRect();\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n\n if ('touches' in e) {\n const touch = e.touches[0] || e.changedTouches[0];\n return {\n x: (touch.clientX - rect.left) * scaleX,\n y: (touch.clientY - rect.top) * scaleY,\n };\n } else {\n return {\n x: (e.clientX - rect.left) * scaleX,\n y: (e.clientY - rect.top) * scaleY,\n };\n }\n }, []);\n\n const startDrawing = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n e.preventDefault();\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const { x, y } = getCoordinates(e);\n setIsDrawing(true);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.strokeStyle = color;\n ctx.lineWidth = brushSize;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n }, [color, brushSize, getCoordinates]);\n\n const draw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n if (!isDrawing) return;\n e.preventDefault();\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const { x, y } = getCoordinates(e);\n ctx.lineTo(x, y);\n ctx.stroke();\n }, [isDrawing, getCoordinates]);\n\n const stopDrawing = useCallback(() => {\n setIsDrawing(false);\n }, []);\n\n const clearCanvas = () => {\n const canvas = canvasRef.current;\n if (!canvas || !image) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0);\n };\n\n const undo = () => {\n const canvas = canvasRef.current;\n if (!canvas || !image) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // Redraw the base image (simple undo - clears all drawings)\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0);\n };\n\n const handleSave = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const editedScreenshot = canvas.toDataURL('image/png');\n onSave(editedScreenshot);\n };\n\n // Calculate canvas display size (max 600px width, maintain aspect ratio)\n const maxWidth = 600;\n const displayWidth = image ? Math.min(maxWidth, image.width) : maxWidth;\n const displayHeight = image ? (displayWidth / image.width) * image.height : 400;\n\n return (\n <div className={`fixed inset-0 z-50 flex items-center justify-center ${themeClasses.overlay} p-2 md:p-4`}>\n <div className={`${themeClasses.bgSecondary} rounded-lg shadow-xl max-w-4xl w-full max-h-[95vh] md:max-h-[90vh] overflow-auto`}>\n <div className={`sticky top-0 ${themeClasses.bgSecondary} border-b ${themeClasses.borderPrimary} p-2 md:p-4 flex items-center justify-between z-10 gap-2`}>\n <h3 className={`text-base md:text-lg font-semibold ${themeClasses.textPrimary} truncate`}>\n {language === 'nl' ? 'Teken op screenshot' : 'Draw on screenshot'}\n </h3>\n <div className=\"flex gap-1 md:gap-2 flex-shrink-0\">\n <button\n type=\"button\"\n onClick={undo}\n className={`p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`}\n title={t.undo}\n >\n <ArrowCounterClockwise weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n <button\n type=\"button\"\n onClick={clearCanvas}\n className={`p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`}\n title={t.clear}\n >\n <Trash weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n <button\n type=\"button\"\n onClick={onCancel}\n className={`p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`}\n title={t.cancel}\n >\n <X weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"p-1.5 md:p-2 bg-brand-500 hover:bg-brand-400 rounded-md text-white transition-colors touch-manipulation\"\n title={t.save}\n >\n <Check weight=\"bold\" className=\"w-4 h-4 md:w-5 md:h-5\" />\n </button>\n </div>\n </div>\n\n <div className=\"p-3 md:p-4\">\n {/* Color picker */}\n <div className=\"mb-3 md:mb-4 flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4\">\n <label className={`text-xs md:text-sm ${themeClasses.textSecondary} whitespace-nowrap`}>\n {language === 'nl' ? 'Kleur:' : 'Color:'}\n </label>\n <div className=\"flex gap-1.5 md:gap-2 flex-wrap\">\n {colors.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setColor(c)}\n className={`w-7 h-7 md:w-8 md:h-8 rounded-full border-2 transition-all touch-manipulation ${\n color === c\n ? `${theme === 'dark' ? 'border-zinc-100' : 'border-gray-900'} scale-110`\n : `${themeClasses.borderSecondary} ${themeClasses.borderHover}`\n }`}\n style={{ backgroundColor: c }}\n title={c}\n />\n ))}\n </div>\n </div>\n\n {/* Brush size */}\n <div className=\"mb-3 md:mb-4 flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4\">\n <label className={`text-xs md:text-sm ${themeClasses.textSecondary} whitespace-nowrap`}>\n {language === 'nl' ? 'Grootte:' : 'Size:'}\n </label>\n <div className=\"flex items-center gap-2 w-full md:w-auto\">\n <input\n type=\"range\"\n min=\"1\"\n max=\"10\"\n value={brushSize}\n onChange={(e) => setBrushSize(Number(e.target.value))}\n className=\"flex-1 md:flex-none md:max-w-xs\"\n />\n <span className={`text-xs md:text-sm ${themeClasses.textTertiary} w-6 md:w-8 text-right`}>{brushSize}</span>\n </div>\n </div>\n\n {/* Canvas */}\n <div className={`flex justify-center ${themeClasses.canvasBg} rounded-lg p-2 md:p-4 overflow-auto`}>\n <canvas\n ref={canvasRef}\n onMouseDown={startDrawing}\n onMouseMove={draw}\n onMouseUp={stopDrawing}\n onMouseLeave={stopDrawing}\n onTouchStart={startDrawing}\n onTouchMove={draw}\n onTouchEnd={stopDrawing}\n className={`cursor-crosshair border ${themeClasses.borderPrimary} rounded touch-none`}\n style={{\n width: `${displayWidth}px`,\n height: `${displayHeight}px`,\n maxWidth: '100%',\n maxHeight: 'calc(95vh - 200px)',\n }}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","'use client'\n\nimport html2canvas from 'html2canvas';\nimport { Camera, Trash, X, PencilSimple } from 'phosphor-react';\nimport { useState } from 'react';\nimport { Loading } from './Loading';\nimport { ScreenshotEditor } from './ScreenshotEditor';\nimport { Language } from '../lib/translations';\nimport { Theme } from '../types';\nimport { getThemeClasses } from '../lib/theme';\n\ninterface ScreenshotButtonProps {\n screenshot: string | null;\n onScreenshotTook: (screenshot: string | null) => void;\n language?: Language;\n theme?: Theme;\n}\n\nexport function ScreenshotButton({\n screenshot,\n onScreenshotTook,\n language = 'en',\n theme = 'dark',\n}: ScreenshotButtonProps) {\n const [isTakenScreenshot, setIsTakenScreenShot] = useState(false);\n const [showEditor, setShowEditor] = useState(false);\n const [tempScreenshot, setTempScreenshot] = useState<string | null>(null);\n const themeClasses = getThemeClasses(theme);\n \n async function handleTakeScreenshot() {\n setIsTakenScreenShot(true);\n const canvas = await html2canvas(document.querySelector('html')!, {\n ignoreElements: (element) => {\n // Exclude the feedback widget from screenshots\n return element.hasAttribute('data-feedback-widget') || \n element.closest('[data-feedback-widget]') !== null;\n },\n });\n const base64image = canvas.toDataURL('image/png');\n onScreenshotTook(base64image);\n setIsTakenScreenShot(false);\n }\n\n function handleEditorSave(editedScreenshot: string) {\n onScreenshotTook(editedScreenshot);\n setShowEditor(false);\n setTempScreenshot(null);\n }\n\n function handleEditorCancel() {\n setShowEditor(false);\n setTempScreenshot(null);\n }\n\n function handleEditScreenshot() {\n if (screenshot) {\n setTempScreenshot(screenshot);\n setShowEditor(true);\n }\n }\n\n if (showEditor && (tempScreenshot || screenshot)) {\n return (\n <>\n <ScreenshotEditor\n screenshot={tempScreenshot || screenshot!}\n onSave={handleEditorSave}\n onCancel={handleEditorCancel}\n language={language}\n theme={theme}\n />\n {screenshot ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"relative group\">\n <div\n className={`p-1 w-10 h-10 rounded-md border ${themeClasses.borderSecondary} flex \n justify-end items-end relative overflow-hidden`}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'center',\n backgroundSize: 'cover',\n }}\n >\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors rounded-md\" />\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onScreenshotTook(null);\n }}\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10\"\n title={language === 'nl' ? 'Verwijderen' : 'Delete'}\n >\n <X weight=\"bold\" className=\"w-3 h-3 text-white\" />\n </button>\n </div>\n <button\n type=\"button\"\n onClick={handleEditScreenshot}\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transition-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n title={language === 'nl' ? 'Bewerk screenshot' : 'Edit screenshot'}\n >\n <PencilSimple weight=\"bold\" className={`w-5 h-5 ${themeClasses.textPrimary}`} />\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transition-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className={`w-6 h-6 ${themeClasses.iconColor}`} />}\n </button>\n )}\n </>\n );\n }\n\n if (screenshot) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"relative group\">\n <div\n className={`p-1 w-10 h-10 rounded-md border ${themeClasses.borderSecondary} flex \n justify-end items-end relative overflow-hidden`}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'center',\n backgroundSize: 'cover',\n }}\n >\n <div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors rounded-md\" />\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onScreenshotTook(null);\n }}\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10\"\n title={language === 'nl' ? 'Verwijderen' : 'Delete'}\n >\n <X weight=\"bold\" className=\"w-3 h-3 text-white\" />\n </button>\n </div>\n <button\n type=\"button\"\n onClick={handleEditScreenshot}\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transition-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n title={language === 'nl' ? 'Bewerk screenshot' : 'Edit screenshot'}\n >\n <PencilSimple weight=\"bold\" className={`w-5 h-5 ${themeClasses.textPrimary}`} />\n </button>\n </div>\n )\n }\n \n return (\n <button\n type=\"button\"\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className={`w-6 h-6 ${themeClasses.iconColor}`} />}\n </button>\n )\n}\n\n","'use client'\n\nimport { Paperclip, X } from 'phosphor-react';\nimport { useRef, useState, useEffect } from 'react';\nimport { Theme } from '../types';\nimport { getThemeClasses } from '../lib/theme';\n\nexport interface UploadedFile {\n file: File;\n preview?: string; // For images\n id: string; // Unique identifier\n}\n\ninterface FileUploadButtonProps {\n files: UploadedFile[];\n onFilesChanged: (files: UploadedFile[]) => void;\n maxFileSize?: number; // in bytes, default 5MB\n maxTotalSize?: number; // in bytes, default 20MB\n acceptedTypes?: string; // e.g., \"image/*,.pdf,.doc,.docx\"\n language?: 'en' | 'nl';\n theme?: Theme;\n}\n\nconst DEFAULT_MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB\nconst DEFAULT_MAX_TOTAL_SIZE = 20 * 1024 * 1024; // 20MB\n\nexport function FileUploadButton({\n files,\n onFilesChanged,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n maxTotalSize = DEFAULT_MAX_TOTAL_SIZE,\n acceptedTypes = 'image/*,.pdf,.doc,.docx,.txt',\n language = 'en',\n theme = 'dark',\n}: FileUploadButtonProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [error, setError] = useState<string | null>(null);\n const themeClasses = getThemeClasses(theme);\n\n const translations = {\n en: {\n upload: 'Upload file',\n remove: 'Remove file',\n fileTooLarge: 'File is too large',\n totalSizeExceeded: 'Total file size exceeded',\n maxFileSize: 'Max file size:',\n maxTotalSize: 'Max total size:',\n files: 'files',\n },\n nl: {\n upload: 'Bestand uploaden',\n remove: 'Bestand verwijderen',\n fileTooLarge: 'Bestand is te groot',\n totalSizeExceeded: 'Totale bestandsgrootte overschreden',\n maxFileSize: 'Max bestandsgrootte:',\n maxTotalSize: 'Max totale grootte:',\n files: 'bestanden',\n },\n };\n\n const t = translations[language];\n\n function formatFileSize(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n function handleFileSelect(e: React.ChangeEvent<HTMLInputElement>) {\n setError(null);\n const selectedFiles = Array.from(e.target.files || []);\n \n if (selectedFiles.length === 0) return;\n\n const newFiles: UploadedFile[] = [];\n let totalSize = files.reduce((sum, f) => sum + f.file.size, 0);\n\n for (const file of selectedFiles) {\n // Check individual file size\n if (file.size > maxFileSize) {\n setError(`${t.fileTooLarge} (${file.name}): ${formatFileSize(file.size)} > ${formatFileSize(maxFileSize)}`);\n continue;\n }\n\n // Check total size\n if (totalSize + file.size > maxTotalSize) {\n setError(`${t.totalSizeExceeded} (${formatFileSize(maxTotalSize)})`);\n continue;\n }\n\n // Create preview for images\n let preview: string | undefined;\n if (file.type.startsWith('image/')) {\n preview = URL.createObjectURL(file);\n }\n\n newFiles.push({\n file,\n preview,\n id: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n });\n\n totalSize += file.size;\n }\n\n if (newFiles.length > 0) {\n onFilesChanged([...files, ...newFiles]);\n }\n\n // Reset input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }\n\n function handleRemoveFile(id: string) {\n const fileToRemove = files.find(f => f.id === id);\n if (fileToRemove?.preview) {\n URL.revokeObjectURL(fileToRemove.preview);\n }\n onFilesChanged(files.filter(f => f.id !== id));\n setError(null);\n }\n\n // Cleanup object URLs when files are removed or component unmounts\n useEffect(() => {\n return () => {\n files.forEach(file => {\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n }, [files]); // Cleanup when files change or component unmounts\n\n function handleButtonClick() {\n fileInputRef.current?.click();\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <button\n type=\"button\"\n className={`p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`}\n onClick={handleButtonClick}\n title={t.upload}\n >\n <Paperclip weight=\"bold\" className={`w-6 h-6 ${themeClasses.iconColor}`} />\n </button>\n \n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n\n {files.map((uploadedFile) => (\n <div\n key={uploadedFile.id}\n className={`flex items-center gap-1 ${themeClasses.bgSecondary} rounded-md px-2 py-1 text-xs`}\n >\n {uploadedFile.preview ? (\n <img\n src={uploadedFile.preview}\n alt={uploadedFile.file.name}\n className=\"w-5 h-5 md:w-6 md:h-6 object-cover rounded flex-shrink-0\"\n />\n ) : (\n <Paperclip className={`w-3 h-3 md:w-4 md:h-4 flex-shrink-0 ${themeClasses.iconColor}`} />\n )}\n <span className={`${themeClasses.textSecondary} max-w-[80px] md:max-w-[100px] truncate`} title={uploadedFile.file.name}>\n {uploadedFile.file.name}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveFile(uploadedFile.id)}\n className={`${themeClasses.textTertiary} ${theme === 'dark' ? 'hover:text-zinc-100' : 'hover:text-gray-900'} transition-colors flex-shrink-0 touch-manipulation`}\n title={t.remove}\n >\n <X weight=\"bold\" className=\"w-3 h-3 md:w-4 md:h-4\" />\n </button>\n </div>\n ))}\n </div>\n \n {error && (\n <p className=\"text-xs text-red-400\">{error}</p>\n )}\n \n {files.length > 0 && (\n <p className={`text-xs ${themeClasses.textTertiary}`}>\n {files.length} {t.files} ({formatFileSize(files.reduce((sum, f) => sum + f.file.size, 0))} / {formatFileSize(maxTotalSize)})\n </p>\n )}\n </div>\n );\n}\n","import { FeedbackType, GitHubConfig } from '../../types';\nimport { UploadedFile } from '../../components/FileUploadButton';\n\ninterface FeedbackData {\n type: FeedbackType;\n comment: string;\n screenshot: string | null;\n files: UploadedFile[];\n}\n\n/**\n * Upload a file to repository and return the URL\n * This avoids the 65536 character limit by storing files in the repo\n */\nasync function uploadFileToRepo(\n token: string,\n owner: string,\n repo: string,\n file: File,\n folderPath: string,\n defaultBranch: string\n): Promise<string> {\n // Read file as base64\n const base64Content = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Remove data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.includes(',') ? result.split(',')[1] : result;\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n // Generate unique filename preserving extension\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(2, 9);\n const fileExtension = file.name.split('.').pop() || 'bin';\n const filename = `feedback-${timestamp}-${randomId}.${fileExtension}`;\n const path = `${folderPath}/${filename}`;\n\n // Upload to repository using GitHub Contents API\n const uploadUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n\n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: `Add feedback file: ${filename}`,\n content: base64Content,\n branch: defaultBranch,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.message || 'Unknown error';\n \n if (response.status === 409) {\n throw new Error(`File already exists: ${filename}`);\n } else if (response.status === 403) {\n throw new Error(`Permission denied for file: ${filename}`);\n } else if (response.status === 422) {\n throw new Error(`File too large or invalid: ${filename} - ${errorMessage}`);\n }\n \n throw new Error(`Failed to upload file ${filename} (${response.status}): ${errorMessage}`);\n }\n\n // Return the GitHub raw URL\n const rawUrl = `https://github.com/${owner}/${repo}/blob/${defaultBranch}/${path}?raw=true`;\n return rawUrl;\n}\n\n/**\n * Upload screenshot to repository and return the URL\n * This avoids the 65536 character limit by storing the image as a file\n */\nasync function uploadScreenshotToRepo(\n token: string,\n owner: string,\n repo: string,\n screenshot: string,\n screenshotPath?: string\n): Promise<string> {\n // Compress screenshot first\n const compressedScreenshot = await compressScreenshot(screenshot, 1920, 0.7);\n \n // Convert base64 data URL to binary\n const base64Data = compressedScreenshot.split(',')[1]; // Remove data:image/jpeg;base64, prefix\n const binaryData = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));\n \n // Get default branch from repository\n const repoResponse = await fetch(\n `https://api.github.com/repos/${owner}/${repo}`,\n {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n }\n );\n \n let defaultBranch = 'main';\n if (repoResponse.ok) {\n const repoData = await repoResponse.json();\n defaultBranch = repoData.default_branch || 'main';\n }\n \n // Use configured path or default to '.feedback-vos'\n const folderPath = screenshotPath || '.feedback-vos';\n \n // Generate unique filename\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).substring(2, 9);\n const filename = `feedback-${timestamp}-${randomId}.jpg`;\n const path = `${folderPath}/${filename}`;\n \n // Convert binary to base64 for GitHub API\n const base64Content = btoa(String.fromCharCode(...binaryData));\n \n // Try to create the folder if it doesn't exist\n // Check if folder exists by trying to get it\n const folderCheckUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}`;\n \n try {\n const folderCheck = await fetch(folderCheckUrl, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n });\n \n // If folder doesn't exist (404), create it with a README.md file\n if (folderCheck.status === 404) {\n const readmeContent = btoa('# Feedback Screenshots\\n\\nThis folder contains screenshots from user feedback.\\n');\n try {\n const folderCreateResponse = await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}/README.md`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: 'Create feedback screenshots folder',\n content: readmeContent,\n branch: defaultBranch,\n }),\n });\n \n if (!folderCreateResponse.ok) {\n const folderError = await folderCreateResponse.json().catch(() => ({}));\n console.warn('Could not create folder, proceeding with upload anyway:', folderError);\n } else {\n console.log(`Folder ${folderPath} created successfully`);\n }\n } catch (folderCreateError) {\n // Ignore errors creating folder - might already exist or permission issue\n console.warn('Could not create folder, proceeding with upload:', folderCreateError);\n }\n } else if (folderCheck.status === 200) {\n // Folder exists, check if it's actually a folder (should return array) or a file\n const folderData = await folderCheck.json().catch(() => null);\n if (folderData && !Array.isArray(folderData)) {\n // It's a file, not a folder - this will cause issues\n throw new Error(`Path \"${folderPath}\" exists as a file, not a folder. Please use a different path or remove the file.`);\n }\n console.log(`Folder ${folderPath} already exists`);\n }\n } catch (folderError) {\n // If it's our custom error, re-throw it\n if (folderError instanceof Error && folderError.message.includes('exists as a file')) {\n throw folderError;\n }\n // Ignore other folder errors - proceed with upload\n console.warn('Could not verify/create screenshots folder:', folderError);\n }\n \n // Upload to repository using GitHub Contents API\n const uploadUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n \n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: `Add feedback screenshot: ${filename}`,\n content: base64Content,\n branch: defaultBranch,\n }),\n });\n \n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.message || 'Unknown error';\n \n // Provide more helpful error messages\n if (response.status === 409) {\n throw new Error(`File already exists. This is unexpected - please try again.`);\n } else if (response.status === 403) {\n throw new Error(`Permission denied. Make sure your token has write access to the repository.`);\n } else if (response.status === 422) {\n throw new Error(`Validation failed: ${errorMessage}. The file might be too large.`);\n }\n \n throw new Error(`Failed to upload screenshot (${response.status}): ${errorMessage}`);\n }\n \n const uploadData = await response.json();\n \n // Return the GitHub blob URL with ?raw=true for direct image access in markdown\n // Format: https://github.com/owner/repo/blob/branch/path?raw=true\n // This URL will work in GitHub issues and markdown\n const rawUrl = `https://github.com/${owner}/${repo}/blob/${defaultBranch}/${path}?raw=true`;\n \n console.log(`Screenshot uploaded successfully to: ${rawUrl}`);\n \n // Return the raw URL (works better in GitHub issues)\n return rawUrl;\n}\n\n/**\n * Compress and resize screenshot to reduce size\n * GitHub Issues have a 65536 character limit for the body\n * This function only works in browser environments\n */\nfunction compressScreenshot(dataUrl: string, maxWidth: number = 1920, quality: number = 0.7): Promise<string> {\n return new Promise((resolve, reject) => {\n // Check if we're in a browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n reject(new Error('Screenshot compression only works in browser environments'));\n return;\n }\n\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n let width = img.width;\n let height = img.height;\n\n // Resize if too large\n if (width > maxWidth) {\n height = (height * maxWidth) / width;\n width = maxWidth;\n }\n\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('Could not get canvas context'));\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n \n // Convert to JPEG with compression (smaller than PNG)\n const compressedDataUrl = canvas.toDataURL('image/jpeg', quality);\n resolve(compressedDataUrl);\n };\n img.onerror = () => reject(new Error('Failed to load image'));\n img.src = dataUrl;\n });\n}\n\n/**\n * Verify that the repository exists and is accessible with the given token\n */\nasync function verifyRepositoryAccess(\n token: string,\n owner: string,\n repo: string\n): Promise<{ exists: boolean; hasIssues: boolean; error?: string }> {\n try {\n const response = await fetch(\n `https://api.github.com/repos/${owner}/${repo}`,\n {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n }\n );\n\n if (response.status === 404) {\n return { exists: false, hasIssues: false, error: 'Repository not found' };\n }\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n exists: false,\n hasIssues: false,\n error: errorData.message || `HTTP ${response.status}`,\n };\n }\n\n const repoData = await response.json();\n return {\n exists: true,\n hasIssues: repoData.has_issues !== false, // Default is true if not specified\n };\n } catch (error) {\n return {\n exists: false,\n hasIssues: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\nexport async function sendToGitHub(\n config: GitHubConfig,\n data: FeedbackData\n): Promise<void> {\n const { token, owner, repo, screenshotPath } = config;\n const { type, comment, screenshot, files } = data;\n\n // Validate configuration\n if (!token || !owner || !repo) {\n throw new Error('GitHub configuration is incomplete. Please provide token, owner, and repo.');\n }\n\n // Verify repository access before attempting to create issue\n const verification = await verifyRepositoryAccess(token, owner, repo);\n if (!verification.exists) {\n throw new Error(\n `Repository \"${owner}/${repo}\" not found or not accessible.\\n` +\n `Error: ${verification.error || 'Unknown error'}\\n\\n` +\n `Please verify:\\n` +\n `- Repository exists at https://github.com/${owner}/${repo}\\n` +\n `- Your token has access to this repository\\n` +\n `- Token has \"repo\" scope (for private) or \"public_repo\" scope (for public)`\n );\n }\n\n if (!verification.hasIssues) {\n throw new Error(\n `Issues are disabled for repository \"${owner}/${repo}\".\\n\\n` +\n `Please enable Issues in repository Settings → General → Features → Issues`\n );\n }\n\n // Get default branch from repository\n const repoResponse = await fetch(\n `https://api.github.com/repos/${owner}/${repo}`,\n {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n }\n );\n \n let defaultBranch = 'main';\n if (repoResponse.ok) {\n const repoData = await repoResponse.json();\n defaultBranch = repoData.default_branch || 'main';\n }\n\n // Use configured path or default to '.feedback-vos'\n const folderPath = screenshotPath || '.feedback-vos';\n\n // Ensure folder exists (similar to screenshot upload)\n const folderCheckUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}`;\n try {\n const folderCheck = await fetch(folderCheckUrl, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'feedback-vos',\n },\n });\n \n if (folderCheck.status === 404) {\n const readmeContent = btoa('# Feedback Files\\n\\nThis folder contains files from user feedback.\\n');\n try {\n await fetch(`https://api.github.com/repos/${owner}/${repo}/contents/${folderPath}/README.md`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n message: 'Create feedback files folder',\n content: readmeContent,\n branch: defaultBranch,\n }),\n });\n } catch (folderCreateError) {\n console.warn('Could not create folder, proceeding with upload:', folderCreateError);\n }\n }\n } catch (folderError) {\n console.warn('Could not verify/create files folder:', folderError);\n }\n\n // Build issue title\n const title = `[${type}] Feedback`;\n\n // Limit comment length early to prevent body from being too long\n // GitHub's absolute limit is 65536 characters\n // Base body text: \"**Type:** ${type}\\n\\n**Comment:**\\n\" ≈ 30 chars\n // Screenshot URL: \"![Screenshot](url)\" ≈ 150 chars\n // Safety margin: 1000 chars\n // So max comment length: 65536 - 30 - 150 - 1000 = 64356\n const ABSOLUTE_MAX_LENGTH = 65536;\n const BASE_BODY_LENGTH = 50; // Approximate length of base text\n const SCREENSHOT_URL_LENGTH = 150; // Approximate length of screenshot markdown\n const SAFETY_MARGIN = 1000; // Safety margin for any additional formatting\n const MAX_COMMENT_LENGTH = ABSOLUTE_MAX_LENGTH - BASE_BODY_LENGTH - SCREENSHOT_URL_LENGTH - SAFETY_MARGIN;\n \n const limitedComment = comment.length > MAX_COMMENT_LENGTH \n ? comment.substring(0, MAX_COMMENT_LENGTH) + '\\n\\n... (comment truncated)'\n : comment;\n\n // Build issue body\n let body = `**Type:** ${type}\\n\\n**Comment:**\\n${limitedComment}`;\n\n // Upload screenshot to repository if provided\n // This avoids the 65536 character limit by storing the image as a file\n if (screenshot) {\n try {\n console.log('Uploading screenshot to repository...');\n console.log('Screenshot path:', folderPath);\n const screenshotUrl = await uploadScreenshotToRepo(token, owner, repo, screenshot, screenshotPath);\n console.log('Screenshot uploaded successfully, URL:', screenshotUrl);\n // Add screenshot reference (just the image, link is redundant)\n body += `\\n\\n**Screenshot:**\\n![Screenshot](${screenshotUrl})`;\n console.log('Body length after adding screenshot URL:', body.length);\n } catch (error) {\n // If upload fails, skip screenshot entirely (don't use base64 as it's too large)\n console.error('Failed to upload screenshot to repository:', error);\n // Don't add error message to body - just note that screenshot failed\n // This keeps the body short\n body += `\\n\\n**Screenshot:** Upload failed - screenshot not included.`;\n console.log('Body length after upload failure:', body.length);\n }\n }\n\n // Upload files to repository if provided\n if (files && files.length > 0) {\n const uploadedFileUrls: string[] = [];\n const failedFiles: string[] = [];\n\n for (const uploadedFile of files) {\n try {\n console.log(`Uploading file: ${uploadedFile.file.name}`);\n const fileUrl = await uploadFileToRepo(\n token,\n owner,\n repo,\n uploadedFile.file,\n folderPath,\n defaultBranch\n );\n uploadedFileUrls.push(fileUrl);\n console.log(`File uploaded successfully: ${fileUrl}`);\n } catch (error) {\n console.error(`Failed to upload file ${uploadedFile.file.name}:`, error);\n failedFiles.push(uploadedFile.file.name);\n }\n }\n\n // Add file references to body\n if (uploadedFileUrls.length > 0) {\n body += `\\n\\n**Uploaded Files:**\\n`;\n uploadedFileUrls.forEach((url, index) => {\n const fileName = files[index]?.file.name || 'Unknown';\n body += `- [${fileName}](${url})\\n`;\n });\n }\n\n if (failedFiles.length > 0) {\n body += `\\n\\n**Failed to upload:** ${failedFiles.join(', ')}`;\n }\n }\n \n // CRITICAL: Final safety check - ensure body is ALWAYS within limit before sending\n // GitHub's absolute limit is 65536 characters\n const SAFE_MAX_LENGTH = 65000; // Use 65000 as safe margin\n \n // Log body length for debugging\n console.log(`Issue body length before final check: ${body.length} characters`);\n \n // If body is too long, truncate it progressively\n if (body.length > SAFE_MAX_LENGTH) {\n console.warn(`Body is too long (${body.length}), truncating...`);\n \n // Calculate how much we need to reduce\n const excess = body.length - SAFE_MAX_LENGTH;\n \n // Find the comment section\n const commentStartMarker = '\\n\\n**Comment:**\\n';\n const commentStart = body.indexOf(commentStartMarker);\n const screenshotStart = body.indexOf('\\n\\n**Screenshot:**');\n \n if (commentStart > 0) {\n // Calculate comment boundaries\n const commentStartPos = commentStart + commentStartMarker.length;\n const commentEndPos = screenshotStart > 0 ? screenshotStart : body.length;\n const currentComment = body.substring(commentStartPos, commentEndPos);\n \n // Calculate new comment length (reduce by excess + safety margin)\n const newCommentLength = Math.max(100, currentComment.length - excess - 500);\n const truncatedComment = currentComment.substring(0, newCommentLength) + '\\n\\n... (truncated due to size limit)';\n \n // Rebuild body with truncated comment\n const beforeComment = body.substring(0, commentStartPos);\n const afterComment = screenshotStart > 0 ? body.substring(screenshotStart) : '';\n body = beforeComment + truncatedComment + afterComment;\n }\n }\n \n // Absolute final check - if still too long, force truncate aggressively\n if (body.length >= ABSOLUTE_MAX_LENGTH) {\n console.error(`Body STILL too long after truncation: ${body.length} characters. Force truncating.`);\n \n const baseText = `**Type:** ${type}\\n\\n**Comment:**\\n`;\n const maxCommentLength = ABSOLUTE_MAX_LENGTH - baseText.length - 1000; // Large margin for screenshot text\n \n // Use original comment, not limitedComment, to ensure we get a fresh truncation\n const safeComment = comment.substring(0, Math.max(100, maxCommentLength)) + '\\n\\n... (truncated due to size limit)';\n body = baseText + safeComment;\n \n // Remove screenshot if present (it will be added back if upload succeeds, but with URL not base64)\n const screenshotIndex = body.indexOf('\\n\\n**Screenshot:**');\n if (screenshotIndex > 0) {\n body = body.substring(0, screenshotIndex) + '\\n\\n**Screenshot:** Not included due to size limit.';\n }\n }\n \n // Final verification - ensure we're under the limit\n if (body.length >= ABSOLUTE_MAX_LENGTH) {\n // Emergency: use minimal body\n const minimalBase = `**Type:** ${type}\\n\\n**Comment:**\\n`;\n const maxSafeComment = ABSOLUTE_MAX_LENGTH - minimalBase.length - 100;\n const minimalComment = comment.substring(0, Math.max(50, maxSafeComment)) + '\\n\\n... (truncated)';\n body = minimalBase + minimalComment;\n }\n \n console.log(`Final issue body length: ${body.length} characters (limit: ${ABSOLUTE_MAX_LENGTH})`);\n \n // Final hard check - throw error if still too long (should never happen)\n if (body.length >= ABSOLUTE_MAX_LENGTH) {\n throw new Error(`CRITICAL: Cannot create issue - body is ${body.length} characters, exceeds GitHub limit of ${ABSOLUTE_MAX_LENGTH}.`);\n }\n\n const url = `https://api.github.com/repos/${owner}/${repo}/issues`;\n \n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n 'User-Agent': 'feedback-vos',\n },\n body: JSON.stringify({\n title,\n body,\n // Note: Labels must exist in the repository. If they don't exist, GitHub will ignore them.\n // You can create these labels in your repository settings if needed.\n labels: ['feedback', type.toLowerCase()],\n }),\n });\n\n if (!response.ok) {\n let errorMessage = `GitHub API error (${response.status}): `;\n \n try {\n const errorData = await response.json();\n errorMessage += errorData.message || JSON.stringify(errorData);\n \n // Provide helpful error messages for common issues\n if (response.status === 404) {\n errorMessage += `\\n\\nTrying to access: ${url}`;\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Repository \"${owner}/${repo}\" does not exist or is not accessible\\n`;\n errorMessage += `- Token does not have access to this repository\\n`;\n errorMessage += `- Check that owner and repo names are correct (case-sensitive)\\n`;\n errorMessage += `- Verify the repository URL: https://github.com/${owner}/${repo}\\n`;\n errorMessage += `- Make sure Issues are enabled in repository settings\\n`;\n errorMessage += `\\nTo debug:\\n`;\n errorMessage += `1. Visit https://github.com/${owner}/${repo} to verify it exists\\n`;\n errorMessage += `2. Check repository Settings → General → Features → Issues (must be enabled)\\n`;\n errorMessage += `3. Verify your token has \"repo\" scope (for private) or \"public_repo\" scope (for public)\\n`;\n errorMessage += `4. Test token access: curl -H \"Authorization: Bearer YOUR_TOKEN\" https://api.github.com/repos/${owner}/${repo}`;\n } else if (response.status === 401) {\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Invalid or expired GitHub token\\n`;\n errorMessage += `- Token does not have the required \"repo\" or \"public_repo\" scope\\n`;\n errorMessage += `- Generate a new token at https://github.com/settings/tokens`;\n } else if (response.status === 422) {\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Issue body is too long (maximum is 65536 characters)\\n`;\n errorMessage += `- Screenshot is too large - it will be automatically compressed\\n`;\n errorMessage += `- Try reducing the comment length or removing the screenshot\\n`;\n errorMessage += `- Invalid label names (labels must exist in the repository)`;\n } else if (response.status === 403) {\n errorMessage += `\\n\\nPossible causes:\\n`;\n errorMessage += `- Token does not have permission to create issues\\n`;\n errorMessage += `- Repository has issues disabled\\n`;\n errorMessage += `- Rate limit exceeded (check GitHub API rate limits)\\n`;\n errorMessage += `- Check repository Settings → General → Features → Issues`;\n }\n } catch (parseError) {\n const errorText = await response.text();\n errorMessage += errorText || 'Unknown error';\n }\n \n throw new Error(errorMessage);\n }\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to create GitHub issue: ${String(error)}`);\n }\n}\n\n","'use client'\n\nimport {ArrowLeft} from 'phosphor-react';\nimport { FormEvent, useState, useEffect } from 'react';\nimport { FeedbackType, getFeedbackTypes } from '..';\nimport { CloseButton } from '../../CloseButton';\nimport {Loading} from '../../Loading';\nimport { ScreenshotButton } from '../../ScreenshotButton';\nimport { FileUploadButton, UploadedFile } from '../../FileUploadButton';\nimport { sendToGitHub } from '../../../lib/integrations/github';\nimport { GitHubConfig, Theme } from '../../../types';\nimport { Language, getTranslations } from '../../../lib/translations';\nimport { getThemeClasses } from '../../../lib/theme';\n\ninterface FeedbackContentStepProps {\n feedbackType: FeedbackType;\n onFeedbackRestartRequest: () => void;\n onFeedbackSent: () => void;\n integration: 'github';\n githubConfig: GitHubConfig;\n language: Language;\n theme: Theme;\n}\n\nexport function FeedbackContentStep({\n feedbackType,\n onFeedbackRestartRequest,\n onFeedbackSent,\n integration,\n githubConfig,\n language,\n theme,\n}: FeedbackContentStepProps) {\n const t = getTranslations(language);\n const feedbackTypes = getFeedbackTypes(language);\n const themeClasses = getThemeClasses(theme);\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFile[]>([]);\n const feedbackTypeData = feedbackTypes[feedbackType];\n const [comment, setComment] = useState('');\n const[isSendingFeedback, setIsSendingFeedback] = useState(false);\n\n // Cleanup object URLs when component unmounts or files change\n useEffect(() => {\n return () => {\n uploadedFiles.forEach(file => {\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n }, [uploadedFiles]);\n\n async function handleSubmitFeedback(e: FormEvent) {\n e.preventDefault();\n setIsSendingFeedback(true);\n \n try {\n const feedbackData = {\n type: feedbackType,\n comment,\n screenshot,\n files: uploadedFiles,\n };\n\n if (integration === 'github') {\n await sendToGitHub(githubConfig, feedbackData);\n } else {\n throw new Error('Invalid integration configuration');\n }\n \n setIsSendingFeedback(false);\n onFeedbackSent();\n } catch (error) {\n console.error('Error sending feedback:', error);\n setIsSendingFeedback(false);\n // TODO: Show error message to user\n alert(t.content.error);\n }\n }\n \n return (\n <>\n <header className=\"relative w-full\">\n <button\n type=\"button\"\n className={`absolute top-0 left-0 ${themeClasses.textTertiary} ${theme === 'dark' ? 'hover:text-zinc-100' : 'hover:text-gray-900'} z-10 p-2 md:p-2.5`}\n onClick={onFeedbackRestartRequest}\n >\n <ArrowLeft weight=\"bold\" className=\"w-5 h-5 md:w-5 md:h-5\" />\n </button>\n\n <span className={`text-lg md:text-xl leading-6 flex items-center gap-2 pl-10 md:pl-12 pr-10 md:pr-12 ${themeClasses.textPrimary}`}>\n <img\n src={feedbackTypeData.image.source}\n alt={feedbackTypeData.image.alt}\n className=\"w-5 h-5 md:w-6 md:h-6\"\n />\n {feedbackTypeData.title}\n </span>\n <CloseButton className=\"absolute top-0 right-0 p-2 md:p-2.5\" title={t.form.closeButton} theme={theme} />\n </header>\n <form onSubmit={handleSubmitFeedback} className=\"my-3 md:my-4 w-full\">\n <textarea\n className={`w-full min-h-[100px] md:min-h-[112px] text-sm \n ${themeClasses.textPrimary} border-2 border-brand-500 bg-transparent rounded-md p-2 md:p-3\n ${theme === 'dark' ? 'placeholder:text-zinc-400' : 'placeholder:text-gray-500'}\n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\n ${theme === 'dark' ? 'scrollbar-thumb-zinc-700' : 'scrollbar-thumb-gray-400'} scrollbar-track-transparent scrollbar-thin`}\n placeholder={t.content.placeholder}\n onChange={(e) => setComment(e.target.value)}\n />\n <div className=\"mt-2\">\n <FileUploadButton\n files={uploadedFiles}\n onFilesChanged={setUploadedFiles}\n language={language}\n theme={theme}\n />\n </div>\n <footer className=\"flex gap-2 mt-3\">\n <ScreenshotButton\n screenshot={screenshot}\n onScreenshotTook={setScreenshot}\n language={language}\n theme={theme}\n />\n <button\n type=\"submit\"\n disabled={comment.length === 0 || isSendingFeedback}\n className={`p-2 bg-brand-500 rounded-md border-transparent flex-1 justify-center\n items-center text-sm hover:bg-brand-300 focus:outline-none focus:ring-2\n focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\n disabled:hover:bg-brand-500 flex text-white`}\n >\n {isSendingFeedback? <Loading/> : t.content.sendButton}\n </button>\n </footer>\n </form>\n </>\n )\n}\n\n","'use client'\n\nimport { CloseButton } from '../../CloseButton';\nimport { Language, getTranslations } from '../../../lib/translations';\nimport { Theme } from '../../../types';\nimport { getThemeClasses } from '../../../lib/theme';\n\ninterface FeedbackSuccessStepProps {\n onFeedbackRestartRequest: () => void;\n language: Language;\n theme: Theme;\n}\n\nexport function FeedbackSuccessStep({ onFeedbackRestartRequest, language, theme }: FeedbackSuccessStepProps) {\n const t = getTranslations(language);\n const themeClasses = getThemeClasses(theme);\n return (\n <>\n <header>\n <CloseButton title={t.form.closeButton} theme={theme} />\n </header>\n\n <div className=\"flex flex-col items-center py-8 md:py-10 w-full max-w-[304px] px-2\">\n <svg width=\"41\" height=\"40\" viewBox=\"0 0 41 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"w-10 h-10 md:w-[41px] md:h-[40px]\">\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\"/>\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\"/>\n </svg>\n \n <span className={`text-lg md:text-xl mt-2 text-center ${themeClasses.textPrimary}`}>{t.success.message}</span>\n\n <button \n type=\"button\"\n onClick={onFeedbackRestartRequest}\n className={`py-2 px-6 mt-6 ${themeClasses.buttonSecondary} rounded-md border-transparent text-sm leading-6 focus:outline-none focus:ring-2 focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500 transition-colors`}\n >\n {t.success.sendAnother}\n </button>\n </div>\n </>\n );\n}\n\n","'use client'\n\nimport { bugImageUrl, ideaImageUrl, thoughtImageUrl } from '../../lib/svg-assets';\nimport { useState } from 'react';\nimport { FeedbackTypeStep } from './Steps/FeedbackTypeStep';\nimport { FeedbackContentStep } from './Steps/FeedbackContentStep';\nimport { FeedbackSuccessStep } from './Steps/FeedbackSuccessStep';\nimport { FeedbackType, GitHubConfig, Theme } from '../../types';\nimport { Language, getTranslations } from '../../lib/translations';\nimport { getThemeClasses } from '../../lib/theme';\n\nexport function getFeedbackTypes(language: Language = 'en') {\n const t = getTranslations(language);\n return {\n BUG: {\n title: t.types.bug,\n image: {\n source: bugImageUrl,\n alt: 'A purple caterpillar image',\n },\n },\n IDEA: {\n title: t.types.idea,\n image: {\n source: ideaImageUrl,\n alt: 'A Lamp image',\n },\n },\n OTHER: {\n title: t.types.other,\n image: {\n source: thoughtImageUrl,\n alt: 'A thought balloon image',\n },\n },\n };\n}\n\nexport type { FeedbackType };\n\ninterface WidgetFormProps {\n integration: 'github';\n githubConfig: GitHubConfig;\n language: Language;\n theme: Theme;\n}\n\nexport function WidgetForm({ integration, githubConfig, language, theme }: WidgetFormProps) {\n const [feedbackType, setFeedbackType] = useState<FeedbackType | null>(null)\n const [feedbackSent, setFeedbackSent] = useState(false)\n const themeClasses = getThemeClasses(theme);\n \n function handleRestartFeedback() {\n setFeedbackSent(false); \n setFeedbackType(null);\n }\n \n return (\n <div className={`${themeClasses.bgPrimary} p-3 md:p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto md:min-w-[384px] max-w-md`}>\n {feedbackSent ? (\n <FeedbackSuccessStep onFeedbackRestartRequest={handleRestartFeedback} language={language} theme={theme} />\n ) : (\n <>\n {!feedbackType ? (\n <FeedbackTypeStep onFeedbackTypeChanged={setFeedbackType} language={language} theme={theme} />\n ) : (\n <FeedbackContentStep\n feedbackType={feedbackType}\n onFeedbackRestartRequest={handleRestartFeedback}\n onFeedbackSent={() => setFeedbackSent(true)}\n integration={integration}\n githubConfig={githubConfig}\n language={language}\n theme={theme}\n />\n )}\n </>\n )}\n <footer className={`text-xs ${themeClasses.textMuted} mt-2`}>\n <a\n className=\"underline underline-offset-2\"\n href=\"https://vossendesign.nl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Vossen Design\n </a>\n </footer>\n </div>\n )\n}\n\n","'use client'\n\nimport { ChatTeardropDots } from 'phosphor-react';\nimport { Popover } from '@headlessui/react';\nimport { WidgetForm } from './WidgetForm';\nimport { WidgetProps } from '../types';\nimport { getTranslations } from '../lib/translations';\nimport { getDefaultTheme } from '../lib/theme';\n\nfunction getDefaultLanguage(): 'en' | 'nl' {\n // Check environment variable (works in Next.js client-side)\n if (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_FEEDBACK_LANG === 'nl') {\n return 'nl';\n }\n return 'en';\n}\n\nfunction isWidgetEnabled(): boolean {\n // Check environment variable to enable/disable widget\n if (typeof process !== 'undefined' && process.env.NEXT_PUBLIC_FEEDBACK_ENABLED !== undefined) {\n const enabled = String(process.env.NEXT_PUBLIC_FEEDBACK_ENABLED).toLowerCase().trim();\n // Disable only if explicitly set to 'false' or '0'\n return enabled !== 'false' && enabled !== '0';\n }\n // Default to enabled for backward compatibility\n return true;\n}\n\nexport function Widget({ \n integration, \n githubConfig,\n position = 'bottom-right',\n language,\n theme,\n}: WidgetProps) {\n // Check if widget should be enabled\n if (!isWidgetEnabled()) {\n return null;\n }\n\n const finalLanguage = language || getDefaultLanguage();\n const finalTheme = theme || getDefaultTheme();\n const t = getTranslations(finalLanguage);\n const positionClasses = {\n 'bottom-right': 'bottom-4 right-4 md:bottom-8 md:right-8',\n 'bottom-left': 'bottom-4 left-4 md:bottom-8 md:left-8',\n 'top-right': 'top-4 right-4 md:top-8 md:right-8',\n 'top-left': 'top-4 left-4 md:top-8 md:left-4',\n };\n\n const isTop = position.includes('top');\n const isLeft = position.includes('left');\n \n const panelPositionClass = isTop \n ? 'absolute top-full mt-2' \n : 'absolute bottom-full mb-2';\n \n const panelAlignmentClass = isLeft \n ? 'left-0' \n : 'right-0';\n\n // Calculate inline styles for positioning to prevent CSS conflicts\n const getPositionStyles = () => {\n const baseStyles: React.CSSProperties = {\n position: 'fixed',\n zIndex: 9999,\n };\n\n if (position === 'bottom-right') {\n baseStyles.bottom = '1rem';\n baseStyles.right = '1rem';\n } else if (position === 'bottom-left') {\n baseStyles.bottom = '1rem';\n baseStyles.left = '1rem';\n } else if (position === 'top-right') {\n baseStyles.top = '1rem';\n baseStyles.right = '1rem';\n } else if (position === 'top-left') {\n baseStyles.top = '1rem';\n baseStyles.left = '1rem';\n }\n\n return baseStyles;\n };\n\n return (\n <div \n data-feedback-widget=\"true\" \n className={`fixed ${positionClasses[position]} z-50`}\n style={getPositionStyles()}\n >\n <Popover className=\"relative\">\n <Popover.Panel className={`${panelPositionClass} ${panelAlignmentClass}`}>\n <WidgetForm \n integration={integration}\n githubConfig={githubConfig}\n language={finalLanguage}\n theme={finalTheme}\n />\n </Popover.Panel>\n <Popover.Button className=\"bg-brand-500 rounded-full px-3 md:px-3 h-12 text-white flex items-center group focus:outline-none shadow-lg hover:shadow-xl transition-shadow\">\n <ChatTeardropDots className=\"w-6 h-6 flex-shrink-0\" />\n <span className=\"max-w-0 overflow-hidden group-hover:max-w-xs md:group-hover:max-w-xs transition-all duration-500 ease-linear hidden md:block\">\n <span className=\"pl-2\"></span>\n {t.widget.button}\n </span>\n </Popover.Button>\n </Popover>\n </div>\n )\n}\n\n"]}