pulse-feedback-widget 0.1.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.
- package/dist/PulseWidget.d.ts +3 -0
- package/dist/PulseWidget.d.ts.map +1 -0
- package/dist/PulseWidget.mjs +62 -0
- package/dist/PulseWidget.mjs.map +1 -0
- package/dist/components/ConversationView.d.ts +11 -0
- package/dist/components/ConversationView.d.ts.map +1 -0
- package/dist/components/ConversationView.mjs +70 -0
- package/dist/components/ConversationView.mjs.map +1 -0
- package/dist/components/ConversationView.module.css.mjs +8 -0
- package/dist/components/ConversationView.module.css.mjs.map +1 -0
- package/dist/components/FeedbackForm.d.ts +14 -0
- package/dist/components/FeedbackForm.d.ts.map +1 -0
- package/dist/components/FeedbackForm.mjs +76 -0
- package/dist/components/FeedbackForm.mjs.map +1 -0
- package/dist/components/FeedbackForm.module.css.mjs +8 -0
- package/dist/components/FeedbackForm.module.css.mjs.map +1 -0
- package/dist/components/FeedbackPanel.d.ts +17 -0
- package/dist/components/FeedbackPanel.d.ts.map +1 -0
- package/dist/components/FeedbackPanel.mjs +41 -0
- package/dist/components/FeedbackPanel.mjs.map +1 -0
- package/dist/components/FeedbackPanel.module.css.mjs +8 -0
- package/dist/components/FeedbackPanel.module.css.mjs.map +1 -0
- package/dist/components/SuccessState.d.ts +7 -0
- package/dist/components/SuccessState.d.ts.map +1 -0
- package/dist/components/SuccessState.mjs +9 -0
- package/dist/components/SuccessState.mjs.map +1 -0
- package/dist/components/SuccessState.module.css.mjs +8 -0
- package/dist/components/SuccessState.module.css.mjs.map +1 -0
- package/dist/components/ThreadList.d.ts +9 -0
- package/dist/components/ThreadList.d.ts.map +1 -0
- package/dist/components/ThreadList.mjs +58 -0
- package/dist/components/ThreadList.mjs.map +1 -0
- package/dist/components/ThreadList.module.css.mjs +8 -0
- package/dist/components/ThreadList.module.css.mjs.map +1 -0
- package/dist/components/TriggerButton.d.ts +9 -0
- package/dist/components/TriggerButton.d.ts.map +1 -0
- package/dist/components/TriggerButton.mjs +10 -0
- package/dist/components/TriggerButton.mjs.map +1 -0
- package/dist/components/TriggerButton.module.css.mjs +8 -0
- package/dist/components/TriggerButton.module.css.mjs.map +1 -0
- package/dist/components/TypeSelector.d.ts +8 -0
- package/dist/components/TypeSelector.d.ts.map +1 -0
- package/dist/components/TypeSelector.mjs +13 -0
- package/dist/components/TypeSelector.mjs.map +1 -0
- package/dist/components/TypeSelector.module.css.mjs +8 -0
- package/dist/components/TypeSelector.module.css.mjs.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/api.d.ts +35 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.mjs +105 -0
- package/dist/lib/api.mjs.map +1 -0
- package/dist/lib/capture.d.ts +7 -0
- package/dist/lib/capture.d.ts.map +1 -0
- package/dist/lib/capture.mjs +14 -0
- package/dist/lib/capture.mjs.map +1 -0
- package/dist/lib/device.d.ts +2 -0
- package/dist/lib/device.d.ts.map +1 -0
- package/dist/lib/device.mjs +34 -0
- package/dist/lib/device.mjs.map +1 -0
- package/dist/lib/supabase.d.ts +4 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.mjs +19 -0
- package/dist/lib/supabase.mjs.map +1 -0
- package/dist/node_modules/style-inject/dist/style-inject.es.mjs +29 -0
- package/dist/node_modules/style-inject/dist/style-inject.es.mjs.map +1 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.mjs +45 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { PulseWidgetProps } from './types';
|
|
2
|
+
export declare function PulseWidget({ projectId, supabaseUrl, supabaseAnonKey, position, accentColor, greeting, placeholder, hideOnPaths, collectEmail, metadata, onOpen, onClose: onCloseProp, onSubmit, }: PulseWidgetProps): import("react/jsx-runtime").JSX.Element | null;
|
|
3
|
+
//# sourceMappingURL=PulseWidget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PulseWidget.d.ts","sourceRoot":"","sources":["../src/PulseWidget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAUhD,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,WAAW,EACX,eAAe,EACf,QAAyB,EACzB,WAAuB,EACvB,QAAmB,EACnB,WAAoC,EACpC,WAAgB,EAChB,YAAmB,EACnB,QAAa,EACb,MAAM,EACN,OAAO,EAAE,WAAW,EACpB,QAAQ,GACT,EAAE,gBAAgB,kDAmFlB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { lazy, useState, useMemo, useEffect, Suspense } from 'react';
|
|
4
|
+
import { getDeviceId } from './lib/device.mjs';
|
|
5
|
+
import { getSupabaseClient } from './lib/supabase.mjs';
|
|
6
|
+
import { checkUnreadReplies } from './lib/api.mjs';
|
|
7
|
+
import { TriggerButton } from './components/TriggerButton.mjs';
|
|
8
|
+
|
|
9
|
+
const FeedbackPanel = lazy(() => import('./components/FeedbackPanel.mjs').then((m) => ({ default: m.FeedbackPanel })));
|
|
10
|
+
function PulseWidget({ projectId, supabaseUrl, supabaseAnonKey, position = 'bottom-right', accentColor = '#6366F1', greeting = 'Hi! 👋', placeholder = "What's on your mind?", hideOnPaths = [], collectEmail = true, metadata = {}, onOpen, onClose: onCloseProp, onSubmit, }) {
|
|
11
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
12
|
+
const [hasNotification, setHasNotification] = useState(false);
|
|
13
|
+
const [hidden, setHidden] = useState(false);
|
|
14
|
+
// Prop validation
|
|
15
|
+
if (!projectId || typeof projectId !== 'string') {
|
|
16
|
+
console.error('[Pulse] Invalid projectId: must be a non-empty string');
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (!supabaseUrl || !supabaseUrl.startsWith('https://')) {
|
|
20
|
+
console.error('[Pulse] Invalid supabaseUrl: must start with https://');
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if (!supabaseAnonKey || typeof supabaseAnonKey !== 'string') {
|
|
24
|
+
console.error('[Pulse] Invalid supabaseAnonKey: must be a non-empty string');
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const deviceId = useMemo(() => getDeviceId(), []);
|
|
28
|
+
const client = useMemo(() => getSupabaseClient(supabaseUrl, supabaseAnonKey, deviceId), [supabaseUrl, supabaseAnonKey, deviceId]);
|
|
29
|
+
// Check if widget should be hidden on current path
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (typeof window === 'undefined')
|
|
32
|
+
return;
|
|
33
|
+
const path = window.location.pathname;
|
|
34
|
+
setHidden(hideOnPaths.some((p) => path.startsWith(p)));
|
|
35
|
+
}, [hideOnPaths]);
|
|
36
|
+
// Check for unread developer replies
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!deviceId)
|
|
39
|
+
return;
|
|
40
|
+
let cancelled = false;
|
|
41
|
+
async function check() {
|
|
42
|
+
const unread = await checkUnreadReplies(client, deviceId);
|
|
43
|
+
if (!cancelled)
|
|
44
|
+
setHasNotification(unread);
|
|
45
|
+
}
|
|
46
|
+
check();
|
|
47
|
+
return () => { cancelled = true; };
|
|
48
|
+
}, [client, deviceId]);
|
|
49
|
+
if (hidden)
|
|
50
|
+
return null;
|
|
51
|
+
return (jsxs(Fragment, { children: [!isOpen && (jsx(TriggerButton, { onClick: () => {
|
|
52
|
+
setIsOpen(true);
|
|
53
|
+
onOpen?.();
|
|
54
|
+
}, position: position, accentColor: accentColor, hasNotification: hasNotification })), isOpen && (jsx(Suspense, { fallback: null, children: jsx(FeedbackPanel, { client: client, projectId: projectId, deviceId: deviceId, accentColor: accentColor, greeting: greeting, placeholder: placeholder, collectEmail: collectEmail, metadata: metadata, position: position, onClose: () => {
|
|
55
|
+
setIsOpen(false);
|
|
56
|
+
setHasNotification(false);
|
|
57
|
+
onCloseProp?.();
|
|
58
|
+
}, onSubmit: onSubmit }) }))] }));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { PulseWidget };
|
|
62
|
+
//# sourceMappingURL=PulseWidget.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PulseWidget.mjs","sources":["../src/PulseWidget.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;AASA;AAIM;;;;;;AAqBF;AACA;;;AAGA;AACA;;;AAGA;AACA;;AAGF;;;;;;AASE;AACA;AACF;;;AAIE;;;AAEA;;AAEE;;;AAEF;;AAEF;AAEA;AAAY;AAEZ;;;AAOQ;;;;;AA8BV;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
import type { Thread } from '../types';
|
|
3
|
+
interface ConversationViewProps {
|
|
4
|
+
client: SupabaseClient;
|
|
5
|
+
thread: Thread;
|
|
6
|
+
accentColor: string;
|
|
7
|
+
onBack: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function ConversationView({ client, thread, accentColor, onBack }: ConversationViewProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ConversationView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationView.d.ts","sourceRoot":"","sources":["../../src/components/ConversationView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,UAAU,CAAC;AAIhD,UAAU,qBAAqB;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,qBAAqB,2CAmG9F"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useRef, useEffect } from 'react';
|
|
3
|
+
import { getThreadMessages, sendUserReply } from '../lib/api.mjs';
|
|
4
|
+
import styles from './ConversationView.module.css.mjs';
|
|
5
|
+
|
|
6
|
+
function ConversationView({ client, thread, accentColor, onBack }) {
|
|
7
|
+
const [messages, setMessages] = useState([]);
|
|
8
|
+
const [reply, setReply] = useState('');
|
|
9
|
+
const [sending, setSending] = useState(false);
|
|
10
|
+
const messagesEndRef = useRef(null);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
let cancelled = false;
|
|
13
|
+
async function load() {
|
|
14
|
+
const data = await getThreadMessages(client, thread.id);
|
|
15
|
+
if (!cancelled)
|
|
16
|
+
setMessages(data);
|
|
17
|
+
}
|
|
18
|
+
load();
|
|
19
|
+
return () => { cancelled = true; };
|
|
20
|
+
}, [client, thread.id]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
23
|
+
}, [messages]);
|
|
24
|
+
async function handleSend() {
|
|
25
|
+
if (!reply.trim() || sending)
|
|
26
|
+
return;
|
|
27
|
+
setSending(true);
|
|
28
|
+
const ok = await sendUserReply(client, thread.id, reply.trim());
|
|
29
|
+
if (ok) {
|
|
30
|
+
setMessages((prev) => [
|
|
31
|
+
...prev,
|
|
32
|
+
{
|
|
33
|
+
id: crypto.randomUUID(),
|
|
34
|
+
threadId: thread.id,
|
|
35
|
+
sender: 'user',
|
|
36
|
+
body: reply.trim(),
|
|
37
|
+
attachments: [],
|
|
38
|
+
isInternal: false,
|
|
39
|
+
createdAt: new Date().toISOString(),
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
setReply('');
|
|
43
|
+
}
|
|
44
|
+
setSending(false);
|
|
45
|
+
}
|
|
46
|
+
function handleKeyDown(e) {
|
|
47
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
handleSend();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return (jsxs("div", { className: styles.conversation, children: [jsxs("button", { type: "button", className: styles.backBtn, onClick: onBack, children: [jsx("svg", { className: styles.backIcon, viewBox: "0 0 24 24", children: jsx("polyline", { points: "15 18 9 12 15 6" }) }), "Back"] }), jsx("h3", { className: styles.subject, children: thread.subject }), jsxs("div", { className: styles.messages, children: [messages.map((msg) => (jsxs("div", { className: `${styles.message} ${msg.sender === 'user' ? styles.messageUser : styles.messageDev}`, style: msg.sender === 'developer' ? { backgroundColor: accentColor } : undefined, children: [jsx("p", { className: styles.messageBody, children: msg.body }), jsxs("div", { className: styles.messageTime, children: [msg.sender === 'developer' ? 'Developer' : 'You', " \u00B7 ", formatTime(msg.createdAt)] })] }, msg.id))), jsx("div", { ref: messagesEndRef })] }), jsxs("div", { className: styles.replyBox, children: [jsx("input", { className: styles.replyInput, value: reply, onChange: (e) => setReply(e.target.value), onKeyDown: handleKeyDown, placeholder: "Type a reply..." }), jsx("button", { type: "button", className: styles.sendBtn, style: { backgroundColor: accentColor }, onClick: handleSend, disabled: !reply.trim() || sending, children: jsxs("svg", { className: styles.sendIcon, viewBox: "0 0 24 24", children: [jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }), jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })] }) })] })] }));
|
|
53
|
+
}
|
|
54
|
+
function formatTime(dateStr) {
|
|
55
|
+
const d = new Date(dateStr);
|
|
56
|
+
const now = new Date();
|
|
57
|
+
const diffMs = now.getTime() - d.getTime();
|
|
58
|
+
const mins = Math.floor(diffMs / 60000);
|
|
59
|
+
if (mins < 1)
|
|
60
|
+
return 'just now';
|
|
61
|
+
if (mins < 60)
|
|
62
|
+
return `${mins}m ago`;
|
|
63
|
+
const hours = Math.floor(mins / 60);
|
|
64
|
+
if (hours < 24)
|
|
65
|
+
return `${hours}h ago`;
|
|
66
|
+
return d.toLocaleDateString();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { ConversationView };
|
|
70
|
+
//# sourceMappingURL=ConversationView.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationView.mjs","sources":["../../src/components/ConversationView.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 = ".ConversationView-module_conversation__Kyrej{display:flex;flex-direction:column;height:100%}.ConversationView-module_backBtn__Ls1YK{align-items:center;background:transparent;border:none;color:var(--pulse-text-secondary,#6b7280);cursor:pointer;display:flex;font-family:inherit;font-size:13px;font-weight:500;gap:6px;margin-bottom:8px;padding:4px 0}.ConversationView-module_backBtn__Ls1YK:hover{color:var(--pulse-text-primary,#111827)}.ConversationView-module_backIcon__rmWLJ{stroke:currentColor;stroke-width:2;fill:none;height:16px;width:16px}.ConversationView-module_subject__DVvkN{color:var(--pulse-text-primary,#111827);font-size:15px;font-weight:600;margin:0 0 12px}.ConversationView-module_messages__KatYK{display:flex;flex:1;flex-direction:column;gap:8px;margin-bottom:12px;overflow-y:auto;padding-bottom:12px}.ConversationView-module_message__L9hkM{border-radius:12px;max-width:85%;padding:10px 12px}.ConversationView-module_messageUser__0n-3J{align-self:flex-end;background:var(--pulse-bg-hover,#f3f4f6);color:var(--pulse-text-primary,#111827)}.ConversationView-module_messageDev__Lss8r{align-self:flex-start;color:#fff}.ConversationView-module_messageBody__K5bq6{font-size:14px;line-height:1.5;margin:0;white-space:pre-wrap;word-break:break-word}.ConversationView-module_messageTime__LQSrh{font-size:11px;margin:4px 0 0;opacity:.7}.ConversationView-module_replyBox__Bjf08{border-top:1px solid var(--pulse-border,#e5e7eb);display:flex;gap:8px;padding-top:12px}.ConversationView-module_replyInput__4UjyN{background:var(--pulse-bg,#fff);border:1px solid var(--pulse-border,#e5e7eb);border-radius:6px;color:var(--pulse-text-primary,#111827);flex:1;font-family:inherit;font-size:14px;height:36px;outline:none;padding:8px 12px}.ConversationView-module_replyInput__4UjyN:focus{border-color:var(--pulse-accent,#6366f1)}.ConversationView-module_sendBtn__ryIfI{align-items:center;border:none;border-radius:6px;color:#fff;cursor:pointer;display:flex;flex-shrink:0;height:36px;justify-content:center;transition:opacity .12s ease;width:36px}.ConversationView-module_sendBtn__ryIfI:hover{opacity:.9}.ConversationView-module_sendBtn__ryIfI:disabled{cursor:not-allowed;opacity:.4}.ConversationView-module_sendIcon__Xcqbi{stroke:currentColor;stroke-width:2;fill:none;height:18px;width:18px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnZlcnNhdGlvblZpZXcubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2Q0FDRSxZQUFhLENBQ2IscUJBQXNCLENBQ3RCLFdBQ0YsQ0FFQSx3Q0FFRSxrQkFBbUIsQ0FJbkIsc0JBQXVCLENBRHZCLFdBQVksQ0FHWix5Q0FBMkMsQ0FEM0MsY0FBZSxDQU5mLFlBQWEsQ0FVYixtQkFBb0IsQ0FGcEIsY0FBZSxDQUNmLGVBQWdCLENBUGhCLE9BQVEsQ0FTUixpQkFBa0IsQ0FSbEIsYUFTRixDQUVBLDhDQUNFLHVDQUNGLENBRUEseUNBR0UsbUJBQW9CLENBQ3BCLGNBQWUsQ0FDZixTQUFVLENBSFYsV0FBWSxDQURaLFVBS0YsQ0FFQSx3Q0FHRSx1Q0FBeUMsQ0FGekMsY0FBZSxDQUNmLGVBQWdCLENBRWhCLGVBQ0YsQ0FFQSx5Q0FHRSxZQUFhLENBRmIsTUFBTyxDQUdQLHFCQUFzQixDQUN0QixPQUFRLENBRVIsa0JBQW1CLENBTG5CLGVBQWdCLENBSWhCLG1CQUVGLENBRUEsd0NBRUUsa0JBQW1CLENBQ25CLGFBQWMsQ0FGZCxpQkFHRixDQUVBLDRDQUNFLG1CQUFvQixDQUNwQix3Q0FBMEMsQ0FDMUMsdUNBQ0YsQ0FFQSwyQ0FDRSxxQkFBc0IsQ0FDdEIsVUFDRixDQUVBLDRDQUNFLGNBQWUsQ0FDZixlQUFnQixDQUNoQixRQUFTLENBQ1Qsb0JBQXFCLENBQ3JCLHFCQUNGLENBRUEsNENBQ0UsY0FBZSxDQUNmLGNBQWUsQ0FDZixVQUNGLENBRUEseUNBR0UsZ0RBQWtELENBRmxELFlBQWEsQ0FDYixPQUFRLENBRVIsZ0JBQ0YsQ0FFQSwyQ0FNRSwrQkFBb0MsQ0FEcEMsNENBQThDLENBRDlDLGlCQUFrQixDQUdsQix1Q0FBeUMsQ0FOekMsTUFBTyxDQVFQLG1CQUFvQixDQURwQixjQUFlLENBTmYsV0FBWSxDQVFaLFlBQWEsQ0FQYixnQkFRRixDQUVBLGlEQUNFLHdDQUNGLENBRUEsd0NBUUUsa0JBQW1CLENBSm5CLFdBQVksQ0FEWixpQkFBa0IsQ0FFbEIsVUFBYyxDQUNkLGNBQWUsQ0FDZixZQUFhLENBR2IsYUFBYyxDQVJkLFdBQVksQ0FPWixzQkFBdUIsQ0FFdkIsNEJBQThCLENBVjlCLFVBV0YsQ0FFQSw4Q0FDRSxVQUNGLENBRUEsaURBRUUsa0JBQW1CLENBRG5CLFVBRUYsQ0FFQSx5Q0FHRSxtQkFBb0IsQ0FDcEIsY0FBZSxDQUNmLFNBQVUsQ0FIVixXQUFZLENBRFosVUFLRiIsImZpbGUiOiJDb252ZXJzYXRpb25WaWV3Lm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY29udmVyc2F0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uYmFja0J0biB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBwYWRkaW5nOiA0cHggMDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogdmFyKC0tcHVsc2UtdGV4dC1zZWNvbmRhcnksICM2YjcyODApO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG5cbi5iYWNrQnRuOmhvdmVyIHtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtcHJpbWFyeSwgIzExMTgyNyk7XG59XG5cbi5iYWNrSWNvbiB7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICBzdHJva2Utd2lkdGg6IDI7XG4gIGZpbGw6IG5vbmU7XG59XG5cbi5zdWJqZWN0IHtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tcHVsc2UtdGV4dC1wcmltYXJ5LCAjMTExODI3KTtcbiAgbWFyZ2luOiAwIDAgMTJweDtcbn1cblxuLm1lc3NhZ2VzIHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA4cHg7XG4gIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xufVxuXG4ubWVzc2FnZSB7XG4gIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgbWF4LXdpZHRoOiA4NSU7XG59XG5cbi5tZXNzYWdlVXNlciB7XG4gIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1wdWxzZS1iZy1ob3ZlciwgI2YzZjRmNik7XG4gIGNvbG9yOiB2YXIoLS1wdWxzZS10ZXh0LXByaW1hcnksICMxMTE4MjcpO1xufVxuXG4ubWVzc2FnZURldiB7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxuXG4ubWVzc2FnZUJvZHkge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIG1hcmdpbjogMDtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xufVxuXG4ubWVzc2FnZVRpbWUge1xuICBmb250LXNpemU6IDExcHg7XG4gIG1hcmdpbjogNHB4IDAgMDtcbiAgb3BhY2l0eTogMC43O1xufVxuXG4ucmVwbHlCb3gge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDhweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXB1bHNlLWJvcmRlciwgI2U1ZTdlYik7XG4gIHBhZGRpbmctdG9wOiAxMnB4O1xufVxuXG4ucmVwbHlJbnB1dCB7XG4gIGZsZXg6IDE7XG4gIGhlaWdodDogMzZweDtcbiAgcGFkZGluZzogOHB4IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcHVsc2UtYm9yZGVyLCAjZTVlN2ViKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tcHVsc2UtYmcsICNmZmZmZmYpO1xuICBjb2xvcjogdmFyKC0tcHVsc2UtdGV4dC1wcmltYXJ5LCAjMTExODI3KTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLnJlcGx5SW5wdXQ6Zm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLXB1bHNlLWFjY2VudCwgIzYzNjZmMSk7XG59XG5cbi5zZW5kQnRuIHtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBmbGV4LXNocmluazogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xufVxuXG4uc2VuZEJ0bjpob3ZlciB7XG4gIG9wYWNpdHk6IDAuOTtcbn1cblxuLnNlbmRCdG46ZGlzYWJsZWQge1xuICBvcGFjaXR5OiAwLjQ7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5zZW5kSWNvbiB7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICBzdHJva2Utd2lkdGg6IDI7XG4gIGZpbGw6IG5vbmU7XG59XG4iXX0= */";
|
|
4
|
+
var styles = {"conversation":"ConversationView-module_conversation__Kyrej","backBtn":"ConversationView-module_backBtn__Ls1YK","backIcon":"ConversationView-module_backIcon__rmWLJ","subject":"ConversationView-module_subject__DVvkN","messages":"ConversationView-module_messages__KatYK","message":"ConversationView-module_message__L9hkM","messageUser":"ConversationView-module_messageUser__0n-3J","messageDev":"ConversationView-module_messageDev__Lss8r","messageBody":"ConversationView-module_messageBody__K5bq6","messageTime":"ConversationView-module_messageTime__LQSrh","replyBox":"ConversationView-module_replyBox__Bjf08","replyInput":"ConversationView-module_replyInput__4UjyN","sendBtn":"ConversationView-module_sendBtn__ryIfI","sendIcon":"ConversationView-module_sendIcon__Xcqbi"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=ConversationView.module.css.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationView.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
interface FeedbackFormProps {
|
|
3
|
+
client: SupabaseClient;
|
|
4
|
+
projectId: string;
|
|
5
|
+
deviceId: string;
|
|
6
|
+
accentColor: string;
|
|
7
|
+
placeholder: string;
|
|
8
|
+
collectEmail: boolean;
|
|
9
|
+
metadata: Record<string, unknown>;
|
|
10
|
+
onSubmit?: (threadId: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function FeedbackForm({ client, projectId, deviceId, accentColor, placeholder, collectEmail, metadata, onSubmit: onSubmitCallback, }: FeedbackFormProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=FeedbackForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackForm.d.ts","sourceRoot":"","sources":["../../src/components/FeedbackForm.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAU5D,UAAU,iBAAiB;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,SAAS,EACT,QAAQ,EACR,WAAW,EACX,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,EAAE,gBAAgB,GAC3B,EAAE,iBAAiB,2CA4InB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { submitFeedback } from '../lib/api.mjs';
|
|
4
|
+
import { captureContext } from '../lib/capture.mjs';
|
|
5
|
+
import { TypeSelector } from './TypeSelector.mjs';
|
|
6
|
+
import { SuccessState } from './SuccessState.mjs';
|
|
7
|
+
import styles from './FeedbackForm.module.css.mjs';
|
|
8
|
+
|
|
9
|
+
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
10
|
+
function FeedbackForm({ client, projectId, deviceId, accentColor, placeholder, collectEmail, metadata, onSubmit: onSubmitCallback, }) {
|
|
11
|
+
const [type, setType] = useState(null);
|
|
12
|
+
const [subject, setSubject] = useState('');
|
|
13
|
+
const [body, setBody] = useState('');
|
|
14
|
+
const [email, setEmail] = useState('');
|
|
15
|
+
const [name, setName] = useState('');
|
|
16
|
+
const [submitting, setSubmitting] = useState(false);
|
|
17
|
+
const [error, setError] = useState(null);
|
|
18
|
+
const [emailError, setEmailError] = useState(null);
|
|
19
|
+
const [success, setSuccess] = useState(false);
|
|
20
|
+
const [cooldown, setCooldown] = useState(false);
|
|
21
|
+
const hasEmailError = email.trim() !== '' && !EMAIL_REGEX.test(email.trim());
|
|
22
|
+
const canSubmit = type && subject.trim() && body.trim() && !hasEmailError && !submitting && !cooldown;
|
|
23
|
+
async function handleSubmit(e) {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
if (!canSubmit)
|
|
26
|
+
return;
|
|
27
|
+
setSubmitting(true);
|
|
28
|
+
setError(null);
|
|
29
|
+
const ctx = captureContext();
|
|
30
|
+
const threadId = await submitFeedback(client, {
|
|
31
|
+
projectSlug: projectId,
|
|
32
|
+
deviceId,
|
|
33
|
+
type,
|
|
34
|
+
subject: subject.trim(),
|
|
35
|
+
body: body.trim(),
|
|
36
|
+
userEmail: email.trim() || undefined,
|
|
37
|
+
userName: name.trim() || undefined,
|
|
38
|
+
pageUrl: ctx.pageUrl,
|
|
39
|
+
userAgent: ctx.userAgent,
|
|
40
|
+
screenSize: ctx.screenSize,
|
|
41
|
+
appVersion: metadata.appVersion,
|
|
42
|
+
metadata,
|
|
43
|
+
});
|
|
44
|
+
setSubmitting(false);
|
|
45
|
+
if (threadId) {
|
|
46
|
+
setSuccess(true);
|
|
47
|
+
setCooldown(true);
|
|
48
|
+
setTimeout(() => setCooldown(false), 30000);
|
|
49
|
+
onSubmitCallback?.(threadId);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
setError("Couldn't send — please try again.");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function resetForm() {
|
|
56
|
+
setType(null);
|
|
57
|
+
setSubject('');
|
|
58
|
+
setBody('');
|
|
59
|
+
setEmail('');
|
|
60
|
+
setName('');
|
|
61
|
+
setError(null);
|
|
62
|
+
setEmailError(null);
|
|
63
|
+
setSuccess(false);
|
|
64
|
+
}
|
|
65
|
+
if (success) {
|
|
66
|
+
return jsx(SuccessState, { accentColor: accentColor, onNewFeedback: resetForm });
|
|
67
|
+
}
|
|
68
|
+
return (jsxs("form", { className: styles.form, onSubmit: handleSubmit, children: [jsxs("div", { children: [jsx("label", { className: styles.label, children: "Type" }), jsx(TypeSelector, { value: type, onChange: setType })] }), jsxs("div", { children: [jsx("label", { className: styles.label, children: "Subject" }), jsx("input", { className: styles.input, type: "text", value: subject, onChange: (e) => setSubject(e.target.value.slice(0, 200)), placeholder: "Brief summary", maxLength: 200 }), jsxs("div", { className: styles.charCount, children: [subject.length, "/200"] })] }), jsxs("div", { children: [jsx("label", { className: styles.label, children: "Message" }), jsx("textarea", { className: styles.textarea, value: body, onChange: (e) => setBody(e.target.value.slice(0, 5000)), placeholder: placeholder, maxLength: 5000 }), jsxs("div", { className: styles.charCount, children: [body.length, "/5000"] })] }), collectEmail && (jsxs("div", { className: styles.row, children: [jsxs("div", { children: [jsx("label", { className: styles.label, children: "Name (optional)" }), jsx("input", { className: styles.input, type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "Your name" })] }), jsxs("div", { children: [jsx("label", { className: styles.label, children: "Email (optional)" }), jsx("input", { className: styles.input, type: "email", value: email, onChange: (e) => { setEmail(e.target.value); setEmailError(null); }, onBlur: () => {
|
|
69
|
+
if (email.trim() && !EMAIL_REGEX.test(email.trim())) {
|
|
70
|
+
setEmailError('Please enter a valid email');
|
|
71
|
+
}
|
|
72
|
+
}, placeholder: "you@example.com" }), emailError && jsx("p", { className: styles.fieldError, children: emailError })] })] })), error && jsx("p", { className: styles.error, children: error }), jsx("button", { type: "submit", className: styles.submitBtn, style: { backgroundColor: accentColor }, disabled: !canSubmit, children: submitting ? 'Sending...' : 'Send Feedback' })] }));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { FeedbackForm };
|
|
76
|
+
//# sourceMappingURL=FeedbackForm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackForm.mjs","sources":["../../src/components/FeedbackForm.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"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 = ".FeedbackForm-module_form__IWYCt{display:flex;flex-direction:column;gap:12px;padding:0}.FeedbackForm-module_label__0DawC{color:var(--pulse-text-primary,#111827);display:block;font-size:13px;font-weight:500;margin-bottom:4px}.FeedbackForm-module_input__BTPxl{background:var(--pulse-bg,#fff);border:1px solid var(--pulse-border,#e5e7eb);border-radius:6px;box-sizing:border-box;color:var(--pulse-text-primary,#111827);font-family:inherit;font-size:14px;height:36px;outline:none;padding:8px 12px;transition:border-color .12s ease;width:100%}.FeedbackForm-module_input__BTPxl:focus{border-color:var(--pulse-accent,#6366f1)}.FeedbackForm-module_input__BTPxl::placeholder{color:var(--pulse-text-tertiary,#9ca3af)}.FeedbackForm-module_textarea__4rBvG{background:var(--pulse-bg,#fff);border:1px solid var(--pulse-border,#e5e7eb);border-radius:6px;box-sizing:border-box;color:var(--pulse-text-primary,#111827);font-family:inherit;font-size:14px;max-height:200px;min-height:80px;outline:none;padding:8px 12px;resize:vertical;transition:border-color .12s ease;width:100%}.FeedbackForm-module_textarea__4rBvG:focus{border-color:var(--pulse-accent,#6366f1)}.FeedbackForm-module_textarea__4rBvG::placeholder{color:var(--pulse-text-tertiary,#9ca3af)}.FeedbackForm-module_row__Pxk7f{display:flex;gap:8px}.FeedbackForm-module_row__Pxk7f>*{flex:1}.FeedbackForm-module_submitBtn__qZEPm{align-items:center;border:none;border-radius:6px;color:#fff;cursor:pointer;display:flex;font-family:inherit;font-size:14px;font-weight:600;gap:6px;height:36px;justify-content:center;transition:opacity .12s ease;width:100%}.FeedbackForm-module_submitBtn__qZEPm:hover{opacity:.9}.FeedbackForm-module_submitBtn__qZEPm:disabled{cursor:not-allowed;opacity:.5}.FeedbackForm-module_error__ubdse{background:rgba(239,68,68,.08);border-radius:6px;color:#ef4444;font-size:13px;margin:0;padding:8px 12px}.FeedbackForm-module_charCount__ahthv{color:var(--pulse-text-tertiary,#9ca3af);font-size:11px;margin-top:-8px;text-align:right}.FeedbackForm-module_fieldError__N4qWo{color:#ef4444;font-size:12px;margin:2px 0 0}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZlZWRiYWNrRm9ybS5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUNFLFlBQWEsQ0FDYixxQkFBc0IsQ0FDdEIsUUFBUyxDQUNULFNBQ0YsQ0FFQSxrQ0FHRSx1Q0FBeUMsQ0FFekMsYUFBYyxDQUpkLGNBQWUsQ0FDZixlQUFnQixDQUVoQixpQkFFRixDQUVBLGtDQU1FLCtCQUFvQyxDQURwQyw0Q0FBOEMsQ0FEOUMsaUJBQWtCLENBUWxCLHFCQUFzQixDQUx0Qix1Q0FBeUMsQ0FFekMsbUJBQW9CLENBRHBCLGNBQWUsQ0FOZixXQUFZLENBUVosWUFBYSxDQVBiLGdCQUFpQixDQVFqQixpQ0FBbUMsQ0FWbkMsVUFZRixDQUVBLHdDQUNFLHdDQUNGLENBRUEsK0NBQ0Usd0NBQ0YsQ0FFQSxxQ0FPRSwrQkFBb0MsQ0FEcEMsNENBQThDLENBRDlDLGlCQUFrQixDQVNsQixxQkFBc0IsQ0FOdEIsdUNBQXlDLENBRXpDLG1CQUFvQixDQURwQixjQUFlLENBTmYsZ0JBQWlCLENBRGpCLGVBQWdCLENBU2hCLFlBQWEsQ0FQYixnQkFBaUIsQ0FRakIsZUFBZ0IsQ0FDaEIsaUNBQW1DLENBWm5DLFVBY0YsQ0FFQSwyQ0FDRSx3Q0FDRixDQUVBLGtEQUNFLHdDQUNGLENBRUEsZ0NBQ0UsWUFBYSxDQUNiLE9BQ0YsQ0FFQSxrQ0FDRSxNQUNGLENBRUEsc0NBWUUsa0JBQW1CLENBUm5CLFdBQVksQ0FEWixpQkFBa0IsQ0FFbEIsVUFBYyxDQUdkLGNBQWUsQ0FHZixZQUFhLENBRmIsbUJBQW9CLENBSHBCLGNBQWUsQ0FDZixlQUFnQixDQU9oQixPQUFRLENBWlIsV0FBWSxDQVdaLHNCQUF1QixDQUh2Qiw0QkFBOEIsQ0FUOUIsVUFjRixDQUVBLDRDQUNFLFVBQ0YsQ0FFQSwrQ0FFRSxrQkFBbUIsQ0FEbkIsVUFFRixDQUVBLGtDQUtFLDhCQUFtQyxDQUNuQyxpQkFBa0IsQ0FKbEIsYUFBYyxDQURkLGNBQWUsQ0FFZixRQUFTLENBQ1QsZ0JBR0YsQ0FFQSxzQ0FFRSx3Q0FBMEMsQ0FEMUMsY0FBZSxDQUdmLGVBQWdCLENBRGhCLGdCQUVGLENBRUEsdUNBRUUsYUFBYyxDQURkLGNBQWUsQ0FFZixjQUNGIiwiZmlsZSI6IkZlZWRiYWNrRm9ybS5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmZvcm0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEycHg7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi5sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtcHJpbWFyeSwgIzExMTgyNyk7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5pbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDM2cHg7XG4gIHBhZGRpbmc6IDhweCAxMnB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXB1bHNlLWJvcmRlciwgI2U1ZTdlYik7XG4gIGJhY2tncm91bmQ6IHZhcigtLXB1bHNlLWJnLCAjZmZmZmZmKTtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtcHJpbWFyeSwgIzExMTgyNyk7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAxMjBtcyBlYXNlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uaW5wdXQ6Zm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLXB1bHNlLWFjY2VudCwgIzYzNjZmMSk7XG59XG5cbi5pbnB1dDo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tcHVsc2UtdGV4dC10ZXJ0aWFyeSwgIzljYTNhZik7XG59XG5cbi50ZXh0YXJlYSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtaW4taGVpZ2h0OiA4MHB4O1xuICBtYXgtaGVpZ2h0OiAyMDBweDtcbiAgcGFkZGluZzogOHB4IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcHVsc2UtYm9yZGVyLCAjZTVlN2ViKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tcHVsc2UtYmcsICNmZmZmZmYpO1xuICBjb2xvcjogdmFyKC0tcHVsc2UtdGV4dC1wcmltYXJ5LCAjMTExODI3KTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgb3V0bGluZTogbm9uZTtcbiAgcmVzaXplOiB2ZXJ0aWNhbDtcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi50ZXh0YXJlYTpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tcHVsc2UtYWNjZW50LCAjNjM2NmYxKTtcbn1cblxuLnRleHRhcmVhOjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1wdWxzZS10ZXh0LXRlcnRpYXJ5LCAjOWNhM2FmKTtcbn1cblxuLnJvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogOHB4O1xufVxuXG4ucm93ID4gKiB7XG4gIGZsZXg6IDE7XG59XG5cbi5zdWJtaXRCdG4ge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG59XG5cbi5zdWJtaXRCdG46aG92ZXIge1xuICBvcGFjaXR5OiAwLjk7XG59XG5cbi5zdWJtaXRCdG46ZGlzYWJsZWQge1xuICBvcGFjaXR5OiAwLjU7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5lcnJvciB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICNFRjQ0NDQ7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogOHB4IDEycHg7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMDgpO1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG59XG5cbi5jaGFyQ291bnQge1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiB2YXIoLS1wdWxzZS10ZXh0LXRlcnRpYXJ5LCAjOWNhM2FmKTtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG1hcmdpbi10b3A6IC04cHg7XG59XG5cbi5maWVsZEVycm9yIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogI0VGNDQ0NDtcbiAgbWFyZ2luOiAycHggMCAwO1xufVxuIl19 */";
|
|
4
|
+
var styles = {"form":"FeedbackForm-module_form__IWYCt","label":"FeedbackForm-module_label__0DawC","input":"FeedbackForm-module_input__BTPxl","textarea":"FeedbackForm-module_textarea__4rBvG","row":"FeedbackForm-module_row__Pxk7f","submitBtn":"FeedbackForm-module_submitBtn__qZEPm","error":"FeedbackForm-module_error__ubdse","charCount":"FeedbackForm-module_charCount__ahthv","fieldError":"FeedbackForm-module_fieldError__N4qWo"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=FeedbackForm.module.css.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackForm.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
interface FeedbackPanelProps {
|
|
3
|
+
client: SupabaseClient;
|
|
4
|
+
projectId: string;
|
|
5
|
+
deviceId: string;
|
|
6
|
+
accentColor: string;
|
|
7
|
+
greeting: string;
|
|
8
|
+
placeholder: string;
|
|
9
|
+
collectEmail: boolean;
|
|
10
|
+
metadata: Record<string, unknown>;
|
|
11
|
+
position: 'bottom-right' | 'bottom-left';
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
onSubmit?: (threadId: string) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function FeedbackPanel({ client, projectId, deviceId, accentColor, greeting, placeholder, collectEmail, metadata, position, onClose, onSubmit, }: FeedbackPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=FeedbackPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackPanel.d.ts","sourceRoot":"","sources":["../../src/components/FeedbackPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,UAAU,kBAAkB;IAC1B,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAAC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAID,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,EACT,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,QAAQ,GACT,EAAE,kBAAkB,2CAuGpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { FeedbackForm } from './FeedbackForm.mjs';
|
|
4
|
+
import { ThreadList } from './ThreadList.mjs';
|
|
5
|
+
import { ConversationView } from './ConversationView.mjs';
|
|
6
|
+
import styles from './FeedbackPanel.module.css.mjs';
|
|
7
|
+
|
|
8
|
+
function FeedbackPanel({ client, projectId, deviceId, accentColor, greeting, placeholder, collectEmail, metadata, position, onClose, onSubmit, }) {
|
|
9
|
+
const [tab, setTab] = useState('new');
|
|
10
|
+
const [selectedThread, setSelectedThread] = useState(null);
|
|
11
|
+
const [isDark, setIsDark] = useState(false);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (typeof window !== 'undefined') {
|
|
14
|
+
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
|
15
|
+
setIsDark(mq.matches);
|
|
16
|
+
}
|
|
17
|
+
}, []);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
function handleKeyDown(e) {
|
|
20
|
+
if (e.key === 'Escape')
|
|
21
|
+
onClose();
|
|
22
|
+
}
|
|
23
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
24
|
+
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
25
|
+
}, [onClose]);
|
|
26
|
+
const posClass = position === 'bottom-left' ? styles.bottomLeft : styles.bottomRight;
|
|
27
|
+
const themeClass = isDark ? styles.panelDark : styles.panelLight;
|
|
28
|
+
function renderBody() {
|
|
29
|
+
if (selectedThread) {
|
|
30
|
+
return (jsx(ConversationView, { client: client, thread: selectedThread, accentColor: accentColor, onBack: () => setSelectedThread(null) }));
|
|
31
|
+
}
|
|
32
|
+
if (tab === 'new') {
|
|
33
|
+
return (jsx(FeedbackForm, { client: client, projectId: projectId, deviceId: deviceId, accentColor: accentColor, placeholder: placeholder, collectEmail: collectEmail, metadata: metadata, onSubmit: onSubmit }));
|
|
34
|
+
}
|
|
35
|
+
return (jsx(ThreadList, { client: client, onSelectThread: (thread) => setSelectedThread(thread) }));
|
|
36
|
+
}
|
|
37
|
+
return (jsxs(Fragment, { children: [jsx("div", { className: styles.overlay, onClick: onClose }), jsxs("div", { className: `${styles.panel} ${posClass} ${themeClass}`, style: { '--pulse-accent': accentColor }, onClick: (e) => e.stopPropagation(), children: [jsxs("div", { className: styles.header, children: [jsx("p", { className: styles.greeting, children: greeting }), jsx("button", { type: "button", className: styles.closeBtn, onClick: onClose, "aria-label": "Close", children: jsxs("svg", { className: styles.closeIcon, viewBox: "0 0 24 24", children: [jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] }), !selectedThread && (jsxs("div", { className: styles.tabs, children: [jsx("button", { type: "button", className: `${styles.tab} ${tab === 'new' ? styles.tabActive : ''}`, style: tab === 'new' ? { borderBottomColor: accentColor } : undefined, onClick: () => setTab('new'), children: "New" }), jsx("button", { type: "button", className: `${styles.tab} ${tab === 'threads' ? styles.tabActive : ''}`, style: tab === 'threads' ? { borderBottomColor: accentColor } : undefined, onClick: () => setTab('threads'), children: "My Threads" })] })), jsx("div", { className: styles.body, children: renderBody() })] })] }));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { FeedbackPanel };
|
|
41
|
+
//# sourceMappingURL=FeedbackPanel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackPanel.mjs","sources":["../../src/components/FeedbackPanel.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs","_Fragment"],"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 = ".FeedbackPanel-module_overlay__7EKR-{inset:0;position:fixed;z-index:9999}.FeedbackPanel-module_panel__kSC1b{animation:FeedbackPanel-module_slideUp__HxbOr .2s cubic-bezier(.22,1,.36,1);border-radius:16px;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;max-height:520px;overflow:hidden;position:fixed;width:380px;z-index:10000}.FeedbackPanel-module_panelLight__KDQJ4{--pulse-bg:#fff;--pulse-bg-secondary:#f9fafb;--pulse-bg-hover:#f3f4f6;--pulse-text-primary:#111827;--pulse-text-secondary:#6b7280;--pulse-text-tertiary:#9ca3af;--pulse-border:#e5e7eb;--pulse-border-strong:#d1d5db;background:#fff;box-shadow:0 8px 40px rgba(0,0,0,.12);color:#111827}.FeedbackPanel-module_panelDark__EUh4H{--pulse-bg:#1a1a2e;--pulse-bg-secondary:#16162a;--pulse-bg-hover:#22223a;--pulse-text-primary:#e5e7eb;--pulse-text-secondary:#9ca3af;--pulse-text-tertiary:#6b7280;--pulse-border:#2a2a40;--pulse-border-strong:#3a3a55;background:#1a1a2e;box-shadow:0 8px 40px rgba(0,0,0,.32);color:#e5e7eb}.FeedbackPanel-module_bottomRight__331Vd{bottom:72px;right:16px}.FeedbackPanel-module_bottomLeft__W1rlu{bottom:72px;left:16px}.FeedbackPanel-module_header__yWwBD{align-items:center;border-bottom:1px solid var(--pulse-border,#e5e7eb);display:flex;flex-shrink:0;justify-content:space-between;padding:14px 16px}.FeedbackPanel-module_greeting__DLD1g{color:var(--pulse-text-primary,#111827);font-size:15px;font-weight:600;margin:0}.FeedbackPanel-module_closeBtn__HdntP{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--pulse-text-secondary,#6b7280);cursor:pointer;display:flex;height:28px;justify-content:center;padding:0;transition:background .12s ease;width:28px}.FeedbackPanel-module_closeBtn__HdntP:hover{background:var(--pulse-bg-hover,#f3f4f6)}.FeedbackPanel-module_closeIcon__eM6qt{stroke:currentColor;stroke-width:2;fill:none;height:18px;width:18px}.FeedbackPanel-module_tabs__-Tq3f{border-bottom:1px solid var(--pulse-border,#e5e7eb);display:flex;flex-shrink:0}.FeedbackPanel-module_tab__MgsxB{background:transparent;border:none;border-bottom:2px solid transparent;color:var(--pulse-text-secondary,#6b7280);cursor:pointer;flex:1;font-family:inherit;font-size:13px;font-weight:500;padding:10px;transition:all .12s ease}.FeedbackPanel-module_tabActive__cSus0{border-bottom-color:var(--pulse-accent,#6366f1);color:var(--pulse-text-primary,#111827)}.FeedbackPanel-module_body__hp-M0{flex:1;overflow-y:auto;padding:16px}@keyframes FeedbackPanel-module_slideUp__HxbOr{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media (max-width:479px){.FeedbackPanel-module_panel__kSC1b{border-radius:16px 16px 16px 16px;bottom:16px!important;left:16px!important;max-height:70vh;right:16px!important;width:calc(100vw - 32px)}}@media (prefers-reduced-motion:reduce){.FeedbackPanel-module_panel__kSC1b{animation:none}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZlZWRiYWNrUGFuZWwubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FFRSxPQUFRLENBRFIsY0FBZSxDQUVmLFlBQ0YsQ0FFQSxtQ0FXRSwyRUFBdUQsQ0FOdkQsa0JBQW1CLENBRW5CLFlBQWEsQ0FDYixxQkFBc0IsQ0FDdEIsNEZBQ3FDLENBTnJDLGdCQUFpQixDQUVqQixlQUFnQixDQUxoQixjQUFlLENBRWYsV0FBWSxDQURaLGFBVUYsQ0FFQSx3Q0FJRSxlQUFtQixDQUNuQiw0QkFBNkIsQ0FDN0Isd0JBQXlCLENBQ3pCLDRCQUE2QixDQUM3Qiw4QkFBK0IsQ0FDL0IsNkJBQThCLENBQzlCLHNCQUF1QixDQUN2Qiw2QkFBOEIsQ0FWOUIsZUFBbUIsQ0FFbkIscUNBQTBDLENBRDFDLGFBVUYsQ0FFQSx1Q0FJRSxrQkFBbUIsQ0FDbkIsNEJBQTZCLENBQzdCLHdCQUF5QixDQUN6Qiw0QkFBNkIsQ0FDN0IsOEJBQStCLENBQy9CLDZCQUE4QixDQUM5QixzQkFBdUIsQ0FDdkIsNkJBQThCLENBVjlCLGtCQUFtQixDQUVuQixxQ0FBMEMsQ0FEMUMsYUFVRixDQUVBLHlDQUNFLFdBQVksQ0FDWixVQUNGLENBRUEsd0NBQ0UsV0FBWSxDQUNaLFNBQ0YsQ0FFQSxvQ0FFRSxrQkFBbUIsQ0FHbkIsbURBQXFELENBSnJELFlBQWEsQ0FLYixhQUFjLENBSGQsNkJBQThCLENBQzlCLGlCQUdGLENBRUEsc0NBSUUsdUNBQXlDLENBSHpDLGNBQWUsQ0FDZixlQUFnQixDQUNoQixRQUVGLENBRUEsc0NBUUUsa0JBQW1CLENBSG5CLHNCQUF1QixDQUR2QixXQUFZLENBRFosaUJBQWtCLENBT2xCLHlDQUEyQyxDQUozQyxjQUFlLENBQ2YsWUFBYSxDQUxiLFdBQVksQ0FPWixzQkFBdUIsQ0FHdkIsU0FBVSxDQURWLCtCQUFpQyxDQVZqQyxVQVlGLENBRUEsNENBQ0Usd0NBQ0YsQ0FFQSx1Q0FHRSxtQkFBb0IsQ0FDcEIsY0FBZSxDQUNmLFNBQVUsQ0FIVixXQUFZLENBRFosVUFLRixDQUVBLGtDQUVFLG1EQUFxRCxDQURyRCxZQUFhLENBRWIsYUFDRixDQUVBLGlDQUlFLHNCQUF1QixDQU92QixXQUFvQyxDQUFwQyxtQ0FBb0MsQ0FIcEMseUNBQTJDLENBSDNDLGNBQWUsQ0FKZixNQUFPLENBU1AsbUJBQW9CLENBSnBCLGNBQWUsQ0FDZixlQUFnQixDQUxoQixZQUFhLENBT2Isd0JBR0YsQ0FFQSx1Q0FDRSwrQ0FBaUQsQ0FDakQsdUNBQ0YsQ0FFQSxrQ0FDRSxNQUFPLENBQ1AsZUFBZ0IsQ0FDaEIsWUFDRixDQUVBLCtDQUNFLEdBQ0UsU0FBVSxDQUNWLHlCQUNGLENBQ0EsR0FDRSxTQUFVLENBQ1YsdUJBQ0YsQ0FDRixDQUdBLHlCQUNFLG1DQU1FLGlDQUFrQyxDQUhsQyxxQkFBdUIsQ0FDdkIsbUJBQXFCLENBRnJCLGVBQWdCLENBR2hCLG9CQUFzQixDQUp0Qix3QkFNRixDQUNGLENBRUEsdUNBQ0UsbUNBQ0UsY0FDRixDQUNGIiwiZmlsZSI6IkZlZWRiYWNrUGFuZWwubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5vdmVybGF5IHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgei1pbmRleDogOTk5OTtcbn1cblxuLnBhbmVsIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiAxMDAwMDtcbiAgd2lkdGg6IDM4MHB4O1xuICBtYXgtaGVpZ2h0OiA1MjBweDtcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLFxuICAgICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBhbmltYXRpb246IHNsaWRlVXAgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMjIsIDEsIDAuMzYsIDEpO1xufVxuXG4ucGFuZWxMaWdodCB7XG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gIGNvbG9yOiAjMTExODI3O1xuICBib3gtc2hhZG93OiAwIDhweCA0MHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIC0tcHVsc2UtYmc6ICNmZmZmZmY7XG4gIC0tcHVsc2UtYmctc2Vjb25kYXJ5OiAjZjlmYWZiO1xuICAtLXB1bHNlLWJnLWhvdmVyOiAjZjNmNGY2O1xuICAtLXB1bHNlLXRleHQtcHJpbWFyeTogIzExMTgyNztcbiAgLS1wdWxzZS10ZXh0LXNlY29uZGFyeTogIzZiNzI4MDtcbiAgLS1wdWxzZS10ZXh0LXRlcnRpYXJ5OiAjOWNhM2FmO1xuICAtLXB1bHNlLWJvcmRlcjogI2U1ZTdlYjtcbiAgLS1wdWxzZS1ib3JkZXItc3Ryb25nOiAjZDFkNWRiO1xufVxuXG4ucGFuZWxEYXJrIHtcbiAgYmFja2dyb3VuZDogIzFhMWEyZTtcbiAgY29sb3I6ICNlNWU3ZWI7XG4gIGJveC1zaGFkb3c6IDAgOHB4IDQwcHggcmdiYSgwLCAwLCAwLCAwLjMyKTtcbiAgLS1wdWxzZS1iZzogIzFhMWEyZTtcbiAgLS1wdWxzZS1iZy1zZWNvbmRhcnk6ICMxNjE2MmE7XG4gIC0tcHVsc2UtYmctaG92ZXI6ICMyMjIyM2E7XG4gIC0tcHVsc2UtdGV4dC1wcmltYXJ5OiAjZTVlN2ViO1xuICAtLXB1bHNlLXRleHQtc2Vjb25kYXJ5OiAjOWNhM2FmO1xuICAtLXB1bHNlLXRleHQtdGVydGlhcnk6ICM2YjcyODA7XG4gIC0tcHVsc2UtYm9yZGVyOiAjMmEyYTQwO1xuICAtLXB1bHNlLWJvcmRlci1zdHJvbmc6ICMzYTNhNTU7XG59XG5cbi5ib3R0b21SaWdodCB7XG4gIGJvdHRvbTogNzJweDtcbiAgcmlnaHQ6IDE2cHg7XG59XG5cbi5ib3R0b21MZWZ0IHtcbiAgYm90dG9tOiA3MnB4O1xuICBsZWZ0OiAxNnB4O1xufVxuXG4uaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1wdWxzZS1ib3JkZXIsICNlNWU3ZWIpO1xuICBmbGV4LXNocmluazogMDtcbn1cblxuLmdyZWV0aW5nIHtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBtYXJnaW46IDA7XG4gIGNvbG9yOiB2YXIoLS1wdWxzZS10ZXh0LXByaW1hcnksICMxMTE4MjcpO1xufVxuXG4uY2xvc2VCdG4ge1xuICB3aWR0aDogMjhweDtcbiAgaGVpZ2h0OiAyOHB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGNvbG9yOiB2YXIoLS1wdWxzZS10ZXh0LXNlY29uZGFyeSwgIzZiNzI4MCk7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTIwbXMgZWFzZTtcbiAgcGFkZGluZzogMDtcbn1cblxuLmNsb3NlQnRuOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tcHVsc2UtYmctaG92ZXIsICNmM2Y0ZjYpO1xufVxuXG4uY2xvc2VJY29uIHtcbiAgd2lkdGg6IDE4cHg7XG4gIGhlaWdodDogMThweDtcbiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XG4gIHN0cm9rZS13aWR0aDogMjtcbiAgZmlsbDogbm9uZTtcbn1cblxuLnRhYnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcHVsc2UtYm9yZGVyLCAjZTVlN2ViKTtcbiAgZmxleC1zaHJpbms6IDA7XG59XG5cbi50YWIge1xuICBmbGV4OiAxO1xuICBwYWRkaW5nOiAxMHB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtc2Vjb25kYXJ5LCAjNmI3MjgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi50YWJBY3RpdmUge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1wdWxzZS1hY2NlbnQsICM2MzY2ZjEpO1xuICBjb2xvcjogdmFyKC0tcHVsc2UtdGV4dC1wcmltYXJ5LCAjMTExODI3KTtcbn1cblxuLmJvZHkge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBwYWRkaW5nOiAxNnB4O1xufVxuXG5Aa2V5ZnJhbWVzIHNsaWRlVXAge1xuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpO1xuICB9XG4gIHRvIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxufVxuXG4vKiBNb2JpbGU6IGZ1bGwtd2lkdGggYm90dG9tIHNoZWV0ICovXG5AbWVkaWEgKG1heC13aWR0aDogNDc5cHgpIHtcbiAgLnBhbmVsIHtcbiAgICB3aWR0aDogY2FsYygxMDB2dyAtIDMycHgpO1xuICAgIG1heC1oZWlnaHQ6IDcwdmg7XG4gICAgYm90dG9tOiAxNnB4ICFpbXBvcnRhbnQ7XG4gICAgbGVmdDogMTZweCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAxNnB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweCAxNnB4IDE2cHggMTZweDtcbiAgfVxufVxuXG5AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xuICAucGFuZWwge1xuICAgIGFuaW1hdGlvbjogbm9uZTtcbiAgfVxufVxuIl19 */";
|
|
4
|
+
var styles = {"overlay":"FeedbackPanel-module_overlay__7EKR-","panel":"FeedbackPanel-module_panel__kSC1b","panelLight":"FeedbackPanel-module_panelLight__KDQJ4","panelDark":"FeedbackPanel-module_panelDark__EUh4H","bottomRight":"FeedbackPanel-module_bottomRight__331Vd","bottomLeft":"FeedbackPanel-module_bottomLeft__W1rlu","header":"FeedbackPanel-module_header__yWwBD","greeting":"FeedbackPanel-module_greeting__DLD1g","closeBtn":"FeedbackPanel-module_closeBtn__HdntP","closeIcon":"FeedbackPanel-module_closeIcon__eM6qt","tabs":"FeedbackPanel-module_tabs__-Tq3f","tab":"FeedbackPanel-module_tab__MgsxB","tabActive":"FeedbackPanel-module_tabActive__cSus0","body":"FeedbackPanel-module_body__hp-M0"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=FeedbackPanel.module.css.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackPanel.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface SuccessStateProps {
|
|
2
|
+
accentColor: string;
|
|
3
|
+
onNewFeedback: () => void;
|
|
4
|
+
}
|
|
5
|
+
export declare function SuccessState({ accentColor, onNewFeedback }: SuccessStateProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=SuccessState.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import styles from './SuccessState.module.css.mjs';
|
|
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" })] }));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export { SuccessState };
|
|
9
|
+
//# sourceMappingURL=SuccessState.mjs.map
|
|
@@ -0,0 +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;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import styleInject from '../node_modules/style-inject/dist/style-inject.es.mjs';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".SuccessState-module_success__0OQ0m{align-items:center;display:flex;flex-direction:column;gap:12px;justify-content:center;padding:40px 24px;text-align:center}.SuccessState-module_checkmark__c3V0j{align-items:center;animation:SuccessState-module_scaleIn__Stz0A .3s cubic-bezier(.34,1.56,.64,1);border-radius:50%;display:flex;height:56px;justify-content:center;width:56px}.SuccessState-module_checkIcon__s-eQX{stroke:currentColor;stroke-width:2.5;fill:none;stroke-linecap:round;stroke-linejoin:round;color:#fff;height:28px;width:28px}.SuccessState-module_title__ht-MC{color:var(--pulse-text-primary,#111827);font-size:15px;font-weight:600;margin:0}.SuccessState-module_subtitle__4BykE{color:var(--pulse-text-secondary,#6b7280);font-size:13px;margin:0}.SuccessState-module_newBtn__N58Qv{background:transparent;border:1px solid var(--pulse-border,#e5e7eb);border-radius:6px;color:var(--pulse-text-secondary,#6b7280);cursor:pointer;font-family:inherit;font-size:13px;font-weight:500;margin-top:8px;padding:8px 16px;transition:all .12s ease}.SuccessState-module_newBtn__N58Qv:hover{background:var(--pulse-bg-hover,#f3f4f6)}@keyframes SuccessState-module_scaleIn__Stz0A{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN1Y2Nlc3NTdGF0ZS5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9DQUdFLGtCQUFtQixDQUZuQixZQUFhLENBQ2IscUJBQXNCLENBS3RCLFFBQVMsQ0FIVCxzQkFBdUIsQ0FDdkIsaUJBQWtCLENBQ2xCLGlCQUVGLENBRUEsc0NBS0Usa0JBQW1CLENBRW5CLDZFQUEwRCxDQUoxRCxpQkFBa0IsQ0FDbEIsWUFBYSxDQUZiLFdBQVksQ0FJWixzQkFBdUIsQ0FMdkIsVUFPRixDQUVBLHNDQUlFLG1CQUFvQixDQUNwQixnQkFBaUIsQ0FDakIsU0FBVSxDQUNWLG9CQUFxQixDQUNyQixxQkFBc0IsQ0FMdEIsVUFBYyxDQURkLFdBQVksQ0FEWixVQVFGLENBRUEsa0NBR0UsdUNBQXlDLENBRnpDLGNBQWUsQ0FDZixlQUFnQixDQUVoQixRQUNGLENBRUEscUNBRUUseUNBQTJDLENBRDNDLGNBQWUsQ0FFZixRQUNGLENBRUEsbUNBS0Usc0JBQXVCLENBRHZCLDRDQUE4QyxDQUQ5QyxpQkFBa0IsQ0FNbEIseUNBQTJDLENBSDNDLGNBQWUsQ0FLZixtQkFBb0IsQ0FKcEIsY0FBZSxDQUNmLGVBQWdCLENBUGhCLGNBQWUsQ0FDZixnQkFBaUIsQ0FRakIsd0JBRUYsQ0FFQSx5Q0FDRSx3Q0FDRixDQUVBLDhDQUNFLEdBQTBCLFNBQVUsQ0FBL0Isa0JBQWlDLENBQ3RDLEdBQTRCLFNBQVUsQ0FBL0Isa0JBQWlDLENBQzFDIiwiZmlsZSI6IlN1Y2Nlc3NTdGF0ZS5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnN1Y2Nlc3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcGFkZGluZzogNDBweCAyNHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbn1cblxuLmNoZWNrbWFyayB7XG4gIHdpZHRoOiA1NnB4O1xuICBoZWlnaHQ6IDU2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFuaW1hdGlvbjogc2NhbGVJbiAzMDBtcyBjdWJpYy1iZXppZXIoMC4zNCwgMS41NiwgMC42NCwgMSk7XG59XG5cbi5jaGVja0ljb24ge1xuICB3aWR0aDogMjhweDtcbiAgaGVpZ2h0OiAyOHB4O1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XG4gIHN0cm9rZS13aWR0aDogMi41O1xuICBmaWxsOiBub25lO1xuICBzdHJva2UtbGluZWNhcDogcm91bmQ7XG4gIHN0cm9rZS1saW5lam9pbjogcm91bmQ7XG59XG5cbi50aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtcHJpbWFyeSwgIzExMTgyNyk7XG4gIG1hcmdpbjogMDtcbn1cblxuLnN1YnRpdGxlIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tcHVsc2UtdGV4dC1zZWNvbmRhcnksICM2YjcyODApO1xuICBtYXJnaW46IDA7XG59XG5cbi5uZXdCdG4ge1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIHBhZGRpbmc6IDhweCAxNnB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXB1bHNlLWJvcmRlciwgI2U1ZTdlYik7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtc2Vjb25kYXJ5LCAjNmI3MjgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xufVxuXG4ubmV3QnRuOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tcHVsc2UtYmctaG92ZXIsICNmM2Y0ZjYpO1xufVxuXG5Aa2V5ZnJhbWVzIHNjYWxlSW4ge1xuICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMCk7IG9wYWNpdHk6IDA7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSk7IG9wYWNpdHk6IDE7IH1cbn1cbiJdfQ== */";
|
|
4
|
+
var styles = {"success":"SuccessState-module_success__0OQ0m","checkmark":"SuccessState-module_checkmark__c3V0j","checkIcon":"SuccessState-module_checkIcon__s-eQX","title":"SuccessState-module_title__ht-MC","subtitle":"SuccessState-module_subtitle__4BykE","newBtn":"SuccessState-module_newBtn__N58Qv"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=SuccessState.module.css.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SuccessState.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
import type { Thread } from '../types';
|
|
3
|
+
interface ThreadListProps {
|
|
4
|
+
client: SupabaseClient;
|
|
5
|
+
onSelectThread: (thread: Thread) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function ThreadList({ client, onSelectThread }: ThreadListProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=ThreadList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadList.d.ts","sourceRoot":"","sources":["../../src/components/ThreadList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAavC,UAAU,eAAe;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,eAAe,2CAqDrE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { FEEDBACK_TYPES } from '../types.mjs';
|
|
4
|
+
import { getMyThreads } from '../lib/api.mjs';
|
|
5
|
+
import styles from './ThreadList.module.css.mjs';
|
|
6
|
+
|
|
7
|
+
const STATUS_COLORS = {
|
|
8
|
+
open: '#3B82F6',
|
|
9
|
+
in_progress: '#F59E0B',
|
|
10
|
+
resolved: '#10B981',
|
|
11
|
+
closed: '#6B7280',
|
|
12
|
+
wont_fix: '#EF4444',
|
|
13
|
+
};
|
|
14
|
+
function ThreadList({ client, onSelectThread }) {
|
|
15
|
+
const [threads, setThreads] = useState([]);
|
|
16
|
+
const [loading, setLoading] = useState(true);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
let cancelled = false;
|
|
19
|
+
async function load() {
|
|
20
|
+
const data = await getMyThreads(client);
|
|
21
|
+
if (!cancelled) {
|
|
22
|
+
setThreads(data);
|
|
23
|
+
setLoading(false);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
load();
|
|
27
|
+
return () => { cancelled = true; };
|
|
28
|
+
}, [client]);
|
|
29
|
+
if (loading) {
|
|
30
|
+
return jsx("div", { className: styles.loading, children: "Loading..." });
|
|
31
|
+
}
|
|
32
|
+
if (threads.length === 0) {
|
|
33
|
+
return jsx("div", { className: styles.empty, children: "No feedback yet. Send your first one!" });
|
|
34
|
+
}
|
|
35
|
+
return (jsx("div", { className: styles.list, children: threads.map((thread) => {
|
|
36
|
+
const typeConfig = FEEDBACK_TYPES.find((ft) => ft.value === thread.type);
|
|
37
|
+
const timeAgo = getTimeAgo(thread.createdAt);
|
|
38
|
+
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
|
+
}
|
|
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
|
+
|
|
57
|
+
export { ThreadList };
|
|
58
|
+
//# sourceMappingURL=ThreadList.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadList.mjs","sources":["../../src/components/ThreadList.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"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 = ".ThreadList-module_list__01UEB{display:flex;flex-direction:column;gap:4px}.ThreadList-module_empty__pNxTk{color:var(--pulse-text-tertiary,#9ca3af);font-size:13px;padding:32px 16px;text-align:center}.ThreadList-module_threadItem__ACj2A{align-items:flex-start;background:transparent;border:none;border-radius:8px;cursor:pointer;display:flex;font-family:inherit;gap:10px;padding:10px 12px;text-align:left;transition:background .12s ease;width:100%}.ThreadList-module_threadItem__ACj2A:hover{background:var(--pulse-bg-hover,#f3f4f6)}.ThreadList-module_threadEmoji__FYO2R{flex-shrink:0;font-size:16px;line-height:1;margin-top:2px}.ThreadList-module_threadContent__1w-m-{flex:1;min-width:0}.ThreadList-module_threadSubject__MclSf{color:var(--pulse-text-primary,#111827);font-size:14px;font-weight:500;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ThreadList-module_threadMeta__ktOO6{color:var(--pulse-text-tertiary,#9ca3af);font-size:11px;margin:2px 0 0}.ThreadList-module_statusDot__z0htt{border-radius:50%;display:inline-block;height:6px;margin-right:4px;vertical-align:middle;width:6px}.ThreadList-module_loading__KjPJf{color:var(--pulse-text-tertiary,#9ca3af);font-size:13px;padding:24px;text-align:center}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRocmVhZExpc3QubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFDRSxZQUFhLENBQ2IscUJBQXNCLENBQ3RCLE9BQ0YsQ0FFQSxnQ0FHRSx3Q0FBMEMsQ0FDMUMsY0FBZSxDQUZmLGlCQUFrQixDQURsQixpQkFJRixDQUVBLHFDQUVFLHNCQUF1QixDQU92QixzQkFBdUIsQ0FEdkIsV0FBWSxDQUhaLGlCQUFrQixDQUNsQixjQUFlLENBTGYsWUFBYSxDQVdiLG1CQUFvQixDQVRwQixRQUFTLENBQ1QsaUJBQWtCLENBT2xCLGVBQWdCLENBSmhCLCtCQUFpQyxDQUdqQyxVQUdGLENBRUEsMkNBQ0Usd0NBQ0YsQ0FFQSxzQ0FJRSxhQUFjLENBSGQsY0FBZSxDQUNmLGFBQWMsQ0FDZCxjQUVGLENBRUEsd0NBQ0UsTUFBTyxDQUNQLFdBQ0YsQ0FFQSx3Q0FHRSx1Q0FBeUMsQ0FGekMsY0FBZSxDQUNmLGVBQWdCLENBRWhCLFFBQVMsQ0FFVCxlQUFnQixDQUNoQixzQkFBdUIsQ0FGdkIsa0JBR0YsQ0FFQSxxQ0FFRSx3Q0FBMEMsQ0FEMUMsY0FBZSxDQUVmLGNBQ0YsQ0FFQSxvQ0FJRSxpQkFBa0IsQ0FIbEIsb0JBQXFCLENBRXJCLFVBQVcsQ0FFWCxnQkFBaUIsQ0FDakIscUJBQXNCLENBSnRCLFNBS0YsQ0FFQSxrQ0FHRSx3Q0FBMEMsQ0FDMUMsY0FBZSxDQUZmLFlBQWEsQ0FEYixpQkFJRiIsImZpbGUiOiJUaHJlYWRMaXN0Lm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIubGlzdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xufVxuXG4uZW1wdHkge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDMycHggMTZweDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtdGVydGlhcnksICM5Y2EzYWYpO1xuICBmb250LXNpemU6IDEzcHg7XG59XG5cbi50aHJlYWRJdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gIGdhcDogMTBweDtcbiAgcGFkZGluZzogMTBweCAxMnB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMjBtcyBlYXNlO1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICB3aWR0aDogMTAwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG59XG5cbi50aHJlYWRJdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tcHVsc2UtYmctaG92ZXIsICNmM2Y0ZjYpO1xufVxuXG4udGhyZWFkRW1vamkge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4udGhyZWFkQ29udGVudCB7XG4gIGZsZXg6IDE7XG4gIG1pbi13aWR0aDogMDtcbn1cblxuLnRocmVhZFN1YmplY3Qge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGNvbG9yOiB2YXIoLS1wdWxzZS10ZXh0LXByaW1hcnksICMxMTE4MjcpO1xuICBtYXJnaW46IDA7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4udGhyZWFkTWV0YSB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtdGVydGlhcnksICM5Y2EzYWYpO1xuICBtYXJnaW46IDJweCAwIDA7XG59XG5cbi5zdGF0dXNEb3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiA2cHg7XG4gIGhlaWdodDogNnB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG1hcmdpbi1yaWdodDogNHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4ubG9hZGluZyB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgcGFkZGluZzogMjRweDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtdGVydGlhcnksICM5Y2EzYWYpO1xuICBmb250LXNpemU6IDEzcHg7XG59XG4iXX0= */";
|
|
4
|
+
var styles = {"list":"ThreadList-module_list__01UEB","empty":"ThreadList-module_empty__pNxTk","threadItem":"ThreadList-module_threadItem__ACj2A","threadEmoji":"ThreadList-module_threadEmoji__FYO2R","threadContent":"ThreadList-module_threadContent__1w-m-","threadSubject":"ThreadList-module_threadSubject__MclSf","threadMeta":"ThreadList-module_threadMeta__ktOO6","statusDot":"ThreadList-module_statusDot__z0htt","loading":"ThreadList-module_loading__KjPJf"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=ThreadList.module.css.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadList.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|