feedback-vos 1.0.30 → 1.0.32
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 +21 -3
- package/dist/index.d.mts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +226 -99
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +228 -101
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +126 -38
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -14,8 +14,47 @@ var html2canvas__default = /*#__PURE__*/_interopDefault(html2canvas);
|
|
|
14
14
|
var bugImageUrl = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuNzUwMDcgNEM4Ljc1MDA3IDMgOC4wMDAwNyAwIDYuMzEyMDcgMEM0LjYyNDA3IDAgNC43NTAwNyAyIDUuNzUwMDcgMkM2Ljc1MDA3IDIgNi43NTAwNyA0IDYuNzUwMDcgNUM2Ljc1MDA3IDYgNy43NTAwNyA0IDcuNzUwMDcgNFpNMy41NjcwNyA1LjcyQzQuNTY3MDcgNC43MiAzLjgxNzA3IDEuNzIgMi4xMjkwNyAxLjcyQzAuNDQxMDY4IDEuNzIgMC41NjcwNjggMy43MiAxLjU2NzA3IDMuNzJDMi41NjcwNyAzLjcyIDIuNTY3MDcgNS43MiAyLjU2NzA3IDYuNzJDMi41NjcwNyA3LjcyIDMuNTY3MDcgNS43MiAzLjU2NzA3IDUuNzJaIiBmaWxsPSIjQUE4REQ4Ii8+CjxwYXRoIGQ9Ik0yOS45NDIgMzIuODU2QzMwLjEzMSAzMy42NjQgMzEuMTY5IDM1LjEzNiAzMS45NzQgMzQuOTQ3QzMyLjc4IDM0Ljc1NyAzMy4wNTEgMzIuOTc2IDMyLjg2MiAzMi4xN0MzMi42NzMgMzEuMzYyIDMxLjg2NCAzMC44NjMgMzEuMDU4IDMxLjA1M0MzMC4yNTMgMzEuMjQzIDI5Ljc1MiAzMi4wNSAyOS45NDIgMzIuODU2Wk0yNC41MDggMzMuNTA1QzI0LjUxMSAzNC4zMzUgMjUuMTg5IDM2LjAwMyAyNi4wMTcgMzZDMjYuODQ1IDM1Ljk5NiAyNy41MTEgMzQuMzIzIDI3LjUwOCAzMy40OTRDMjcuNTA1IDMyLjY2NSAyNi44MzEgMzEuOTk3IDI2LjAwMyAzMS45OTlDMjUuMTc1IDMyLjAwMyAyNC41MDUgMzIuNjc2IDI0LjUwOCAzMy41MDVaTTE5LjIzNyAzMS4wNTlDMTguOTExIDMxLjgyMyAxOC44NzIgMzMuNjIyIDE5LjYzMyAzMy45NDlDMjAuMzk2IDM0LjI3MyAyMS42NyAzMy4wMDIgMjEuOTk2IDMyLjIzOUMyMi4zMjEgMzEuNDc3IDIxLjk2OCAzMC41OTYgMjEuMjA3IDMwLjI2OUMyMC40NDUgMjkuOTQ0IDE5LjU2NCAzMC4yOTYgMTkuMjM3IDMxLjA1OVpNMTQuMjA2IDIwLjAxOUMxMy4zOTQgMjAuMTkxIDExLjg5OCAyMS4xOTIgMTIuMDY3IDIyLjAwMkMxMi4yNCAyMi44MTIgMTQuMDEyIDIzLjEyNiAxNC44MjQgMjIuOTU1QzE1LjYzNSAyMi43ODQgMTYuMTUzIDIxLjk4OCAxNS45ODQgMjEuMTc4QzE1LjgxMiAyMC4zNjggMTUuMDE5IDE5Ljg0OCAxNC4yMDYgMjAuMDE5Wk0xMi4xNjkgMTUuMDE5QzExLjM1NyAxNS4xOTEgOS44NjEwNCAxNi4xOTIgMTAuMDMgMTcuMDAyQzEwLjIwMyAxNy44MTIgMTEuOTc1IDE4LjEyNiAxMi43ODcgMTcuOTU1QzEzLjU5OCAxNy43ODQgMTQuMTE2IDE2Ljk4OCAxMy45NDcgMTYuMTc4QzEzLjc3NSAxNS4zNjggMTIuOTgxIDE0Ljg0OCAxMi4xNjkgMTUuMDE5WiIgZmlsbD0iIzc0NEVBQSIvPgo8cGF0aCBkPSJNMjcuNTc5MSAzNEMzMC40MSAzNCAzMi41MDUgMzMuMTIzIDMyLjg0NSAzMi45NzNDMzUuMTE2MSAzMS45NjMgMzYuMTM4MSAyOS4zMDQgMzUuMTI5MSAyNy4wMzRDMzQuMTMwMSAyNC43ODQgMzEuNTEzMSAyMy43NTkgMjkuMjU3MSAyNC43MkMyOS4xMjQxIDI0Ljc3IDI3LjQ2NDEgMjUuMzY5IDI1LjkxNDEgMjQuNjQ4QzI0LjA2MzEgMjMuNzg3IDIyLjkxOTEgMjEuMzM5IDIyLjI4NjEgMTkuNDM5QzIyLjE0MjEgMTkuMDA5IDIxLjkwMTEgMTguMTY1IDIxLjYgMTcuMTIzQzE5LjczNDEgMTAuNjUyIDE4Ljc2ODEgOC44Mzc5OSAxNy42MTcxIDcuMzAyOTlDMTMuOTA2IDIuMzUxOTkgOC4wMjUwNSAyLjAwNjk5IDUuMTM0MDUgMi41ODY5OUMyLjY5NzA1IDMuMDczOTkgMS4xMTYwNSA1LjQ0NDk5IDEuNjA0MDUgNy44ODE5OUMyLjA5MjA1IDEwLjMyIDQuNDY0MDUgMTEuOTAyIDYuOTAwMDUgMTEuNDEyQzcuMDYyMDUgMTEuMzg2IDkuMTA0MDUgMTEuMTA2IDEwLjMyNDEgMTIuNTgxQzEwLjk2NzEgMTMuODY4IDEyLjQwNDEgMTcuNzA5IDEyLjk1NDEgMTkuNjE1QzEzLjMwMDEgMjAuODE0IDEzLjU4MzEgMjEuNzg2IDEzLjc0ODEgMjIuMjgyQzE1LjUyMTEgMjcuNTk5IDE4LjQxNDEgMzEuMTc1IDIyLjM1MTEgMzIuOTExQzI0LjIwMzEgMzMuNzI5IDI2LjAwNTEgMzQgMjcuNTc5MSAzNFoiIGZpbGw9IiM5MjY2Q0MiLz4KPHBhdGggZD0iTTcuMDE3MDkgNkM3LjU2OTM3IDYgOC4wMTcwOSA1LjU1MjI4IDguMDE3MDkgNUM4LjAxNzA5IDQuNDQ3NzIgNy41NjkzNyA0IDcuMDE3MDkgNEM2LjQ2NDgxIDQgNi4wMTcwOSA0LjQ0NzcyIDYuMDE3MDkgNUM2LjAxNzA5IDUuNTUyMjggNi40NjQ4MSA2IDcuMDE3MDkgNloiIGZpbGw9IiMyMDIwMjQiLz4KPHBhdGggZD0iTTMxLjI1ODEgMzIuOTY0QzMxLjE2OTEgMzIuOTY0IDMxLjA3ODEgMzIuOTUyIDMwLjk4OTEgMzIuOTI4QzMwLjQ1NzEgMzIuNzggMzAuMTQ1MSAzMi4yMjkgMzAuMjkzMSAzMS42OTdDMzEuMDUwMSAyOC45NzUgMjkuNTIzMSAyNy4xNTUgMjkuNTA4MSAyNy4xMzdDMjkuMTQ5MSAyNi43MTggMjkuMTk2MSAyNi4wODYgMjkuNjE1MSAyNS43MjdDMzAuMDMzMSAyNS4zNjggMzAuNjY2MSAyNS40MTUgMzEuMDI1MSAyNS44MzRDMzEuMTE3MSAyNS45NDEgMzMuMjU5MSAyOC40OTQgMzIuMjIwMSAzMi4yMzFDMzIuMDk4MSAzMi42NzQgMzEuNjk1MSAzMi45NjQgMzEuMjU4MSAzMi45NjRaTTI0LjA1OTEgMzIuNDAxQzIzLjgxNDEgMzIuNDAxIDIzLjU2OTEgMzIuMzEyIDIzLjM3NTEgMzIuMTMxQzIyLjk3MjEgMzEuNzUzIDIyLjk1MTEgMzEuMTIgMjMuMzI4MSAzMC43MTdDMjQuODEzMSAyOS4xMyAyNC43ODExIDI2LjUyNCAyNC43ODAxIDI2LjQ5N0MyNC43NjQxIDI1Ljk0NSAyNS4xOTkxIDI1LjQ4NSAyNS43NTIxIDI1LjQ2OUMyNi4yOTQxIDI1LjQ2NCAyNi43NjUxIDI1Ljg4OCAyNi43ODAxIDI2LjQ0MUMyNi43ODQxIDI2LjU4IDI2Ljg1MzEgMjkuODc4IDI0Ljc4OTEgMzIuMDg1QzI0LjU5MjEgMzIuMjk1IDI0LjMyNTEgMzIuNDAxIDI0LjA1OTEgMzIuNDAxWk0xNS41MTcxIDIzLjcwNUMxNS4wMzcxIDIzLjcwNSAxNC42MTMxIDIzLjM1OCAxNC41MzIxIDIyLjg2OEMxNC40NDIxIDIyLjMyNCAxNC44MTAxIDIxLjgwOCAxNS4zNTUxIDIxLjcxOUMxOC40MjkxIDIxLjIwOSAyMC4xMjkxIDE5LjM0MiAyMC4xNDYxIDE5LjMyM0MyMC41MTExIDE4LjkxMyAyMS4xNDQxIDE4Ljg3NCAyMS41NTUxIDE5LjIzOUMyMS45NjcxIDE5LjYwNCAyMi4wMDgxIDIwLjIzMiAyMS42NDYxIDIwLjY0NUMyMS41NTkxIDIwLjc0NCAxOS40OTAxIDIzLjA2IDE1LjY4MjEgMjMuNjkxQzE1LjYyNjEgMjMuNzAxIDE1LjU3MTEgMjMuNzA1IDE1LjUxNzEgMjMuNzA1Wk0xOC40MzgxIDI4LjU2MkMxOC4wMTMxIDI4LjU2MiAxNy42MTkxIDI4LjI5IDE3LjQ4NDEgMjcuODY0QzE3LjMxODEgMjcuMzM4IDE3LjYxMDEgMjYuNzc1IDE4LjEzNjEgMjYuNjA5QzIwLjgyOTEgMjUuNzU2IDIyLjAxNjEgMjMuNzc5IDIyLjAyODEgMjMuNzU5QzIyLjMwODEgMjMuMjgyIDIyLjkyMDEgMjMuMTIyIDIzLjM5NjEgMjMuNDAyQzIzLjg3MzEgMjMuNjgxIDI0LjAzMjEgMjQuMjk1IDIzLjc1MzEgMjQuNzdDMjMuNjkwMSAyNC44NzggMjIuMTU4MSAyNy40MzMgMTguNzQwMSAyOC41MTRDMTguNjM5MSAyOC41NDcgMTguNTM3MSAyOC41NjIgMTguNDM4MSAyOC41NjJaTTEzLjgxOTEgMTcuODkyQzEzLjMyMzEgMTcuODkyIDEyLjg5MjEgMTcuNTIzIDEyLjgyODEgMTcuMDE3QzEyLjc1OTEgMTYuNDY5IDEzLjE0NzEgMTUuOTY5IDEzLjY5NTEgMTUuODk5QzE2LjM4NDEgMTUuNTU5IDE4LjM1MjEgMTMuOTI4IDE4LjM3MTEgMTMuOTExQzE4Ljc5MzEgMTMuNTU3IDE5LjQyNDEgMTMuNjA4IDE5Ljc3OTEgMTQuMDNDMjAuMTM1MSAxNC40NTEgMjAuMDg0MSAxNS4wOCAxOS42NjQxIDE1LjQzN0MxOS41NjcxIDE1LjUyIDE3LjI0NDEgMTcuNDY2IDEzLjk0NjEgMTcuODgzQzEzLjkwMzEgMTcuODg5IDEzLjg2MTEgMTcuODkyIDEzLjgxOTEgMTcuODkyWk0xMS45OTgxIDEzLjEyNUMxMS41NzMxIDEzLjEyNSAxMS4xNzkxIDEyLjg1MiAxMS4wNDQxIDEyLjQyNEMxMC44NzkxIDExLjg5NyAxMS4xNzExIDExLjMzNiAxMS42OTgxIDExLjE3QzE0LjgyODEgMTAuMTg3IDE1Ljk1MTEgOC40NzggMTUuOTk3MSA4LjQwNkMxNi4yOTIxIDcuOTQ0IDE2LjkwODEgNy44MDEgMTcuMzcyMSA4LjA5NEMxNy44MzcxIDguMzg2IDE3Ljk4MzEgOC45OTMgMTcuNjk2MSA5LjQ2QzE3LjYzNjEgOS41NTcgMTYuMTkwMSAxMS44NTYgMTIuMjk3MSAxMy4wNzlDMTIuMTk4MSAxMy4xMSAxMi4wOTcxIDEzLjEyNSAxMS45OTgxIDEzLjEyNVoiIGZpbGw9IiM3NDRFQUEiLz4KPC9zdmc+";
|
|
15
15
|
var ideaImageUrl = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMzUiIHZpZXdCb3g9IjAgMCAyMyAzNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIyLjUgMTAuOTJDMjIuNSAxNy4zNTkgMTcuNSAxOC4zNTkgMTcuNSAyNC4zNkMxNy41IDI3LjQ1OCAxNC4zNzcgMjcuNzE5IDEyIDI3LjcxOUM5Ljk0NyAyNy43MTkgNS40MTQgMjYuOTQgNS40MTQgMjQuMzU4QzUuNDE0IDE4LjM2IDAuNSAxNy4zNiAwLjUgMTAuOTJDMC41IDQuODg5IDUuNzg1IDAgMTEuNTgzIDBDMTcuMzgzIDAgMjIuNSA0Ljg4OSAyMi41IDEwLjkyWiIgZmlsbD0iI0ZGREQ4MyIvPgo8cGF0aCBkPSJNMTUuNjY3IDMyLjM2QzE1LjY2NyAzMy4xODggMTMuNDMzIDM0Ljg2IDExLjUgMzQuODZDOS41NjcwMSAzNC44NiA3LjMzMzAxIDMzLjE4OCA3LjMzMzAxIDMyLjM2QzcuMzMzMDEgMzEuNTMyIDkuNTY2MDEgMzEuODYgMTEuNSAzMS44NkMxMy40MzMgMzEuODYgMTUuNjY3IDMxLjUzMiAxNS42NjcgMzIuMzZaIiBmaWxsPSIjQ0NENkREIi8+CjxwYXRoIGQ9Ik0xNi4yMDcgMTAuMTUzQzE1LjgxNiA5Ljc2MTk5IDE1LjE4NCA5Ljc2MTk5IDE0Ljc5MyAxMC4xNTNMMTEuNSAxMy40NDZMOC4yMDcwMSAxMC4xNTNDNy44MTYwMSA5Ljc2MTk5IDcuMTg0MDEgOS43NjE5OSA2Ljc5MzAxIDEwLjE1M0M2LjQwMjAxIDEwLjU0NCA2LjQwMjAxIDExLjE3NiA2Ljc5MzAxIDExLjU2N0wxMC41IDE1LjI3NFYyNS44NkMxMC41IDI2LjQxMyAxMC45NDggMjYuODYgMTEuNSAyNi44NkMxMi4wNTIgMjYuODYgMTIuNSAyNi40MTMgMTIuNSAyNS44NlYxNS4yNzRMMTYuMjA3IDExLjU2N0MxNi41OTggMTEuMTc2IDE2LjU5OCAxMC41NDQgMTYuMjA3IDEwLjE1M1oiIGZpbGw9IiNGRkNDNEQiLz4KPHBhdGggZD0iTTE3LjUgMzAuODZDMTcuNSAzMS45NjQgMTYuNjA0IDMyLjg2IDE1LjUgMzIuODZIOC41QzcuMzk2IDMyLjg2IDYuNSAzMS45NjQgNi41IDMwLjg2VjI0Ljg2SDE3LjVWMzAuODZaIiBmaWxsPSIjOTlBQUI1Ii8+CjxwYXRoIGQ9Ik01LjQ5OSAzMS44NkM1LjAxOSAzMS44NiA0LjU5NSAzMS41MTMgNC41MTQgMzEuMDI0QzQuNDIzIDMwLjQ4IDQuNzkxIDI5Ljk2NCA1LjMzNiAyOS44NzRMMTcuMzM2IDI3Ljg3NEMxNy44OCAyNy43NzYgMTguMzk2IDI4LjE1MSAxOC40ODYgMjguNjk2QzE4LjU3NyAyOS4yNCAxOC4yMDkgMjkuNzU2IDE3LjY2NCAyOS44NDZMOS42NjQgMzEuODQ2QzkuNjA5IDMxLjg1NiA5LjU1MyAzMS44NiA1LjQ5OSAzMS44NlpNNS40OTkgMjcuODZDNS4wMTkgMjcuODYgNC41OTUgMjcuNTEzIDQuNTE0IDI3LjAyNEM0LjQyMyAyNi40OCA0Ljc5MSAyNS45NjQgNS4zMzYgMjUuODc0TDE3LjMzNiAyMy44NzRDMTcuODggMjMuNzc3IDE4LjM5NiAyNC4xNTEgMTguNDg2IDI0LjY5NkMxOC41NzcgMjUuMjQgMTguMjA5IDI1Ljc1NiAxNy42NjQgMjUuODQ2TDkuNjY0IDI3Ljg0NkM5LjYwOSAyNy44NTYgOS41NTMgMjcuODYgNS40OTkgMjcuODZaIiBmaWxsPSIjQ0NENkREIi8+Cjwvc3ZnPg==";
|
|
16
16
|
var thoughtImageUrl = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzNiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM1LjE2NjYgMTAuODc1QzM1LjE2NjYgNy4wMDkgMzIuMDMyNiAzLjg3NSAyOC4xNjY2IDMuODc1QzI2Ljk5OTYgMy44NzUgMjUuOTAxNiA0LjE2NSAyNC45MzQ2IDQuNjY5QzIyLjg1MjYgMS44NDIgMTkuNTA5NiAwIDE1LjcyOTYgMEMxMC41OTc2IDAgNi4yNTQ2MyAzLjM4IDQuODA2NjMgOC4wMzZDMi4xNDg2MyA4LjY1MyAwLjE2NjYyNiAxMS4wMyAwLjE2NjYyNiAxMy44NzVDMC4xNjY2MjYgMTYuODU0IDIuMzQwNjMgMTkuMzIgNS4xODc2MyAxOS43ODhDNS40MDM2MyAyMy43MzcgOC42NjQ2MyAyNi44NzUgMTIuNjY2NiAyNi44NzVDMTQuODQyNiAyNi44NzUgMTYuNzk2NiAyNS45NDIgMTguMTY2NiAyNC40NjJDMTkuNTM2NiAyNS45NDIgMjEuNDg5NiAyNi44NzUgMjMuNjY2NiAyNi44NzVDMjcuODA5NiAyNi44NzUgMzEuMTY2NiAyMy41MTggMzEuMTY2NiAxOS4zNzVDMzEuMTY2NiAxOC42NjUgMzEuMDYxNiAxNy45ODEgMzAuODc3NiAxNy4zM0MzMy4zOTY2IDE2LjI3MSAzNS4xNjY2IDEzLjc4IDM1LjE2NjYgMTAuODc1WiIgZmlsbD0iIzg1QzhGOCIvPgo8cGF0aCBkPSJNNC4xNjY2MyAzMi44NzVDNS44MjM0OCAzMi44NzUgNy4xNjY2MyAzMS41MzE5IDcuMTY2NjMgMjkuODc1QzcuMTY2NjMgMjguMjE4MSA1LjgyMzQ4IDI2Ljg3NSA0LjE2NjYzIDI2Ljg3NUMuNTA5NzcgMjYuODc1IDEuMTY2NjMgMjguMjE4MSAxLjE2NjYzIDI5Ljg3NUMxLjE2NjYzIDMxLjUzMTkgMi41MDk3NyAzMi44NzUgNC4xNjY2MyAzMi44NzVaIiBmaWxsPSIjODVDOEY4Ii8+Cjwvc3ZnPg==";
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
|
|
18
|
+
// src/lib/theme.ts
|
|
19
|
+
function getThemeClasses(theme) {
|
|
20
|
+
return {
|
|
21
|
+
// Background colors - light mode is now softer (gray-50 instead of white)
|
|
22
|
+
bgPrimary: theme === "dark" ? "bg-zinc-900" : "bg-gray-50",
|
|
23
|
+
bgSecondary: theme === "dark" ? "bg-zinc-800" : "bg-gray-100",
|
|
24
|
+
bgTertiary: theme === "dark" ? "bg-zinc-700" : "bg-gray-200",
|
|
25
|
+
bgHover: theme === "dark" ? "hover:bg-zinc-600" : "hover:bg-gray-200",
|
|
26
|
+
bgHoverSecondary: theme === "dark" ? "hover:bg-zinc-700" : "hover:bg-gray-200",
|
|
27
|
+
// Text colors
|
|
28
|
+
textPrimary: theme === "dark" ? "text-zinc-100" : "text-gray-900",
|
|
29
|
+
textSecondary: theme === "dark" ? "text-zinc-300" : "text-gray-700",
|
|
30
|
+
textTertiary: theme === "dark" ? "text-zinc-400" : "text-gray-600",
|
|
31
|
+
textMuted: theme === "dark" ? "text-neutral-400" : "text-gray-500",
|
|
32
|
+
// Border colors
|
|
33
|
+
borderPrimary: theme === "dark" ? "border-zinc-700" : "border-gray-300",
|
|
34
|
+
borderSecondary: theme === "dark" ? "border-zinc-600" : "border-gray-300",
|
|
35
|
+
borderHover: theme === "dark" ? "hover:border-zinc-500" : "hover:border-gray-400",
|
|
36
|
+
// Canvas/Editor background
|
|
37
|
+
canvasBg: theme === "dark" ? "bg-zinc-900" : "bg-gray-200",
|
|
38
|
+
// Overlay
|
|
39
|
+
overlay: theme === "dark" ? "bg-black/80" : "bg-black/60",
|
|
40
|
+
// Focus ring offset
|
|
41
|
+
focusRingOffset: theme === "dark" ? "focus:ring-offset-zinc-900" : "focus:ring-offset-gray-50",
|
|
42
|
+
// Button variants
|
|
43
|
+
buttonSecondary: theme === "dark" ? "bg-zinc-800 hover:bg-zinc-700 text-zinc-100" : "bg-gray-200 hover:bg-gray-300 text-gray-900",
|
|
44
|
+
buttonTertiary: theme === "dark" ? "bg-zinc-700 hover:bg-zinc-600 text-zinc-100" : "bg-gray-300 hover:bg-gray-400 text-gray-900",
|
|
45
|
+
// Icon colors - make icons more visible (darker for better contrast)
|
|
46
|
+
iconColor: theme === "dark" ? "text-zinc-100" : "text-gray-900"
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function getDefaultTheme() {
|
|
50
|
+
if (typeof process !== "undefined" && process.env.NEXT_PUBLIC_FEEDBACK_THEME === "light") {
|
|
51
|
+
return "light";
|
|
52
|
+
}
|
|
53
|
+
return "dark";
|
|
54
|
+
}
|
|
55
|
+
function CloseButton({ className = "", title = "Close feedback form", theme = "dark" }) {
|
|
56
|
+
const themeClasses = getThemeClasses(theme);
|
|
57
|
+
return /* @__PURE__ */ jsxRuntime.jsx(react.Popover.Button, { className: `${themeClasses.textTertiary} ${theme === "dark" ? "hover:text-zinc-100" : "hover:text-gray-900"} ${className}`, title, children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.X, { weight: "bold", className: "w-5 h-5" }) });
|
|
19
58
|
}
|
|
20
59
|
|
|
21
60
|
// src/lib/translations.ts
|
|
@@ -70,24 +109,25 @@ var translations = {
|
|
|
70
109
|
function getTranslations(lang = "en") {
|
|
71
110
|
return translations[lang];
|
|
72
111
|
}
|
|
73
|
-
function FeedbackTypeStep({ onFeedbackTypeChanged, language }) {
|
|
112
|
+
function FeedbackTypeStep({ onFeedbackTypeChanged, language, theme }) {
|
|
74
113
|
const t = getTranslations(language);
|
|
75
114
|
const feedbackTypes = getFeedbackTypes(language);
|
|
115
|
+
const themeClasses = getThemeClasses(theme);
|
|
76
116
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
77
117
|
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center justify-between w-full gap-2", children: [
|
|
78
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className:
|
|
79
|
-
/* @__PURE__ */ jsxRuntime.jsx(CloseButton, { title: t.form.closeButton })
|
|
118
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-lg md:text-xl leading-6 ${themeClasses.textPrimary}`, children: t.form.header }),
|
|
119
|
+
/* @__PURE__ */ jsxRuntime.jsx(CloseButton, { title: t.form.closeButton, theme })
|
|
80
120
|
] }),
|
|
81
121
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex py-6 md:py-8 gap-2 md:gap-2 w-full justify-center md:justify-start flex-wrap", children: Object.entries(feedbackTypes).map(([key, value]) => {
|
|
82
122
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
83
123
|
"button",
|
|
84
124
|
{
|
|
85
|
-
className:
|
|
125
|
+
className: `${themeClasses.bgSecondary} rounded py-4 md:py-5 flex-1 min-w-[80px] md:w-24 flex flex-col items-center gap-2 border-2 border-transparent hover:border-brand-500 focus:border-brand-500 focus:outline-none transition-colors`,
|
|
86
126
|
type: "button",
|
|
87
127
|
onClick: () => onFeedbackTypeChanged(key),
|
|
88
128
|
children: [
|
|
89
129
|
/* @__PURE__ */ jsxRuntime.jsx("img", { src: value.image.source, alt: value.image.alt, className: "w-5 h-5 md:w-6 md:h-6" }),
|
|
90
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className:
|
|
130
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-xs md:text-sm text-center ${themeClasses.textPrimary}`, children: value.title })
|
|
91
131
|
]
|
|
92
132
|
},
|
|
93
133
|
key
|
|
@@ -102,13 +142,15 @@ function ScreenshotEditor({
|
|
|
102
142
|
screenshot,
|
|
103
143
|
onSave,
|
|
104
144
|
onCancel,
|
|
105
|
-
language
|
|
145
|
+
language,
|
|
146
|
+
theme = "dark"
|
|
106
147
|
}) {
|
|
107
148
|
const canvasRef = react$1.useRef(null);
|
|
108
149
|
const [isDrawing, setIsDrawing] = react$1.useState(false);
|
|
109
150
|
const [color, setColor] = react$1.useState("#ef4444");
|
|
110
151
|
const [brushSize, setBrushSize] = react$1.useState(3);
|
|
111
152
|
const [image, setImage] = react$1.useState(null);
|
|
153
|
+
const themeClasses = getThemeClasses(theme);
|
|
112
154
|
const t = {
|
|
113
155
|
en: {
|
|
114
156
|
save: "Save",
|
|
@@ -232,16 +274,16 @@ function ScreenshotEditor({
|
|
|
232
274
|
const maxWidth = 600;
|
|
233
275
|
const displayWidth = image ? Math.min(maxWidth, image.width) : maxWidth;
|
|
234
276
|
const displayHeight = image ? displayWidth / image.width * image.height : 400;
|
|
235
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className:
|
|
236
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
237
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className:
|
|
277
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `fixed inset-0 z-50 flex items-center justify-center ${themeClasses.overlay} p-2 md:p-4`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${themeClasses.bgSecondary} rounded-lg shadow-xl max-w-4xl w-full max-h-[95vh] md:max-h-[90vh] overflow-auto`, children: [
|
|
278
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: `sticky top-0 ${themeClasses.bgSecondary} border-b ${themeClasses.borderPrimary} p-2 md:p-4 flex items-center justify-between z-10 gap-2`, children: [
|
|
279
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: `text-base md:text-lg font-semibold ${themeClasses.textPrimary} truncate`, children: language === "nl" ? "Teken op screenshot" : "Draw on screenshot" }),
|
|
238
280
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-1 md:gap-2 flex-shrink-0", children: [
|
|
239
281
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
240
282
|
"button",
|
|
241
283
|
{
|
|
242
284
|
type: "button",
|
|
243
285
|
onClick: undo,
|
|
244
|
-
className:
|
|
286
|
+
className: `p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`,
|
|
245
287
|
title: t.undo,
|
|
246
288
|
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.ArrowCounterClockwise, { weight: "bold", className: "w-4 h-4 md:w-5 md:h-5" })
|
|
247
289
|
}
|
|
@@ -251,7 +293,7 @@ function ScreenshotEditor({
|
|
|
251
293
|
{
|
|
252
294
|
type: "button",
|
|
253
295
|
onClick: clearCanvas,
|
|
254
|
-
className:
|
|
296
|
+
className: `p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`,
|
|
255
297
|
title: t.clear,
|
|
256
298
|
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Trash, { weight: "bold", className: "w-4 h-4 md:w-5 md:h-5" })
|
|
257
299
|
}
|
|
@@ -261,7 +303,7 @@ function ScreenshotEditor({
|
|
|
261
303
|
{
|
|
262
304
|
type: "button",
|
|
263
305
|
onClick: onCancel,
|
|
264
|
-
className:
|
|
306
|
+
className: `p-1.5 md:p-2 ${themeClasses.buttonTertiary} rounded-md ${themeClasses.textPrimary} transition-colors touch-manipulation`,
|
|
265
307
|
title: t.cancel,
|
|
266
308
|
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.X, { weight: "bold", className: "w-4 h-4 md:w-5 md:h-5" })
|
|
267
309
|
}
|
|
@@ -271,7 +313,7 @@ function ScreenshotEditor({
|
|
|
271
313
|
{
|
|
272
314
|
type: "button",
|
|
273
315
|
onClick: handleSave,
|
|
274
|
-
className: "p-1.5 md:p-2 bg-brand-500 hover:bg-brand-400 rounded-md text-
|
|
316
|
+
className: "p-1.5 md:p-2 bg-brand-500 hover:bg-brand-400 rounded-md text-white transition-colors touch-manipulation",
|
|
275
317
|
title: t.save,
|
|
276
318
|
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Check, { weight: "bold", className: "w-4 h-4 md:w-5 md:h-5" })
|
|
277
319
|
}
|
|
@@ -280,13 +322,13 @@ function ScreenshotEditor({
|
|
|
280
322
|
] }),
|
|
281
323
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 md:p-4", children: [
|
|
282
324
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 md:mb-4 flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4", children: [
|
|
283
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
325
|
+
/* @__PURE__ */ jsxRuntime.jsx("label", { className: `text-xs md:text-sm ${themeClasses.textSecondary} whitespace-nowrap`, children: language === "nl" ? "Kleur:" : "Color:" }),
|
|
284
326
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-1.5 md:gap-2 flex-wrap", children: colors.map((c) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
285
327
|
"button",
|
|
286
328
|
{
|
|
287
329
|
type: "button",
|
|
288
330
|
onClick: () => setColor(c),
|
|
289
|
-
className: `w-7 h-7 md:w-8 md:h-8 rounded-full border-2 transition-all touch-manipulation ${color === c ? "border-zinc-100
|
|
331
|
+
className: `w-7 h-7 md:w-8 md:h-8 rounded-full border-2 transition-all touch-manipulation ${color === c ? `${theme === "dark" ? "border-zinc-100" : "border-gray-900"} scale-110` : `${themeClasses.borderSecondary} ${themeClasses.borderHover}`}`,
|
|
290
332
|
style: { backgroundColor: c },
|
|
291
333
|
title: c
|
|
292
334
|
},
|
|
@@ -294,7 +336,7 @@ function ScreenshotEditor({
|
|
|
294
336
|
)) })
|
|
295
337
|
] }),
|
|
296
338
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 md:mb-4 flex flex-col md:flex-row items-start md:items-center gap-2 md:gap-4", children: [
|
|
297
|
-
/* @__PURE__ */ jsxRuntime.jsx("label", { className:
|
|
339
|
+
/* @__PURE__ */ jsxRuntime.jsx("label", { className: `text-xs md:text-sm ${themeClasses.textSecondary} whitespace-nowrap`, children: language === "nl" ? "Grootte:" : "Size:" }),
|
|
298
340
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 w-full md:w-auto", children: [
|
|
299
341
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
300
342
|
"input",
|
|
@@ -307,10 +349,10 @@ function ScreenshotEditor({
|
|
|
307
349
|
className: "flex-1 md:flex-none md:max-w-xs"
|
|
308
350
|
}
|
|
309
351
|
),
|
|
310
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className:
|
|
352
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-xs md:text-sm ${themeClasses.textTertiary} w-6 md:w-8 text-right`, children: brushSize })
|
|
311
353
|
] })
|
|
312
354
|
] }),
|
|
313
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className:
|
|
355
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `flex justify-center ${themeClasses.canvasBg} rounded-lg p-2 md:p-4 overflow-auto`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
314
356
|
"canvas",
|
|
315
357
|
{
|
|
316
358
|
ref: canvasRef,
|
|
@@ -321,7 +363,7 @@ function ScreenshotEditor({
|
|
|
321
363
|
onTouchStart: startDrawing,
|
|
322
364
|
onTouchMove: draw,
|
|
323
365
|
onTouchEnd: stopDrawing,
|
|
324
|
-
className:
|
|
366
|
+
className: `cursor-crosshair border ${themeClasses.borderPrimary} rounded touch-none`,
|
|
325
367
|
style: {
|
|
326
368
|
width: `${displayWidth}px`,
|
|
327
369
|
height: `${displayHeight}px`,
|
|
@@ -336,17 +378,22 @@ function ScreenshotEditor({
|
|
|
336
378
|
function ScreenshotButton({
|
|
337
379
|
screenshot,
|
|
338
380
|
onScreenshotTook,
|
|
339
|
-
language = "en"
|
|
381
|
+
language = "en",
|
|
382
|
+
theme = "dark"
|
|
340
383
|
}) {
|
|
341
384
|
const [isTakenScreenshot, setIsTakenScreenShot] = react$1.useState(false);
|
|
342
385
|
const [showEditor, setShowEditor] = react$1.useState(false);
|
|
343
386
|
const [tempScreenshot, setTempScreenshot] = react$1.useState(null);
|
|
387
|
+
const themeClasses = getThemeClasses(theme);
|
|
344
388
|
async function handleTakeScreenshot() {
|
|
345
389
|
setIsTakenScreenShot(true);
|
|
346
|
-
const canvas = await html2canvas__default.default(document.querySelector("html")
|
|
390
|
+
const canvas = await html2canvas__default.default(document.querySelector("html"), {
|
|
391
|
+
ignoreElements: (element) => {
|
|
392
|
+
return element.hasAttribute("data-feedback-widget") || element.closest("[data-feedback-widget]") !== null;
|
|
393
|
+
}
|
|
394
|
+
});
|
|
347
395
|
const base64image = canvas.toDataURL("image/png");
|
|
348
|
-
|
|
349
|
-
setShowEditor(true);
|
|
396
|
+
onScreenshotTook(base64image);
|
|
350
397
|
setIsTakenScreenShot(false);
|
|
351
398
|
}
|
|
352
399
|
function handleEditorSave(editedScreenshot) {
|
|
@@ -372,61 +419,104 @@ function ScreenshotButton({
|
|
|
372
419
|
screenshot: tempScreenshot || screenshot,
|
|
373
420
|
onSave: handleEditorSave,
|
|
374
421
|
onCancel: handleEditorCancel,
|
|
375
|
-
language
|
|
422
|
+
language,
|
|
423
|
+
theme
|
|
376
424
|
}
|
|
377
425
|
),
|
|
378
|
-
screenshot
|
|
379
|
-
"
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
426
|
+
screenshot ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
427
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative group", children: [
|
|
428
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
429
|
+
"div",
|
|
430
|
+
{
|
|
431
|
+
className: `p-1 w-10 h-10 rounded-md border ${themeClasses.borderSecondary} flex
|
|
432
|
+
justify-end items-end relative overflow-hidden`,
|
|
433
|
+
style: {
|
|
434
|
+
backgroundImage: `url(${screenshot})`,
|
|
435
|
+
backgroundPosition: "center",
|
|
436
|
+
backgroundSize: "cover"
|
|
437
|
+
},
|
|
438
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors rounded-md" })
|
|
439
|
+
}
|
|
440
|
+
),
|
|
441
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
442
|
+
"button",
|
|
443
|
+
{
|
|
444
|
+
type: "button",
|
|
445
|
+
onClick: (e) => {
|
|
446
|
+
e.stopPropagation();
|
|
447
|
+
onScreenshotTook(null);
|
|
448
|
+
},
|
|
449
|
+
className: "absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10",
|
|
450
|
+
title: language === "nl" ? "Verwijderen" : "Delete",
|
|
451
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.X, { weight: "bold", className: "w-3 h-3 text-white" })
|
|
452
|
+
}
|
|
453
|
+
)
|
|
454
|
+
] }),
|
|
455
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
456
|
+
"button",
|
|
457
|
+
{
|
|
458
|
+
type: "button",
|
|
459
|
+
onClick: handleEditScreenshot,
|
|
460
|
+
className: `p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}
|
|
461
|
+
transition-colors focus:outline-none focus:ring-2
|
|
462
|
+
focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`,
|
|
463
|
+
title: language === "nl" ? "Bewerk screenshot" : "Edit screenshot",
|
|
464
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.PencilSimple, { weight: "bold", className: `w-5 h-5 ${themeClasses.textPrimary}` })
|
|
465
|
+
}
|
|
466
|
+
)
|
|
467
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
392
468
|
"button",
|
|
393
469
|
{
|
|
394
470
|
type: "button",
|
|
395
|
-
className:
|
|
471
|
+
className: `p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}
|
|
472
|
+
transition-colors focus:outline-none focus:ring-2
|
|
473
|
+
focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`,
|
|
396
474
|
onClick: handleTakeScreenshot,
|
|
397
|
-
children: isTakenScreenshot ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Camera, { weight: "bold", className:
|
|
475
|
+
children: isTakenScreenshot ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Camera, { weight: "bold", className: `w-6 h-6 ${themeClasses.iconColor}` })
|
|
398
476
|
}
|
|
399
477
|
)
|
|
400
478
|
] });
|
|
401
479
|
}
|
|
402
480
|
if (screenshot) {
|
|
403
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
481
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
482
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative group", children: [
|
|
483
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
484
|
+
"div",
|
|
485
|
+
{
|
|
486
|
+
className: `p-1 w-10 h-10 rounded-md border ${themeClasses.borderSecondary} flex
|
|
487
|
+
justify-end items-end relative overflow-hidden`,
|
|
488
|
+
style: {
|
|
489
|
+
backgroundImage: `url(${screenshot})`,
|
|
490
|
+
backgroundPosition: "center",
|
|
491
|
+
backgroundSize: "cover"
|
|
492
|
+
},
|
|
493
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors rounded-md" })
|
|
494
|
+
}
|
|
495
|
+
),
|
|
496
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
497
|
+
"button",
|
|
498
|
+
{
|
|
499
|
+
type: "button",
|
|
500
|
+
onClick: (e) => {
|
|
501
|
+
e.stopPropagation();
|
|
502
|
+
onScreenshotTook(null);
|
|
503
|
+
},
|
|
504
|
+
className: "absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10",
|
|
505
|
+
title: language === "nl" ? "Verwijderen" : "Delete",
|
|
506
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.X, { weight: "bold", className: "w-3 h-3 text-white" })
|
|
507
|
+
}
|
|
508
|
+
)
|
|
509
|
+
] }),
|
|
404
510
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
405
511
|
"button",
|
|
406
512
|
{
|
|
407
513
|
type: "button",
|
|
408
|
-
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 relative",
|
|
409
514
|
onClick: handleEditScreenshot,
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
}
|
|
415
|
-
title: language === "nl" ? "Klik om te bewerken" : "Click to edit",
|
|
416
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors rounded-md" })
|
|
417
|
-
}
|
|
418
|
-
),
|
|
419
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
420
|
-
"button",
|
|
421
|
-
{
|
|
422
|
-
type: "button",
|
|
423
|
-
onClick: (e) => {
|
|
424
|
-
e.stopPropagation();
|
|
425
|
-
onScreenshotTook(null);
|
|
426
|
-
},
|
|
427
|
-
className: "absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10",
|
|
428
|
-
title: language === "nl" ? "Verwijderen" : "Delete",
|
|
429
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.X, { weight: "bold", className: "w-3 h-3 text-white" })
|
|
515
|
+
className: `p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}
|
|
516
|
+
transition-colors focus:outline-none focus:ring-2
|
|
517
|
+
focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`,
|
|
518
|
+
title: language === "nl" ? "Bewerk screenshot" : "Edit screenshot",
|
|
519
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.PencilSimple, { weight: "bold", className: `w-5 h-5 ${themeClasses.textPrimary}` })
|
|
430
520
|
}
|
|
431
521
|
)
|
|
432
522
|
] });
|
|
@@ -435,9 +525,11 @@ function ScreenshotButton({
|
|
|
435
525
|
"button",
|
|
436
526
|
{
|
|
437
527
|
type: "button",
|
|
438
|
-
className:
|
|
528
|
+
className: `p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}
|
|
529
|
+
transitions-colors focus:outline-none focus:ring-2
|
|
530
|
+
focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`,
|
|
439
531
|
onClick: handleTakeScreenshot,
|
|
440
|
-
children: isTakenScreenshot ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Camera, { weight: "bold", className:
|
|
532
|
+
children: isTakenScreenshot ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Camera, { weight: "bold", className: `w-6 h-6 ${themeClasses.iconColor}` })
|
|
441
533
|
}
|
|
442
534
|
);
|
|
443
535
|
}
|
|
@@ -449,10 +541,12 @@ function FileUploadButton({
|
|
|
449
541
|
maxFileSize = DEFAULT_MAX_FILE_SIZE,
|
|
450
542
|
maxTotalSize = DEFAULT_MAX_TOTAL_SIZE,
|
|
451
543
|
acceptedTypes = "image/*,.pdf,.doc,.docx,.txt",
|
|
452
|
-
language = "en"
|
|
544
|
+
language = "en",
|
|
545
|
+
theme = "dark"
|
|
453
546
|
}) {
|
|
454
547
|
const fileInputRef = react$1.useRef(null);
|
|
455
548
|
const [error, setError] = react$1.useState(null);
|
|
549
|
+
const themeClasses = getThemeClasses(theme);
|
|
456
550
|
const translations2 = {
|
|
457
551
|
en: {
|
|
458
552
|
upload: "Upload file",
|
|
@@ -538,10 +632,12 @@ function FileUploadButton({
|
|
|
538
632
|
"button",
|
|
539
633
|
{
|
|
540
634
|
type: "button",
|
|
541
|
-
className:
|
|
635
|
+
className: `p-2 ${themeClasses.bgSecondary} rounded-md border-transparent ${themeClasses.bgHoverSecondary}
|
|
636
|
+
transitions-colors focus:outline-none focus:ring-2
|
|
637
|
+
focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500`,
|
|
542
638
|
onClick: handleButtonClick,
|
|
543
639
|
title: t.upload,
|
|
544
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Paperclip, { weight: "bold", className:
|
|
640
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Paperclip, { weight: "bold", className: `w-6 h-6 ${themeClasses.iconColor}` })
|
|
545
641
|
}
|
|
546
642
|
),
|
|
547
643
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -558,7 +654,7 @@ function FileUploadButton({
|
|
|
558
654
|
files.map((uploadedFile) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
559
655
|
"div",
|
|
560
656
|
{
|
|
561
|
-
className:
|
|
657
|
+
className: `flex items-center gap-1 ${themeClasses.bgSecondary} rounded-md px-2 py-1 text-xs`,
|
|
562
658
|
children: [
|
|
563
659
|
uploadedFile.preview ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
564
660
|
"img",
|
|
@@ -567,14 +663,14 @@ function FileUploadButton({
|
|
|
567
663
|
alt: uploadedFile.file.name,
|
|
568
664
|
className: "w-5 h-5 md:w-6 md:h-6 object-cover rounded flex-shrink-0"
|
|
569
665
|
}
|
|
570
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Paperclip, { className:
|
|
571
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className:
|
|
666
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.Paperclip, { className: `w-3 h-3 md:w-4 md:h-4 flex-shrink-0 ${themeClasses.iconColor}` }),
|
|
667
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `${themeClasses.textSecondary} max-w-[80px] md:max-w-[100px] truncate`, title: uploadedFile.file.name, children: uploadedFile.file.name }),
|
|
572
668
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
573
669
|
"button",
|
|
574
670
|
{
|
|
575
671
|
type: "button",
|
|
576
672
|
onClick: () => handleRemoveFile(uploadedFile.id),
|
|
577
|
-
className: "text-zinc-
|
|
673
|
+
className: `${themeClasses.textTertiary} ${theme === "dark" ? "hover:text-zinc-100" : "hover:text-gray-900"} transition-colors flex-shrink-0 touch-manipulation`,
|
|
578
674
|
title: t.remove,
|
|
579
675
|
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.X, { weight: "bold", className: "w-3 h-3 md:w-4 md:h-4" })
|
|
580
676
|
}
|
|
@@ -585,7 +681,7 @@ function FileUploadButton({
|
|
|
585
681
|
))
|
|
586
682
|
] }),
|
|
587
683
|
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-red-400", children: error }),
|
|
588
|
-
files.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("p", { className:
|
|
684
|
+
files.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: `text-xs ${themeClasses.textTertiary}`, children: [
|
|
589
685
|
files.length,
|
|
590
686
|
" ",
|
|
591
687
|
t.files,
|
|
@@ -1110,10 +1206,12 @@ function FeedbackContentStep({
|
|
|
1110
1206
|
onFeedbackSent,
|
|
1111
1207
|
integration,
|
|
1112
1208
|
githubConfig,
|
|
1113
|
-
language
|
|
1209
|
+
language,
|
|
1210
|
+
theme
|
|
1114
1211
|
}) {
|
|
1115
1212
|
const t = getTranslations(language);
|
|
1116
1213
|
const feedbackTypes = getFeedbackTypes(language);
|
|
1214
|
+
const themeClasses = getThemeClasses(theme);
|
|
1117
1215
|
const [screenshot, setScreenshot] = react$1.useState(null);
|
|
1118
1216
|
const [uploadedFiles, setUploadedFiles] = react$1.useState([]);
|
|
1119
1217
|
const feedbackTypeData = feedbackTypes[feedbackType];
|
|
@@ -1152,17 +1250,17 @@ function FeedbackContentStep({
|
|
|
1152
1250
|
}
|
|
1153
1251
|
}
|
|
1154
1252
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1155
|
-
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "relative w-full
|
|
1253
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "relative w-full", children: [
|
|
1156
1254
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1157
1255
|
"button",
|
|
1158
1256
|
{
|
|
1159
1257
|
type: "button",
|
|
1160
|
-
className:
|
|
1258
|
+
className: `absolute top-0 left-0 ${themeClasses.textTertiary} ${theme === "dark" ? "hover:text-zinc-100" : "hover:text-gray-900"} z-10 p-2 md:p-2.5`,
|
|
1161
1259
|
onClick: onFeedbackRestartRequest,
|
|
1162
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.ArrowLeft, { weight: "bold", className: "w-
|
|
1260
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(phosphorReact.ArrowLeft, { weight: "bold", className: "w-5 h-5 md:w-5 md:h-5" })
|
|
1163
1261
|
}
|
|
1164
1262
|
),
|
|
1165
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className:
|
|
1263
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: `text-lg md:text-xl leading-6 flex items-center gap-2 pl-10 md:pl-12 pr-10 md:pr-12 ${themeClasses.textPrimary}`, children: [
|
|
1166
1264
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1167
1265
|
"img",
|
|
1168
1266
|
{
|
|
@@ -1173,13 +1271,17 @@ function FeedbackContentStep({
|
|
|
1173
1271
|
),
|
|
1174
1272
|
feedbackTypeData.title
|
|
1175
1273
|
] }),
|
|
1176
|
-
/* @__PURE__ */ jsxRuntime.jsx(CloseButton, { className: "absolute top-
|
|
1274
|
+
/* @__PURE__ */ jsxRuntime.jsx(CloseButton, { className: "absolute top-0 right-0 p-2 md:p-2.5", title: t.form.closeButton, theme })
|
|
1177
1275
|
] }),
|
|
1178
1276
|
/* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmitFeedback, className: "my-3 md:my-4 w-full", children: [
|
|
1179
1277
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1180
1278
|
"textarea",
|
|
1181
1279
|
{
|
|
1182
|
-
className:
|
|
1280
|
+
className: `w-full min-h-[100px] md:min-h-[112px] text-sm
|
|
1281
|
+
${themeClasses.textPrimary} border-2 border-brand-500 bg-transparent rounded-md p-2 md:p-3
|
|
1282
|
+
${theme === "dark" ? "placeholder:text-zinc-400" : "placeholder:text-gray-500"}
|
|
1283
|
+
focus:border-brand-500 focus:ring-brand-500 focus:ring-1 resize-none focus:outline-none
|
|
1284
|
+
${theme === "dark" ? "scrollbar-thumb-zinc-700" : "scrollbar-thumb-gray-400"} scrollbar-track-transparent scrollbar-thin`,
|
|
1183
1285
|
placeholder: t.content.placeholder,
|
|
1184
1286
|
onChange: (e) => setComment(e.target.value)
|
|
1185
1287
|
}
|
|
@@ -1189,7 +1291,8 @@ function FeedbackContentStep({
|
|
|
1189
1291
|
{
|
|
1190
1292
|
files: uploadedFiles,
|
|
1191
1293
|
onFilesChanged: setUploadedFiles,
|
|
1192
|
-
language
|
|
1294
|
+
language,
|
|
1295
|
+
theme
|
|
1193
1296
|
}
|
|
1194
1297
|
) }),
|
|
1195
1298
|
/* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "flex gap-2 mt-3", children: [
|
|
@@ -1198,7 +1301,8 @@ function FeedbackContentStep({
|
|
|
1198
1301
|
{
|
|
1199
1302
|
screenshot,
|
|
1200
1303
|
onScreenshotTook: setScreenshot,
|
|
1201
|
-
language
|
|
1304
|
+
language,
|
|
1305
|
+
theme
|
|
1202
1306
|
}
|
|
1203
1307
|
),
|
|
1204
1308
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1206,7 +1310,11 @@ function FeedbackContentStep({
|
|
|
1206
1310
|
{
|
|
1207
1311
|
type: "submit",
|
|
1208
1312
|
disabled: comment.length === 0 || isSendingFeedback,
|
|
1209
|
-
className:
|
|
1313
|
+
className: `p-2 bg-brand-500 rounded-md border-transparent flex-1 justify-center
|
|
1314
|
+
items-center text-sm hover:bg-brand-300 focus:outline-none focus:ring-2
|
|
1315
|
+
focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500
|
|
1316
|
+
transition-colors disabled:opacity-50 disabled:cursor-not-allowed
|
|
1317
|
+
disabled:hover:bg-brand-500 flex text-white`,
|
|
1210
1318
|
children: isSendingFeedback ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : t.content.sendButton
|
|
1211
1319
|
}
|
|
1212
1320
|
)
|
|
@@ -1214,22 +1322,23 @@ function FeedbackContentStep({
|
|
|
1214
1322
|
] })
|
|
1215
1323
|
] });
|
|
1216
1324
|
}
|
|
1217
|
-
function FeedbackSuccessStep({ onFeedbackRestartRequest, language }) {
|
|
1325
|
+
function FeedbackSuccessStep({ onFeedbackRestartRequest, language, theme }) {
|
|
1218
1326
|
const t = getTranslations(language);
|
|
1327
|
+
const themeClasses = getThemeClasses(theme);
|
|
1219
1328
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1220
|
-
/* @__PURE__ */ jsxRuntime.jsx("header", { children: /* @__PURE__ */ jsxRuntime.jsx(CloseButton, { title: t.form.closeButton }) }),
|
|
1329
|
+
/* @__PURE__ */ jsxRuntime.jsx("header", { children: /* @__PURE__ */ jsxRuntime.jsx(CloseButton, { title: t.form.closeButton, theme }) }),
|
|
1221
1330
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center py-8 md:py-10 w-full max-w-[304px] px-2", children: [
|
|
1222
1331
|
/* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "41", height: "40", viewBox: "0 0 41 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "w-10 h-10 md:w-[41px] md:h-[40px]", children: [
|
|
1223
1332
|
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M38.5 34C38.5 36.209 36.709 38 34.5 38H6.5C4.291 38 2.5 36.209 2.5 34V6C2.5 3.791 4.291 2 6.5 2H34.5C36.709 2 38.5 3.791 38.5 6V34Z", fill: "#77B255" }),
|
|
1224
1333
|
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M31.78 8.36202C30.624 7.61102 29.076 7.94002 28.322 9.09802L17.436 25.877L12.407 21.227C11.393 20.289 9.81103 20.352 8.87403 21.365C7.93703 22.379 7.99903 23.961 9.01303 24.898L16.222 31.564C16.702 32.009 17.312 32.229 17.918 32.229C18.591 32.229 19.452 31.947 20.017 31.09C20.349 30.584 32.517 11.82 32.517 11.82C33.268 10.661 32.938 9.11302 31.78 8.36202Z", fill: "white" })
|
|
1225
1334
|
] }),
|
|
1226
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className:
|
|
1335
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-lg md:text-xl mt-2 text-center ${themeClasses.textPrimary}`, children: t.success.message }),
|
|
1227
1336
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1228
1337
|
"button",
|
|
1229
1338
|
{
|
|
1230
1339
|
type: "button",
|
|
1231
1340
|
onClick: onFeedbackRestartRequest,
|
|
1232
|
-
className:
|
|
1341
|
+
className: `py-2 px-6 mt-6 ${themeClasses.buttonSecondary} rounded-md border-transparent text-sm leading-6 focus:outline-none focus:ring-2 focus:ring-offset-2 ${themeClasses.focusRingOffset} focus:ring-brand-500 transition-colors`,
|
|
1233
1342
|
children: t.success.sendAnother
|
|
1234
1343
|
}
|
|
1235
1344
|
)
|
|
@@ -1262,15 +1371,16 @@ function getFeedbackTypes(language = "en") {
|
|
|
1262
1371
|
}
|
|
1263
1372
|
};
|
|
1264
1373
|
}
|
|
1265
|
-
function WidgetForm({ integration, githubConfig, language }) {
|
|
1374
|
+
function WidgetForm({ integration, githubConfig, language, theme }) {
|
|
1266
1375
|
const [feedbackType, setFeedbackType] = react$1.useState(null);
|
|
1267
1376
|
const [feedbackSent, setFeedbackSent] = react$1.useState(false);
|
|
1377
|
+
const themeClasses = getThemeClasses(theme);
|
|
1268
1378
|
function handleRestartFeedback() {
|
|
1269
1379
|
setFeedbackSent(false);
|
|
1270
1380
|
setFeedbackType(null);
|
|
1271
1381
|
}
|
|
1272
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
1273
|
-
feedbackSent ? /* @__PURE__ */ jsxRuntime.jsx(FeedbackSuccessStep, { onFeedbackRestartRequest: handleRestartFeedback, language }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: !feedbackType ? /* @__PURE__ */ jsxRuntime.jsx(FeedbackTypeStep, { onFeedbackTypeChanged: setFeedbackType, language }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1382
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${themeClasses.bgPrimary} p-3 md:p-4 relative rounded-2xl mb-4 flex flex-col items-center shadow-lg w-[calc(100vw-2rem)] md:w-auto md:min-w-[384px] max-w-md`, children: [
|
|
1383
|
+
feedbackSent ? /* @__PURE__ */ jsxRuntime.jsx(FeedbackSuccessStep, { onFeedbackRestartRequest: handleRestartFeedback, language, theme }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: !feedbackType ? /* @__PURE__ */ jsxRuntime.jsx(FeedbackTypeStep, { onFeedbackTypeChanged: setFeedbackType, language, theme }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1274
1384
|
FeedbackContentStep,
|
|
1275
1385
|
{
|
|
1276
1386
|
feedbackType,
|
|
@@ -1278,10 +1388,11 @@ function WidgetForm({ integration, githubConfig, language }) {
|
|
|
1278
1388
|
onFeedbackSent: () => setFeedbackSent(true),
|
|
1279
1389
|
integration,
|
|
1280
1390
|
githubConfig,
|
|
1281
|
-
language
|
|
1391
|
+
language,
|
|
1392
|
+
theme
|
|
1282
1393
|
}
|
|
1283
1394
|
) }),
|
|
1284
|
-
/* @__PURE__ */ jsxRuntime.jsx("footer", { className:
|
|
1395
|
+
/* @__PURE__ */ jsxRuntime.jsx("footer", { className: `text-xs ${themeClasses.textMuted} mt-2`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1285
1396
|
"a",
|
|
1286
1397
|
{
|
|
1287
1398
|
className: "underline underline-offset-2",
|
|
@@ -1299,13 +1410,25 @@ function getDefaultLanguage() {
|
|
|
1299
1410
|
}
|
|
1300
1411
|
return "en";
|
|
1301
1412
|
}
|
|
1413
|
+
function isWidgetEnabled() {
|
|
1414
|
+
if (typeof process !== "undefined" && process.env.NEXT_PUBLIC_FEEDBACK_ENABLED !== void 0) {
|
|
1415
|
+
const enabled = process.env.NEXT_PUBLIC_FEEDBACK_ENABLED.toLowerCase();
|
|
1416
|
+
return enabled !== "false" && enabled !== "0";
|
|
1417
|
+
}
|
|
1418
|
+
return true;
|
|
1419
|
+
}
|
|
1302
1420
|
function Widget({
|
|
1303
1421
|
integration,
|
|
1304
1422
|
githubConfig,
|
|
1305
1423
|
position = "bottom-right",
|
|
1306
|
-
language
|
|
1424
|
+
language,
|
|
1425
|
+
theme
|
|
1307
1426
|
}) {
|
|
1427
|
+
if (!isWidgetEnabled()) {
|
|
1428
|
+
return null;
|
|
1429
|
+
}
|
|
1308
1430
|
const finalLanguage = language || getDefaultLanguage();
|
|
1431
|
+
const finalTheme = theme || getDefaultTheme();
|
|
1309
1432
|
const t = getTranslations(finalLanguage);
|
|
1310
1433
|
const positionClasses = {
|
|
1311
1434
|
"bottom-right": "bottom-4 right-4 md:bottom-8 md:right-8",
|
|
@@ -1313,14 +1436,18 @@ function Widget({
|
|
|
1313
1436
|
"top-right": "top-4 right-4 md:top-8 md:right-8",
|
|
1314
1437
|
"top-left": "top-4 left-4 md:top-8 md:left-4"
|
|
1315
1438
|
};
|
|
1316
|
-
const
|
|
1317
|
-
|
|
1318
|
-
|
|
1439
|
+
const isTop = position.includes("top");
|
|
1440
|
+
const isLeft = position.includes("left");
|
|
1441
|
+
const panelPositionClass = isTop ? "absolute top-full mt-2" : "absolute bottom-full mb-2";
|
|
1442
|
+
const panelAlignmentClass = isLeft ? "left-0" : "right-0";
|
|
1443
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-feedback-widget": "true", className: `fixed ${positionClasses[position]} z-50`, children: /* @__PURE__ */ jsxRuntime.jsxs(react.Popover, { className: "relative", children: [
|
|
1444
|
+
/* @__PURE__ */ jsxRuntime.jsx(react.Popover.Panel, { className: `${panelPositionClass} ${panelAlignmentClass}`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1319
1445
|
WidgetForm,
|
|
1320
1446
|
{
|
|
1321
1447
|
integration,
|
|
1322
1448
|
githubConfig,
|
|
1323
|
-
language: finalLanguage
|
|
1449
|
+
language: finalLanguage,
|
|
1450
|
+
theme: finalTheme
|
|
1324
1451
|
}
|
|
1325
1452
|
) }),
|
|
1326
1453
|
/* @__PURE__ */ jsxRuntime.jsxs(react.Popover.Button, { className: "bg-brand-500 rounded-full px-3 md:px-3 h-12 text-white flex items-center group focus:outline-none shadow-lg hover:shadow-xl transition-shadow", children: [
|
|
@@ -1330,7 +1457,7 @@ function Widget({
|
|
|
1330
1457
|
t.widget.button
|
|
1331
1458
|
] })
|
|
1332
1459
|
] })
|
|
1333
|
-
] });
|
|
1460
|
+
] }) });
|
|
1334
1461
|
}
|
|
1335
1462
|
|
|
1336
1463
|
exports.Widget = Widget;
|