pulse-feedback-widget 1.3.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/PulseWidget.d.ts +3 -2
  2. package/dist/PulseWidget.d.ts.map +1 -1
  3. package/dist/PulseWidget.mjs +28 -15
  4. package/dist/PulseWidget.mjs.map +1 -1
  5. package/dist/components/ConversationView.d.ts +3 -1
  6. package/dist/components/ConversationView.d.ts.map +1 -1
  7. package/dist/components/ConversationView.mjs +4 -17
  8. package/dist/components/ConversationView.mjs.map +1 -1
  9. package/dist/components/FeedbackForm.d.ts +3 -1
  10. package/dist/components/FeedbackForm.d.ts.map +1 -1
  11. package/dist/components/FeedbackForm.mjs +7 -7
  12. package/dist/components/FeedbackForm.mjs.map +1 -1
  13. package/dist/components/FeedbackPanel.d.ts +9 -1
  14. package/dist/components/FeedbackPanel.d.ts.map +1 -1
  15. package/dist/components/FeedbackPanel.mjs +12 -5
  16. package/dist/components/FeedbackPanel.mjs.map +1 -1
  17. package/dist/components/FeedbackPanel.module.css.mjs +1 -1
  18. package/dist/components/ImagePicker.d.ts +4 -1
  19. package/dist/components/ImagePicker.d.ts.map +1 -1
  20. package/dist/components/ImagePicker.mjs +8 -2
  21. package/dist/components/ImagePicker.mjs.map +1 -1
  22. package/dist/components/ImagePicker.module.css.mjs +2 -2
  23. package/dist/components/ScreenshotEditor.d.ts +10 -0
  24. package/dist/components/ScreenshotEditor.d.ts.map +1 -0
  25. package/dist/components/ScreenshotEditor.mjs +146 -0
  26. package/dist/components/ScreenshotEditor.mjs.map +1 -0
  27. package/dist/components/ScreenshotEditor.module.css.mjs +8 -0
  28. package/dist/components/ScreenshotEditor.module.css.mjs.map +1 -0
  29. package/dist/components/SuccessState.d.ts +3 -1
  30. package/dist/components/SuccessState.d.ts.map +1 -1
  31. package/dist/components/SuccessState.mjs +2 -2
  32. package/dist/components/SuccessState.mjs.map +1 -1
  33. package/dist/components/ThreadList.d.ts +3 -1
  34. package/dist/components/ThreadList.d.ts.map +1 -1
  35. package/dist/components/ThreadList.mjs +5 -19
  36. package/dist/components/ThreadList.mjs.map +1 -1
  37. package/dist/components/TriggerButton.d.ts +6 -1
  38. package/dist/components/TriggerButton.d.ts.map +1 -1
  39. package/dist/components/TriggerButton.mjs +9 -2
  40. package/dist/components/TriggerButton.mjs.map +1 -1
  41. package/dist/components/TriggerButton.module.css.mjs +1 -1
  42. package/dist/components/TypeSelector.d.ts +3 -1
  43. package/dist/components/TypeSelector.d.ts.map +1 -1
  44. package/dist/components/TypeSelector.mjs +9 -2
  45. package/dist/components/TypeSelector.mjs.map +1 -1
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/lib/canvas-tools.d.ts +15 -0
  49. package/dist/lib/canvas-tools.d.ts.map +1 -0
  50. package/dist/lib/canvas-tools.mjs +64 -0
  51. package/dist/lib/canvas-tools.mjs.map +1 -0
  52. package/dist/lib/i18n.d.ts +40 -0
  53. package/dist/lib/i18n.d.ts.map +1 -0
  54. package/dist/lib/i18n.mjs +34 -0
  55. package/dist/lib/i18n.mjs.map +1 -0
  56. package/dist/locales/en.d.ts +4 -0
  57. package/dist/locales/en.d.ts.map +1 -0
  58. package/dist/locales/en.mjs +48 -0
  59. package/dist/locales/en.mjs.map +1 -0
  60. package/dist/locales/ko.d.ts +4 -0
  61. package/dist/locales/ko.d.ts.map +1 -0
  62. package/dist/locales/ko.mjs +48 -0
  63. package/dist/locales/ko.mjs.map +1 -0
  64. package/dist/pulse-widget.iife.js +56 -0
  65. package/dist/pulse-widget.iife.js.map +1 -0
  66. package/dist/standalone.d.ts +2 -0
  67. package/dist/standalone.d.ts.map +1 -0
  68. package/dist/types.d.ts +18 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.mjs.map +1 -1
  71. package/package.json +9 -3
@@ -0,0 +1,34 @@
1
+ import en from '../locales/en.mjs';
2
+ import ko from '../locales/ko.mjs';
3
+
4
+ const LOCALE_MAP = { en, ko };
5
+ function createTranslations(locale) {
6
+ const resolvedLocale = locale || detectLocale();
7
+ return LOCALE_MAP[resolvedLocale] || en;
8
+ }
9
+ function detectLocale() {
10
+ if (typeof navigator === 'undefined')
11
+ return 'en';
12
+ const lang = navigator.language.split('-')[0];
13
+ if (lang === 'ko')
14
+ return 'ko';
15
+ return 'en';
16
+ }
17
+ function formatTimeAgo(dateStr, t) {
18
+ const diff = Date.now() - new Date(dateStr).getTime();
19
+ const mins = Math.floor(diff / 60000);
20
+ if (mins < 1)
21
+ return t.timeJustNow;
22
+ if (mins < 60)
23
+ return t.timeMinutesAgo.replace('{n}', String(mins));
24
+ const hours = Math.floor(mins / 60);
25
+ if (hours < 24)
26
+ return t.timeHoursAgo.replace('{n}', String(hours));
27
+ const days = Math.floor(hours / 24);
28
+ if (days < 30)
29
+ return t.timeDaysAgo.replace('{n}', String(days));
30
+ return new Date(dateStr).toLocaleDateString();
31
+ }
32
+
33
+ export { createTranslations, formatTimeAgo };
34
+ //# sourceMappingURL=i18n.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.mjs","sources":["../../src/lib/i18n.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AA2DA,MAAM,UAAU,GAAiC,EAAE,EAAE,EAAE,EAAE,EAAE;AAErD,SAAU,kBAAkB,CAAC,MAAe,EAAA;AAChD,IAAA,MAAM,cAAc,GAAG,MAAM,IAAI,YAAY,EAAE;AAC/C,IAAA,OAAO,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE;AACzC;AAEA,SAAS,YAAY,GAAA;IACnB,IAAI,OAAO,SAAS,KAAK,WAAW;AAAE,QAAA,OAAO,IAAI;AACjD,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;AAC9B,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,aAAa,CAAC,OAAe,EAAE,CAAe,EAAA;AAC5D,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;IACrC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,WAAW;IAClC,IAAI,IAAI,GAAG,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;IACnC,IAAI,KAAK,GAAG,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;IACnC,IAAI,IAAI,GAAG,EAAE;AAAE,QAAA,OAAO,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE;AAC/C;;;;"}
@@ -0,0 +1,4 @@
1
+ import type { Translations } from '../lib/i18n';
2
+ declare const en: Translations;
3
+ export default en;
4
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,QAAA,MAAM,EAAE,EAAE,YAoDT,CAAC;AAEF,eAAe,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ const en = {
2
+ // Tabs
3
+ tabNew: 'New',
4
+ tabMyThreads: 'My Threads',
5
+ // FeedbackForm
6
+ labelType: 'Type',
7
+ labelMessage: 'Message',
8
+ labelName: 'Name (optional)',
9
+ labelEmail: 'Email (optional)',
10
+ placeholderName: 'Your name',
11
+ placeholderEmail: 'you@example.com',
12
+ emailError: 'Please enter a valid email',
13
+ submitError: "Couldn't send — please try again.",
14
+ btnUploading: 'Uploading...',
15
+ btnSending: 'Sending...',
16
+ btnSendFeedback: 'Send Feedback',
17
+ // TypeSelector
18
+ typeBug: 'Bug',
19
+ typeFeature: 'Feature',
20
+ typeQuestion: 'Question',
21
+ typePraise: 'Praise',
22
+ typeOther: 'Other',
23
+ // SuccessState
24
+ successTitle: 'Thanks for your feedback!',
25
+ successSubtitle: "We'll look into this.",
26
+ successSendAnother: 'Send another',
27
+ // ThreadList
28
+ threadListLoading: 'Loading...',
29
+ threadListEmpty: 'No feedback yet. Send your first one!',
30
+ // ConversationView
31
+ btnBack: 'Back',
32
+ replyPlaceholder: 'Type a reply...',
33
+ senderDeveloper: 'Developer',
34
+ senderYou: 'You',
35
+ // ImagePicker
36
+ attachImages: 'Attach images',
37
+ // ScreenshotEditor
38
+ editorDone: 'Done',
39
+ editorCancel: 'Cancel',
40
+ // Time
41
+ timeJustNow: 'just now',
42
+ timeMinutesAgo: '{n}m ago',
43
+ timeHoursAgo: '{n}h ago',
44
+ timeDaysAgo: '{n}d ago',
45
+ };
46
+
47
+ export { en as default };
48
+ //# sourceMappingURL=en.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.mjs","sources":["../../src/locales/en.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA,MAAM,EAAE,GAAiB;;AAEvB,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,YAAY,EAAE,YAAY;;AAG1B,IAAA,SAAS,EAAE,MAAM;AACjB,IAAA,YAAY,EAAE,SAAS;AACvB,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,UAAU,EAAE,kBAAkB;AAC9B,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,gBAAgB,EAAE,iBAAiB;AACnC,IAAA,UAAU,EAAE,4BAA4B;AACxC,IAAA,WAAW,EAAE,mCAAmC;AAChD,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,eAAe,EAAE,eAAe;;AAGhC,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,YAAY,EAAE,UAAU;AACxB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,SAAS,EAAE,OAAO;;AAGlB,IAAA,YAAY,EAAE,2BAA2B;AACzC,IAAA,eAAe,EAAE,uBAAuB;AACxC,IAAA,kBAAkB,EAAE,cAAc;;AAGlC,IAAA,iBAAiB,EAAE,YAAY;AAC/B,IAAA,eAAe,EAAE,uCAAuC;;AAGxD,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,gBAAgB,EAAE,iBAAiB;AACnC,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,SAAS,EAAE,KAAK;;AAGhB,IAAA,YAAY,EAAE,eAAe;;AAG7B,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,YAAY,EAAE,QAAQ;;AAGtB,IAAA,WAAW,EAAE,UAAU;AACvB,IAAA,cAAc,EAAE,UAAU;AAC1B,IAAA,YAAY,EAAE,UAAU;AACxB,IAAA,WAAW,EAAE,UAAU;;;;;"}
@@ -0,0 +1,4 @@
1
+ import type { Translations } from '../lib/i18n';
2
+ declare const ko: Translations;
3
+ export default ko;
4
+ //# sourceMappingURL=ko.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../src/locales/ko.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,QAAA,MAAM,EAAE,EAAE,YAoDT,CAAC;AAEF,eAAe,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ const ko = {
2
+ // Tabs
3
+ tabNew: '새 피드백',
4
+ tabMyThreads: '내 대화',
5
+ // FeedbackForm
6
+ labelType: '유형',
7
+ labelMessage: '메시지',
8
+ labelName: '이름 (선택)',
9
+ labelEmail: '이메일 (선택)',
10
+ placeholderName: '이름을 입력하세요',
11
+ placeholderEmail: 'you@example.com',
12
+ emailError: '올바른 이메일을 입력해주세요',
13
+ submitError: '전송에 실패했습니다. 다시 시도해주세요.',
14
+ btnUploading: '업로드 중...',
15
+ btnSending: '전송 중...',
16
+ btnSendFeedback: '피드백 보내기',
17
+ // TypeSelector
18
+ typeBug: '버그',
19
+ typeFeature: '기능 요청',
20
+ typeQuestion: '질문',
21
+ typePraise: '칭찬',
22
+ typeOther: '기타',
23
+ // SuccessState
24
+ successTitle: '피드백을 보내주셔서 감사합니다!',
25
+ successSubtitle: '확인 후 답변드리겠습니다.',
26
+ successSendAnother: '다른 피드백 보내기',
27
+ // ThreadList
28
+ threadListLoading: '로딩 중...',
29
+ threadListEmpty: '아직 피드백이 없습니다. 첫 번째 피드백을 보내보세요!',
30
+ // ConversationView
31
+ btnBack: '뒤로',
32
+ replyPlaceholder: '답글을 입력하세요...',
33
+ senderDeveloper: '개발자',
34
+ senderYou: '나',
35
+ // ImagePicker
36
+ attachImages: '이미지 첨부',
37
+ // ScreenshotEditor
38
+ editorDone: '완료',
39
+ editorCancel: '취소',
40
+ // Time
41
+ timeJustNow: '방금',
42
+ timeMinutesAgo: '{n}분 전',
43
+ timeHoursAgo: '{n}시간 전',
44
+ timeDaysAgo: '{n}일 전',
45
+ };
46
+
47
+ export { ko as default };
48
+ //# sourceMappingURL=ko.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ko.mjs","sources":["../../src/locales/ko.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA,MAAM,EAAE,GAAiB;;AAEvB,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,YAAY,EAAE,MAAM;;AAGpB,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,UAAU,EAAE,UAAU;AACtB,IAAA,eAAe,EAAE,WAAW;AAC5B,IAAA,gBAAgB,EAAE,iBAAiB;AACnC,IAAA,UAAU,EAAE,iBAAiB;AAC7B,IAAA,WAAW,EAAE,wBAAwB;AACrC,IAAA,YAAY,EAAE,UAAU;AACxB,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,eAAe,EAAE,SAAS;;AAG1B,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,WAAW,EAAE,OAAO;AACpB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,SAAS,EAAE,IAAI;;AAGf,IAAA,YAAY,EAAE,mBAAmB;AACjC,IAAA,eAAe,EAAE,gBAAgB;AACjC,IAAA,kBAAkB,EAAE,YAAY;;AAGhC,IAAA,iBAAiB,EAAE,SAAS;AAC5B,IAAA,eAAe,EAAE,gCAAgC;;AAGjD,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,gBAAgB,EAAE,cAAc;AAChC,IAAA,eAAe,EAAE,KAAK;AACtB,IAAA,SAAS,EAAE,GAAG;;AAGd,IAAA,YAAY,EAAE,QAAQ;;AAGtB,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,YAAY,EAAE,IAAI;;AAGlB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,YAAY,EAAE,SAAS;AACvB,IAAA,WAAW,EAAE,QAAQ;;;;;"}