pulse-feedback-widget 2.0.0 → 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 (62) hide show
  1. package/dist/PulseWidget.d.ts.map +1 -1
  2. package/dist/PulseWidget.mjs +4 -2
  3. package/dist/PulseWidget.mjs.map +1 -1
  4. package/dist/components/ConversationView.d.ts +3 -1
  5. package/dist/components/ConversationView.d.ts.map +1 -1
  6. package/dist/components/ConversationView.mjs +4 -17
  7. package/dist/components/ConversationView.mjs.map +1 -1
  8. package/dist/components/FeedbackForm.d.ts +3 -1
  9. package/dist/components/FeedbackForm.d.ts.map +1 -1
  10. package/dist/components/FeedbackForm.mjs +7 -7
  11. package/dist/components/FeedbackForm.mjs.map +1 -1
  12. package/dist/components/FeedbackPanel.d.ts +3 -1
  13. package/dist/components/FeedbackPanel.d.ts.map +1 -1
  14. package/dist/components/FeedbackPanel.mjs +5 -5
  15. package/dist/components/FeedbackPanel.mjs.map +1 -1
  16. package/dist/components/ImagePicker.d.ts +4 -1
  17. package/dist/components/ImagePicker.d.ts.map +1 -1
  18. package/dist/components/ImagePicker.mjs +8 -2
  19. package/dist/components/ImagePicker.mjs.map +1 -1
  20. package/dist/components/ImagePicker.module.css.mjs +2 -2
  21. package/dist/components/ScreenshotEditor.d.ts +10 -0
  22. package/dist/components/ScreenshotEditor.d.ts.map +1 -0
  23. package/dist/components/ScreenshotEditor.mjs +146 -0
  24. package/dist/components/ScreenshotEditor.mjs.map +1 -0
  25. package/dist/components/ScreenshotEditor.module.css.mjs +8 -0
  26. package/dist/components/ScreenshotEditor.module.css.mjs.map +1 -0
  27. package/dist/components/SuccessState.d.ts +3 -1
  28. package/dist/components/SuccessState.d.ts.map +1 -1
  29. package/dist/components/SuccessState.mjs +2 -2
  30. package/dist/components/SuccessState.mjs.map +1 -1
  31. package/dist/components/ThreadList.d.ts +3 -1
  32. package/dist/components/ThreadList.d.ts.map +1 -1
  33. package/dist/components/ThreadList.mjs +5 -19
  34. package/dist/components/ThreadList.mjs.map +1 -1
  35. package/dist/components/TypeSelector.d.ts +3 -1
  36. package/dist/components/TypeSelector.d.ts.map +1 -1
  37. package/dist/components/TypeSelector.mjs +9 -2
  38. package/dist/components/TypeSelector.mjs.map +1 -1
  39. package/dist/lib/canvas-tools.d.ts +15 -0
  40. package/dist/lib/canvas-tools.d.ts.map +1 -0
  41. package/dist/lib/canvas-tools.mjs +64 -0
  42. package/dist/lib/canvas-tools.mjs.map +1 -0
  43. package/dist/lib/i18n.d.ts +40 -0
  44. package/dist/lib/i18n.d.ts.map +1 -0
  45. package/dist/lib/i18n.mjs +34 -0
  46. package/dist/lib/i18n.mjs.map +1 -0
  47. package/dist/locales/en.d.ts +4 -0
  48. package/dist/locales/en.d.ts.map +1 -0
  49. package/dist/locales/en.mjs +48 -0
  50. package/dist/locales/en.mjs.map +1 -0
  51. package/dist/locales/ko.d.ts +4 -0
  52. package/dist/locales/ko.d.ts.map +1 -0
  53. package/dist/locales/ko.mjs +48 -0
  54. package/dist/locales/ko.mjs.map +1 -0
  55. package/dist/pulse-widget.iife.js +56 -0
  56. package/dist/pulse-widget.iife.js.map +1 -0
  57. package/dist/standalone.d.ts +2 -0
  58. package/dist/standalone.d.ts.map +1 -0
  59. package/dist/types.d.ts +2 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/types.mjs.map +1 -1
  62. package/package.json +9 -3
@@ -0,0 +1,146 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useRef, useState, useEffect, useCallback } from 'react';
3
+ import { drawFreehand, drawRect, drawText, blurRegion } from '../lib/canvas-tools.mjs';
4
+ import styles from './ScreenshotEditor.module.css.mjs';
5
+
6
+ function ScreenshotEditor({ imageUrl, t, onDone, onCancel }) {
7
+ const canvasRef = useRef(null);
8
+ const imageRef = useRef(null);
9
+ const [tool, setTool] = useState('draw');
10
+ const [isDrawing, setIsDrawing] = useState(false);
11
+ const [currentPoints, setCurrentPoints] = useState([]);
12
+ const [startPoint, setStartPoint] = useState(null);
13
+ const [actions, setActions] = useState([]);
14
+ const [textInput, setTextInput] = useState('');
15
+ const [textPos, setTextPos] = useState(null);
16
+ const COLOR = '#EF4444';
17
+ const LINE_WIDTH = 3;
18
+ // Load image
19
+ useEffect(() => {
20
+ const img = new Image();
21
+ img.onload = () => {
22
+ imageRef.current = img;
23
+ const canvas = canvasRef.current;
24
+ if (!canvas)
25
+ return;
26
+ canvas.width = img.width;
27
+ canvas.height = img.height;
28
+ redraw();
29
+ };
30
+ img.src = imageUrl;
31
+ }, [imageUrl]);
32
+ const redraw = useCallback(() => {
33
+ const canvas = canvasRef.current;
34
+ const ctx = canvas?.getContext('2d');
35
+ const img = imageRef.current;
36
+ if (!canvas || !ctx || !img)
37
+ return;
38
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
39
+ ctx.drawImage(img, 0, 0);
40
+ for (const action of actions) {
41
+ if (action.tool === 'draw' && action.points) {
42
+ drawFreehand(ctx, action.points, COLOR, LINE_WIDTH);
43
+ }
44
+ else if (action.tool === 'rect' && action.rect) {
45
+ drawRect(ctx, action.rect, COLOR, LINE_WIDTH);
46
+ }
47
+ else if (action.tool === 'text' && action.text && action.pos) {
48
+ drawText(ctx, action.pos, action.text, COLOR, 16);
49
+ }
50
+ else if (action.tool === 'blur' && action.rect) {
51
+ blurRegion(ctx, action.rect);
52
+ }
53
+ }
54
+ }, [actions]);
55
+ useEffect(() => { redraw(); }, [redraw]);
56
+ function getCanvasPoint(e) {
57
+ const canvas = canvasRef.current;
58
+ const rect = canvas.getBoundingClientRect();
59
+ const scaleX = canvas.width / rect.width;
60
+ const scaleY = canvas.height / rect.height;
61
+ return {
62
+ x: (e.clientX - rect.left) * scaleX,
63
+ y: (e.clientY - rect.top) * scaleY,
64
+ };
65
+ }
66
+ function handleMouseDown(e) {
67
+ const pt = getCanvasPoint(e);
68
+ if (tool === 'text') {
69
+ setTextPos(pt);
70
+ return;
71
+ }
72
+ setIsDrawing(true);
73
+ setStartPoint(pt);
74
+ if (tool === 'draw') {
75
+ setCurrentPoints([pt]);
76
+ }
77
+ }
78
+ function handleMouseMove(e) {
79
+ if (!isDrawing)
80
+ return;
81
+ const pt = getCanvasPoint(e);
82
+ if (tool === 'draw') {
83
+ setCurrentPoints((prev) => [...prev, pt]);
84
+ // Live preview
85
+ const ctx = canvasRef.current?.getContext('2d');
86
+ if (ctx) {
87
+ redraw();
88
+ drawFreehand(ctx, [...currentPoints, pt], COLOR, LINE_WIDTH);
89
+ }
90
+ }
91
+ else if ((tool === 'rect' || tool === 'blur') && startPoint) {
92
+ const ctx = canvasRef.current?.getContext('2d');
93
+ if (ctx) {
94
+ redraw();
95
+ const rect = { x: startPoint.x, y: startPoint.y, w: pt.x - startPoint.x, h: pt.y - startPoint.y };
96
+ if (tool === 'rect') {
97
+ drawRect(ctx, rect, COLOR, LINE_WIDTH);
98
+ }
99
+ else {
100
+ drawRect(ctx, rect, '#888', 1);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ function handleMouseUp(e) {
106
+ if (!isDrawing)
107
+ return;
108
+ setIsDrawing(false);
109
+ const pt = getCanvasPoint(e);
110
+ if (tool === 'draw' && currentPoints.length > 1) {
111
+ setActions((prev) => [...prev, { tool: 'draw', points: [...currentPoints, pt] }]);
112
+ }
113
+ else if ((tool === 'rect' || tool === 'blur') && startPoint) {
114
+ const rect = { x: startPoint.x, y: startPoint.y, w: pt.x - startPoint.x, h: pt.y - startPoint.y };
115
+ setActions((prev) => [...prev, { tool, rect }]);
116
+ }
117
+ setCurrentPoints([]);
118
+ setStartPoint(null);
119
+ }
120
+ function handleTextSubmit() {
121
+ if (!textInput.trim() || !textPos)
122
+ return;
123
+ setActions((prev) => [...prev, { tool: 'text', text: textInput.trim(), pos: textPos }]);
124
+ setTextInput('');
125
+ setTextPos(null);
126
+ }
127
+ function handleUndo() {
128
+ setActions((prev) => prev.slice(0, -1));
129
+ }
130
+ function handleDone() {
131
+ const canvas = canvasRef.current;
132
+ if (!canvas)
133
+ return;
134
+ canvas.toBlob((blob) => {
135
+ if (blob)
136
+ onDone(blob);
137
+ }, 'image/png');
138
+ }
139
+ return (jsxs("div", { className: styles.editor, children: [jsxs("div", { className: styles.toolbar, children: [['draw', 'rect', 'blur', 'text'].map((t) => (jsx("button", { type: "button", className: `${styles.toolBtn} ${tool === t ? styles.toolActive : ''}`, onClick: () => setTool(t), children: t === 'draw' ? '✏️' : t === 'rect' ? '▭' : t === 'blur' ? '🔲' : 'T' }, t))), jsx("button", { type: "button", className: styles.toolBtn, onClick: handleUndo, disabled: actions.length === 0, children: "\u21A9" }), jsx("div", { className: styles.spacer }), jsx("button", { type: "button", className: styles.cancelBtn, onClick: onCancel, children: t.editorCancel }), jsx("button", { type: "button", className: styles.doneBtn, onClick: handleDone, children: t.editorDone })] }), textPos && (jsxs("div", { className: styles.textInputWrap, style: { left: 0, top: 0 }, children: [jsx("input", { className: styles.textInput, value: textInput, onChange: (e) => setTextInput(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter')
140
+ handleTextSubmit(); if (e.key === 'Escape')
141
+ setTextPos(null); }, placeholder: "Type text...", autoFocus: true }), jsx("button", { type: "button", className: styles.textOk, onClick: handleTextSubmit, children: "OK" })] })), jsx("div", { className: styles.canvasWrap, children: jsx("canvas", { ref: canvasRef, className: styles.canvas, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseUp: handleMouseUp, onMouseLeave: () => { if (isDrawing)
142
+ handleMouseUp({ clientX: 0, clientY: 0 }); } }) })] }));
143
+ }
144
+
145
+ export { ScreenshotEditor };
146
+ //# sourceMappingURL=ScreenshotEditor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenshotEditor.mjs","sources":["../../src/components/ScreenshotEditor.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../node_modules/style-inject/dist/style-inject.es.mjs';
2
+
3
+ var css_248z = ".ScreenshotEditor-module_editor__PVGL-{background:rgba(0,0,0,.85);display:flex;flex-direction:column;inset:0;position:fixed;z-index:100000}.ScreenshotEditor-module_toolbar__oKXCg{align-items:center;background:#1a1a1a;display:flex;gap:6px;padding:8px 12px}.ScreenshotEditor-module_toolBtn__RPYjF{align-items:center;background:#2a2a2a;border:1px solid #444;border-radius:4px;color:#ddd;cursor:pointer;display:flex;font-size:14px;height:32px;justify-content:center;width:32px}.ScreenshotEditor-module_toolBtn__RPYjF:hover{background:#3a3a3a}.ScreenshotEditor-module_toolBtn__RPYjF:disabled{cursor:not-allowed;opacity:.3}.ScreenshotEditor-module_toolActive__5Lz7o{background:#3a2020;border-color:#ef4444}.ScreenshotEditor-module_spacer__-ALGj{flex:1}.ScreenshotEditor-module_cancelBtn__e9xAe{background:#2a2a2a;border:1px solid #444;border-radius:4px;color:#ddd;cursor:pointer;font-size:13px;height:32px;padding:0 12px}.ScreenshotEditor-module_cancelBtn__e9xAe:hover{background:#3a3a3a}.ScreenshotEditor-module_doneBtn__LqRy8{background:#3b82f6;border:none;border-radius:4px;color:#fff;cursor:pointer;font-size:13px;font-weight:600;height:32px;padding:0 16px}.ScreenshotEditor-module_doneBtn__LqRy8:hover{background:#2563eb}.ScreenshotEditor-module_canvasWrap__T3XK0{align-items:center;display:flex;flex:1;justify-content:center;overflow:auto;padding:16px}.ScreenshotEditor-module_canvas__6Ij7x{border-radius:4px;cursor:crosshair;max-height:100%;max-width:100%}.ScreenshotEditor-module_textInputWrap__Vbz3V{background:#1a1a1a;display:flex;gap:4px;padding:4px 12px}.ScreenshotEditor-module_textInput__jNk6t{background:#2a2a2a;border:1px solid #444;border-radius:4px;color:#fff;flex:1;font-size:13px;height:28px;outline:none;padding:0 8px}.ScreenshotEditor-module_textInput__jNk6t:focus{border-color:#3b82f6}.ScreenshotEditor-module_textOk__LXSOw{background:#3b82f6;border:none;border-radius:4px;color:#fff;cursor:pointer;font-size:12px;height:28px;padding:0 10px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmVlbnNob3RFZGl0b3IubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1Q0FJRSwwQkFBK0IsQ0FDL0IsWUFBYSxDQUNiLHFCQUFzQixDQUp0QixPQUFRLENBRFIsY0FBZSxDQUVmLGNBSUYsQ0FFQSx3Q0FFRSxrQkFBbUIsQ0FHbkIsa0JBQW1CLENBSm5CLFlBQWEsQ0FFYixPQUFRLENBQ1IsZ0JBRUYsQ0FFQSx3Q0FVRSxrQkFBbUIsQ0FMbkIsa0JBQW1CLENBRm5CLHFCQUFzQixDQUN0QixpQkFBa0IsQ0FFbEIsVUFBVyxDQUVYLGNBQWUsQ0FDZixZQUFhLENBRmIsY0FBZSxDQUxmLFdBQVksQ0FTWixzQkFBdUIsQ0FWdkIsVUFXRixDQUVBLDhDQUNFLGtCQUNGLENBRUEsaURBRUUsa0JBQW1CLENBRG5CLFVBRUYsQ0FFQSwyQ0FFRSxrQkFBbUIsQ0FEbkIsb0JBRUYsQ0FFQSx1Q0FDRSxNQUNGLENBRUEsMENBS0Usa0JBQW1CLENBRm5CLHFCQUFzQixDQUN0QixpQkFBa0IsQ0FFbEIsVUFBVyxDQUVYLGNBQWUsQ0FEZixjQUFlLENBTmYsV0FBWSxDQUNaLGNBT0YsQ0FFQSxnREFDRSxrQkFDRixDQUVBLHdDQUtFLGtCQUFtQixDQUZuQixXQUFZLENBQ1osaUJBQWtCLENBRWxCLFVBQVcsQ0FHWCxjQUFlLENBRmYsY0FBZSxDQUNmLGVBQWdCLENBUGhCLFdBQVksQ0FDWixjQVFGLENBRUEsOENBQ0Usa0JBQ0YsQ0FFQSwyQ0FHRSxrQkFBbUIsQ0FEbkIsWUFBYSxDQURiLE1BQU8sQ0FHUCxzQkFBdUIsQ0FDdkIsYUFBYyxDQUNkLFlBQ0YsQ0FFQSx1Q0FJRSxpQkFBa0IsQ0FEbEIsZ0JBQWlCLENBRGpCLGVBQWdCLENBRGhCLGNBSUYsQ0FFQSw4Q0FJRSxrQkFBbUIsQ0FIbkIsWUFBYSxDQUNiLE9BQVEsQ0FDUixnQkFFRixDQUVBLDBDQUlFLGtCQUFtQixDQUNuQixxQkFBc0IsQ0FDdEIsaUJBQWtCLENBQ2xCLFVBQVcsQ0FOWCxNQUFPLENBT1AsY0FBZSxDQU5mLFdBQVksQ0FPWixZQUFhLENBTmIsYUFPRixDQUVBLGdEQUNFLG9CQUNGLENBRUEsdUNBS0Usa0JBQW1CLENBRm5CLFdBQVksQ0FDWixpQkFBa0IsQ0FFbEIsVUFBVyxDQUVYLGNBQWUsQ0FEZixjQUFlLENBTmYsV0FBWSxDQUNaLGNBT0YiLCJmaWxlIjoiU2NyZWVuc2hvdEVkaXRvci5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmVkaXRvciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDEwMDAwMDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjg1KTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnRvb2xiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDZweDtcbiAgcGFkZGluZzogOHB4IDEycHg7XG4gIGJhY2tncm91bmQ6ICMxYTFhMWE7XG59XG5cbi50b29sQnRuIHtcbiAgd2lkdGg6IDMycHg7XG4gIGhlaWdodDogMzJweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBiYWNrZ3JvdW5kOiAjMmEyYTJhO1xuICBjb2xvcjogI2RkZDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4udG9vbEJ0bjpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICMzYTNhM2E7XG59XG5cbi50b29sQnRuOmRpc2FibGVkIHtcbiAgb3BhY2l0eTogMC4zO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4udG9vbEFjdGl2ZSB7XG4gIGJvcmRlci1jb2xvcjogI0VGNDQ0NDtcbiAgYmFja2dyb3VuZDogIzNhMjAyMDtcbn1cblxuLnNwYWNlciB7XG4gIGZsZXg6IDE7XG59XG5cbi5jYW5jZWxCdG4ge1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgMTJweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBiYWNrZ3JvdW5kOiAjMmEyYTJhO1xuICBjb2xvcjogI2RkZDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5jYW5jZWxCdG46aG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjM2EzYTNhO1xufVxuXG4uZG9uZUJ0biB7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYmFja2dyb3VuZDogIzNCODJGNjtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZG9uZUJ0bjpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICMyNTYzRUI7XG59XG5cbi5jYW52YXNXcmFwIHtcbiAgZmxleDogMTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG92ZXJmbG93OiBhdXRvO1xuICBwYWRkaW5nOiAxNnB4O1xufVxuXG4uY2FudmFzIHtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xuICBjdXJzb3I6IGNyb3NzaGFpcjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4udGV4dElucHV0V3JhcCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogNHB4O1xuICBwYWRkaW5nOiA0cHggMTJweDtcbiAgYmFja2dyb3VuZDogIzFhMWExYTtcbn1cblxuLnRleHRJbnB1dCB7XG4gIGZsZXg6IDE7XG4gIGhlaWdodDogMjhweDtcbiAgcGFkZGluZzogMCA4cHg7XG4gIGJhY2tncm91bmQ6ICMyYTJhMmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM0NDQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLnRleHRJbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogIzNCODJGNjtcbn1cblxuLnRleHRPayB7XG4gIGhlaWdodDogMjhweDtcbiAgcGFkZGluZzogMCAxMHB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYmFja2dyb3VuZDogIzNCODJGNjtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuIl19 */";
4
+ var styles = {"editor":"ScreenshotEditor-module_editor__PVGL-","toolbar":"ScreenshotEditor-module_toolbar__oKXCg","toolBtn":"ScreenshotEditor-module_toolBtn__RPYjF","toolActive":"ScreenshotEditor-module_toolActive__5Lz7o","spacer":"ScreenshotEditor-module_spacer__-ALGj","cancelBtn":"ScreenshotEditor-module_cancelBtn__e9xAe","doneBtn":"ScreenshotEditor-module_doneBtn__LqRy8","canvasWrap":"ScreenshotEditor-module_canvasWrap__T3XK0","canvas":"ScreenshotEditor-module_canvas__6Ij7x","textInputWrap":"ScreenshotEditor-module_textInputWrap__Vbz3V","textInput":"ScreenshotEditor-module_textInput__jNk6t","textOk":"ScreenshotEditor-module_textOk__LXSOw"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=ScreenshotEditor.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenshotEditor.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -1,7 +1,9 @@
1
+ import type { Translations } from '../lib/i18n';
1
2
  interface SuccessStateProps {
2
3
  accentColor: string;
4
+ t: Translations;
3
5
  onNewFeedback: () => void;
4
6
  }
5
- export declare function SuccessState({ accentColor, onNewFeedback }: SuccessStateProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function SuccessState({ accentColor, t, onNewFeedback }: SuccessStateProps): import("react/jsx-runtime").JSX.Element;
6
8
  export {};
7
9
  //# sourceMappingURL=SuccessState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SuccessState.d.ts","sourceRoot":"","sources":["../../src/components/SuccessState.tsx"],"names":[],"mappings":"AAGA,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE,iBAAiB,2CAe7E"}
1
+ {"version":3,"file":"SuccessState.d.ts","sourceRoot":"","sources":["../../src/components/SuccessState.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,EAAE,YAAY,CAAC;IAChB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,iBAAiB,2CAehF"}
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import styles from './SuccessState.module.css.mjs';
3
3
 
4
- function SuccessState({ accentColor, onNewFeedback }) {
5
- return (jsxs("div", { className: styles.success, children: [jsx("div", { className: styles.checkmark, style: { backgroundColor: accentColor }, children: jsx("svg", { className: styles.checkIcon, viewBox: "0 0 24 24", children: jsx("polyline", { points: "20 6 9 17 4 12" }) }) }), jsx("p", { className: styles.title, children: "Thanks for your feedback!" }), jsx("p", { className: styles.subtitle, children: "We'll look into this." }), jsx("button", { type: "button", className: styles.newBtn, onClick: onNewFeedback, children: "Send another" })] }));
4
+ function SuccessState({ accentColor, t, onNewFeedback }) {
5
+ return (jsxs("div", { className: styles.success, children: [jsx("div", { className: styles.checkmark, style: { backgroundColor: accentColor }, children: jsx("svg", { className: styles.checkIcon, viewBox: "0 0 24 24", children: jsx("polyline", { points: "20 6 9 17 4 12" }) }) }), jsx("p", { className: styles.title, children: t.successTitle }), jsx("p", { className: styles.subtitle, children: t.successSubtitle }), jsx("button", { type: "button", className: styles.newBtn, onClick: onNewFeedback, children: t.successSendAnother })] }));
6
6
  }
7
7
 
8
8
  export { SuccessState };
@@ -1 +1 @@
1
- {"version":3,"file":"SuccessState.mjs","sources":["../../src/components/SuccessState.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;SAQgB,YAAY,CAAC,EAAE,WAAW,EAAE,aAAa,EAAqB,EAAA;AAC5E,IAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CAC5BC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,EAAA,QAAA,EACvEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAC,WAAW,EAAA,QAAA,EACnDA,kBAAU,MAAM,EAAC,gBAAgB,EAAA,CAAG,GAChC,EAAA,CACF,EACNA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EAAA,2BAAA,EAAA,CAA+B,EACzDA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAA,QAAA,EAAA,uBAAA,EAAA,CAAgC,EAC7DA,GAAA,CAAA,QAAA,EAAA,EAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAA,QAAA,EAAA,cAAA,EAAA,CAE7D,CAAA,EAAA,CACL;AAEV;;;;"}
1
+ {"version":3,"file":"SuccessState.mjs","sources":["../../src/components/SuccessState.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;AAUM,SAAU,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAqB,EAAA;AAC/E,IAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAA,CAC5BC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,YACvEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAC,WAAW,EAAA,QAAA,EACnDA,kBAAU,MAAM,EAAC,gBAAgB,EAAA,CAAG,EAAA,CAChC,GACF,EACNA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,MAAM,CAAC,KAAK,YAAG,CAAC,CAAC,YAAY,EAAA,CAAK,EAChDA,WAAG,SAAS,EAAE,MAAM,CAAC,QAAQ,YAAG,CAAC,CAAC,eAAe,EAAA,CAAK,EACtDA,GAAA,CAAA,QAAA,EAAA,EAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,YACnE,CAAC,CAAC,kBAAkB,EAAA,CACd,CAAA,EAAA,CACL;AAEV;;;;"}
@@ -1,9 +1,11 @@
1
1
  import type { HttpClient } from '../lib/http';
2
2
  import type { Thread } from '../types';
3
+ import type { Translations } from '../lib/i18n';
3
4
  interface ThreadListProps {
4
5
  client: HttpClient;
6
+ t: Translations;
5
7
  onSelectThread: (thread: Thread) => void;
6
8
  }
7
- export declare function ThreadList({ client, onSelectThread }: ThreadListProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function ThreadList({ client, t, onSelectThread }: ThreadListProps): import("react/jsx-runtime").JSX.Element;
8
10
  export {};
9
11
  //# sourceMappingURL=ThreadList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadList.d.ts","sourceRoot":"","sources":["../../src/components/ThreadList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAavC,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,eAAe,2CAqDrE"}
1
+ {"version":3,"file":"ThreadList.d.ts","sourceRoot":"","sources":["../../src/components/ThreadList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAahD,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,CAAC,EAAE,YAAY,CAAC;IAChB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,eAAe,2CAqDxE"}
@@ -1,6 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useEffect } from 'react';
3
3
  import { FEEDBACK_TYPES } from '../types.mjs';
4
+ import { formatTimeAgo } from '../lib/i18n.mjs';
4
5
  import { getMyThreads } from '../lib/api.mjs';
5
6
  import styles from './ThreadList.module.css.mjs';
6
7
 
@@ -11,7 +12,7 @@ const STATUS_COLORS = {
11
12
  closed: '#6B7280',
12
13
  wont_fix: '#EF4444',
13
14
  };
14
- function ThreadList({ client, onSelectThread }) {
15
+ function ThreadList({ client, t, onSelectThread }) {
15
16
  const [threads, setThreads] = useState([]);
16
17
  const [loading, setLoading] = useState(true);
17
18
  useEffect(() => {
@@ -27,32 +28,17 @@ function ThreadList({ client, onSelectThread }) {
27
28
  return () => { cancelled = true; };
28
29
  }, [client]);
29
30
  if (loading) {
30
- return jsx("div", { className: styles.loading, children: "Loading..." });
31
+ return jsx("div", { className: styles.loading, children: t.threadListLoading });
31
32
  }
32
33
  if (threads.length === 0) {
33
- return jsx("div", { className: styles.empty, children: "No feedback yet. Send your first one!" });
34
+ return jsx("div", { className: styles.empty, children: t.threadListEmpty });
34
35
  }
35
36
  return (jsx("div", { className: styles.list, children: threads.map((thread) => {
36
37
  const typeConfig = FEEDBACK_TYPES.find((ft) => ft.value === thread.type);
37
- const timeAgo = getTimeAgo(thread.createdAt);
38
+ const timeAgo = formatTimeAgo(thread.createdAt, t);
38
39
  return (jsxs("button", { className: styles.threadItem, onClick: () => onSelectThread(thread), type: "button", children: [jsx("span", { className: styles.threadEmoji, children: typeConfig?.emoji || '💬' }), jsxs("div", { className: styles.threadContent, children: [jsx("p", { className: styles.threadSubject, children: thread.subject }), jsxs("p", { className: styles.threadMeta, children: [jsx("span", { className: styles.statusDot, style: { backgroundColor: STATUS_COLORS[thread.status] || '#6B7280' } }), thread.status.replace('_', ' '), " \u00B7 ", timeAgo] })] })] }, thread.id));
39
40
  }) }));
40
41
  }
41
- function getTimeAgo(dateStr) {
42
- const diff = Date.now() - new Date(dateStr).getTime();
43
- const mins = Math.floor(diff / 60000);
44
- if (mins < 1)
45
- return 'just now';
46
- if (mins < 60)
47
- return `${mins}m ago`;
48
- const hours = Math.floor(mins / 60);
49
- if (hours < 24)
50
- return `${hours}h ago`;
51
- const days = Math.floor(hours / 24);
52
- if (days < 30)
53
- return `${days}d ago`;
54
- return new Date(dateStr).toLocaleDateString();
55
- }
56
42
 
57
43
  export { ThreadList };
58
44
  //# sourceMappingURL=ThreadList.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadList.mjs","sources":["../../src/components/ThreadList.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadList.mjs","sources":["../../src/components/ThreadList.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;;;;AASA,MAAM,aAAa,GAA2B;AAC5C,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,QAAQ,EAAE,SAAS;CACpB;AAQK,SAAU,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAmB,EAAA;IACvE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE5C,SAAS,CAAC,MAAK;QACb,IAAI,SAAS,GAAG,KAAK;AACrB,QAAA,eAAe,IAAI,GAAA;AACjB,YAAA,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE;gBACd,UAAU,CAAC,IAAI,CAAC;gBAChB,UAAU,CAAC,KAAK,CAAC;YACnB;QACF;AACA,QAAA,IAAI,EAAE;QACN,OAAO,MAAK,EAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;AACpC,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAEZ,IAAI,OAAO,EAAE;QACX,OAAOA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,OAAO,EAAA,QAAA,EAAG,CAAC,CAAC,iBAAiB,EAAA,CAAO;IACpE;AAEA,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAOA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EAAG,CAAC,CAAC,eAAe,EAAA,CAAO;IAChE;AAEA,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EACxB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AACtB,YAAA,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC;YACxE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAClD,QACEC,iBAEE,SAAS,EAAE,MAAM,CAAC,UAAU,EAC5B,OAAO,EAAE,MAAM,cAAc,CAAC,MAAM,CAAC,EACrC,IAAI,EAAC,QAAQ,EAAA,QAAA,EAAA,CAEbD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,WAAW,YAAG,UAAU,EAAE,KAAK,IAAI,IAAI,EAAA,CAAQ,EACvEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,QAAA,EAAA,CAClCD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,QAAA,EAAG,MAAM,CAAC,OAAO,EAAA,CAAK,EACxDC,YAAG,SAAS,EAAE,MAAM,CAAC,UAAU,EAAA,QAAA,EAAA,CAC7BD,GAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,KAAK,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAAA,CACrE,EACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAA,UAAA,EAAK,OAAO,CAAA,EAAA,CAC1C,CAAA,EAAA,CACA,CAAA,EAAA,EAfD,MAAM,CAAC,EAAE,CAgBP;QAEb,CAAC,CAAC,EAAA,CACE;AAEV;;;;"}
@@ -1,8 +1,10 @@
1
1
  import type { FeedbackType } from '../types';
2
+ import type { Translations } from '../lib/i18n';
2
3
  interface TypeSelectorProps {
3
4
  value: FeedbackType | null;
4
5
  onChange: (type: FeedbackType) => void;
6
+ t: Translations;
5
7
  }
6
- export declare function TypeSelector({ value, onChange }: TypeSelectorProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function TypeSelector({ value, onChange, t }: TypeSelectorProps): import("react/jsx-runtime").JSX.Element;
7
9
  export {};
8
10
  //# sourceMappingURL=TypeSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TypeSelector.d.ts","sourceRoot":"","sources":["../../src/components/TypeSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAoBlE"}
1
+ {"version":3,"file":"TypeSelector.d.ts","sourceRoot":"","sources":["../../src/components/TypeSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWhD,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,CAAC,EAAE,YAAY,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,iBAAiB,2CAoBrE"}
@@ -2,10 +2,17 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { FEEDBACK_TYPES } from '../types.mjs';
3
3
  import styles from './TypeSelector.module.css.mjs';
4
4
 
5
- function TypeSelector({ value, onChange }) {
5
+ const TYPE_LABEL_KEYS = {
6
+ bug: 'typeBug',
7
+ feature: 'typeFeature',
8
+ question: 'typeQuestion',
9
+ praise: 'typePraise',
10
+ other: 'typeOther',
11
+ };
12
+ function TypeSelector({ value, onChange, t }) {
6
13
  return (jsx("div", { className: styles.typeSelector, children: FEEDBACK_TYPES.map((ft) => {
7
14
  const isActive = value === ft.value;
8
- return (jsxs("button", { type: "button", className: `${styles.typeBtn} ${isActive ? styles.typeBtnActive : ''}`, style: isActive ? { backgroundColor: ft.color, borderColor: ft.color } : undefined, onClick: () => onChange(ft.value), children: [jsx("span", { className: styles.emoji, children: ft.emoji }), ft.label] }, ft.value));
15
+ return (jsxs("button", { type: "button", className: `${styles.typeBtn} ${isActive ? styles.typeBtnActive : ''}`, style: isActive ? { backgroundColor: ft.color, borderColor: ft.color } : undefined, onClick: () => onChange(ft.value), children: [jsx("span", { className: styles.emoji, children: ft.emoji }), t[TYPE_LABEL_KEYS[ft.value]]] }, ft.value));
9
16
  }) }));
10
17
  }
11
18
 
@@ -1 +1 @@
1
- {"version":3,"file":"TypeSelector.mjs","sources":["../../src/components/TypeSelector.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;SAUgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAqB,EAAA;AACjE,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAChC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI;AACzB,YAAA,MAAM,QAAQ,GAAG,KAAK,KAAK,EAAE,CAAC,KAAK;AACnC,YAAA,QACEC,IAAA,CAAA,QAAA,EAAA,EAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,GAAG,MAAM,CAAC,aAAa,GAAG,EAAE,EAAE,EACtE,KAAK,EAAE,QAAQ,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,EAClF,OAAO,EAAE,MAAM,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAA,QAAA,EAAA,CAEjCD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,KAAK,YAAG,EAAE,CAAC,KAAK,EAAA,CAAQ,EAC/C,EAAE,CAAC,KAAK,CAAA,EAAA,EAPJ,EAAE,CAAC,KAAK,CAQN;QAEb,CAAC,CAAC,EAAA,CACE;AAEV;;;;"}
1
+ {"version":3,"file":"TypeSelector.mjs","sources":["../../src/components/TypeSelector.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;AAMA,MAAM,eAAe,GAA6C;AAChE,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,OAAO,EAAE,aAAa;AACtB,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,KAAK,EAAE,WAAW;CACnB;AAQK,SAAU,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAqB,EAAA;AACpE,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAChC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI;AACzB,YAAA,MAAM,QAAQ,GAAG,KAAK,KAAK,EAAE,CAAC,KAAK;AACnC,YAAA,QACEC,IAAA,CAAA,QAAA,EAAA,EAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,GAAG,MAAM,CAAC,aAAa,GAAG,EAAE,CAAA,CAAE,EACtE,KAAK,EAAE,QAAQ,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,EAClF,OAAO,EAAE,MAAM,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,aAEjCD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EAAG,EAAE,CAAC,KAAK,EAAA,CAAQ,EAC/C,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA,EAAA,EAPxB,EAAE,CAAC,KAAK,CAQN;QAEb,CAAC,CAAC,EAAA,CACE;AAEV;;;;"}
@@ -0,0 +1,15 @@
1
+ export interface Point {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export interface Rect {
6
+ x: number;
7
+ y: number;
8
+ w: number;
9
+ h: number;
10
+ }
11
+ export declare function drawFreehand(ctx: CanvasRenderingContext2D, points: Point[], color: string, lineWidth: number): void;
12
+ export declare function drawRect(ctx: CanvasRenderingContext2D, rect: Rect, color: string, lineWidth: number): void;
13
+ export declare function drawText(ctx: CanvasRenderingContext2D, pos: Point, text: string, color: string, fontSize: number): void;
14
+ export declare function blurRegion(ctx: CanvasRenderingContext2D, rect: Rect, pixelSize?: number): void;
15
+ //# sourceMappingURL=canvas-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-tools.d.ts","sourceRoot":"","sources":["../../src/lib/canvas-tools.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAY5G;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAInG;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAIhH;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,GAAE,MAAU,QAsC1F"}
@@ -0,0 +1,64 @@
1
+ function drawFreehand(ctx, points, color, lineWidth) {
2
+ if (points.length < 2)
3
+ return;
4
+ ctx.strokeStyle = color;
5
+ ctx.lineWidth = lineWidth;
6
+ ctx.lineCap = 'round';
7
+ ctx.lineJoin = 'round';
8
+ ctx.beginPath();
9
+ ctx.moveTo(points[0].x, points[0].y);
10
+ for (let i = 1; i < points.length; i++) {
11
+ ctx.lineTo(points[i].x, points[i].y);
12
+ }
13
+ ctx.stroke();
14
+ }
15
+ function drawRect(ctx, rect, color, lineWidth) {
16
+ ctx.strokeStyle = color;
17
+ ctx.lineWidth = lineWidth;
18
+ ctx.strokeRect(rect.x, rect.y, rect.w, rect.h);
19
+ }
20
+ function drawText(ctx, pos, text, color, fontSize) {
21
+ ctx.fillStyle = color;
22
+ ctx.font = `${fontSize}px sans-serif`;
23
+ ctx.fillText(text, pos.x, pos.y);
24
+ }
25
+ function blurRegion(ctx, rect, pixelSize = 8) {
26
+ const { x, y, w, h } = rect;
27
+ const absW = Math.abs(w);
28
+ const absH = Math.abs(h);
29
+ const startX = w < 0 ? x + w : x;
30
+ const startY = h < 0 ? y + h : y;
31
+ if (absW < 2 || absH < 2)
32
+ return;
33
+ const imageData = ctx.getImageData(startX, startY, absW, absH);
34
+ const data = imageData.data;
35
+ for (let py = 0; py < absH; py += pixelSize) {
36
+ for (let px = 0; px < absW; px += pixelSize) {
37
+ let r = 0, g = 0, b = 0, count = 0;
38
+ for (let dy = 0; dy < pixelSize && py + dy < absH; dy++) {
39
+ for (let dx = 0; dx < pixelSize && px + dx < absW; dx++) {
40
+ const i = ((py + dy) * absW + (px + dx)) * 4;
41
+ r += data[i];
42
+ g += data[i + 1];
43
+ b += data[i + 2];
44
+ count++;
45
+ }
46
+ }
47
+ r = Math.round(r / count);
48
+ g = Math.round(g / count);
49
+ b = Math.round(b / count);
50
+ for (let dy = 0; dy < pixelSize && py + dy < absH; dy++) {
51
+ for (let dx = 0; dx < pixelSize && px + dx < absW; dx++) {
52
+ const i = ((py + dy) * absW + (px + dx)) * 4;
53
+ data[i] = r;
54
+ data[i + 1] = g;
55
+ data[i + 2] = b;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ ctx.putImageData(imageData, startX, startY);
61
+ }
62
+
63
+ export { blurRegion, drawFreehand, drawRect, drawText };
64
+ //# sourceMappingURL=canvas-tools.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-tools.mjs","sources":["../../src/lib/canvas-tools.ts"],"sourcesContent":[null],"names":[],"mappings":"AAYM,SAAU,YAAY,CAAC,GAA6B,EAAE,MAAe,EAAE,KAAa,EAAE,SAAiB,EAAA;AAC3G,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE;AACvB,IAAA,GAAG,CAAC,WAAW,GAAG,KAAK;AACvB,IAAA,GAAG,CAAC,SAAS,GAAG,SAAS;AACzB,IAAA,GAAG,CAAC,OAAO,GAAG,OAAO;AACrB,IAAA,GAAG,CAAC,QAAQ,GAAG,OAAO;IACtB,GAAG,CAAC,SAAS,EAAE;AACf,IAAA,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,QAAA,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC;IACA,GAAG,CAAC,MAAM,EAAE;AACd;AAEM,SAAU,QAAQ,CAAC,GAA6B,EAAE,IAAU,EAAE,KAAa,EAAE,SAAiB,EAAA;AAClG,IAAA,GAAG,CAAC,WAAW,GAAG,KAAK;AACvB,IAAA,GAAG,CAAC,SAAS,GAAG,SAAS;AACzB,IAAA,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAChD;AAEM,SAAU,QAAQ,CAAC,GAA6B,EAAE,GAAU,EAAE,IAAY,EAAE,KAAa,EAAE,QAAgB,EAAA;AAC/G,IAAA,GAAG,CAAC,SAAS,GAAG,KAAK;AACrB,IAAA,GAAG,CAAC,IAAI,GAAG,CAAA,EAAG,QAAQ,eAAe;AACrC,IAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAClC;AAEM,SAAU,UAAU,CAAC,GAA6B,EAAE,IAAU,EAAE,YAAoB,CAAC,EAAA;IACzF,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACxB,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAEhC,IAAA,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE;AAE1B,IAAA,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;AAC9D,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI;AAE3B,IAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,SAAS,EAAE;AAC3C,QAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,SAAS,EAAE;AAC3C,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAClC,YAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE;AACvD,gBAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE;AACvD,oBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;AAC5C,oBAAA,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AACZ,oBAAA,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAChB,oBAAA,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAChB,oBAAA,KAAK,EAAE;gBACT;YACF;YACA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;AACzB,YAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE;AACvD,gBAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE;AACvD,oBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;AAC5C,oBAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACX,oBAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AACf,oBAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;gBACjB;YACF;QACF;IACF;IACA,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;AAC7C;;;;"}
@@ -0,0 +1,40 @@
1
+ export interface Translations {
2
+ tabNew: string;
3
+ tabMyThreads: string;
4
+ labelType: string;
5
+ labelMessage: string;
6
+ labelName: string;
7
+ labelEmail: string;
8
+ placeholderName: string;
9
+ placeholderEmail: string;
10
+ emailError: string;
11
+ submitError: string;
12
+ btnUploading: string;
13
+ btnSending: string;
14
+ btnSendFeedback: string;
15
+ typeBug: string;
16
+ typeFeature: string;
17
+ typeQuestion: string;
18
+ typePraise: string;
19
+ typeOther: string;
20
+ successTitle: string;
21
+ successSubtitle: string;
22
+ successSendAnother: string;
23
+ threadListLoading: string;
24
+ threadListEmpty: string;
25
+ btnBack: string;
26
+ replyPlaceholder: string;
27
+ senderDeveloper: string;
28
+ senderYou: string;
29
+ attachImages: string;
30
+ editorDone: string;
31
+ editorCancel: string;
32
+ timeJustNow: string;
33
+ timeMinutesAgo: string;
34
+ timeHoursAgo: string;
35
+ timeDaysAgo: string;
36
+ }
37
+ export type Locale = 'en' | 'ko';
38
+ export declare function createTranslations(locale?: string): Translations;
39
+ export declare function formatTimeAgo(dateStr: string, t: Translations): string;
40
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/lib/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAE3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IAGrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IAGxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAGlB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAG3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IAGxB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAGlB,YAAY,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IAGrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAOjC,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAGhE;AASD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAUtE"}
@@ -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"}