@bbearai/react 0.1.8 → 0.1.9

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/index.js CHANGED
@@ -58,7 +58,17 @@ var BugBearContext = (0, import_react.createContext)({
58
58
  endSession: async () => ({ success: false }),
59
59
  addFinding: async () => ({ success: false }),
60
60
  refreshSession: async () => {
61
- }
61
+ },
62
+ // Messaging
63
+ threads: [],
64
+ unreadCount: 0,
65
+ refreshThreads: async () => {
66
+ },
67
+ getThreadMessages: async () => [],
68
+ sendMessage: async () => false,
69
+ markAsRead: async () => {
70
+ },
71
+ createThread: async () => ({ success: false })
62
72
  });
63
73
  function useBugBear() {
64
74
  return (0, import_react.useContext)(BugBearContext);
@@ -73,6 +83,8 @@ function BugBearProvider({ config, children, enabled = true }) {
73
83
  const hasInitialized = (0, import_react.useRef)(false);
74
84
  const [activeSession, setActiveSession] = (0, import_react.useState)(null);
75
85
  const [sessionFindings, setSessionFindings] = (0, import_react.useState)([]);
86
+ const [threads, setThreads] = (0, import_react.useState)([]);
87
+ const [unreadCount, setUnreadCount] = (0, import_react.useState)(0);
76
88
  const refreshAssignments = (0, import_react.useCallback)(async () => {
77
89
  if (!client) return;
78
90
  const newAssignments = await client.getAssignedTests();
@@ -117,6 +129,38 @@ function BugBearProvider({ config, children, enabled = true }) {
117
129
  }
118
130
  return result;
119
131
  }, [client, activeSession]);
132
+ const refreshThreads = (0, import_react.useCallback)(async () => {
133
+ if (!client) return;
134
+ const newThreads = await client.getThreadsForTester();
135
+ setThreads(newThreads);
136
+ const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
137
+ setUnreadCount(totalUnread);
138
+ }, [client]);
139
+ const getThreadMessages = (0, import_react.useCallback)(async (threadId) => {
140
+ if (!client) return [];
141
+ return client.getThreadMessages(threadId);
142
+ }, [client]);
143
+ const sendMessage = (0, import_react.useCallback)(async (threadId, content) => {
144
+ if (!client) return false;
145
+ const success = await client.sendMessage(threadId, content);
146
+ if (success) {
147
+ await refreshThreads();
148
+ }
149
+ return success;
150
+ }, [client, refreshThreads]);
151
+ const markAsRead = (0, import_react.useCallback)(async (threadId) => {
152
+ if (!client) return;
153
+ await client.markThreadAsRead(threadId);
154
+ await refreshThreads();
155
+ }, [client, refreshThreads]);
156
+ const createThread = (0, import_react.useCallback)(async (options) => {
157
+ if (!client) return { success: false, error: "Client not initialized" };
158
+ const result = await client.createThread(options);
159
+ if (result.success) {
160
+ await refreshThreads();
161
+ }
162
+ return result;
163
+ }, [client, refreshThreads]);
120
164
  const initializeBugBear = (0, import_react.useCallback)(async (bugBearClient) => {
121
165
  setIsLoading(true);
122
166
  try {
@@ -129,12 +173,16 @@ function BugBearProvider({ config, children, enabled = true }) {
129
173
  setTesterInfo(info);
130
174
  setIsTester(!!info);
131
175
  if (info && qaEnabled) {
132
- const [newAssignments, session] = await Promise.all([
176
+ const [newAssignments, session, newThreads] = await Promise.all([
133
177
  bugBearClient.getAssignedTests(),
134
- bugBearClient.getActiveSession()
178
+ bugBearClient.getActiveSession(),
179
+ bugBearClient.getThreadsForTester()
135
180
  ]);
136
181
  setAssignments(newAssignments);
137
182
  setActiveSession(session);
183
+ setThreads(newThreads);
184
+ const totalUnread = newThreads.reduce((sum, t) => sum + t.unreadCount, 0);
185
+ setUnreadCount(totalUnread);
138
186
  if (session) {
139
187
  const findings = await bugBearClient.getSessionFindings(session.id);
140
188
  setSessionFindings(findings);
@@ -200,7 +248,15 @@ function BugBearProvider({ config, children, enabled = true }) {
200
248
  startSession,
201
249
  endSession,
202
250
  addFinding,
203
- refreshSession
251
+ refreshSession,
252
+ // Messaging
253
+ threads,
254
+ unreadCount,
255
+ refreshThreads,
256
+ getThreadMessages,
257
+ sendMessage,
258
+ markAsRead,
259
+ createThread
204
260
  },
205
261
  children
206
262
  }
@@ -279,13 +335,77 @@ function BugBearPanel({
279
335
  defaultCollapsed = false,
280
336
  draggable = true
281
337
  }) {
282
- const { client, shouldShowWidget, testerInfo, assignments, currentAssignment, refreshAssignments, isLoading, onNavigate, updateTesterProfile, refreshTesterInfo, activeSession, sessionFindings, startSession, endSession, addFinding } = useBugBear();
338
+ const { client, shouldShowWidget, testerInfo, assignments, currentAssignment, refreshAssignments, isLoading, onNavigate, updateTesterProfile, refreshTesterInfo, activeSession, sessionFindings, startSession, endSession, addFinding, threads, unreadCount, refreshThreads, getThreadMessages, sendMessage, markAsRead, createThread } = useBugBear();
283
339
  const [collapsed, setCollapsed] = (0, import_react2.useState)(defaultCollapsed);
284
340
  const [activeTab, setActiveTab] = (0, import_react2.useState)("tests");
285
341
  const [showSteps, setShowSteps] = (0, import_react2.useState)(false);
286
342
  const [testView, setTestView] = (0, import_react2.useState)("detail");
287
343
  const [selectedTestId, setSelectedTestId] = (0, import_react2.useState)(null);
344
+ const [messageView, setMessageView] = (0, import_react2.useState)("list");
345
+ const [selectedThread, setSelectedThread] = (0, import_react2.useState)(null);
346
+ const [threadMessages, setThreadMessages] = (0, import_react2.useState)([]);
347
+ const [replyText, setReplyText] = (0, import_react2.useState)("");
348
+ const [sendingReply, setSendingReply] = (0, import_react2.useState)(false);
349
+ const [loadingMessages, setLoadingMessages] = (0, import_react2.useState)(false);
350
+ const [composeSubject, setComposeSubject] = (0, import_react2.useState)("");
351
+ const [composeMessage, setComposeMessage] = (0, import_react2.useState)("");
352
+ const [sendingNewMessage, setSendingNewMessage] = (0, import_react2.useState)(false);
288
353
  const displayedAssignment = selectedTestId ? assignments.find((a) => a.id === selectedTestId) || currentAssignment : currentAssignment;
354
+ const groupedAssignments = (0, import_react2.useMemo)(() => {
355
+ const groups = /* @__PURE__ */ new Map();
356
+ for (const assignment of assignments) {
357
+ const groupId = assignment.testCase.group?.id || "ungrouped";
358
+ const group = assignment.testCase.group || null;
359
+ if (!groups.has(groupId)) {
360
+ groups.set(groupId, {
361
+ group,
362
+ assignments: [],
363
+ stats: { total: 0, passed: 0, failed: 0, pending: 0, skipped: 0 }
364
+ });
365
+ }
366
+ const folder = groups.get(groupId);
367
+ folder.assignments.push(assignment);
368
+ folder.stats.total++;
369
+ if (assignment.status === "passed") folder.stats.passed++;
370
+ else if (assignment.status === "failed") folder.stats.failed++;
371
+ else if (assignment.status === "skipped") folder.stats.skipped++;
372
+ else folder.stats.pending++;
373
+ }
374
+ const sortedGroups = Array.from(groups.values()).sort((a, b) => {
375
+ if (!a.group && !b.group) return 0;
376
+ if (!a.group) return 1;
377
+ if (!b.group) return -1;
378
+ return a.group.sortOrder - b.group.sortOrder;
379
+ });
380
+ return sortedGroups;
381
+ }, [assignments]);
382
+ const toggleFolderCollapse = (0, import_react2.useCallback)((groupId) => {
383
+ setCollapsedFolders((prev) => {
384
+ const next = new Set(prev);
385
+ if (next.has(groupId)) {
386
+ next.delete(groupId);
387
+ } else {
388
+ next.add(groupId);
389
+ }
390
+ return next;
391
+ });
392
+ }, []);
393
+ const getStatusBadge = (status) => {
394
+ switch (status) {
395
+ case "passed":
396
+ return { icon: "\u2705", label: "Passed", className: "bg-green-900/30 text-green-400" };
397
+ case "failed":
398
+ return { icon: "\u274C", label: "Failed", className: "bg-red-900/30 text-red-400" };
399
+ case "skipped":
400
+ return { icon: "\u23ED\uFE0F", label: "Skipped", className: "bg-yellow-900/30 text-yellow-400" };
401
+ case "in_progress":
402
+ return { icon: "\u{1F504}", label: "In Progress", className: "bg-blue-900/30 text-blue-400" };
403
+ case "blocked":
404
+ return { icon: "\u{1F6AB}", label: "Blocked", className: "bg-orange-900/30 text-orange-400" };
405
+ default:
406
+ return { icon: "\u23F3", label: "Pending", className: "bg-zinc-700 text-zinc-400" };
407
+ }
408
+ };
289
409
  const [panelPosition, setPanelPosition] = (0, import_react2.useState)(null);
290
410
  const [isDragging, setIsDragging] = (0, import_react2.useState)(false);
291
411
  const dragStartRef = (0, import_react2.useRef)(null);
@@ -307,6 +427,10 @@ function BugBearPanel({
307
427
  expectedResultUnclear: false
308
428
  });
309
429
  const [criteriaResults, setCriteriaResults] = (0, import_react2.useState)({});
430
+ const [showSkipModal, setShowSkipModal] = (0, import_react2.useState)(false);
431
+ const [selectedSkipReason, setSelectedSkipReason] = (0, import_react2.useState)(null);
432
+ const [skipNotes, setSkipNotes] = (0, import_react2.useState)("");
433
+ const [skipping, setSkipping] = (0, import_react2.useState)(false);
310
434
  const [profileEditing, setProfileEditing] = (0, import_react2.useState)(false);
311
435
  const [profileName, setProfileName] = (0, import_react2.useState)("");
312
436
  const [profileAdditionalEmails, setProfileAdditionalEmails] = (0, import_react2.useState)([]);
@@ -315,6 +439,7 @@ function BugBearPanel({
315
439
  const [savingProfile, setSavingProfile] = (0, import_react2.useState)(false);
316
440
  const [profileSaved, setProfileSaved] = (0, import_react2.useState)(false);
317
441
  const [showProfileOverlay, setShowProfileOverlay] = (0, import_react2.useState)(false);
442
+ const [collapsedFolders, setCollapsedFolders] = (0, import_react2.useState)(/* @__PURE__ */ new Set());
318
443
  const [startingSession, setStartingSession] = (0, import_react2.useState)(false);
319
444
  const [sessionFocusArea, setSessionFocusArea] = (0, import_react2.useState)("");
320
445
  const [sessionPlatform, setSessionPlatform] = (0, import_react2.useState)("web");
@@ -518,6 +643,35 @@ function BugBearPanel({
518
643
  expectedResultUnclear: false
519
644
  });
520
645
  };
646
+ const handleOpenSkipModal = () => {
647
+ setShowSkipModal(true);
648
+ setSelectedSkipReason(null);
649
+ setSkipNotes("");
650
+ };
651
+ const handleSkip = async () => {
652
+ if (!client || !displayedAssignment || !selectedSkipReason) return;
653
+ setSkipping(true);
654
+ const result = await client.skipAssignment(
655
+ displayedAssignment.id,
656
+ selectedSkipReason,
657
+ skipNotes.trim() || void 0
658
+ );
659
+ if (result.success) {
660
+ await refreshAssignments();
661
+ setShowSkipModal(false);
662
+ setSelectedSkipReason(null);
663
+ setSkipNotes("");
664
+ setSelectedTestId(null);
665
+ setTestView("detail");
666
+ }
667
+ setSkipping(false);
668
+ };
669
+ const skipReasonOptions = [
670
+ { value: "blocked", label: "Blocked", description: "Environment issue or external blocker" },
671
+ { value: "not_ready", label: "Not Ready", description: "Feature not yet implemented" },
672
+ { value: "dependency", label: "Dependency", description: "Waiting on another test or task" },
673
+ { value: "other", label: "Other", description: "Other reason (please specify)" }
674
+ ];
521
675
  const handleSubmitFeedback = async (skipFeedback = false) => {
522
676
  if (!client || !displayedAssignment) return;
523
677
  setSubmitting(true);
@@ -713,6 +867,87 @@ function BugBearPanel({
713
867
  }
714
868
  return `${m}:${s.toString().padStart(2, "0")}`;
715
869
  };
870
+ const formatRelativeTime = (dateString) => {
871
+ const date = new Date(dateString);
872
+ const now = /* @__PURE__ */ new Date();
873
+ const diffMs = now.getTime() - date.getTime();
874
+ const diffMins = Math.floor(diffMs / 6e4);
875
+ const diffHours = Math.floor(diffMs / 36e5);
876
+ const diffDays = Math.floor(diffMs / 864e5);
877
+ if (diffMins < 1) return "Just now";
878
+ if (diffMins < 60) return `${diffMins}m ago`;
879
+ if (diffHours < 24) return `${diffHours}h ago`;
880
+ if (diffDays === 1) return "Yesterday";
881
+ if (diffDays < 7) return `${diffDays}d ago`;
882
+ return date.toLocaleDateString();
883
+ };
884
+ const formatMessageTime = (dateString) => {
885
+ const date = new Date(dateString);
886
+ return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
887
+ };
888
+ const getThreadTypeIcon = (type) => {
889
+ switch (type) {
890
+ case "announcement":
891
+ return "\u{1F4E2}";
892
+ case "direct":
893
+ return "\u{1F4AC}";
894
+ case "report":
895
+ return "\u{1F41B}";
896
+ case "general_note":
897
+ return "\u{1F4DD}";
898
+ default:
899
+ return "\u{1F4AC}";
900
+ }
901
+ };
902
+ const handleOpenThread = async (thread) => {
903
+ setSelectedThread(thread);
904
+ setMessageView("thread");
905
+ setLoadingMessages(true);
906
+ const messages = await getThreadMessages(thread.id);
907
+ setThreadMessages(messages);
908
+ setLoadingMessages(false);
909
+ if (thread.unreadCount > 0) {
910
+ await markAsRead(thread.id);
911
+ }
912
+ };
913
+ const handleSendReply = async () => {
914
+ if (!selectedThread || !replyText.trim()) return;
915
+ setSendingReply(true);
916
+ const success = await sendMessage(selectedThread.id, replyText.trim());
917
+ if (success) {
918
+ setReplyText("");
919
+ const messages = await getThreadMessages(selectedThread.id);
920
+ setThreadMessages(messages);
921
+ }
922
+ setSendingReply(false);
923
+ };
924
+ const handleBackToThreadList = () => {
925
+ setMessageView("list");
926
+ setSelectedThread(null);
927
+ setThreadMessages([]);
928
+ setReplyText("");
929
+ setComposeSubject("");
930
+ setComposeMessage("");
931
+ };
932
+ const handleStartNewMessage = () => {
933
+ setMessageView("compose");
934
+ setComposeSubject("");
935
+ setComposeMessage("");
936
+ };
937
+ const handleSendNewMessage = async () => {
938
+ if (!composeSubject.trim() || !composeMessage.trim()) return;
939
+ setSendingNewMessage(true);
940
+ const result = await createThread({
941
+ subject: composeSubject.trim(),
942
+ message: composeMessage.trim()
943
+ });
944
+ if (result.success) {
945
+ setComposeSubject("");
946
+ setComposeMessage("");
947
+ setMessageView("list");
948
+ }
949
+ setSendingNewMessage(false);
950
+ };
716
951
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
717
952
  "div",
718
953
  {
@@ -735,22 +970,22 @@ function BugBearPanel({
735
970
  onClick: () => setCollapsed(false),
736
971
  "data-drag-handle": true,
737
972
  onDoubleClick: handleDoubleClick,
738
- className: "flex items-center gap-2 px-3 py-2 bg-purple-600 text-white rounded-full shadow-lg hover:bg-purple-700 transition-colors",
973
+ className: "flex items-center gap-2 px-3 py-2 bg-blue-500 text-white rounded-full shadow-lg hover:bg-blue-600 transition-colors",
739
974
  style: { cursor: draggable ? "grab" : "pointer" },
740
975
  children: [
741
976
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(BugBearIcon, { size: 24 }),
742
977
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: "BugBear" }),
743
- pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "bg-white text-purple-600 text-xs font-bold px-1.5 py-0.5 rounded-full", children: pendingCount })
978
+ pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "bg-white text-blue-400 text-xs font-bold px-1.5 py-0.5 rounded-full", children: pendingCount })
744
979
  ]
745
980
  }
746
981
  ),
747
- !collapsed && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "w-80 bg-white rounded-xl shadow-2xl border border-gray-200 overflow-hidden", children: [
982
+ !collapsed && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "w-80 bg-zinc-900 rounded-xl shadow-2xl border border-zinc-800 overflow-hidden", children: [
748
983
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
749
984
  "div",
750
985
  {
751
986
  "data-drag-handle": true,
752
987
  onDoubleClick: handleDoubleClick,
753
- className: "bg-purple-600 text-white px-4 py-3 flex items-center justify-between",
988
+ className: "bg-zinc-950 text-white px-4 py-3 flex items-center justify-between border-b border-zinc-800",
754
989
  style: { cursor: draggable ? isDragging ? "grabbing" : "grab" : "default" },
755
990
  children: [
756
991
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
@@ -758,13 +993,13 @@ function BugBearPanel({
758
993
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
759
994
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("h3", { className: "font-semibold text-sm flex items-center gap-2", children: [
760
995
  "BugBear",
761
- draggable && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-purple-300 text-xs", title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
996
+ draggable && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-zinc-500 text-xs", title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
762
997
  ] }),
763
998
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
764
999
  "button",
765
1000
  {
766
1001
  onClick: handleOpenProfile,
767
- className: "text-purple-200 text-xs flex items-center gap-1 hover:text-white transition-colors",
1002
+ className: "text-zinc-400 text-xs flex items-center gap-1 hover:text-white transition-colors",
768
1003
  children: [
769
1004
  testerInfo?.name,
770
1005
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-[10px]", children: "\u270E" })
@@ -777,23 +1012,33 @@ function BugBearPanel({
777
1012
  "button",
778
1013
  {
779
1014
  onClick: () => setCollapsed(true),
780
- className: "p-1 hover:bg-purple-500 rounded",
1015
+ className: "p-1 hover:bg-zinc-800 rounded",
781
1016
  children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })
782
1017
  }
783
1018
  )
784
1019
  ]
785
1020
  }
786
1021
  ),
787
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2 p-2 bg-gray-50 border-b border-gray-200", children: [
1022
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex border-b border-zinc-800 bg-zinc-900", children: [
788
1023
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
789
1024
  "button",
790
1025
  {
791
1026
  onClick: () => setActiveTab("tests"),
792
- className: `flex-1 py-2 px-3 rounded-lg text-sm font-semibold transition-all flex items-center justify-center gap-1.5 ${activeTab === "tests" ? "bg-purple-600 text-white shadow-sm" : "bg-white text-gray-600 hover:bg-gray-100 border border-gray-200"}`,
1027
+ className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 border-b-2 ${activeTab === "tests" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
793
1028
  children: [
794
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "\u{1F4CB}" }),
795
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "Run Tests" }),
796
- pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `ml-1 px-1.5 py-0.5 rounded-full text-xs ${activeTab === "tests" ? "bg-purple-500 text-white" : "bg-purple-100 text-purple-600"}`, children: pendingCount })
1029
+ "Tests ",
1030
+ pendingCount > 0 && `(${pendingCount})`
1031
+ ]
1032
+ }
1033
+ ),
1034
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1035
+ "button",
1036
+ {
1037
+ onClick: () => setActiveTab("messages"),
1038
+ className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 relative border-b-2 ${activeTab === "messages" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
1039
+ children: [
1040
+ "Messages",
1041
+ unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "absolute top-1.5 ml-16 min-w-[18px] h-[18px] px-1 bg-blue-500 rounded-full text-[10px] text-white font-bold flex items-center justify-center", children: unreadCount })
797
1042
  ]
798
1043
  }
799
1044
  ),
@@ -801,100 +1046,165 @@ function BugBearPanel({
801
1046
  "button",
802
1047
  {
803
1048
  onClick: () => setActiveTab("session"),
804
- className: `flex-1 py-2 px-3 rounded-lg text-sm font-semibold transition-all flex items-center justify-center gap-1.5 relative ${activeTab === "session" ? "bg-amber-500 text-white shadow-sm" : "bg-white text-gray-600 hover:bg-gray-100 border border-gray-200"}`,
1049
+ className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 relative border-b-2 ${activeTab === "session" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
805
1050
  children: [
806
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "\u{1F50D}" }),
807
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "Explore" }),
808
- activeSession && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "absolute -top-1 -right-1 w-3 h-3 bg-green-500 rounded-full border-2 border-white animate-pulse" })
1051
+ "Explore",
1052
+ activeSession && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "absolute top-2 ml-14 w-2 h-2 bg-green-500 rounded-full animate-pulse" })
809
1053
  ]
810
1054
  }
1055
+ ),
1056
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1057
+ "button",
1058
+ {
1059
+ onClick: () => setActiveTab("report"),
1060
+ className: `flex-1 py-3 text-sm font-medium transition-all flex items-center justify-center gap-1.5 border-b-2 ${activeTab === "report" ? "border-blue-500 text-blue-400" : "border-transparent text-zinc-500 hover:text-zinc-300"}`,
1061
+ children: "Report"
1062
+ }
811
1063
  )
812
1064
  ] }),
813
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex justify-center py-1.5 border-b border-gray-200 bg-white", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
814
- "button",
815
- {
816
- onClick: () => setActiveTab("report"),
817
- className: `px-4 py-1 text-xs font-medium transition-colors rounded-full ${activeTab === "report" ? "bg-red-50 text-red-600 border border-red-200" : "text-gray-500 hover:text-gray-700 hover:bg-gray-50"}`,
818
- children: "\u{1F41B} Report Bug / Feedback"
819
- }
820
- ) }),
821
1065
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "p-4 max-h-96 overflow-y-auto", children: [
822
1066
  activeTab === "tests" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: assignments.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
823
1067
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u2705" }),
824
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-600 mt-2 font-medium", children: "All caught up!" }),
825
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-400 text-sm", children: "No tests assigned" })
1068
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "All caught up!" }),
1069
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm", children: "No tests assigned" })
826
1070
  ] }) : testView === "list" ? (
827
- /* List View - Show all tests */
828
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "space-y-2", children: [
829
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs font-medium text-gray-500", children: [
830
- assignments.length,
831
- " test",
832
- assignments.length !== 1 ? "s" : "",
833
- " assigned"
834
- ] }) }),
835
- assignments.map((assignment) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
836
- "button",
837
- {
838
- onClick: () => {
839
- setSelectedTestId(assignment.id);
840
- setTestView("detail");
841
- setShowSteps(false);
842
- },
843
- className: `w-full text-left p-3 rounded-lg border transition-colors ${assignment.id === currentAssignment?.id ? "bg-purple-50 border-purple-200" : "bg-gray-50 border-gray-200 hover:bg-gray-100"}`,
844
- children: [
845
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start justify-between mb-1", children: [
846
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-mono text-gray-500", children: assignment.testCase.testKey }),
847
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${assignment.testCase.priority === "P0" ? "bg-red-100 text-red-700" : assignment.testCase.priority === "P1" ? "bg-orange-100 text-orange-700" : "bg-gray-100 text-gray-600"}`, children: assignment.testCase.priority })
848
- ] }),
849
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-medium text-gray-900 text-sm line-clamp-2", children: assignment.testCase.title }),
850
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 mt-1 text-xs text-gray-400", children: [
851
- assignment.testCase.track && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
852
- "span",
853
- {
854
- className: "px-1 py-0.5 rounded text-white",
855
- style: { backgroundColor: assignment.testCase.track.color },
856
- children: templateInfo[assignment.testCase.track.testTemplate || "steps"].icon
857
- }
858
- ),
859
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
860
- assignment.testCase.steps.length,
861
- " ",
862
- assignment.testCase.track?.testTemplate === "checklist" ? "items" : assignment.testCase.track?.testTemplate === "rubric" ? "criteria" : "steps"
863
- ] }),
864
- assignment.id === currentAssignment?.id && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-purple-600 font-medium", children: "\u2022 Current" })
865
- ] })
866
- ]
867
- },
868
- assignment.id
869
- ))
1071
+ /* List View - Show tests grouped by folder */
1072
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "space-y-3", children: [
1073
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-2 px-1", children: [
1074
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs font-medium text-zinc-500", children: [
1075
+ assignments.length,
1076
+ " test",
1077
+ assignments.length !== 1 ? "s" : "",
1078
+ " assigned"
1079
+ ] }),
1080
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 text-xs", children: [
1081
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-green-400", children: [
1082
+ "\u2705 ",
1083
+ assignments.filter((a) => a.status === "passed").length
1084
+ ] }),
1085
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-red-400", children: [
1086
+ "\u274C ",
1087
+ assignments.filter((a) => a.status === "failed").length
1088
+ ] }),
1089
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-zinc-500", children: [
1090
+ "\u23F3 ",
1091
+ assignments.filter((a) => a.status === "pending" || a.status === "in_progress").length
1092
+ ] })
1093
+ ] })
1094
+ ] }),
1095
+ groupedAssignments.map((folder) => {
1096
+ const groupId = folder.group?.id || "ungrouped";
1097
+ const isCollapsed = collapsedFolders.has(groupId);
1098
+ const completedCount = folder.stats.passed + folder.stats.failed + folder.stats.skipped;
1099
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "border border-zinc-700 rounded-lg overflow-hidden", children: [
1100
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1101
+ "button",
1102
+ {
1103
+ onClick: () => toggleFolderCollapse(groupId),
1104
+ className: "w-full flex items-center justify-between p-2.5 bg-zinc-800 hover:bg-zinc-700 transition-colors",
1105
+ children: [
1106
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
1107
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-sm", children: isCollapsed ? "\u{1F4C1}" : "\u{1F4C2}" }),
1108
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium text-sm text-zinc-100", children: folder.group?.name || "Other Tests" }),
1109
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs text-zinc-500", children: [
1110
+ "(",
1111
+ completedCount,
1112
+ "/",
1113
+ folder.stats.total,
1114
+ ")"
1115
+ ] })
1116
+ ] }),
1117
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
1118
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-16 h-1.5 bg-zinc-700 rounded-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1119
+ "div",
1120
+ {
1121
+ className: "h-full bg-green-500 transition-all",
1122
+ style: { width: `${completedCount / folder.stats.total * 100}%` }
1123
+ }
1124
+ ) }),
1125
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-zinc-500 text-xs", children: isCollapsed ? "\u25B6" : "\u25BC" })
1126
+ ] })
1127
+ ]
1128
+ }
1129
+ ),
1130
+ !isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "divide-y divide-zinc-800", children: folder.assignments.map((assignment) => {
1131
+ const statusBadge = getStatusBadge(assignment.status);
1132
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1133
+ "button",
1134
+ {
1135
+ onClick: () => {
1136
+ setSelectedTestId(assignment.id);
1137
+ setTestView("detail");
1138
+ setShowSteps(false);
1139
+ },
1140
+ className: `w-full text-left p-3 transition-colors ${assignment.id === currentAssignment?.id ? "bg-blue-950/30" : "bg-zinc-900 hover:bg-zinc-800"}`,
1141
+ children: [
1142
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start justify-between mb-1", children: [
1143
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
1144
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-mono text-zinc-500", children: assignment.testCase.testKey }),
1145
+ assignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-green-900/30 text-green-400 font-medium", children: "\u{1F527} Verify" })
1146
+ ] }),
1147
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5", children: [
1148
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${statusBadge.className}`, children: [
1149
+ statusBadge.icon,
1150
+ " ",
1151
+ statusBadge.label
1152
+ ] }),
1153
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${assignment.testCase.priority === "P0" ? "bg-red-900/30 text-red-400" : assignment.testCase.priority === "P1" ? "bg-orange-900/30 text-orange-400" : "bg-zinc-700 text-zinc-400"}`, children: assignment.testCase.priority })
1154
+ ] })
1155
+ ] }),
1156
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-medium text-zinc-100 text-sm line-clamp-2", children: assignment.testCase.title }),
1157
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 mt-1 text-xs text-zinc-500", children: [
1158
+ assignment.testCase.track && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1159
+ "span",
1160
+ {
1161
+ className: "px-1 py-0.5 rounded text-white",
1162
+ style: { backgroundColor: assignment.testCase.track.color },
1163
+ children: templateInfo[assignment.testCase.track.testTemplate || "steps"].icon
1164
+ }
1165
+ ),
1166
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
1167
+ assignment.testCase.steps.length,
1168
+ " ",
1169
+ assignment.testCase.track?.testTemplate === "checklist" ? "items" : assignment.testCase.track?.testTemplate === "rubric" ? "criteria" : "steps"
1170
+ ] }),
1171
+ assignment.id === currentAssignment?.id && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-blue-400 font-medium", children: "\u2022 Current" })
1172
+ ] })
1173
+ ]
1174
+ },
1175
+ assignment.id
1176
+ );
1177
+ }) })
1178
+ ] }, groupId);
1179
+ })
870
1180
  ] })
871
1181
  ) : showFeedbackPrompt && displayedAssignment ? (
872
1182
  /* Feedback prompt after completing a test */
873
1183
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "p-3", children: [
874
1184
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
875
1185
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-3xl", children: pendingFeedbackStatus === "passed" ? "\u2713" : "\u2717" }),
876
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `font-semibold mt-1 ${pendingFeedbackStatus === "passed" ? "text-green-600" : "text-red-600"}`, children: pendingFeedbackStatus === "passed" ? "Test Passed!" : "Test Failed" })
1186
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `font-semibold mt-1 ${pendingFeedbackStatus === "passed" ? "text-green-400" : "text-red-400"}`, children: pendingFeedbackStatus === "passed" ? "Test Passed!" : "Test Failed" })
877
1187
  ] }),
878
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-purple-50 border border-purple-100 rounded-lg p-3 mb-4", children: [
879
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-purple-800 text-sm font-medium mb-1", children: "Help us improve this test" }),
880
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-purple-600 text-xs", children: "Your feedback shapes better tests for everyone." })
1188
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-blue-950/30 border border-blue-900 rounded-lg p-3 mb-4", children: [
1189
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-blue-300 text-sm font-medium mb-1", children: "Help us improve this test" }),
1190
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-blue-400 text-xs", children: "Your feedback shapes better tests for everyone." })
881
1191
  ] }),
882
1192
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
883
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-600 mb-2", children: "How was this test?" }),
1193
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-2", children: "How was this test?" }),
884
1194
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center gap-1 justify-center", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
885
1195
  "button",
886
1196
  {
887
1197
  type: "button",
888
1198
  onClick: () => setFeedbackRating(star),
889
- className: `text-2xl transition-colors ${star <= feedbackRating ? "text-yellow-400" : "text-gray-300"} hover:text-yellow-400`,
1199
+ className: `text-2xl transition-colors ${star <= feedbackRating ? "text-yellow-400" : "text-zinc-600"} hover:text-yellow-400`,
890
1200
  children: "\u2605"
891
1201
  },
892
1202
  star
893
1203
  )) }),
894
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-center text-xs text-gray-500 mt-1", children: feedbackRating === 1 ? "Needs work" : feedbackRating === 2 ? "Could be better" : feedbackRating === 3 ? "Okay" : feedbackRating === 4 ? "Good" : "Great!" })
1204
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-center text-xs text-zinc-500 mt-1", children: feedbackRating === 1 ? "Needs work" : feedbackRating === 2 ? "Could be better" : feedbackRating === 3 ? "Okay" : feedbackRating === 4 ? "Good" : "Great!" })
895
1205
  ] }),
896
1206
  feedbackRating < 4 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
897
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-600 mb-2", children: "What could be improved?" }),
1207
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-2", children: "What could be improved?" }),
898
1208
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "grid grid-cols-2 gap-2", children: [
899
1209
  { key: "stepsUnclear", label: "Steps unclear" },
900
1210
  { key: "expectedResultUnclear", label: "Expected result unclear" },
@@ -905,21 +1215,21 @@ function BugBearPanel({
905
1215
  {
906
1216
  type: "button",
907
1217
  onClick: () => setFeedbackFlags((prev) => ({ ...prev, [key]: !prev[key] })),
908
- className: `px-2 py-1.5 rounded text-xs font-medium border transition-colors ${feedbackFlags[key] ? "bg-purple-100 border-purple-300 text-purple-700" : "bg-white border-gray-200 text-gray-600 hover:border-purple-200"}`,
1218
+ className: `px-2 py-1.5 rounded text-xs font-medium border transition-colors ${feedbackFlags[key] ? "bg-blue-900/50 border-blue-700 text-blue-300" : "bg-zinc-800 border-zinc-700 text-zinc-400 hover:border-blue-800"}`,
909
1219
  children: label
910
1220
  },
911
1221
  key
912
1222
  )) })
913
1223
  ] }),
914
1224
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
915
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-600 mb-1", children: "Suggestions? (optional)" }),
1225
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-1", children: "Suggestions? (optional)" }),
916
1226
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
917
1227
  "textarea",
918
1228
  {
919
1229
  value: feedbackNote,
920
1230
  onChange: (e) => setFeedbackNote(e.target.value),
921
1231
  placeholder: "How could this test be improved?",
922
- className: "w-full px-3 py-2 text-sm border border-gray-200 rounded-lg resize-none focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent",
1232
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-700 rounded-lg resize-none focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent placeholder:text-zinc-500",
923
1233
  rows: 2
924
1234
  }
925
1235
  )
@@ -930,7 +1240,7 @@ function BugBearPanel({
930
1240
  {
931
1241
  onClick: handleSkipFeedback,
932
1242
  disabled: submitting,
933
- className: "flex-1 px-3 py-2 text-sm font-medium text-gray-600 bg-gray-100 rounded-lg hover:bg-gray-200 transition-colors disabled:opacity-50",
1243
+ className: "flex-1 px-3 py-2 text-sm font-medium text-zinc-400 bg-zinc-700 rounded-lg hover:bg-zinc-700 transition-colors disabled:opacity-50",
934
1244
  children: "Skip"
935
1245
  }
936
1246
  ),
@@ -939,7 +1249,7 @@ function BugBearPanel({
939
1249
  {
940
1250
  onClick: () => handleSubmitFeedback(false),
941
1251
  disabled: submitting,
942
- className: "flex-1 px-3 py-2 text-sm font-medium text-white bg-purple-600 rounded-lg hover:bg-purple-700 transition-colors disabled:opacity-50",
1252
+ className: "flex-1 px-3 py-2 text-sm font-medium text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition-colors disabled:opacity-50",
943
1253
  children: submitting ? "Submitting..." : "Submit Feedback"
944
1254
  }
945
1255
  )
@@ -949,8 +1259,8 @@ function BugBearPanel({
949
1259
  /* Success state after passing */
950
1260
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
951
1261
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-5xl", children: "\u2713" }),
952
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-green-600 mt-3 font-semibold text-lg", children: "Passed!" }),
953
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-400 text-sm mt-1", children: "Loading next test..." })
1262
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-green-400 mt-3 font-semibold text-lg", children: "Passed!" }),
1263
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm mt-1", children: "Loading next test..." })
954
1264
  ] })
955
1265
  ) : displayedAssignment ? (
956
1266
  /* Detail View - Show single test */
@@ -962,7 +1272,7 @@ function BugBearPanel({
962
1272
  setTestView("list");
963
1273
  setSelectedTestId(null);
964
1274
  },
965
- className: "flex items-center gap-1 text-xs text-purple-600 font-medium hover:text-purple-700 mb-3",
1275
+ className: "flex items-center gap-1 text-xs text-blue-400 font-medium hover:text-blue-300 mb-2",
966
1276
  children: [
967
1277
  "\u2190 All Tests (",
968
1278
  assignments.length,
@@ -970,9 +1280,53 @@ function BugBearPanel({
970
1280
  ]
971
1281
  }
972
1282
  ),
973
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-gray-50 rounded-lg p-3 mb-3", children: [
1283
+ (() => {
1284
+ const currentGroup = displayedAssignment.testCase.group;
1285
+ const groupAssignments = currentGroup ? assignments.filter((a) => a.testCase.group?.id === currentGroup.id) : assignments;
1286
+ const completed = groupAssignments.filter(
1287
+ (a) => a.status === "passed" || a.status === "failed" || a.status === "skipped"
1288
+ ).length;
1289
+ const total = groupAssignments.length;
1290
+ const progressPercent = total > 0 ? completed / total * 100 : 0;
1291
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3 p-2 bg-blue-950/30 rounded-lg", children: [
1292
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-1.5", children: [
1293
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-medium text-blue-300", children: currentGroup ? `\u{1F4C1} ${currentGroup.name}` : "\u{1F4CB} All Tests" }),
1294
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs text-blue-400", children: [
1295
+ completed,
1296
+ "/",
1297
+ total,
1298
+ " complete"
1299
+ ] })
1300
+ ] }),
1301
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-full h-2 bg-zinc-700 rounded-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1302
+ "div",
1303
+ {
1304
+ className: "h-full bg-blue-500 transition-all duration-300",
1305
+ style: { width: `${progressPercent}%` }
1306
+ }
1307
+ ) }),
1308
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex justify-between mt-1 text-[10px] text-blue-400", children: [
1309
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
1310
+ "\u2705 ",
1311
+ groupAssignments.filter((a) => a.status === "passed").length,
1312
+ " passed"
1313
+ ] }),
1314
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
1315
+ "\u274C ",
1316
+ groupAssignments.filter((a) => a.status === "failed").length,
1317
+ " failed"
1318
+ ] }),
1319
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
1320
+ "\u23ED\uFE0F ",
1321
+ groupAssignments.filter((a) => a.status === "skipped").length,
1322
+ " skipped"
1323
+ ] })
1324
+ ] })
1325
+ ] });
1326
+ })(),
1327
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
974
1328
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start justify-between mb-2", children: [
975
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-mono text-gray-500", children: displayedAssignment.testCase.testKey }),
1329
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs font-mono text-zinc-500", children: displayedAssignment.testCase.testKey }),
976
1330
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1", children: [
977
1331
  displayedAssignment.testCase.track && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
978
1332
  "span",
@@ -982,11 +1336,11 @@ function BugBearPanel({
982
1336
  children: templateInfo[displayedAssignment.testCase.track.testTemplate || "steps"].icon
983
1337
  }
984
1338
  ),
985
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${displayedAssignment.testCase.priority === "P0" ? "bg-red-100 text-red-700" : displayedAssignment.testCase.priority === "P1" ? "bg-orange-100 text-orange-700" : "bg-gray-100 text-gray-600"}`, children: displayedAssignment.testCase.priority })
1339
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-xs px-1.5 py-0.5 rounded font-medium ${displayedAssignment.testCase.priority === "P0" ? "bg-red-900/30 text-red-400" : displayedAssignment.testCase.priority === "P1" ? "bg-orange-900/30 text-orange-400" : "bg-zinc-700 text-zinc-400"}`, children: displayedAssignment.testCase.priority })
986
1340
  ] })
987
1341
  ] }),
988
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-medium text-gray-900 text-sm mb-1", children: displayedAssignment.testCase.title }),
989
- displayedAssignment.status === "in_progress" && displayedAssignment.startedAt && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5 mb-2 text-xs text-green-600 bg-green-50 px-2 py-1 rounded", children: [
1342
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h4", { className: "font-medium text-zinc-100 text-sm mb-1", children: displayedAssignment.testCase.title }),
1343
+ displayedAssignment.status === "in_progress" && displayedAssignment.startedAt && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5 mb-2 text-xs text-green-400 bg-green-900/20 px-2 py-1 rounded", children: [
990
1344
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "relative flex h-2 w-2", children: [
991
1345
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75" }),
992
1346
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "relative inline-flex rounded-full h-2 w-2 bg-green-500" })
@@ -994,12 +1348,12 @@ function BugBearPanel({
994
1348
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: "Testing" }),
995
1349
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-mono", children: formatElapsedTime(assignmentElapsedTime) })
996
1350
  ] }),
997
- displayedAssignment.testCase.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-500 text-xs mb-2", children: displayedAssignment.testCase.description }),
1351
+ displayedAssignment.testCase.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs mb-2", children: displayedAssignment.testCase.description }),
998
1352
  displayedAssignment.testCase.targetRoute && onNavigate && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
999
1353
  "button",
1000
1354
  {
1001
1355
  onClick: () => onNavigate(displayedAssignment.testCase.targetRoute),
1002
- className: "w-full mb-2 py-1.5 px-3 bg-blue-50 text-blue-700 border border-blue-200 rounded-lg text-xs font-medium hover:bg-blue-100 transition-colors flex items-center justify-center gap-1",
1356
+ className: "w-full mb-2 py-1.5 px-3 bg-blue-900/20 text-blue-300 border border-blue-800 rounded-lg text-xs font-medium hover:bg-blue-900/30 transition-colors flex items-center justify-center gap-1",
1003
1357
  children: [
1004
1358
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "Go to test location" }),
1005
1359
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "\u2192" })
@@ -1022,7 +1376,7 @@ function BugBearPanel({
1022
1376
  children: [
1023
1377
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: info.icon }),
1024
1378
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: info.name }),
1025
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-gray-500", children: [
1379
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-zinc-500", children: [
1026
1380
  "\u2022 ",
1027
1381
  info.action
1028
1382
  ] })
@@ -1033,7 +1387,7 @@ function BugBearPanel({
1033
1387
  "button",
1034
1388
  {
1035
1389
  onClick: () => setShowSteps(!showSteps),
1036
- className: "text-purple-600 text-xs font-medium hover:text-purple-700 flex items-center gap-1",
1390
+ className: "text-blue-400 text-xs font-medium hover:text-blue-300 flex items-center gap-1",
1037
1391
  children: [
1038
1392
  showSteps ? "\u25BC" : "\u25B6",
1039
1393
  " ",
@@ -1042,10 +1396,10 @@ function BugBearPanel({
1042
1396
  }
1043
1397
  ),
1044
1398
  showSteps && template === "steps" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mt-2 space-y-2", children: steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2 text-xs", children: [
1045
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded-full bg-purple-100 text-purple-700 flex items-center justify-center flex-shrink-0 font-medium", children: step.stepNumber }),
1399
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded-full bg-blue-900/50 text-blue-300 flex items-center justify-center flex-shrink-0 font-medium", children: step.stepNumber }),
1046
1400
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1047
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-700", children: step.action }),
1048
- step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-gray-400 mt-0.5", children: [
1401
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-300", children: step.action }),
1402
+ step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-zinc-500 mt-0.5", children: [
1049
1403
  "\u2192 ",
1050
1404
  step.expectedResult
1051
1405
  ] })
@@ -1064,39 +1418,39 @@ function BugBearPanel({
1064
1418
  }
1065
1419
  return newResults;
1066
1420
  }),
1067
- className: `w-full flex items-center gap-2 text-xs p-2 rounded border transition-colors text-left ${criteriaResults[idx] === true ? "bg-green-50 border-green-300" : "bg-white border-gray-200 hover:bg-gray-50"}`,
1421
+ className: `w-full flex items-center gap-2 text-xs p-2 rounded border transition-colors text-left ${criteriaResults[idx] === true ? "bg-green-900/20 border-green-700" : "bg-zinc-900 border-zinc-700 hover:bg-zinc-800"}`,
1068
1422
  children: [
1069
1423
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `w-5 h-5 rounded border-2 flex items-center justify-center ${criteriaResults[idx] === true ? "bg-green-500 border-green-500 text-white" : "border-cyan-400 text-cyan-600"}`, children: criteriaResults[idx] === true ? "\u2713" : "" }),
1070
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `flex-1 ${criteriaResults[idx] === true ? "text-green-700" : "text-gray-700"}`, children: step.action })
1424
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `flex-1 ${criteriaResults[idx] === true ? "text-green-400" : "text-zinc-300"}`, children: step.action })
1071
1425
  ]
1072
1426
  },
1073
1427
  idx
1074
1428
  )),
1075
1429
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mt-2", children: [
1076
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-400", children: "Tap to check off each item." }),
1430
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: "Tap to check off each item." }),
1077
1431
  Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1078
1432
  "button",
1079
1433
  {
1080
1434
  onClick: () => setCriteriaResults({}),
1081
- className: "text-xs text-gray-400 hover:text-red-500 transition-colors",
1435
+ className: "text-xs text-zinc-500 hover:text-red-500 transition-colors",
1082
1436
  children: "\u21BA Reset"
1083
1437
  }
1084
1438
  )
1085
1439
  ] })
1086
1440
  ] }),
1087
1441
  showSteps && template === "rubric" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-2 space-y-2", children: [
1088
- steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-white p-2 rounded border border-gray-200", children: [
1442
+ steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 p-2 rounded border border-zinc-700", children: [
1089
1443
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 text-xs mb-1", children: [
1090
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded bg-purple-100 text-purple-700 flex items-center justify-center font-medium", children: idx + 1 }),
1091
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-900 font-medium flex-1", children: step.action })
1444
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-5 h-5 rounded bg-blue-900/50 text-blue-300 flex items-center justify-center font-medium", children: idx + 1 }),
1445
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-100 font-medium flex-1", children: step.action })
1092
1446
  ] }),
1093
- step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-500 ml-7 mb-2", children: step.expectedResult }),
1447
+ step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 ml-7 mb-2", children: step.expectedResult }),
1094
1448
  rubricMode === "pass_fail" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2 ml-7", children: [
1095
1449
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1096
1450
  "button",
1097
1451
  {
1098
1452
  onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: true })),
1099
- className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === true ? "bg-green-500 text-white" : "bg-gray-100 text-gray-600 hover:bg-green-100"}`,
1453
+ className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === true ? "bg-green-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-green-900/30"}`,
1100
1454
  children: "\u2713 Pass"
1101
1455
  }
1102
1456
  ),
@@ -1104,7 +1458,7 @@ function BugBearPanel({
1104
1458
  "button",
1105
1459
  {
1106
1460
  onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: false })),
1107
- className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === false ? "bg-red-500 text-white" : "bg-gray-100 text-gray-600 hover:bg-red-100"}`,
1461
+ className: `flex-1 py-1 px-2 rounded text-xs font-medium transition-colors ${criteriaResults[idx] === false ? "bg-red-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-red-900/30"}`,
1108
1462
  children: "\u2717 Fail"
1109
1463
  }
1110
1464
  )
@@ -1113,28 +1467,28 @@ function BugBearPanel({
1113
1467
  "button",
1114
1468
  {
1115
1469
  onClick: () => setCriteriaResults((prev) => ({ ...prev, [idx]: n })),
1116
- className: `w-8 h-8 rounded font-medium text-sm transition-colors ${criteriaResults[idx] === n ? "bg-purple-600 text-white" : "bg-gray-100 text-gray-600 hover:bg-purple-100"}`,
1470
+ className: `w-8 h-8 rounded font-medium text-sm transition-colors ${criteriaResults[idx] === n ? "bg-blue-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-blue-900/50"}`,
1117
1471
  children: n
1118
1472
  },
1119
1473
  n
1120
1474
  )) })
1121
1475
  ] }, idx)),
1122
1476
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mt-2", children: [
1123
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-400", children: rubricMode === "rating" ? "Rate 1-5 for each criterion." : "Mark each criterion as Pass or Fail." }),
1477
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: rubricMode === "rating" ? "Rate 1-5 for each criterion." : "Mark each criterion as Pass or Fail." }),
1124
1478
  Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1125
1479
  "button",
1126
1480
  {
1127
1481
  onClick: () => setCriteriaResults({}),
1128
- className: "text-xs text-gray-400 hover:text-red-500 transition-colors",
1482
+ className: "text-xs text-zinc-500 hover:text-red-500 transition-colors",
1129
1483
  children: "\u21BA Reset"
1130
1484
  }
1131
1485
  )
1132
1486
  ] })
1133
1487
  ] }),
1134
- showSteps && template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-2 p-2 bg-amber-50 rounded border border-amber-200 text-xs", children: [
1135
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-800 font-medium mb-1", children: "\u{1F4AD} Open Observation" }),
1136
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-700", children: "Review the area described above and note:" }),
1137
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("ul", { className: "text-amber-700 mt-1 ml-4 list-disc", children: [
1488
+ showSteps && template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-2 p-2 bg-amber-900/20 rounded border border-amber-800 text-xs", children: [
1489
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-300 font-medium mb-1", children: "\u{1F4AD} Open Observation" }),
1490
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-amber-400", children: "Review the area described above and note:" }),
1491
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("ul", { className: "text-amber-400 mt-1 ml-4 list-disc", children: [
1138
1492
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "What works well" }),
1139
1493
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "Issues or concerns" }),
1140
1494
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "Suggestions" })
@@ -1142,7 +1496,7 @@ function BugBearPanel({
1142
1496
  ] })
1143
1497
  ] });
1144
1498
  })(),
1145
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-3 p-2 bg-green-50 rounded text-xs text-green-700", children: [
1499
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mt-3 p-2 bg-green-900/20 rounded text-xs text-green-400", children: [
1146
1500
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: displayedAssignment.testCase.track?.testTemplate === "checklist" ? "Pass criteria:" : displayedAssignment.testCase.track?.testTemplate === "rubric" ? "Target score:" : "Expected:" }),
1147
1501
  " ",
1148
1502
  displayedAssignment.testCase.expectedResult
@@ -1153,69 +1507,279 @@ function BugBearPanel({
1153
1507
  "button",
1154
1508
  {
1155
1509
  onClick: handleFail,
1156
- disabled: submitting,
1157
- className: "flex-1 py-2 px-3 bg-red-100 text-red-700 rounded-lg font-medium text-sm hover:bg-red-200 disabled:opacity-50 transition-colors",
1510
+ disabled: submitting || skipping,
1511
+ className: "flex-1 py-2 px-3 bg-red-900/30 text-red-400 rounded-lg font-medium text-sm hover:bg-red-800/30 disabled:opacity-50 transition-colors",
1158
1512
  children: "\u2717 Fail"
1159
1513
  }
1160
1514
  ),
1515
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1516
+ "button",
1517
+ {
1518
+ onClick: handleOpenSkipModal,
1519
+ disabled: submitting || skipping,
1520
+ className: "py-2 px-3 bg-yellow-900/30 text-yellow-400 rounded-lg font-medium text-sm hover:bg-yellow-800/30 disabled:opacity-50 transition-colors",
1521
+ children: "\u23ED\uFE0F Skip"
1522
+ }
1523
+ ),
1161
1524
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1162
1525
  "button",
1163
1526
  {
1164
1527
  onClick: handlePass,
1165
- disabled: submitting,
1528
+ disabled: submitting || skipping,
1166
1529
  className: "flex-1 py-2 px-3 bg-green-600 text-white rounded-lg font-medium text-sm hover:bg-green-700 disabled:opacity-50 transition-colors",
1167
1530
  children: submitting ? "..." : "\u2713 Pass"
1168
1531
  }
1169
1532
  )
1170
- ] })
1533
+ ] }),
1534
+ showSkipModal && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", onClick: () => setShowSkipModal(false), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-xl p-4 w-72 shadow-xl border border-zinc-700", onClick: (e) => e.stopPropagation(), children: [
1535
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 mb-3", children: "Skip Test" }),
1536
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mb-3", children: "Please select a reason for skipping this test." }),
1537
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-2 mb-4", children: skipReasonOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1538
+ "button",
1539
+ {
1540
+ onClick: () => setSelectedSkipReason(option.value),
1541
+ className: `w-full text-left p-2.5 rounded-lg border transition-colors ${selectedSkipReason === option.value ? "bg-yellow-900/20 border-yellow-700 text-yellow-300" : "bg-zinc-800 border-zinc-700 text-zinc-300 hover:border-yellow-800"}`,
1542
+ children: [
1543
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "font-medium text-sm", children: option.label }),
1544
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-xs text-zinc-500", children: option.description })
1545
+ ]
1546
+ },
1547
+ option.value
1548
+ )) }),
1549
+ selectedSkipReason === "other" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1550
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-400 mb-1", children: "Notes (required)" }),
1551
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1552
+ "textarea",
1553
+ {
1554
+ value: skipNotes,
1555
+ onChange: (e) => setSkipNotes(e.target.value),
1556
+ placeholder: "Please explain why you're skipping...",
1557
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-700 rounded-lg resize-none focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:border-transparent placeholder:text-zinc-500",
1558
+ rows: 2
1559
+ }
1560
+ )
1561
+ ] }),
1562
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2", children: [
1563
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1564
+ "button",
1565
+ {
1566
+ onClick: () => setShowSkipModal(false),
1567
+ className: "flex-1 py-2 px-3 text-sm font-medium text-zinc-400 bg-zinc-700 rounded-lg hover:bg-zinc-700 transition-colors",
1568
+ children: "Cancel"
1569
+ }
1570
+ ),
1571
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1572
+ "button",
1573
+ {
1574
+ onClick: handleSkip,
1575
+ disabled: !selectedSkipReason || selectedSkipReason === "other" && !skipNotes.trim() || skipping,
1576
+ className: "flex-1 py-2 px-3 text-sm font-medium text-white bg-yellow-500 rounded-lg hover:bg-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
1577
+ children: skipping ? "Skipping..." : "Skip Test"
1578
+ }
1579
+ )
1580
+ ] })
1581
+ ] }) })
1171
1582
  ] })
1172
1583
  ) : null }),
1584
+ activeTab === "messages" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: messageView === "compose" ? (
1585
+ /* Compose New Message */
1586
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1587
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1588
+ "button",
1589
+ {
1590
+ onClick: handleBackToThreadList,
1591
+ className: "text-sm text-zinc-400 hover:text-zinc-200 mb-3 flex items-center gap-1",
1592
+ children: "\u2190 Back to Messages"
1593
+ }
1594
+ ),
1595
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
1596
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100", children: "New Message" }),
1597
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs mt-1", children: "Send a message to the QA team" })
1598
+ ] }),
1599
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "space-y-3", children: [
1600
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1601
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Subject" }),
1602
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1603
+ "input",
1604
+ {
1605
+ type: "text",
1606
+ value: composeSubject,
1607
+ onChange: (e) => setComposeSubject(e.target.value),
1608
+ placeholder: "What's this about?",
1609
+ maxLength: 100,
1610
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
1611
+ }
1612
+ )
1613
+ ] }),
1614
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1615
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Message" }),
1616
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1617
+ "textarea",
1618
+ {
1619
+ value: composeMessage,
1620
+ onChange: (e) => setComposeMessage(e.target.value),
1621
+ placeholder: "Write your message...",
1622
+ maxLength: 2e3,
1623
+ rows: 6,
1624
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
1625
+ }
1626
+ )
1627
+ ] }),
1628
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1629
+ "button",
1630
+ {
1631
+ onClick: handleSendNewMessage,
1632
+ disabled: !composeSubject.trim() || !composeMessage.trim() || sendingNewMessage,
1633
+ className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
1634
+ children: sendingNewMessage ? "Sending..." : "Send Message"
1635
+ }
1636
+ )
1637
+ ] })
1638
+ ] })
1639
+ ) : messageView === "thread" && selectedThread ? (
1640
+ /* Thread Detail View */
1641
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1642
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1643
+ "button",
1644
+ {
1645
+ onClick: handleBackToThreadList,
1646
+ className: "text-sm text-zinc-400 hover:text-zinc-200 mb-3 flex items-center gap-1",
1647
+ children: "\u2190 Back to Messages"
1648
+ }
1649
+ ),
1650
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 mb-4 pb-3 border-b border-zinc-700", children: [
1651
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-lg", children: getThreadTypeIcon(selectedThread.threadType) }),
1652
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 text-sm leading-tight", children: selectedThread.subject || "No subject" })
1653
+ ] }),
1654
+ loadingMessages ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-center py-6", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm", children: "Loading messages..." }) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-3 mb-4", children: threadMessages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1655
+ "div",
1656
+ {
1657
+ className: `p-3 rounded-lg ${message.senderType === "tester" ? "bg-blue-900/30 border border-blue-800 ml-6" : "bg-zinc-800 border border-zinc-700 mr-6"}`,
1658
+ children: [
1659
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `text-xs font-medium mb-1 ${message.senderType === "tester" ? "text-blue-300" : "text-zinc-300"}`, children: message.senderType === "tester" ? "You" : message.senderName }),
1660
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `text-sm ${message.senderType === "tester" ? "text-blue-100" : "text-zinc-200"}`, children: message.content }),
1661
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: `text-[10px] mt-1 ${message.senderType === "tester" ? "text-blue-400/60" : "text-zinc-500"}`, children: formatMessageTime(message.createdAt) })
1662
+ ]
1663
+ },
1664
+ message.id
1665
+ )) }),
1666
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex gap-2 pt-3 border-t border-zinc-700", children: [
1667
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1668
+ "input",
1669
+ {
1670
+ type: "text",
1671
+ value: replyText,
1672
+ onChange: (e) => setReplyText(e.target.value),
1673
+ placeholder: "Type a reply...",
1674
+ maxLength: 1e3,
1675
+ className: "flex-1 px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500",
1676
+ onKeyDown: (e) => e.key === "Enter" && !e.shiftKey && handleSendReply()
1677
+ }
1678
+ ),
1679
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1680
+ "button",
1681
+ {
1682
+ onClick: handleSendReply,
1683
+ disabled: !replyText.trim() || sendingReply,
1684
+ className: "px-3 py-2 bg-blue-500 text-white text-sm rounded-lg hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
1685
+ children: sendingReply ? "..." : "Send"
1686
+ }
1687
+ )
1688
+ ] })
1689
+ ] })
1690
+ ) : (
1691
+ /* Thread List View */
1692
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1693
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1694
+ "button",
1695
+ {
1696
+ onClick: handleStartNewMessage,
1697
+ className: "w-full flex items-center justify-center gap-2 py-2 px-4 mb-3 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 transition-colors",
1698
+ children: "\u2709\uFE0F New Message"
1699
+ }
1700
+ ),
1701
+ threads.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
1702
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u{1F4AC}" }),
1703
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "No messages yet" }),
1704
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-sm", children: "Start a conversation or wait for messages from admins" })
1705
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-2", children: threads.map((thread) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1706
+ "button",
1707
+ {
1708
+ onClick: () => handleOpenThread(thread),
1709
+ className: `w-full text-left p-3 rounded-lg border transition-colors ${thread.unreadCount > 0 ? "bg-blue-900/20 border-blue-800 hover:bg-blue-900/30" : "bg-zinc-800 border-zinc-700 hover:bg-zinc-700"}`,
1710
+ children: [
1711
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-1", children: [
1712
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-1.5 min-w-0 flex-1", children: [
1713
+ thread.isPinned && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs", children: "\u{1F4CC}" }),
1714
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xs", children: getThreadTypeIcon(thread.threadType) }),
1715
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-sm truncate ${thread.unreadCount > 0 ? "font-semibold text-zinc-100" : "text-zinc-300"}`, children: thread.subject || "No subject" })
1716
+ ] }),
1717
+ (thread.priority === "high" || thread.priority === "urgent") && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `w-2 h-2 rounded-full flex-shrink-0 ml-2 ${thread.priority === "urgent" ? "bg-red-500" : "bg-orange-500"}` })
1718
+ ] }),
1719
+ thread.lastMessage && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-xs text-zinc-500 truncate", children: [
1720
+ thread.lastMessage.senderName,
1721
+ ": ",
1722
+ thread.lastMessage.content
1723
+ ] }),
1724
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mt-1.5", children: [
1725
+ thread.unreadCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-[10px] px-1.5 py-0.5 bg-blue-500 text-white rounded-full font-medium", children: [
1726
+ thread.unreadCount,
1727
+ " new"
1728
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-[10px] text-zinc-600", children: "Read" }),
1729
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-[10px] text-zinc-600", children: formatRelativeTime(thread.lastMessageAt) })
1730
+ ] })
1731
+ ]
1732
+ },
1733
+ thread.id
1734
+ )) })
1735
+ ] })
1736
+ ) }),
1173
1737
  activeTab === "session" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: !activeSession ? (
1174
1738
  /* Start Session View */
1175
1739
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1176
1740
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
1177
1741
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u{1F50D}" }),
1178
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-gray-900 mt-2", children: "Exploratory QA Session" }),
1179
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-500 text-xs mt-1", children: "Explore freely and capture findings as you go" })
1742
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 mt-2", children: "Exploratory QA Session" }),
1743
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs mt-1", children: "Explore freely and capture findings as you go" })
1180
1744
  ] }),
1181
1745
  focusAreas.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1182
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { className: "block text-xs font-medium text-gray-700 mb-2", children: [
1746
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { className: "block text-xs font-medium text-zinc-300 mb-2", children: [
1183
1747
  "\u{1F4CC} Focus Areas",
1184
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "ml-1 text-[10px] text-gray-500 font-normal", children: "from your team" })
1748
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "ml-1 text-[10px] text-zinc-500 font-normal", children: "from your team" })
1185
1749
  ] }),
1186
1750
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-1.5", children: focusAreas.map((area) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1187
1751
  "button",
1188
1752
  {
1189
1753
  onClick: () => setSessionFocusArea(area.name),
1190
- className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === area.name ? "bg-amber-50 border-amber-300 text-amber-700" : "bg-amber-50/50 border-amber-200 text-gray-700 hover:bg-amber-50"}`,
1754
+ className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === area.name ? "bg-amber-900/20 border-amber-700 text-amber-400" : "bg-amber-900/20/50 border-amber-800 text-zinc-300 hover:bg-amber-900/20"}`,
1191
1755
  children: [
1192
1756
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
1193
1757
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: area.name }),
1194
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${area.priority >= 70 ? "bg-red-100 text-red-600" : area.priority >= 50 ? "bg-amber-100 text-amber-600" : "bg-gray-100 text-gray-500"}`, children: area.priority >= 70 ? "Urgent" : area.priority >= 50 ? "Important" : "Suggested" })
1758
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${area.priority >= 70 ? "bg-red-900/30 text-red-400" : area.priority >= 50 ? "bg-amber-900/30 text-amber-400" : "bg-zinc-700 text-zinc-500"}`, children: area.priority >= 70 ? "Urgent" : area.priority >= 50 ? "Important" : "Suggested" })
1195
1759
  ] }),
1196
- area.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-[10px] text-gray-500 mt-0.5 line-clamp-2", children: area.description })
1760
+ area.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-[10px] text-zinc-500 mt-0.5 line-clamp-2", children: area.description })
1197
1761
  ]
1198
1762
  },
1199
1763
  area.id
1200
1764
  )) })
1201
1765
  ] }),
1202
1766
  suggestedRoutes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1203
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-2", children: "\u{1F3AF} Suggested Routes to Explore" }),
1767
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-2", children: "\u{1F3AF} Suggested Routes to Explore" }),
1204
1768
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-1.5 max-h-32 overflow-y-auto", children: suggestedRoutes.map((suggestion, idx) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1205
1769
  "button",
1206
1770
  {
1207
1771
  onClick: () => setSessionFocusArea(suggestion.route),
1208
- className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === suggestion.route ? "bg-purple-50 border-purple-300 text-purple-700" : "bg-gray-50 border-gray-200 text-gray-700 hover:bg-gray-100"}`,
1772
+ className: `w-full text-left px-3 py-2 rounded-lg text-xs transition-colors border ${sessionFocusArea === suggestion.route ? "bg-blue-950/30 border-blue-700 text-blue-300" : "bg-zinc-800 border-zinc-700 text-zinc-300 hover:bg-zinc-700"}`,
1209
1773
  children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
1210
1774
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium truncate", children: suggestion.route }),
1211
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${suggestion.priorityScore >= 40 ? "bg-red-100 text-red-600" : suggestion.priorityScore >= 25 ? "bg-amber-100 text-amber-600" : "bg-gray-100 text-gray-500"}`, children: suggestion.reason })
1775
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `text-[10px] px-1.5 py-0.5 rounded ${suggestion.priorityScore >= 40 ? "bg-red-900/30 text-red-400" : suggestion.priorityScore >= 25 ? "bg-amber-900/30 text-amber-400" : "bg-zinc-700 text-zinc-500"}`, children: suggestion.reason })
1212
1776
  ] })
1213
1777
  },
1214
1778
  idx
1215
1779
  )) })
1216
1780
  ] }),
1217
1781
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
1218
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Focus Area (optional)" }),
1782
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Focus Area (optional)" }),
1219
1783
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1220
1784
  "input",
1221
1785
  {
@@ -1223,12 +1787,12 @@ function BugBearPanel({
1223
1787
  value: sessionFocusArea,
1224
1788
  onChange: (e) => setSessionFocusArea(e.target.value),
1225
1789
  placeholder: "e.g., checkout flow, settings page",
1226
- className: "w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500"
1790
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
1227
1791
  }
1228
1792
  )
1229
1793
  ] }),
1230
1794
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1231
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Platform" }),
1795
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Platform" }),
1232
1796
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-2", children: [
1233
1797
  { key: "web", label: "\u{1F310} Web" },
1234
1798
  { key: "ios", label: "\u{1F4F1} iOS" },
@@ -1237,7 +1801,7 @@ function BugBearPanel({
1237
1801
  "button",
1238
1802
  {
1239
1803
  onClick: () => setSessionPlatform(key),
1240
- className: `flex-1 py-2 px-3 rounded-lg text-xs font-medium transition-colors border-2 ${sessionPlatform === key ? "bg-purple-50 border-purple-500 text-purple-700" : "bg-gray-50 border-transparent text-gray-600 hover:bg-gray-100"}`,
1804
+ className: `flex-1 py-2 px-3 rounded-lg text-xs font-medium transition-colors border-2 ${sessionPlatform === key ? "bg-blue-950/30 border-blue-500 text-blue-300" : "bg-zinc-800 border-transparent text-zinc-400 hover:bg-zinc-700"}`,
1241
1805
  children: label
1242
1806
  },
1243
1807
  key
@@ -1261,8 +1825,8 @@ function BugBearPanel({
1261
1825
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1262
1826
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center mb-4", children: [
1263
1827
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u270B" }),
1264
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-gray-900 mt-2", children: "End Session?" }),
1265
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-gray-500 text-xs mt-1", children: [
1828
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 mt-2", children: "End Session?" }),
1829
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-zinc-500 text-xs mt-1", children: [
1266
1830
  "Duration: ",
1267
1831
  formatElapsedTime(sessionElapsedTime),
1268
1832
  " \u2022 ",
@@ -1272,7 +1836,7 @@ function BugBearPanel({
1272
1836
  ] })
1273
1837
  ] }),
1274
1838
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1275
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Session Notes (optional)" }),
1839
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Session Notes (optional)" }),
1276
1840
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1277
1841
  "textarea",
1278
1842
  {
@@ -1280,7 +1844,7 @@ function BugBearPanel({
1280
1844
  onChange: (e) => setSessionNotes(e.target.value),
1281
1845
  placeholder: "Any overall observations from this session...",
1282
1846
  rows: 3,
1283
- className: "w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 resize-none"
1847
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
1284
1848
  }
1285
1849
  )
1286
1850
  ] }),
@@ -1289,7 +1853,7 @@ function BugBearPanel({
1289
1853
  "button",
1290
1854
  {
1291
1855
  onClick: () => setShowEndConfirm(false),
1292
- className: "flex-1 py-2 px-3 bg-gray-100 text-gray-700 rounded-lg font-medium text-sm hover:bg-gray-200 transition-colors",
1856
+ className: "flex-1 py-2 px-3 bg-zinc-700 text-zinc-300 rounded-lg font-medium text-sm hover:bg-zinc-700 transition-colors",
1293
1857
  children: "Cancel"
1294
1858
  }
1295
1859
  ),
@@ -1308,12 +1872,12 @@ function BugBearPanel({
1308
1872
  /* Add Finding Form */
1309
1873
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1310
1874
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [
1311
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-gray-900 text-sm", children: "Add Finding" }),
1875
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100 text-sm", children: "Add Finding" }),
1312
1876
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1313
1877
  "button",
1314
1878
  {
1315
1879
  onClick: () => setShowAddFinding(false),
1316
- className: "text-gray-400 hover:text-gray-600",
1880
+ className: "text-zinc-500 hover:text-zinc-400",
1317
1881
  children: "\u2715"
1318
1882
  }
1319
1883
  )
@@ -1327,25 +1891,25 @@ function BugBearPanel({
1327
1891
  "button",
1328
1892
  {
1329
1893
  onClick: () => setFindingType(type),
1330
- className: `flex-1 py-1.5 px-2 rounded text-xs font-medium transition-colors ${findingType === type ? color === "red" ? "bg-red-100 text-red-700 ring-2 ring-red-400" : color === "orange" ? "bg-orange-100 text-orange-700 ring-2 ring-orange-400" : color === "blue" ? "bg-blue-100 text-blue-700 ring-2 ring-blue-400" : "bg-purple-100 text-purple-700 ring-2 ring-purple-400" : "bg-gray-100 text-gray-600 hover:bg-gray-200"}`,
1894
+ className: `flex-1 py-1.5 px-2 rounded text-xs font-medium transition-colors ${findingType === type ? color === "red" ? "bg-red-900/30 text-red-400 ring-2 ring-red-400" : color === "orange" ? "bg-orange-900/30 text-orange-400 ring-2 ring-orange-400" : color === "blue" ? "bg-blue-900/30 text-blue-300 ring-2 ring-blue-400" : "bg-blue-900/50 text-blue-300 ring-2 ring-blue-400" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
1331
1895
  children: label
1332
1896
  },
1333
1897
  type
1334
1898
  )) }),
1335
1899
  findingType === "bug" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
1336
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Severity" }),
1900
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Severity" }),
1337
1901
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-1", children: ["critical", "high", "medium", "low", "observation"].map((sev) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1338
1902
  "button",
1339
1903
  {
1340
1904
  onClick: () => setFindingSeverity(sev),
1341
- className: `flex-1 py-1 px-1 rounded text-xs font-medium capitalize transition-colors ${findingSeverity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : sev === "low" ? "bg-gray-500 text-white" : "bg-blue-500 text-white" : "bg-gray-100 text-gray-600 hover:bg-gray-200"}`,
1905
+ className: `flex-1 py-1 px-1 rounded text-xs font-medium capitalize transition-colors ${findingSeverity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : sev === "low" ? "bg-zinc-8000 text-white" : "bg-blue-500 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
1342
1906
  children: sev === "observation" ? "obs" : sev
1343
1907
  },
1344
1908
  sev
1345
1909
  )) })
1346
1910
  ] }),
1347
1911
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
1348
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Title *" }),
1912
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Title *" }),
1349
1913
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1350
1914
  "input",
1351
1915
  {
@@ -1353,12 +1917,12 @@ function BugBearPanel({
1353
1917
  value: findingTitle,
1354
1918
  onChange: (e) => setFindingTitle(e.target.value),
1355
1919
  placeholder: "Brief description of what you found",
1356
- className: "w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500"
1920
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
1357
1921
  }
1358
1922
  )
1359
1923
  ] }),
1360
1924
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
1361
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Details (optional)" }),
1925
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Details (optional)" }),
1362
1926
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1363
1927
  "textarea",
1364
1928
  {
@@ -1366,7 +1930,7 @@ function BugBearPanel({
1366
1930
  onChange: (e) => setFindingDescription(e.target.value),
1367
1931
  placeholder: "Steps to reproduce, expected behavior, etc.",
1368
1932
  rows: 2,
1369
- className: "w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 resize-none"
1933
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
1370
1934
  }
1371
1935
  )
1372
1936
  ] }),
@@ -1375,7 +1939,7 @@ function BugBearPanel({
1375
1939
  {
1376
1940
  onClick: handleAddFinding,
1377
1941
  disabled: addingFinding || !findingTitle.trim(),
1378
- className: "w-full py-2 px-4 bg-purple-600 text-white rounded-lg font-medium text-sm hover:bg-purple-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
1942
+ className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
1379
1943
  children: addingFinding ? "Adding..." : "Add Finding"
1380
1944
  }
1381
1945
  )
@@ -1383,15 +1947,15 @@ function BugBearPanel({
1383
1947
  ) : (
1384
1948
  /* Active Session View */
1385
1949
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1386
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-green-50 rounded-lg p-3 mb-3 border border-green-200", children: [
1950
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-green-900/20 rounded-lg p-3 mb-3 border border-green-800", children: [
1387
1951
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
1388
1952
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
1389
1953
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "w-2 h-2 bg-green-500 rounded-full animate-pulse" }),
1390
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium text-green-800 text-sm", children: "Session Active" })
1954
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium text-green-300 text-sm", children: "Session Active" })
1391
1955
  ] }),
1392
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-mono text-green-700 text-lg font-semibold", children: formatElapsedTime(sessionElapsedTime) })
1956
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-mono text-green-400 text-lg font-semibold", children: formatElapsedTime(sessionElapsedTime) })
1393
1957
  ] }),
1394
- activeSession.focusArea && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-green-700 text-xs mt-1", children: [
1958
+ activeSession.focusArea && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "text-green-400 text-xs mt-1", children: [
1395
1959
  "Focus: ",
1396
1960
  activeSession.focusArea
1397
1961
  ] })
@@ -1400,7 +1964,7 @@ function BugBearPanel({
1400
1964
  "button",
1401
1965
  {
1402
1966
  onClick: () => setShowAddFinding(true),
1403
- className: "w-full py-3 px-4 bg-purple-600 text-white rounded-lg font-semibold text-sm hover:bg-purple-700 transition-colors flex items-center justify-center gap-2 mb-3",
1967
+ className: "w-full py-3 px-4 bg-blue-500 text-white rounded-lg font-semibold text-sm hover:bg-blue-600 transition-colors flex items-center justify-center gap-2 mb-3",
1404
1968
  children: [
1405
1969
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "+" }),
1406
1970
  " Add Finding"
@@ -1408,23 +1972,23 @@ function BugBearPanel({
1408
1972
  }
1409
1973
  ),
1410
1974
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
1411
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs font-medium text-gray-500", children: [
1975
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-xs font-medium text-zinc-500", children: [
1412
1976
  "Findings (",
1413
1977
  sessionFindings.length,
1414
1978
  ")"
1415
1979
  ] }) }),
1416
- sessionFindings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-4 bg-gray-50 rounded-lg", children: [
1417
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-400 text-xs", children: "No findings yet" }),
1418
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-400 text-xs", children: "Explore and add findings as you go" })
1980
+ sessionFindings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-4 bg-zinc-800 rounded-lg", children: [
1981
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs", children: "No findings yet" }),
1982
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-500 text-xs", children: "Explore and add findings as you go" })
1419
1983
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-2 max-h-32 overflow-y-auto", children: sessionFindings.map((finding) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1420
1984
  "div",
1421
1985
  {
1422
- className: `p-2 rounded-lg border text-xs ${finding.type === "bug" ? "bg-red-50 border-red-200" : finding.type === "concern" ? "bg-orange-50 border-orange-200" : finding.type === "suggestion" ? "bg-blue-50 border-blue-200" : "bg-purple-50 border-purple-200"}`,
1986
+ className: `p-2 rounded-lg border text-xs ${finding.type === "bug" ? "bg-red-900/20 border-red-800" : finding.type === "concern" ? "bg-orange-900/20 border-orange-200" : finding.type === "suggestion" ? "bg-blue-900/20 border-blue-800" : "bg-blue-950/30 border-blue-800"}`,
1423
1987
  children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start gap-2", children: [
1424
1988
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: finding.type === "bug" ? "\u{1F41B}" : finding.type === "concern" ? "\u26A0\uFE0F" : finding.type === "suggestion" ? "\u{1F4A1}" : "\u2753" }),
1425
1989
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex-1 min-w-0", children: [
1426
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "font-medium text-gray-900 truncate", children: finding.title }),
1427
- finding.severity && finding.type === "bug" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `inline-block mt-0.5 px-1 py-0.5 rounded text-[10px] font-medium ${finding.severity === "critical" ? "bg-red-200 text-red-800" : finding.severity === "high" ? "bg-orange-200 text-orange-800" : finding.severity === "medium" ? "bg-yellow-200 text-yellow-800" : "bg-gray-200 text-gray-700"}`, children: finding.severity })
1990
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "font-medium text-zinc-100 truncate", children: finding.title }),
1991
+ finding.severity && finding.type === "bug" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `inline-block mt-0.5 px-1 py-0.5 rounded text-[10px] font-medium ${finding.severity === "critical" ? "bg-red-900/40 text-red-300" : finding.severity === "high" ? "bg-orange-900/40 text-orange-300" : finding.severity === "medium" ? "bg-yellow-900/40 text-yellow-300" : "bg-zinc-700 text-zinc-300"}`, children: finding.severity })
1428
1992
  ] })
1429
1993
  ] })
1430
1994
  },
@@ -1435,7 +1999,7 @@ function BugBearPanel({
1435
1999
  "button",
1436
2000
  {
1437
2001
  onClick: () => setShowEndConfirm(true),
1438
- className: "w-full py-2 px-4 bg-gray-100 text-gray-700 rounded-lg font-medium text-sm hover:bg-gray-200 transition-colors",
2002
+ className: "w-full py-2 px-4 bg-zinc-700 text-zinc-300 rounded-lg font-medium text-sm hover:bg-zinc-700 transition-colors",
1439
2003
  children: "End Session"
1440
2004
  }
1441
2005
  )
@@ -1443,7 +2007,7 @@ function BugBearPanel({
1443
2007
  ) }),
1444
2008
  activeTab === "report" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: submitted ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
1445
2009
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u{1F389}" }),
1446
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-600 mt-2 font-medium", children: "Report submitted!" })
2010
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "Report submitted!" })
1447
2011
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
1448
2012
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-2 mb-4", children: [
1449
2013
  { type: "bug", label: "\u{1F41B} Bug", color: "red" },
@@ -1453,25 +2017,25 @@ function BugBearPanel({
1453
2017
  "button",
1454
2018
  {
1455
2019
  onClick: () => setReportType(type),
1456
- className: `flex-1 py-1.5 px-2 rounded-lg text-xs font-medium transition-colors ${reportType === type ? color === "red" ? "bg-red-100 text-red-700 ring-2 ring-red-500" : color === "blue" ? "bg-blue-100 text-blue-700 ring-2 ring-blue-500" : "bg-purple-100 text-purple-700 ring-2 ring-purple-500" : "bg-gray-100 text-gray-600 hover:bg-gray-200"}`,
2020
+ className: `flex-1 py-1.5 px-2 rounded-lg text-xs font-medium transition-colors ${reportType === type ? color === "red" ? "bg-red-900/30 text-red-400 ring-2 ring-red-500" : color === "blue" ? "bg-blue-900/30 text-blue-300 ring-2 ring-blue-500" : "bg-blue-900/50 text-blue-300 ring-2 ring-blue-500" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
1457
2021
  children: label
1458
2022
  },
1459
2023
  type
1460
2024
  )) }),
1461
2025
  (reportType === "bug" || reportType === "test_fail") && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
1462
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Severity" }),
2026
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Severity" }),
1463
2027
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-1", children: ["critical", "high", "medium", "low"].map((sev) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1464
2028
  "button",
1465
2029
  {
1466
2030
  onClick: () => setSeverity(sev),
1467
- className: `flex-1 py-1 px-2 rounded text-xs font-medium capitalize transition-colors ${severity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : "bg-gray-500 text-white" : "bg-gray-100 text-gray-600 hover:bg-gray-200"}`,
2031
+ className: `flex-1 py-1 px-2 rounded text-xs font-medium capitalize transition-colors ${severity === sev ? sev === "critical" ? "bg-red-600 text-white" : sev === "high" ? "bg-orange-500 text-white" : sev === "medium" ? "bg-yellow-500 text-black" : "bg-zinc-8000 text-white" : "bg-zinc-700 text-zinc-400 hover:bg-zinc-700"}`,
1468
2032
  children: sev
1469
2033
  },
1470
2034
  sev
1471
2035
  )) })
1472
2036
  ] }),
1473
2037
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-3", children: [
1474
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "What happened?" }),
2038
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "What happened?" }),
1475
2039
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1476
2040
  "textarea",
1477
2041
  {
@@ -1479,7 +2043,7 @@ function BugBearPanel({
1479
2043
  onChange: (e) => setDescription(e.target.value),
1480
2044
  placeholder: "Describe the issue...",
1481
2045
  rows: 3,
1482
- className: "w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 resize-none"
2046
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500 resize-none"
1483
2047
  }
1484
2048
  )
1485
2049
  ] }),
@@ -1488,19 +2052,19 @@ function BugBearPanel({
1488
2052
  {
1489
2053
  onClick: handleSubmitReport,
1490
2054
  disabled: submitting || !description.trim(),
1491
- className: "w-full py-2 px-4 bg-purple-600 text-white rounded-lg font-medium text-sm hover:bg-purple-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
2055
+ className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
1492
2056
  children: submitting ? "Submitting..." : "Submit Report"
1493
2057
  }
1494
2058
  )
1495
2059
  ] }) })
1496
2060
  ] }),
1497
- showProfileOverlay && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute inset-0 bg-white z-50 flex flex-col rounded-xl overflow-hidden", children: [
1498
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-purple-600 text-white px-4 py-3 flex items-center justify-between", children: [
2061
+ showProfileOverlay && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute inset-0 bg-zinc-900 z-50 flex flex-col rounded-xl overflow-hidden", children: [
2062
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-950 text-white px-4 py-3 flex items-center justify-between border-b border-zinc-800", children: [
1499
2063
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1500
2064
  "button",
1501
2065
  {
1502
2066
  onClick: handleCloseProfile,
1503
- className: "text-sm text-purple-200 hover:text-white transition-colors",
2067
+ className: "text-sm text-zinc-400 hover:text-white transition-colors",
1504
2068
  children: "\u2190 Back"
1505
2069
  }
1506
2070
  ),
@@ -1510,23 +2074,23 @@ function BugBearPanel({
1510
2074
  ] }),
1511
2075
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex-1 overflow-y-auto p-4", children: profileSaved ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center py-8", children: [
1512
2076
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-4xl", children: "\u2705" }),
1513
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-gray-600 mt-2 font-medium", children: "Profile saved!" })
2077
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-zinc-400 mt-2 font-medium", children: "Profile saved!" })
1514
2078
  ] }) : profileEditing ? (
1515
2079
  /* Edit Profile Form */
1516
2080
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1517
2081
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
1518
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-gray-900", children: "Edit Profile" }),
2082
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100", children: "Edit Profile" }),
1519
2083
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1520
2084
  "button",
1521
2085
  {
1522
2086
  onClick: handleCancelEditProfile,
1523
- className: "text-sm text-gray-500 hover:text-gray-700",
2087
+ className: "text-sm text-zinc-500 hover:text-zinc-300",
1524
2088
  children: "Cancel"
1525
2089
  }
1526
2090
  )
1527
2091
  ] }),
1528
2092
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1529
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Name" }),
2093
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Name" }),
1530
2094
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1531
2095
  "input",
1532
2096
  {
@@ -1534,27 +2098,27 @@ function BugBearPanel({
1534
2098
  value: profileName,
1535
2099
  onChange: (e) => setProfileName(e.target.value),
1536
2100
  placeholder: "Your name",
1537
- className: "w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500"
2101
+ className: "w-full px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500"
1538
2102
  }
1539
2103
  )
1540
2104
  ] }),
1541
2105
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1542
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Primary Email" }),
1543
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "px-3 py-2 bg-gray-100 rounded-lg", children: [
1544
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-gray-700", children: testerInfo?.email }),
1545
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-400 mt-0.5", children: "Main communication email" })
2106
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Primary Email" }),
2107
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "px-3 py-2 bg-zinc-800 rounded-lg", children: [
2108
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-zinc-300", children: testerInfo?.email }),
2109
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mt-0.5", children: "Main communication email" })
1546
2110
  ] })
1547
2111
  ] }),
1548
2112
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1549
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Additional Testing Emails" }),
1550
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-500 mb-2", children: "Add other emails you use to test on different accounts" }),
2113
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Additional Testing Emails" }),
2114
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mb-2", children: "Add other emails you use to test on different accounts" }),
1551
2115
  profileAdditionalEmails.map((email) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
1552
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "flex-1 px-3 py-1.5 bg-purple-50 text-purple-700 text-sm rounded-full", children: email }),
2116
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "flex-1 px-3 py-1.5 bg-blue-950/30 text-blue-300 text-sm rounded-full", children: email }),
1553
2117
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1554
2118
  "button",
1555
2119
  {
1556
2120
  onClick: () => handleRemoveEmail(email),
1557
- className: "text-purple-400 hover:text-red-500 text-sm",
2121
+ className: "text-blue-400 hover:text-red-500 text-sm",
1558
2122
  children: "\u2715"
1559
2123
  }
1560
2124
  )
@@ -1567,7 +2131,7 @@ function BugBearPanel({
1567
2131
  value: newEmailInput,
1568
2132
  onChange: (e) => setNewEmailInput(e.target.value),
1569
2133
  placeholder: "email@example.com",
1570
- className: "flex-1 px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500",
2134
+ className: "flex-1 px-3 py-2 text-sm bg-zinc-800 text-zinc-100 border border-zinc-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 placeholder:text-zinc-500",
1571
2135
  onKeyDown: (e) => e.key === "Enter" && handleAddEmail()
1572
2136
  }
1573
2137
  ),
@@ -1576,15 +2140,15 @@ function BugBearPanel({
1576
2140
  {
1577
2141
  onClick: handleAddEmail,
1578
2142
  disabled: !newEmailInput.trim(),
1579
- className: "px-3 py-2 bg-purple-600 text-white text-sm rounded-lg hover:bg-purple-700 disabled:opacity-50 disabled:cursor-not-allowed",
2143
+ className: "px-3 py-2 bg-blue-500 text-white text-sm rounded-lg hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed",
1580
2144
  children: "Add"
1581
2145
  }
1582
2146
  )
1583
2147
  ] })
1584
2148
  ] }),
1585
2149
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mb-4", children: [
1586
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Testing Platforms" }),
1587
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-500 mb-2", children: "Select the platforms you can test on" }),
2150
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { className: "block text-xs font-medium text-zinc-300 mb-1", children: "Testing Platforms" }),
2151
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500 mb-2", children: "Select the platforms you can test on" }),
1588
2152
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex gap-2", children: [
1589
2153
  { key: "ios", label: "\u{1F4F1} iOS" },
1590
2154
  { key: "android", label: "\u{1F916} Android" },
@@ -1593,7 +2157,7 @@ function BugBearPanel({
1593
2157
  "button",
1594
2158
  {
1595
2159
  onClick: () => handleTogglePlatform(key),
1596
- className: `flex-1 py-2 px-3 rounded-lg text-sm font-medium transition-colors border-2 ${profilePlatforms.includes(key) ? "bg-purple-50 border-purple-500 text-purple-700" : "bg-gray-50 border-transparent text-gray-600 hover:bg-gray-100"}`,
2160
+ className: `flex-1 py-2 px-3 rounded-lg text-sm font-medium transition-colors border-2 ${profilePlatforms.includes(key) ? "bg-blue-950/30 border-blue-500 text-blue-300" : "bg-zinc-800 border-transparent text-zinc-400 hover:bg-zinc-700"}`,
1597
2161
  children: label
1598
2162
  },
1599
2163
  key
@@ -1612,31 +2176,31 @@ function BugBearPanel({
1612
2176
  ) : (
1613
2177
  /* Profile View */
1614
2178
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
1615
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-gray-50 rounded-lg p-4 text-center mb-4", children: [
1616
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-16 h-16 mx-auto bg-purple-600 rounded-full flex items-center justify-center mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-2xl font-semibold text-white", children: testerInfo?.name?.charAt(0)?.toUpperCase() || "?" }) }),
1617
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-gray-900", children: testerInfo?.name }),
1618
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-gray-500", children: testerInfo?.email }),
1619
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-center gap-6 mt-4 pt-4 border-t border-gray-200", children: [
2179
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-4 text-center mb-4", children: [
2180
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-16 h-16 mx-auto bg-blue-500 rounded-full flex items-center justify-center mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-2xl font-semibold text-white", children: testerInfo?.name?.charAt(0)?.toUpperCase() || "?" }) }),
2181
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "font-semibold text-zinc-100", children: testerInfo?.name }),
2182
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-zinc-500", children: testerInfo?.email }),
2183
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-center gap-6 mt-4 pt-4 border-t border-zinc-700", children: [
1620
2184
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center", children: [
1621
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-purple-600", children: testerInfo?.assignedTests || 0 }),
1622
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-500", children: "Assigned" })
2185
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-blue-400", children: testerInfo?.assignedTests || 0 }),
2186
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: "Assigned" })
1623
2187
  ] }),
1624
2188
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-center", children: [
1625
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-purple-600", children: testerInfo?.completedTests || 0 }),
1626
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-gray-500", children: "Completed" })
2189
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xl font-bold text-blue-400", children: testerInfo?.completedTests || 0 }),
2190
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-zinc-500", children: "Completed" })
1627
2191
  ] })
1628
2192
  ] })
1629
2193
  ] }),
1630
- (testerInfo?.additionalEmails?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-gray-50 rounded-lg p-3 mb-3", children: [
1631
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wide mb-2", children: "Additional Emails" }),
1632
- testerInfo?.additionalEmails?.map((email) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-gray-700", children: email }, email))
2194
+ (testerInfo?.additionalEmails?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
2195
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-zinc-500 uppercase tracking-wide mb-2", children: "Additional Emails" }),
2196
+ testerInfo?.additionalEmails?.map((email) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-zinc-300", children: email }, email))
1633
2197
  ] }),
1634
- (testerInfo?.platforms?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-gray-50 rounded-lg p-3 mb-3", children: [
1635
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wide mb-2", children: "Testing Platforms" }),
2198
+ (testerInfo?.platforms?.length || 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-zinc-800 rounded-lg p-3 mb-3", children: [
2199
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs font-medium text-zinc-500 uppercase tracking-wide mb-2", children: "Testing Platforms" }),
1636
2200
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex flex-wrap gap-2", children: testerInfo?.platforms?.map((platform) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1637
2201
  "span",
1638
2202
  {
1639
- className: "px-2 py-1 bg-purple-100 text-purple-700 text-xs rounded-full font-medium",
2203
+ className: "px-2 py-1 bg-blue-900/50 text-blue-300 text-xs rounded-full font-medium",
1640
2204
  children: platform === "ios" ? "\u{1F4F1} iOS" : platform === "android" ? "\u{1F916} Android" : "\u{1F310} Web"
1641
2205
  },
1642
2206
  platform
@@ -1646,14 +2210,31 @@ function BugBearPanel({
1646
2210
  "button",
1647
2211
  {
1648
2212
  onClick: handleStartEditProfile,
1649
- className: "w-full py-2 px-4 bg-purple-600 text-white rounded-lg font-medium text-sm hover:bg-purple-700 transition-colors",
2213
+ className: "w-full py-2 px-4 bg-blue-500 text-white rounded-lg font-medium text-sm hover:bg-blue-600 transition-colors",
1650
2214
  children: "Edit Profile"
1651
2215
  }
1652
2216
  )
1653
2217
  ] })
1654
2218
  ) })
1655
2219
  ] }),
1656
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "px-4 py-2 bg-gray-50 border-t border-gray-200 flex items-center justify-between text-xs text-gray-400", children: [
2220
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "px-4 py-2 bg-zinc-950 border-t border-zinc-800 flex items-center justify-between text-xs text-zinc-500", children: activeTab === "messages" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
2221
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2222
+ threads.length,
2223
+ " thread",
2224
+ threads.length !== 1 ? "s" : "",
2225
+ " \xB7 ",
2226
+ unreadCount,
2227
+ " unread"
2228
+ ] }),
2229
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2230
+ "button",
2231
+ {
2232
+ onClick: refreshThreads,
2233
+ className: "hover:text-zinc-300",
2234
+ children: "\u21BB Refresh"
2235
+ }
2236
+ )
2237
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
1657
2238
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
1658
2239
  pendingCount,
1659
2240
  " pending \xB7 ",
@@ -1664,11 +2245,11 @@ function BugBearPanel({
1664
2245
  "button",
1665
2246
  {
1666
2247
  onClick: refreshAssignments,
1667
- className: "hover:text-gray-600",
2248
+ className: "hover:text-zinc-300",
1668
2249
  children: "\u21BB Refresh"
1669
2250
  }
1670
2251
  )
1671
- ] })
2252
+ ] }) })
1672
2253
  ] })
1673
2254
  ]
1674
2255
  }