feedback-vos 1.0.3 → 1.0.4

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/README.md CHANGED
@@ -100,4 +100,4 @@ MIT License
100
100
 
101
101
  ---
102
102
 
103
- Built with 💜 by [Klaas Sysop](https://github.com/klaas-sysop)
103
+ Built with 💜 by [Klaas Sysop](https://github.com/klaas-sysop) | [Vossen Design](https://vossendesign.nl)
package/dist/index.js CHANGED
@@ -614,6 +614,19 @@ function WidgetForm({ integration, githubConfig }) {
614
614
  href: "https://github.com/klaas-sysop",
615
615
  children: "Klaas Sysop"
616
616
  }
617
+ ),
618
+ " ",
619
+ "|",
620
+ " ",
621
+ /* @__PURE__ */ jsxRuntime.jsx(
622
+ "a",
623
+ {
624
+ className: "underline underline-offset-2",
625
+ href: "https://vossendesign.nl",
626
+ target: "_blank",
627
+ rel: "noopener noreferrer",
628
+ children: "Vossen Design"
629
+ }
617
630
  )
618
631
  ] })
619
632
  ] });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/svg-assets.ts","../src/components/CloseButton.tsx","../src/components/WidgetForm/Steps/FeedbackTypeStep.tsx","../src/components/Loading.tsx","../src/components/ScreenshotButton.tsx","../src/lib/integrations/github.ts","../src/components/WidgetForm/Steps/FeedbackContentStep.tsx","../src/components/WidgetForm/Steps/FeedbackSuccessStep.tsx","../src/components/WidgetForm/index.tsx","../src/components/Widget.tsx"],"names":["jsx","Popover","X","jsxs","Fragment","CircleNotch","useState","html2canvas","Trash","Camera","ArrowLeft","ChatTeardropDots"],"mappings":"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","file":"index.js","sourcesContent":["// SVG files as data URLs (base64 encoded)\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","'use client'\n\nimport { Popover } from \"@headlessui/react\";\nimport { X } from \"phosphor-react\";\n\nexport function CloseButton() {\n return (\n <Popover.Button className=\"top-5 right-5 absolute text-zinc-400 hover:text-zinc-100\" title=\"Close feedback form\">\n <X weight=\"bold\" className=\"w-4 h-4\"/>\n </Popover.Button>\n )\n}\n\n","'use client'\n\nimport { FeedbackType, feedbackTypes } from \"..\";\nimport { CloseButton } from \"../../CloseButton\";\n\ninterface FeedbackTypeStepProps {\n onFeedbackTypeChanged: (type: FeedbackType) => void;\n}\n\nexport function FeedbackTypeStep({ onFeedbackTypeChanged }: FeedbackTypeStepProps) {\n return (\n <>\n <header>\n <span className=\"text-xl leading-6\">Please give us your feedback!</span>\n <CloseButton />\n </header>\n <div className=\"flex py-8 gap-2 w-full\">\n {\n Object.entries(feedbackTypes).map(([key, value]) => {\n return (\n <button\n key={key}\n className=\"bg-zinc-800 rounded py-5 w-24 flex1 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none\"\n type=\"button\"\n onClick={() => onFeedbackTypeChanged(key as FeedbackType)}\n >\n <img src={value.image.source} alt={value.image.alt}></img>\n <span>{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 html2canvas from 'html2canvas';\nimport { Camera, Trash } from 'phosphor-react';\nimport { useState } from 'react';\nimport { Loading } from './Loading';\n\ninterface ScreenshotButtonProps {\n screenshot: string | null;\n onScreenshotTook: (screenshot: string | null) => void;\n}\n\nexport function ScreenshotButton({\n screenshot,\n onScreenshotTook,\n}: ScreenshotButtonProps) {\n const [isTakenScreenshot, setIsTakenScreenShot] = useState(false)\n \n async function handleTakeScreenshot() {\n setIsTakenScreenShot(true);\n const canvas = await html2canvas(document.querySelector('html')!);\n const base64image = canvas.toDataURL('image/png');\n onScreenshotTook(base64image);\n setIsTakenScreenShot(false);\n }\n \n if (screenshot) {\n return (\n <button\n type=\"button\"\n className=\"p-1 w-10 h-10 rounded-md border-transparent flex \n justify-end items-end text-zinc-400 hover:text-zinc-100 transition-colors\"\n onClick={() => onScreenshotTook(null)}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'right bottom',\n backgroundSize: 180,\n }}\n >\n <Trash weight=\"fill\" />\n </button>\n )\n }\n \n return (\n <button\n type=\"button\"\n className=\"p-2 bg-zinc-800 rounded-md border-transparent hover:bg-zinc-700\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500\"\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className=\"w-6 h-6\" />}\n </button>\n )\n}\n\n","import { FeedbackType, GitHubConfig } from '../../types';\n\ninterface FeedbackData {\n type: FeedbackType;\n comment: string;\n screenshot: string | null;\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 } = 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 // 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:', screenshotPath || '.feedback-vos');\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 // 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 } from 'react';\nimport { FeedbackType, feedbackTypes } from '..';\nimport { CloseButton } from '../../CloseButton';\nimport {Loading} from '../../Loading';\nimport { ScreenshotButton } from '../../ScreenshotButton';\nimport { sendToGitHub } from '../../../lib/integrations/github';\nimport { GitHubConfig } from '../../../types';\n\ninterface FeedbackContentStepProps {\n feedbackType: FeedbackType;\n onFeedbackRestartRequest: () => void;\n onFeedbackSent: () => void;\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function FeedbackContentStep({\n feedbackType,\n onFeedbackRestartRequest,\n onFeedbackSent,\n integration,\n githubConfig,\n}: FeedbackContentStepProps) {\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const feedbackTypeData = feedbackTypes[feedbackType];\n const [comment, setComment] = useState('');\n const[isSendingFeedback, setIsSendingFeedback] = useState(false);\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 };\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('Failed to send feedback. Please try again.');\n }\n }\n \n return (\n <>\n <header>\n <button\n type=\"button\"\n className=\"absolute top-5 left-5 text-zinc-400 hover:text-zinc-100\"\n onClick={onFeedbackRestartRequest}\n >\n <ArrowLeft weight=\"bold\" className=\"w-4 h-4\" />\n </button>\n\n <span className=\"text-xl leading-6 flex items-center gap-2 mt-2\">\n <img\n src={feedbackTypeData.image.source}\n alt={feedbackTypeData.image.alt}\n className=\"w-6 h-6\"\n />\n {feedbackTypeData.title}\n </span>\n <CloseButton />\n </header>\n <form onSubmit={handleSubmitFeedback} className=\"my-4 w-full\">\n <textarea\n className=\"min-w-[384px] w-full min-h-[112px] text-sm \n placeholder-zinc-400 text-zinc-100 border-zinc-600 bg-transparent rounded-md \n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\n scrollbar-thumb-zinc-700 scrollbar-track-transparent scrollbar-thin\"\n placeholder=\"Tell in detail what is happening\"\n onChange={(e) => setComment(e.target.value)}\n />\n <footer className=\" flex gap-2 mt-2\">\n <ScreenshotButton\n screenshot={screenshot}\n onScreenshotTook={setScreenshot}\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 focus:ring-offset-zinc-900 focus:ring-brand-500\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\n disabled:hover:bg-brand-500\"\n >\n {isSendingFeedback? <Loading/> : \"Send feedback\"}\n </button>\n </footer>\n </form>\n </>\n )\n}\n\n","'use client'\n\nimport { CloseButton } from '../../CloseButton';\n\ninterface FeedbackSuccessStepProps {\n onFeedbackRestartRequest: () => void;\n}\n\nexport function FeedbackSuccessStep({ onFeedbackRestartRequest }: FeedbackSuccessStepProps) {\n return (\n <>\n <header>\n <CloseButton />\n </header>\n\n <div className=\"flex flex-col items-center py-10 w-[304px]\">\n <svg width=\"41\" height=\"40\" viewBox=\"0 0 41 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\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-xl mt-2\">We appreciate the feedback</span>\n\n <button \n type=\"button\"\n onClick={onFeedbackRestartRequest}\n className=\"py-2 px-6 mt-6 bg-zinc-800 rounded-md border-transparent text-sm leading-6 hover:bg-zinc-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500 transition-colors\"\n >\n I want to send another\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 } from '../../types';\n\nexport const feedbackTypes = {\n BUG: {\n title: 'Bug',\n image: {\n source: bugImageUrl,\n alt: 'A purple caterpillar image',\n },\n },\n IDEA: {\n title: 'Idea',\n image: {\n source: ideaImageUrl,\n alt: 'A Lamp image',\n },\n },\n OTHER: {\n title: 'Other',\n image: {\n source: thoughtImageUrl,\n alt: 'A thought balloon image',\n },\n },\n}\n\nexport type { FeedbackType };\n\ninterface WidgetFormProps {\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function WidgetForm({ integration, githubConfig }: WidgetFormProps) {\n const [feedbackType, setFeedbackType] = useState<FeedbackType | null>(null)\n const [feedbackSent, setFeedbackSent] = useState(false)\n \n function handleRestartFeedback() {\n setFeedbackSent(false); \n setFeedbackType(null);\n }\n \n return (\n <div className=\"bg-zinc-900 p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto\">\n {feedbackSent ? (\n <FeedbackSuccessStep onFeedbackRestartRequest={handleRestartFeedback} />\n ) : (\n <>\n {!feedbackType ? (\n <FeedbackTypeStep onFeedbackTypeChanged={setFeedbackType} />\n ) : (\n <FeedbackContentStep\n feedbackType={feedbackType}\n onFeedbackRestartRequest={handleRestartFeedback}\n onFeedbackSent={() => setFeedbackSent(true)}\n integration={integration}\n githubConfig={githubConfig}\n />\n )}\n </>\n )}\n <footer className=\"text-xs text-neutral-400\">\n Built with 💜 by{' '}\n <a\n className=\"underline underline-offset-2\"\n href=\"https://github.com/klaas-sysop\"\n >\n Klaas Sysop\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';\n\nexport function Widget({ \n integration, \n githubConfig,\n position = 'bottom-right'\n}: WidgetProps) {\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 return (\n <Popover className={`absolute ${positionClasses[position]} flex flex-col items-end`}>\n <Popover.Panel>\n <WidgetForm \n integration={integration}\n githubConfig={githubConfig}\n />\n </Popover.Panel>\n <Popover.Button className=\"bg-brand-500 rounded-full px-3 h-12 text-white flex items-center group\">\n <ChatTeardropDots className=\"w-6 h-6\" />\n <span className=\"max-w-0 overflow-hidden group-hover:max-w-xs transition-all duration-500 ease-linear\">\n <span className=\"pl-2\"></span>\n Feedback\n </span>\n </Popover.Button>\n </Popover>\n )\n}\n\n"]}
1
+ {"version":3,"sources":["../src/lib/svg-assets.ts","../src/components/CloseButton.tsx","../src/components/WidgetForm/Steps/FeedbackTypeStep.tsx","../src/components/Loading.tsx","../src/components/ScreenshotButton.tsx","../src/lib/integrations/github.ts","../src/components/WidgetForm/Steps/FeedbackContentStep.tsx","../src/components/WidgetForm/Steps/FeedbackSuccessStep.tsx","../src/components/WidgetForm/index.tsx","../src/components/Widget.tsx"],"names":["jsx","Popover","X","jsxs","Fragment","CircleNotch","useState","html2canvas","Trash","Camera","ArrowLeft","ChatTeardropDots"],"mappings":"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","file":"index.js","sourcesContent":["// SVG files as data URLs (base64 encoded)\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","'use client'\n\nimport { Popover } from \"@headlessui/react\";\nimport { X } from \"phosphor-react\";\n\nexport function CloseButton() {\n return (\n <Popover.Button className=\"top-5 right-5 absolute text-zinc-400 hover:text-zinc-100\" title=\"Close feedback form\">\n <X weight=\"bold\" className=\"w-4 h-4\"/>\n </Popover.Button>\n )\n}\n\n","'use client'\n\nimport { FeedbackType, feedbackTypes } from \"..\";\nimport { CloseButton } from \"../../CloseButton\";\n\ninterface FeedbackTypeStepProps {\n onFeedbackTypeChanged: (type: FeedbackType) => void;\n}\n\nexport function FeedbackTypeStep({ onFeedbackTypeChanged }: FeedbackTypeStepProps) {\n return (\n <>\n <header>\n <span className=\"text-xl leading-6\">Please give us your feedback!</span>\n <CloseButton />\n </header>\n <div className=\"flex py-8 gap-2 w-full\">\n {\n Object.entries(feedbackTypes).map(([key, value]) => {\n return (\n <button\n key={key}\n className=\"bg-zinc-800 rounded py-5 w-24 flex1 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none\"\n type=\"button\"\n onClick={() => onFeedbackTypeChanged(key as FeedbackType)}\n >\n <img src={value.image.source} alt={value.image.alt}></img>\n <span>{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 html2canvas from 'html2canvas';\nimport { Camera, Trash } from 'phosphor-react';\nimport { useState } from 'react';\nimport { Loading } from './Loading';\n\ninterface ScreenshotButtonProps {\n screenshot: string | null;\n onScreenshotTook: (screenshot: string | null) => void;\n}\n\nexport function ScreenshotButton({\n screenshot,\n onScreenshotTook,\n}: ScreenshotButtonProps) {\n const [isTakenScreenshot, setIsTakenScreenShot] = useState(false)\n \n async function handleTakeScreenshot() {\n setIsTakenScreenShot(true);\n const canvas = await html2canvas(document.querySelector('html')!);\n const base64image = canvas.toDataURL('image/png');\n onScreenshotTook(base64image);\n setIsTakenScreenShot(false);\n }\n \n if (screenshot) {\n return (\n <button\n type=\"button\"\n className=\"p-1 w-10 h-10 rounded-md border-transparent flex \n justify-end items-end text-zinc-400 hover:text-zinc-100 transition-colors\"\n onClick={() => onScreenshotTook(null)}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'right bottom',\n backgroundSize: 180,\n }}\n >\n <Trash weight=\"fill\" />\n </button>\n )\n }\n \n return (\n <button\n type=\"button\"\n className=\"p-2 bg-zinc-800 rounded-md border-transparent hover:bg-zinc-700\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500\"\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className=\"w-6 h-6\" />}\n </button>\n )\n}\n\n","import { FeedbackType, GitHubConfig } from '../../types';\n\ninterface FeedbackData {\n type: FeedbackType;\n comment: string;\n screenshot: string | null;\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 } = 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 // 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:', screenshotPath || '.feedback-vos');\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 // 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 } from 'react';\nimport { FeedbackType, feedbackTypes } from '..';\nimport { CloseButton } from '../../CloseButton';\nimport {Loading} from '../../Loading';\nimport { ScreenshotButton } from '../../ScreenshotButton';\nimport { sendToGitHub } from '../../../lib/integrations/github';\nimport { GitHubConfig } from '../../../types';\n\ninterface FeedbackContentStepProps {\n feedbackType: FeedbackType;\n onFeedbackRestartRequest: () => void;\n onFeedbackSent: () => void;\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function FeedbackContentStep({\n feedbackType,\n onFeedbackRestartRequest,\n onFeedbackSent,\n integration,\n githubConfig,\n}: FeedbackContentStepProps) {\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const feedbackTypeData = feedbackTypes[feedbackType];\n const [comment, setComment] = useState('');\n const[isSendingFeedback, setIsSendingFeedback] = useState(false);\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 };\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('Failed to send feedback. Please try again.');\n }\n }\n \n return (\n <>\n <header>\n <button\n type=\"button\"\n className=\"absolute top-5 left-5 text-zinc-400 hover:text-zinc-100\"\n onClick={onFeedbackRestartRequest}\n >\n <ArrowLeft weight=\"bold\" className=\"w-4 h-4\" />\n </button>\n\n <span className=\"text-xl leading-6 flex items-center gap-2 mt-2\">\n <img\n src={feedbackTypeData.image.source}\n alt={feedbackTypeData.image.alt}\n className=\"w-6 h-6\"\n />\n {feedbackTypeData.title}\n </span>\n <CloseButton />\n </header>\n <form onSubmit={handleSubmitFeedback} className=\"my-4 w-full\">\n <textarea\n className=\"min-w-[384px] w-full min-h-[112px] text-sm \n placeholder-zinc-400 text-zinc-100 border-zinc-600 bg-transparent rounded-md \n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\n scrollbar-thumb-zinc-700 scrollbar-track-transparent scrollbar-thin\"\n placeholder=\"Tell in detail what is happening\"\n onChange={(e) => setComment(e.target.value)}\n />\n <footer className=\" flex gap-2 mt-2\">\n <ScreenshotButton\n screenshot={screenshot}\n onScreenshotTook={setScreenshot}\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 focus:ring-offset-zinc-900 focus:ring-brand-500\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\n disabled:hover:bg-brand-500\"\n >\n {isSendingFeedback? <Loading/> : \"Send feedback\"}\n </button>\n </footer>\n </form>\n </>\n )\n}\n\n","'use client'\n\nimport { CloseButton } from '../../CloseButton';\n\ninterface FeedbackSuccessStepProps {\n onFeedbackRestartRequest: () => void;\n}\n\nexport function FeedbackSuccessStep({ onFeedbackRestartRequest }: FeedbackSuccessStepProps) {\n return (\n <>\n <header>\n <CloseButton />\n </header>\n\n <div className=\"flex flex-col items-center py-10 w-[304px]\">\n <svg width=\"41\" height=\"40\" viewBox=\"0 0 41 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\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-xl mt-2\">We appreciate the feedback</span>\n\n <button \n type=\"button\"\n onClick={onFeedbackRestartRequest}\n className=\"py-2 px-6 mt-6 bg-zinc-800 rounded-md border-transparent text-sm leading-6 hover:bg-zinc-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500 transition-colors\"\n >\n I want to send another\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 } from '../../types';\n\nexport const feedbackTypes = {\n BUG: {\n title: 'Bug',\n image: {\n source: bugImageUrl,\n alt: 'A purple caterpillar image',\n },\n },\n IDEA: {\n title: 'Idea',\n image: {\n source: ideaImageUrl,\n alt: 'A Lamp image',\n },\n },\n OTHER: {\n title: 'Other',\n image: {\n source: thoughtImageUrl,\n alt: 'A thought balloon image',\n },\n },\n}\n\nexport type { FeedbackType };\n\ninterface WidgetFormProps {\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function WidgetForm({ integration, githubConfig }: WidgetFormProps) {\n const [feedbackType, setFeedbackType] = useState<FeedbackType | null>(null)\n const [feedbackSent, setFeedbackSent] = useState(false)\n \n function handleRestartFeedback() {\n setFeedbackSent(false); \n setFeedbackType(null);\n }\n \n return (\n <div className=\"bg-zinc-900 p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto\">\n {feedbackSent ? (\n <FeedbackSuccessStep onFeedbackRestartRequest={handleRestartFeedback} />\n ) : (\n <>\n {!feedbackType ? (\n <FeedbackTypeStep onFeedbackTypeChanged={setFeedbackType} />\n ) : (\n <FeedbackContentStep\n feedbackType={feedbackType}\n onFeedbackRestartRequest={handleRestartFeedback}\n onFeedbackSent={() => setFeedbackSent(true)}\n integration={integration}\n githubConfig={githubConfig}\n />\n )}\n </>\n )}\n <footer className=\"text-xs text-neutral-400\">\n Built with 💜 by{' '}\n <a\n className=\"underline underline-offset-2\"\n href=\"https://github.com/klaas-sysop\"\n >\n Klaas Sysop\n </a>\n {' '}|{' '}\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';\n\nexport function Widget({ \n integration, \n githubConfig,\n position = 'bottom-right'\n}: WidgetProps) {\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 return (\n <Popover className={`absolute ${positionClasses[position]} flex flex-col items-end`}>\n <Popover.Panel>\n <WidgetForm \n integration={integration}\n githubConfig={githubConfig}\n />\n </Popover.Panel>\n <Popover.Button className=\"bg-brand-500 rounded-full px-3 h-12 text-white flex items-center group\">\n <ChatTeardropDots className=\"w-6 h-6\" />\n <span className=\"max-w-0 overflow-hidden group-hover:max-w-xs transition-all duration-500 ease-linear\">\n <span className=\"pl-2\"></span>\n Feedback\n </span>\n </Popover.Button>\n </Popover>\n )\n}\n\n"]}
package/dist/index.mjs CHANGED
@@ -608,6 +608,19 @@ function WidgetForm({ integration, githubConfig }) {
608
608
  href: "https://github.com/klaas-sysop",
609
609
  children: "Klaas Sysop"
610
610
  }
611
+ ),
612
+ " ",
613
+ "|",
614
+ " ",
615
+ /* @__PURE__ */ jsx(
616
+ "a",
617
+ {
618
+ className: "underline underline-offset-2",
619
+ href: "https://vossendesign.nl",
620
+ target: "_blank",
621
+ rel: "noopener noreferrer",
622
+ children: "Vossen Design"
623
+ }
611
624
  )
612
625
  ] })
613
626
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/svg-assets.ts","../src/components/CloseButton.tsx","../src/components/WidgetForm/Steps/FeedbackTypeStep.tsx","../src/components/Loading.tsx","../src/components/ScreenshotButton.tsx","../src/lib/integrations/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","useState","jsxs","Fragment","Popover"],"mappings":"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","file":"index.mjs","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","'use client'\n\nimport { Popover } from \"@headlessui/react\";\nimport { X } from \"phosphor-react\";\n\nexport function CloseButton() {\n return (\n <Popover.Button className=\"top-5 right-5 absolute text-zinc-400 hover:text-zinc-100\" title=\"Close feedback form\">\n <X weight=\"bold\" className=\"w-4 h-4\"/>\n </Popover.Button>\n )\n}\n\n","'use client'\n\nimport { FeedbackType, feedbackTypes } from \"..\";\nimport { CloseButton } from \"../../CloseButton\";\n\ninterface FeedbackTypeStepProps {\n onFeedbackTypeChanged: (type: FeedbackType) => void;\n}\n\nexport function FeedbackTypeStep({ onFeedbackTypeChanged }: FeedbackTypeStepProps) {\n return (\n <>\n <header>\n <span className=\"text-xl leading-6\">Please give us your feedback!</span>\n <CloseButton />\n </header>\n <div className=\"flex py-8 gap-2 w-full\">\n {\n Object.entries(feedbackTypes).map(([key, value]) => {\n return (\n <button\n key={key}\n className=\"bg-zinc-800 rounded py-5 w-24 flex1 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none\"\n type=\"button\"\n onClick={() => onFeedbackTypeChanged(key as FeedbackType)}\n >\n <img src={value.image.source} alt={value.image.alt}></img>\n <span>{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 html2canvas from 'html2canvas';\nimport { Camera, Trash } from 'phosphor-react';\nimport { useState } from 'react';\nimport { Loading } from './Loading';\n\ninterface ScreenshotButtonProps {\n screenshot: string | null;\n onScreenshotTook: (screenshot: string | null) => void;\n}\n\nexport function ScreenshotButton({\n screenshot,\n onScreenshotTook,\n}: ScreenshotButtonProps) {\n const [isTakenScreenshot, setIsTakenScreenShot] = useState(false)\n \n async function handleTakeScreenshot() {\n setIsTakenScreenShot(true);\n const canvas = await html2canvas(document.querySelector('html')!);\n const base64image = canvas.toDataURL('image/png');\n onScreenshotTook(base64image);\n setIsTakenScreenShot(false);\n }\n \n if (screenshot) {\n return (\n <button\n type=\"button\"\n className=\"p-1 w-10 h-10 rounded-md border-transparent flex \n justify-end items-end text-zinc-400 hover:text-zinc-100 transition-colors\"\n onClick={() => onScreenshotTook(null)}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'right bottom',\n backgroundSize: 180,\n }}\n >\n <Trash weight=\"fill\" />\n </button>\n )\n }\n \n return (\n <button\n type=\"button\"\n className=\"p-2 bg-zinc-800 rounded-md border-transparent hover:bg-zinc-700\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500\"\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className=\"w-6 h-6\" />}\n </button>\n )\n}\n\n","import { FeedbackType, GitHubConfig } from '../../types';\n\ninterface FeedbackData {\n type: FeedbackType;\n comment: string;\n screenshot: string | null;\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 } = 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 // 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:', screenshotPath || '.feedback-vos');\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 // 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 } from 'react';\nimport { FeedbackType, feedbackTypes } from '..';\nimport { CloseButton } from '../../CloseButton';\nimport {Loading} from '../../Loading';\nimport { ScreenshotButton } from '../../ScreenshotButton';\nimport { sendToGitHub } from '../../../lib/integrations/github';\nimport { GitHubConfig } from '../../../types';\n\ninterface FeedbackContentStepProps {\n feedbackType: FeedbackType;\n onFeedbackRestartRequest: () => void;\n onFeedbackSent: () => void;\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function FeedbackContentStep({\n feedbackType,\n onFeedbackRestartRequest,\n onFeedbackSent,\n integration,\n githubConfig,\n}: FeedbackContentStepProps) {\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const feedbackTypeData = feedbackTypes[feedbackType];\n const [comment, setComment] = useState('');\n const[isSendingFeedback, setIsSendingFeedback] = useState(false);\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 };\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('Failed to send feedback. Please try again.');\n }\n }\n \n return (\n <>\n <header>\n <button\n type=\"button\"\n className=\"absolute top-5 left-5 text-zinc-400 hover:text-zinc-100\"\n onClick={onFeedbackRestartRequest}\n >\n <ArrowLeft weight=\"bold\" className=\"w-4 h-4\" />\n </button>\n\n <span className=\"text-xl leading-6 flex items-center gap-2 mt-2\">\n <img\n src={feedbackTypeData.image.source}\n alt={feedbackTypeData.image.alt}\n className=\"w-6 h-6\"\n />\n {feedbackTypeData.title}\n </span>\n <CloseButton />\n </header>\n <form onSubmit={handleSubmitFeedback} className=\"my-4 w-full\">\n <textarea\n className=\"min-w-[384px] w-full min-h-[112px] text-sm \n placeholder-zinc-400 text-zinc-100 border-zinc-600 bg-transparent rounded-md \n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\n scrollbar-thumb-zinc-700 scrollbar-track-transparent scrollbar-thin\"\n placeholder=\"Tell in detail what is happening\"\n onChange={(e) => setComment(e.target.value)}\n />\n <footer className=\" flex gap-2 mt-2\">\n <ScreenshotButton\n screenshot={screenshot}\n onScreenshotTook={setScreenshot}\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 focus:ring-offset-zinc-900 focus:ring-brand-500\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\n disabled:hover:bg-brand-500\"\n >\n {isSendingFeedback? <Loading/> : \"Send feedback\"}\n </button>\n </footer>\n </form>\n </>\n )\n}\n\n","'use client'\n\nimport { CloseButton } from '../../CloseButton';\n\ninterface FeedbackSuccessStepProps {\n onFeedbackRestartRequest: () => void;\n}\n\nexport function FeedbackSuccessStep({ onFeedbackRestartRequest }: FeedbackSuccessStepProps) {\n return (\n <>\n <header>\n <CloseButton />\n </header>\n\n <div className=\"flex flex-col items-center py-10 w-[304px]\">\n <svg width=\"41\" height=\"40\" viewBox=\"0 0 41 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\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-xl mt-2\">We appreciate the feedback</span>\n\n <button \n type=\"button\"\n onClick={onFeedbackRestartRequest}\n className=\"py-2 px-6 mt-6 bg-zinc-800 rounded-md border-transparent text-sm leading-6 hover:bg-zinc-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500 transition-colors\"\n >\n I want to send another\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 } from '../../types';\n\nexport const feedbackTypes = {\n BUG: {\n title: 'Bug',\n image: {\n source: bugImageUrl,\n alt: 'A purple caterpillar image',\n },\n },\n IDEA: {\n title: 'Idea',\n image: {\n source: ideaImageUrl,\n alt: 'A Lamp image',\n },\n },\n OTHER: {\n title: 'Other',\n image: {\n source: thoughtImageUrl,\n alt: 'A thought balloon image',\n },\n },\n}\n\nexport type { FeedbackType };\n\ninterface WidgetFormProps {\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function WidgetForm({ integration, githubConfig }: WidgetFormProps) {\n const [feedbackType, setFeedbackType] = useState<FeedbackType | null>(null)\n const [feedbackSent, setFeedbackSent] = useState(false)\n \n function handleRestartFeedback() {\n setFeedbackSent(false); \n setFeedbackType(null);\n }\n \n return (\n <div className=\"bg-zinc-900 p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto\">\n {feedbackSent ? (\n <FeedbackSuccessStep onFeedbackRestartRequest={handleRestartFeedback} />\n ) : (\n <>\n {!feedbackType ? (\n <FeedbackTypeStep onFeedbackTypeChanged={setFeedbackType} />\n ) : (\n <FeedbackContentStep\n feedbackType={feedbackType}\n onFeedbackRestartRequest={handleRestartFeedback}\n onFeedbackSent={() => setFeedbackSent(true)}\n integration={integration}\n githubConfig={githubConfig}\n />\n )}\n </>\n )}\n <footer className=\"text-xs text-neutral-400\">\n Built with 💜 by{' '}\n <a\n className=\"underline underline-offset-2\"\n href=\"https://github.com/klaas-sysop\"\n >\n Klaas Sysop\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';\n\nexport function Widget({ \n integration, \n githubConfig,\n position = 'bottom-right'\n}: WidgetProps) {\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 return (\n <Popover className={`absolute ${positionClasses[position]} flex flex-col items-end`}>\n <Popover.Panel>\n <WidgetForm \n integration={integration}\n githubConfig={githubConfig}\n />\n </Popover.Panel>\n <Popover.Button className=\"bg-brand-500 rounded-full px-3 h-12 text-white flex items-center group\">\n <ChatTeardropDots className=\"w-6 h-6\" />\n <span className=\"max-w-0 overflow-hidden group-hover:max-w-xs transition-all duration-500 ease-linear\">\n <span className=\"pl-2\"></span>\n Feedback\n </span>\n </Popover.Button>\n </Popover>\n )\n}\n\n"]}
1
+ {"version":3,"sources":["../src/lib/svg-assets.ts","../src/components/CloseButton.tsx","../src/components/WidgetForm/Steps/FeedbackTypeStep.tsx","../src/components/Loading.tsx","../src/components/ScreenshotButton.tsx","../src/lib/integrations/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","useState","jsxs","Fragment","Popover"],"mappings":";;;;;;;AACO,IAAM,WAAA,GAAc,ojLAAA;AAEpB,IAAM,YAAA,GAAe,whEAAA;AAErB,IAAM,eAAA,GAAkB,4rCAAA;ACAxB,SAAS,WAAA,GAAc;AAC1B,EAAA,uBACI,GAAA,CAAC,OAAA,CAAQ,MAAA,EAAR,EAAe,WAAU,0DAAA,EAA2D,KAAA,EAAM,qBAAA,EACvF,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,WAAS,CAAA,EACxC,CAAA;AAER;ACFO,SAAS,gBAAA,CAAiB,EAAE,qBAAA,EAAsB,EAA0B;AAC/E,EAAA,uBACI,IAAA,CAAA,QAAA,EAAA,EACI,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,+BAAA,EAA6B,CAAA;AAAA,sBACjEA,IAAC,WAAA,EAAA,EAAY;AAAA,KAAA,EACjB,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAEP,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,MAAA,uBACI,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEG,SAAA,EAAU,mKAAA;AAAA,UACV,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,qBAAA,CAAsB,GAAmB,CAAA;AAAA,UAExD,QAAA,EAAA;AAAA,4BAAAA,GAAAA,CAAC,SAAI,GAAA,EAAK,KAAA,CAAM,MAAM,MAAA,EAAQ,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,CAAA;AAAA,4BACpDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM;AAAA;AAAA,SAAA;AAAA,QANd;AAAA,OAOT;AAAA,IAER,CAAC,CAAA,EAET;AAAA,GAAA,EACJ,CAAA;AAER;AC/BO,SAAS,OAAA,GAAU;AACxB,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,CAAA,EAC9D,CAAA;AAEJ;ACEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,UAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhE,EAAA,eAAe,oBAAA,GAAuB;AACpC,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,MAAM,SAAS,MAAM,WAAA,CAAY,QAAA,CAAS,aAAA,CAAc,MAAM,CAAE,CAAA;AAChE,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA;AAChD,IAAA,gBAAA,CAAiB,WAAW,CAAA;AAC5B,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,8IAAA;AAAA,QAEV,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QACpC,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB,OAAO,UAAU,CAAA,CAAA,CAAA;AAAA,UAClC,kBAAA,EAAoB,cAAA;AAAA,UACpB,cAAA,EAAgB;AAAA,SAClB;AAAA,QAEA,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,MAAA,EAAO,MAAA,EAAO;AAAA;AAAA,KACvB;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,4MAAA;AAAA,MAGV,OAAA,EAAS,oBAAA;AAAA,MAER,QAAA,EAAA,iBAAA,mBAAoBA,GAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA,mBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAO,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,GAC/E;AAEJ;;;AC3CA,eAAe,sBAAA,CACb,KAAA,EACA,KAAA,EACA,IAAA,EACA,YACA,cAAA,EACiB;AAEjB,EAAA,MAAM,oBAAA,GAAuB,MAAM,kBAAA,CAAmB,UAAA,EAAY,MAAM,GAAG,CAAA;AAG3E,EAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,UAAU,GAAG,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,CAAC,CAAC,CAAA;AAGzE,EAAA,MAAM,eAAe,MAAM,KAAA;AAAA,IACzB,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,IAC7C;AAAA,MACE,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,UAAU,KAAK,CAAA,CAAA;AAAA,QAChC,QAAA,EAAU,gCAAA;AAAA,QACV,YAAA,EAAc;AAAA;AAChB;AACF,GACF;AAEA,EAAA,IAAI,aAAA,GAAgB,MAAA;AACpB,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,IAAA,EAAK;AACzC,IAAA,aAAA,GAAgB,SAAS,cAAA,IAAkB,MAAA;AAAA,EAC7C;AAGA,EAAA,MAAM,aAAa,cAAA,IAAkB,eAAA;AAGrC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,IAAA,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAGtC,EAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,GAAG,UAAU,CAAC,CAAA;AAI7D,EAAA,MAAM,iBAAiB,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,IAAI,aAAa,UAAU,CAAA,CAAA;AAE3F,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,cAAA,EAAgB;AAAA,MAC9C,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,UAAU,KAAK,CAAA,CAAA;AAAA,QAChC,QAAA,EAAU,gCAAA;AAAA,QACV,YAAA,EAAc;AAAA;AAChB,KACD,CAAA;AAGD,IAAA,IAAI,WAAA,CAAY,WAAW,GAAA,EAAK;AAC9B,MAAA,MAAM,aAAA,GAAgB,KAAK,kFAAkF,CAAA;AAC7G,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,KAAA,CAAM,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,EAAa,UAAU,CAAA,UAAA,CAAA,EAAc;AAAA,UACzH,MAAA,EAAQ,KAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,eAAA,EAAiB,UAAU,KAAK,CAAA,CAAA;AAAA,YAChC,QAAA,EAAU,gCAAA;AAAA,YACV,cAAA,EAAgB,kBAAA;AAAA,YAChB,YAAA,EAAc;AAAA,WAChB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,OAAA,EAAS,oCAAA;AAAA,YACT,OAAA,EAAS,aAAA;AAAA,YACT,MAAA,EAAQ;AAAA,WACT;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,qBAAqB,EAAA,EAAI;AAC5B,UAAA,MAAM,WAAA,GAAc,MAAM,oBAAA,CAAqB,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACtE,UAAA,OAAA,CAAQ,IAAA,CAAK,2DAA2D,WAAW,CAAA;AAAA,QACrF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,UAAU,CAAA,qBAAA,CAAuB,CAAA;AAAA,QACzD;AAAA,MACF,SAAS,iBAAA,EAAmB;AAE1B,QAAA,OAAA,CAAQ,IAAA,CAAK,oDAAoD,iBAAiB,CAAA;AAAA,MACpF;AAAA,IACF,CAAA,MAAA,IAAW,WAAA,CAAY,MAAA,KAAW,GAAA,EAAK;AAErC,MAAA,MAAM,aAAa,MAAM,WAAA,CAAY,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC5D,MAAA,IAAI,UAAA,IAAc,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAE5C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,UAAU,CAAA,iFAAA,CAAmF,CAAA;AAAA,MACxH;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,UAAU,CAAA,eAAA,CAAiB,CAAA;AAAA,IACnD;AAAA,EACF,SAAS,WAAA,EAAa;AAEpB,IAAA,IAAI,uBAAuB,KAAA,IAAS,WAAA,CAAY,OAAA,CAAQ,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACpF,MAAA,MAAM,WAAA;AAAA,IACR;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,WAAW,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,YAAY,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,IAAI,aAAa,IAAI,CAAA,CAAA;AAEhF,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,IACtC,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,eAAA,EAAiB,UAAU,KAAK,CAAA,CAAA;AAAA,MAChC,QAAA,EAAU,gCAAA;AAAA,MACV,cAAA,EAAgB,kBAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,OAAA,EAAS,4BAA4B,QAAQ,CAAA,CAAA;AAAA,MAC7C,OAAA,EAAS,aAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACT;AAAA,GACF,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,IAAA,MAAM,YAAA,GAAe,UAAU,OAAA,IAAW,eAAA;AAG1C,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,MAAM,CAAA,2DAAA,CAA6D,CAAA;AAAA,IAC/E,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK;AAClC,MAAA,MAAM,IAAI,MAAM,CAAA,2EAAA,CAA6E,CAAA;AAAA,IAC/F,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,YAAY,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,SAAS,MAAM,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAAA,EACrF;AAEA,EAAmB,MAAM,QAAA,CAAS,IAAA;AAKlC,EAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,MAAA,EAAS,aAAa,IAAI,IAAI,CAAA,SAAA,CAAA;AAEhF,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,MAAM,CAAA,CAAE,CAAA;AAG5D,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,kBAAA,CAAmB,OAAA,EAAiB,QAAA,GAAmB,IAAA,EAAM,UAAkB,GAAA,EAAsB;AAC5G,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAEtC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,aAAa,WAAA,EAAa;AACpE,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,2DAA2D,CAAC,CAAA;AAC7E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,SAAS,MAAM;AACjB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,IAAI,QAAQ,GAAA,CAAI,KAAA;AAChB,MAAA,IAAI,SAAS,GAAA,CAAI,MAAA;AAGjB,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAA,GAAU,SAAS,QAAA,GAAY,KAAA;AAC/B,QAAA,KAAA,GAAQ,QAAA;AAAA,MACV;AAEA,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,MAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAEhB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,8BAA8B,CAAC,CAAA;AAChD,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AAGtC,MAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,SAAA,CAAU,YAAA,EAAc,OAAO,CAAA;AAChE,MAAA,OAAA,CAAQ,iBAAiB,CAAA;AAAA,IAC3B,CAAA;AACA,IAAA,GAAA,CAAI,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAC5D,IAAA,GAAA,CAAI,GAAA,GAAM,OAAA;AAAA,EACZ,CAAC,CAAA;AACH;AAKA,eAAe,sBAAA,CACb,KAAA,EACA,KAAA,EACA,IAAA,EACkE;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA;AAAA,MACrB,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC7C;AAAA,QACE,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,UAAU,KAAK,CAAA,CAAA;AAAA,UAChC,QAAA,EAAU,gCAAA;AAAA,UACV,YAAA,EAAc;AAAA;AAChB;AACF,KACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,OAAO,sBAAA,EAAuB;AAAA,IAC1E;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,SAAA,CAAU,OAAA,IAAW,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,OACrD;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,SAAS,UAAA,KAAe;AAAA;AAAA,KACrC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,SAAA,EAAW,KAAA;AAAA,MACX,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAEA,eAAsB,YAAA,CACpB,QACA,IAAA,EACe;AACf,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,gBAAe,GAAI,MAAA;AAC/C,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAW,GAAI,IAAA;AAGtC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM;AAC7B,IAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAAA,EAC9F;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,sBAAA,CAAuB,KAAA,EAAO,OAAO,IAAI,CAAA;AACpE,EAAA,IAAI,CAAC,aAAa,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,OAAA,EAClB,YAAA,CAAa,SAAS,eAAe;;AAAA;AAAA,0CAAA,EAEF,KAAK,IAAI,IAAI;AAAA;AAAA,0EAAA;AAAA,KAG5D;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA;;AAAA,wFAAA;AAAA,KAEtD;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAI,CAAA,UAAA,CAAA;AAQtB,EAAA,MAAM,mBAAA,GAAsB,KAAA;AAC5B,EAAA,MAAM,gBAAA,GAAmB,EAAA;AACzB,EAAA,MAAM,qBAAA,GAAwB,GAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,EAAA,MAAM,kBAAA,GAAqB,mBAAA,GAAsB,gBAAA,GAAmB,qBAAA,GAAwB,aAAA;AAE5F,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAA,GAAS,kBAAA,GACpC,QAAQ,SAAA,CAAU,CAAA,EAAG,kBAAkB,CAAA,GAAI,6BAAA,GAC3C,OAAA;AAGJ,EAAA,IAAI,IAAA,GAAO,aAAa,IAAI;;AAAA;AAAA,EAAqB,cAAc,CAAA,CAAA;AAI/D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,cAAA,IAAkB,eAAe,CAAA;AACjE,MAAA,MAAM,gBAAgB,MAAM,sBAAA,CAAuB,OAAO,KAAA,EAAO,IAAA,EAAM,YAAY,cAAc,CAAA;AACjG,MAAA,OAAA,CAAQ,GAAA,CAAI,0CAA0C,aAAa,CAAA;AAEnE,MAAA,IAAA,IAAQ;;AAAA;AAAA,cAAA,EAAsC,aAAa,CAAA,CAAA,CAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI,0CAAA,EAA4C,IAAA,CAAK,MAAM,CAAA;AAAA,IACrE,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,KAAK,CAAA;AAGjE,MAAA,IAAA,IAAQ;;AAAA,wDAAA,CAAA;AACR,MAAA,OAAA,CAAQ,GAAA,CAAI,mCAAA,EAAqC,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9D;AAAA,EACF;AAIA,EAAA,MAAM,eAAA,GAAkB,IAAA;AAGxB,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,IAAA,CAAK,MAAM,CAAA,WAAA,CAAa,CAAA;AAG7E,EAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAA,CAAK,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAG/D,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,GAAS,eAAA;AAG7B,IAAA,MAAM,kBAAA,GAAqB,oBAAA;AAC3B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,kBAAkB,CAAA;AACpD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,qBAAqB,CAAA;AAE1D,IAAA,IAAI,eAAe,CAAA,EAAG;AAEpB,MAAA,MAAM,eAAA,GAAkB,eAAe,kBAAA,CAAmB,MAAA;AAC1D,MAAA,MAAM,aAAA,GAAgB,eAAA,GAAkB,CAAA,GAAI,eAAA,GAAkB,IAAA,CAAK,MAAA;AACnE,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,aAAa,CAAA;AAGpE,MAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,CAAI,KAAK,cAAA,CAAe,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3E,MAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,SAAA,CAAU,CAAA,EAAG,gBAAgB,CAAA,GAAI,uCAAA;AAGzE,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,eAAe,CAAA;AACvD,MAAA,MAAM,eAAe,eAAA,GAAkB,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,eAAe,CAAA,GAAI,EAAA;AAC7E,MAAA,IAAA,GAAO,gBAAgB,gBAAA,GAAmB,YAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,UAAU,mBAAA,EAAqB;AACtC,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAA,CAAK,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAElG,IAAA,MAAM,QAAA,GAAW,aAAa,IAAI;;AAAA;AAAA,CAAA;AAClC,IAAA,MAAM,gBAAA,GAAmB,mBAAA,GAAsB,QAAA,CAAS,MAAA,GAAS,GAAA;AAGjE,IAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,CAAU,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,gBAAgB,CAAC,CAAA,GAAI,uCAAA;AAC5E,IAAA,IAAA,GAAO,QAAA,GAAW,WAAA;AAGlB,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,qBAAqB,CAAA;AAC1D,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,MAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,eAAe,CAAA,GAAI,qDAAA;AAAA,IAC9C;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,UAAU,mBAAA,EAAqB;AAEtC,IAAA,MAAM,WAAA,GAAc,aAAa,IAAI;;AAAA;AAAA,CAAA;AACrC,IAAA,MAAM,cAAA,GAAiB,mBAAA,GAAsB,WAAA,CAAY,MAAA,GAAS,GAAA;AAClE,IAAA,MAAM,cAAA,GAAiB,QAAQ,SAAA,CAAU,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,cAAc,CAAC,CAAA,GAAI,qBAAA;AAC5E,IAAA,IAAA,GAAO,WAAA,GAAc,cAAA;AAAA,EACvB;AAEA,EAAA,OAAA,CAAQ,IAAI,CAAA,yBAAA,EAA4B,IAAA,CAAK,MAAM,CAAA,oBAAA,EAAuB,mBAAmB,CAAA,CAAA,CAAG,CAAA;AAGhG,EAAA,IAAI,IAAA,CAAK,UAAU,mBAAA,EAAqB;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,KAAK,MAAM,CAAA,qCAAA,EAAwC,mBAAmB,CAAA,CAAA,CAAG,CAAA;AAAA,EACtI;AAEA,EAAA,MAAM,GAAA,GAAM,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,OAAA,CAAA;AAEzD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,UAAU,KAAK,CAAA,CAAA;AAAA,QAChC,QAAA,EAAU,gCAAA;AAAA,QACV,cAAA,EAAgB,kBAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,KAAA;AAAA,QACA,IAAA;AAAA;AAAA;AAAA,QAGA,MAAA,EAAQ,CAAC,UAAA,EAAY,IAAA,CAAK,aAAa;AAAA,OACxC;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,YAAA,GAAe,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAM,CAAA,GAAA,CAAA;AAEvD,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,YAAA,IAAgB,SAAA,CAAU,OAAA,IAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAG7D,QAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,UAAA,YAAA,IAAgB;;AAAA,kBAAA,EAAyB,GAAG,CAAA,CAAA;AAC5C,UAAA,YAAA,IAAgB;;AAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,CAAA;AAC9C,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,gDAAA,EAAmD,KAAK,CAAA,CAAA,EAAI,IAAI;AAAA,CAAA;AAChF,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB;AAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,CAAA;AAC5D,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,8FAAA,EAAiG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,QAChI,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK;AAClC,UAAA,YAAA,IAAgB;;AAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,4DAAA,CAAA;AAAA,QAClB,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK;AAClC,UAAA,YAAA,IAAgB;;AAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,2DAAA,CAAA;AAAA,QAClB,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK;AAClC,UAAA,YAAA,IAAgB;;AAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,wEAAA,CAAA;AAAA,QAClB;AAAA,MACF,SAAS,UAAA,EAAY;AACnB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,YAAA,IAAgB,SAAA,IAAa,eAAA;AAAA,MAC/B;AAEA,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACnE;AACF;ACrcO,SAAS,mBAAA,CAAoB;AAAA,EAClC,YAAA;AAAA,EACA,wBAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIC,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,gBAAA,GAAmB,cAAc,YAAY,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,EAAE,CAAA;AACzC,EAAA,MAAK,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE/D,EAAA,eAAe,qBAAqB,CAAA,EAAc;AAChD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAEzB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,IAAA,EAAM,YAAA;AAAA,QACN,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,QAAA,MAAM,YAAA,CAAa,cAAc,YAAY,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AAEA,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,cAAA,EAAe;AAAA,IACjB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAE1B,MAAA,KAAA,CAAM,4CAA4C,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,uBACEC,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,yDAAA;AAAA,UACV,OAAA,EAAS,wBAAA;AAAA,UAET,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAO,MAAA,EAAO,WAAU,SAAA,EAAU;AAAA;AAAA,OAC/C;AAAA,sBAEAE,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACd,QAAA,EAAA;AAAA,wBAAAF,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,iBAAiB,KAAA,CAAM,MAAA;AAAA,YAC5B,GAAA,EAAK,iBAAiB,KAAA,CAAM,GAAA;AAAA,YAC5B,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QACC,gBAAA,CAAiB;AAAA,OAAA,EACpB,CAAA;AAAA,sBACAA,IAAC,WAAA,EAAA,EAAY;AAAA,KAAA,EACf,CAAA;AAAA,oBACAE,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,oBAAA,EAAsB,WAAU,aAAA,EAC9C,QAAA,EAAA;AAAA,sBAAAF,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,qTAAA;AAAA,UAIV,WAAA,EAAY,kCAAA;AAAA,UACZ,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,OAC5C;AAAA,sBACAE,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kBAAA,EAChB,QAAA,EAAA;AAAA,wBAAAF,GAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,UAAA;AAAA,YACA,gBAAA,EAAkB;AAAA;AAAA,SACpB;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,iBAAA;AAAA,YAClC,SAAA,EAAU,+VAAA;AAAA,YAMV,QAAA,EAAA,iBAAA,mBAAmBA,GAAAA,CAAC,OAAA,EAAA,EAAO,CAAA,GAAM;AAAA;AAAA;AACnC,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACpGO,SAAS,mBAAA,CAAoB,EAAE,wBAAA,EAAyB,EAA6B;AAC1F,EAAA,uBACEE,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,QAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,oBAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,KAAA,EAAM,4BAAA,EAChE,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qIAAA,EAAsI,MAAK,SAAA,EAAS,CAAA;AAAA,wBAC5JA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uWAAA,EAAwW,MAAK,OAAA,EAAO;AAAA,OAAA,EAC9X,CAAA;AAAA,sBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAe,QAAA,EAAA,4BAAA,EAA0B,CAAA;AAAA,sBAEzDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,wBAAA;AAAA,UACT,SAAA,EAAU,oNAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACxBO,IAAM,aAAA,GAAgB;AAAA,EAC3B,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,WAAA;AAAA,MACR,GAAA,EAAK;AAAA;AACP,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,YAAA;AAAA,MACR,GAAA,EAAK;AAAA;AACP,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,eAAA;AAAA,MACR,GAAA,EAAK;AAAA;AACP;AAEJ,CAAA;AASO,SAAS,UAAA,CAAW,EAAE,WAAA,EAAa,YAAA,EAAa,EAAoB;AACzE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,SAA8B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtD,EAAA,SAAS,qBAAA,GAAwB;AAC/B,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+GAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,mBACCF,GAAAA,CAAC,mBAAA,EAAA,EAAoB,0BAA0B,qBAAA,EAAuB,CAAA,mBAEtEA,GAAAA,CAAAG,QAAAA,EAAA,EACG,QAAA,EAAA,CAAC,+BACAH,GAAAA,CAAC,oBAAiB,qBAAA,EAAuB,eAAA,EAAiB,oBAE1DA,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,YAAA;AAAA,QACA,wBAAA,EAA0B,qBAAA;AAAA,QAC1B,cAAA,EAAgB,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,QAC1C,WAAA;AAAA,QACA;AAAA;AAAA,KACF,EAEJ,CAAA;AAAA,oBAEFE,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA;AAAA,MAAA,yBAAA;AAAA,MAC1B,GAAA;AAAA,sBACjBF,GAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,8BAAA;AAAA,UACV,IAAA,EAAK,gCAAA;AAAA,UACN,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MACC,GAAA;AAAA,MAAI,GAAA;AAAA,MAAE,GAAA;AAAA,sBACPA,GAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,8BAAA;AAAA,UACV,IAAA,EAAK,yBAAA;AAAA,UACL,MAAA,EAAO,QAAA;AAAA,UACP,GAAA,EAAI,qBAAA;AAAA,UACL,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACjFO,SAAS,MAAA,CAAO;AAAA,EACrB,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAgB;AACd,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,cAAA,EAAgB,yCAAA;AAAA,IAChB,aAAA,EAAe,uCAAA;AAAA,IACf,WAAA,EAAa,mCAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,uBACEE,KAACE,OAAAA,EAAA,EAAQ,WAAW,CAAA,SAAA,EAAY,eAAA,CAAgB,QAAQ,CAAC,CAAA,wBAAA,CAAA,EACvD,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAACI,OAAAA,CAAQ,KAAA,EAAR,EACC,QAAA,kBAAAJ,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAE,IAAAA,CAACE,OAAAA,CAAQ,MAAA,EAAR,EAAe,WAAU,wEAAA,EACxB,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACtCE,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACd,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAO,CAAA;AAAA,QAAO;AAAA,OAAA,EAEhC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.mjs","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","'use client'\n\nimport { Popover } from \"@headlessui/react\";\nimport { X } from \"phosphor-react\";\n\nexport function CloseButton() {\n return (\n <Popover.Button className=\"top-5 right-5 absolute text-zinc-400 hover:text-zinc-100\" title=\"Close feedback form\">\n <X weight=\"bold\" className=\"w-4 h-4\"/>\n </Popover.Button>\n )\n}\n\n","'use client'\n\nimport { FeedbackType, feedbackTypes } from \"..\";\nimport { CloseButton } from \"../../CloseButton\";\n\ninterface FeedbackTypeStepProps {\n onFeedbackTypeChanged: (type: FeedbackType) => void;\n}\n\nexport function FeedbackTypeStep({ onFeedbackTypeChanged }: FeedbackTypeStepProps) {\n return (\n <>\n <header>\n <span className=\"text-xl leading-6\">Please give us your feedback!</span>\n <CloseButton />\n </header>\n <div className=\"flex py-8 gap-2 w-full\">\n {\n Object.entries(feedbackTypes).map(([key, value]) => {\n return (\n <button\n key={key}\n className=\"bg-zinc-800 rounded py-5 w-24 flex1 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none\"\n type=\"button\"\n onClick={() => onFeedbackTypeChanged(key as FeedbackType)}\n >\n <img src={value.image.source} alt={value.image.alt}></img>\n <span>{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 html2canvas from 'html2canvas';\nimport { Camera, Trash } from 'phosphor-react';\nimport { useState } from 'react';\nimport { Loading } from './Loading';\n\ninterface ScreenshotButtonProps {\n screenshot: string | null;\n onScreenshotTook: (screenshot: string | null) => void;\n}\n\nexport function ScreenshotButton({\n screenshot,\n onScreenshotTook,\n}: ScreenshotButtonProps) {\n const [isTakenScreenshot, setIsTakenScreenShot] = useState(false)\n \n async function handleTakeScreenshot() {\n setIsTakenScreenShot(true);\n const canvas = await html2canvas(document.querySelector('html')!);\n const base64image = canvas.toDataURL('image/png');\n onScreenshotTook(base64image);\n setIsTakenScreenShot(false);\n }\n \n if (screenshot) {\n return (\n <button\n type=\"button\"\n className=\"p-1 w-10 h-10 rounded-md border-transparent flex \n justify-end items-end text-zinc-400 hover:text-zinc-100 transition-colors\"\n onClick={() => onScreenshotTook(null)}\n style={{\n backgroundImage: `url(${screenshot})`,\n backgroundPosition: 'right bottom',\n backgroundSize: 180,\n }}\n >\n <Trash weight=\"fill\" />\n </button>\n )\n }\n \n return (\n <button\n type=\"button\"\n className=\"p-2 bg-zinc-800 rounded-md border-transparent hover:bg-zinc-700\n transitions-colors focus:outline-none focus:ring-2\n focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500\"\n onClick={handleTakeScreenshot}\n >\n {isTakenScreenshot ? <Loading /> : <Camera weight=\"bold\" className=\"w-6 h-6\" />}\n </button>\n )\n}\n\n","import { FeedbackType, GitHubConfig } from '../../types';\n\ninterface FeedbackData {\n type: FeedbackType;\n comment: string;\n screenshot: string | null;\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 } = 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 // 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:', screenshotPath || '.feedback-vos');\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 // 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 } from 'react';\nimport { FeedbackType, feedbackTypes } from '..';\nimport { CloseButton } from '../../CloseButton';\nimport {Loading} from '../../Loading';\nimport { ScreenshotButton } from '../../ScreenshotButton';\nimport { sendToGitHub } from '../../../lib/integrations/github';\nimport { GitHubConfig } from '../../../types';\n\ninterface FeedbackContentStepProps {\n feedbackType: FeedbackType;\n onFeedbackRestartRequest: () => void;\n onFeedbackSent: () => void;\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function FeedbackContentStep({\n feedbackType,\n onFeedbackRestartRequest,\n onFeedbackSent,\n integration,\n githubConfig,\n}: FeedbackContentStepProps) {\n const [screenshot, setScreenshot] = useState<string | null>(null);\n const feedbackTypeData = feedbackTypes[feedbackType];\n const [comment, setComment] = useState('');\n const[isSendingFeedback, setIsSendingFeedback] = useState(false);\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 };\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('Failed to send feedback. Please try again.');\n }\n }\n \n return (\n <>\n <header>\n <button\n type=\"button\"\n className=\"absolute top-5 left-5 text-zinc-400 hover:text-zinc-100\"\n onClick={onFeedbackRestartRequest}\n >\n <ArrowLeft weight=\"bold\" className=\"w-4 h-4\" />\n </button>\n\n <span className=\"text-xl leading-6 flex items-center gap-2 mt-2\">\n <img\n src={feedbackTypeData.image.source}\n alt={feedbackTypeData.image.alt}\n className=\"w-6 h-6\"\n />\n {feedbackTypeData.title}\n </span>\n <CloseButton />\n </header>\n <form onSubmit={handleSubmitFeedback} className=\"my-4 w-full\">\n <textarea\n className=\"min-w-[384px] w-full min-h-[112px] text-sm \n placeholder-zinc-400 text-zinc-100 border-zinc-600 bg-transparent rounded-md \n focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none\n scrollbar-thumb-zinc-700 scrollbar-track-transparent scrollbar-thin\"\n placeholder=\"Tell in detail what is happening\"\n onChange={(e) => setComment(e.target.value)}\n />\n <footer className=\" flex gap-2 mt-2\">\n <ScreenshotButton\n screenshot={screenshot}\n onScreenshotTook={setScreenshot}\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 focus:ring-offset-zinc-900 focus:ring-brand-500\n transition-colors disabled:opacity-50 disabled:cursor-not-allowed\n disabled:hover:bg-brand-500\"\n >\n {isSendingFeedback? <Loading/> : \"Send feedback\"}\n </button>\n </footer>\n </form>\n </>\n )\n}\n\n","'use client'\n\nimport { CloseButton } from '../../CloseButton';\n\ninterface FeedbackSuccessStepProps {\n onFeedbackRestartRequest: () => void;\n}\n\nexport function FeedbackSuccessStep({ onFeedbackRestartRequest }: FeedbackSuccessStepProps) {\n return (\n <>\n <header>\n <CloseButton />\n </header>\n\n <div className=\"flex flex-col items-center py-10 w-[304px]\">\n <svg width=\"41\" height=\"40\" viewBox=\"0 0 41 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\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-xl mt-2\">We appreciate the feedback</span>\n\n <button \n type=\"button\"\n onClick={onFeedbackRestartRequest}\n className=\"py-2 px-6 mt-6 bg-zinc-800 rounded-md border-transparent text-sm leading-6 hover:bg-zinc-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-zinc-900 focus:ring-brand-500 transition-colors\"\n >\n I want to send another\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 } from '../../types';\n\nexport const feedbackTypes = {\n BUG: {\n title: 'Bug',\n image: {\n source: bugImageUrl,\n alt: 'A purple caterpillar image',\n },\n },\n IDEA: {\n title: 'Idea',\n image: {\n source: ideaImageUrl,\n alt: 'A Lamp image',\n },\n },\n OTHER: {\n title: 'Other',\n image: {\n source: thoughtImageUrl,\n alt: 'A thought balloon image',\n },\n },\n}\n\nexport type { FeedbackType };\n\ninterface WidgetFormProps {\n integration: 'github';\n githubConfig: GitHubConfig;\n}\n\nexport function WidgetForm({ integration, githubConfig }: WidgetFormProps) {\n const [feedbackType, setFeedbackType] = useState<FeedbackType | null>(null)\n const [feedbackSent, setFeedbackSent] = useState(false)\n \n function handleRestartFeedback() {\n setFeedbackSent(false); \n setFeedbackType(null);\n }\n \n return (\n <div className=\"bg-zinc-900 p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto\">\n {feedbackSent ? (\n <FeedbackSuccessStep onFeedbackRestartRequest={handleRestartFeedback} />\n ) : (\n <>\n {!feedbackType ? (\n <FeedbackTypeStep onFeedbackTypeChanged={setFeedbackType} />\n ) : (\n <FeedbackContentStep\n feedbackType={feedbackType}\n onFeedbackRestartRequest={handleRestartFeedback}\n onFeedbackSent={() => setFeedbackSent(true)}\n integration={integration}\n githubConfig={githubConfig}\n />\n )}\n </>\n )}\n <footer className=\"text-xs text-neutral-400\">\n Built with 💜 by{' '}\n <a\n className=\"underline underline-offset-2\"\n href=\"https://github.com/klaas-sysop\"\n >\n Klaas Sysop\n </a>\n {' '}|{' '}\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';\n\nexport function Widget({ \n integration, \n githubConfig,\n position = 'bottom-right'\n}: WidgetProps) {\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 return (\n <Popover className={`absolute ${positionClasses[position]} flex flex-col items-end`}>\n <Popover.Panel>\n <WidgetForm \n integration={integration}\n githubConfig={githubConfig}\n />\n </Popover.Panel>\n <Popover.Button className=\"bg-brand-500 rounded-full px-3 h-12 text-white flex items-center group\">\n <ChatTeardropDots className=\"w-6 h-6\" />\n <span className=\"max-w-0 overflow-hidden group-hover:max-w-xs transition-all duration-500 ease-linear\">\n <span className=\"pl-2\"></span>\n Feedback\n </span>\n </Popover.Button>\n </Popover>\n )\n}\n\n"]}
package/dist/styles.css CHANGED
@@ -652,7 +652,7 @@ video {
652
652
  }
653
653
  .bg-brand-500 {
654
654
  --tw-bg-opacity: 1;
655
- background-color: rgb(139 92 246 / var(--tw-bg-opacity, 1));
655
+ background-color: rgb(212 66 30 / var(--tw-bg-opacity, 1));
656
656
  }
657
657
  .bg-transparent {
658
658
  background-color: transparent;
@@ -769,11 +769,11 @@ video {
769
769
  }
770
770
  .hover\:border-brand-500:hover {
771
771
  --tw-border-opacity: 1;
772
- border-color: rgb(139 92 246 / var(--tw-border-opacity, 1));
772
+ border-color: rgb(212 66 30 / var(--tw-border-opacity, 1));
773
773
  }
774
774
  .hover\:bg-brand-300:hover {
775
775
  --tw-bg-opacity: 1;
776
- background-color: rgb(153 109 255 / var(--tw-bg-opacity, 1));
776
+ background-color: rgb(232 106 74 / var(--tw-bg-opacity, 1));
777
777
  }
778
778
  .hover\:bg-zinc-700:hover {
779
779
  --tw-bg-opacity: 1;
@@ -785,7 +785,7 @@ video {
785
785
  }
786
786
  .focus\:border-brand-500:focus {
787
787
  --tw-border-opacity: 1;
788
- border-color: rgb(139 92 246 / var(--tw-border-opacity, 1));
788
+ border-color: rgb(212 66 30 / var(--tw-border-opacity, 1));
789
789
  }
790
790
  .focus\:outline-none:focus {
791
791
  outline: 2px solid transparent;
@@ -803,7 +803,7 @@ video {
803
803
  }
804
804
  .focus\:ring-brand-500:focus {
805
805
  --tw-ring-opacity: 1;
806
- --tw-ring-color: rgb(139 92 246 / var(--tw-ring-opacity, 1));
806
+ --tw-ring-color: rgb(212 66 30 / var(--tw-ring-opacity, 1));
807
807
  }
808
808
  .focus\:ring-offset-2:focus {
809
809
  --tw-ring-offset-width: 2px;
@@ -819,7 +819,7 @@ video {
819
819
  }
820
820
  .disabled\:hover\:bg-brand-500:hover:disabled {
821
821
  --tw-bg-opacity: 1;
822
- background-color: rgb(139 92 246 / var(--tw-bg-opacity, 1));
822
+ background-color: rgb(212 66 30 / var(--tw-bg-opacity, 1));
823
823
  }
824
824
  .group:hover .group-hover\:max-w-xs {
825
825
  max-width: 20rem;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feedback-vos",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "A beautiful feedback widget for Next.js with GitHub Issues integration",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",