@bbearai/react 0.4.6 → 0.5.1

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.mjs CHANGED
@@ -45,6 +45,8 @@ var BugBearContext = createContext({
45
45
  issueCounts: { open: 0, done: 0, reopened: 0 },
46
46
  refreshIssueCounts: async () => {
47
47
  },
48
+ queuedCount: 0,
49
+ dashboardUrl: void 0,
48
50
  onError: void 0
49
51
  });
50
52
  function useBugBear() {
@@ -63,6 +65,7 @@ function BugBearProvider({ config, children, enabled = true }) {
63
65
  const [threads, setThreads] = useState([]);
64
66
  const [unreadCount, setUnreadCount] = useState(0);
65
67
  const [issueCounts, setIssueCounts] = useState({ open: 0, done: 0, reopened: 0 });
68
+ const [queuedCount, setQueuedCount] = useState(0);
66
69
  const refreshAssignments = useCallback(async () => {
67
70
  if (!client) return;
68
71
  const newAssignments = await client.getAssignedTests();
@@ -210,18 +213,45 @@ function BugBearProvider({ config, children, enabled = true }) {
210
213
  hasInitialized.current = true;
211
214
  contextCapture.startCapture();
212
215
  const newClient = createBugBear(config);
216
+ if (newClient.queue) {
217
+ newClient.queue.onChange(setQueuedCount);
218
+ newClient.initQueue();
219
+ }
213
220
  setClient(newClient);
214
221
  initializeBugBear(newClient);
215
222
  }
216
223
  }, [enabled, config, initializeBugBear]);
224
+ useEffect(() => {
225
+ if (!client?.queue) return;
226
+ const handleOnline = () => {
227
+ client.queue?.flush();
228
+ };
229
+ window.addEventListener("online", handleOnline);
230
+ if (navigator.onLine && client.queue.count > 0) {
231
+ client.queue.flush();
232
+ }
233
+ return () => window.removeEventListener("online", handleOnline);
234
+ }, [client]);
217
235
  useEffect(() => {
218
236
  if (!client || !isTester || !isQAEnabled) return;
237
+ let unsubscribe;
238
+ if (client.realtimeEnabled) {
239
+ unsubscribe = client.subscribeToChanges({
240
+ onAssignmentChange: refreshAssignments,
241
+ onMessageChange: refreshThreads,
242
+ onReportChange: refreshIssueCounts
243
+ });
244
+ }
245
+ const pollInterval = client.realtimeEnabled ? 12e4 : 3e4;
219
246
  const interval = setInterval(() => {
220
247
  refreshThreads();
221
248
  refreshIssueCounts();
222
- }, 3e4);
223
- return () => clearInterval(interval);
224
- }, [client, isTester, isQAEnabled, refreshThreads, refreshIssueCounts]);
249
+ }, pollInterval);
250
+ return () => {
251
+ clearInterval(interval);
252
+ unsubscribe?.();
253
+ };
254
+ }, [client, isTester, isQAEnabled, refreshThreads, refreshIssueCounts, refreshAssignments]);
225
255
  const currentAssignment = assignments.find(
226
256
  (a) => a.status === "in_progress"
227
257
  ) || assignments.find(
@@ -264,6 +294,8 @@ function BugBearProvider({ config, children, enabled = true }) {
264
294
  // Issue tracking
265
295
  issueCounts,
266
296
  refreshIssueCounts,
297
+ queuedCount,
298
+ dashboardUrl: config.dashboardUrl,
267
299
  onError: config.onError
268
300
  },
269
301
  children
@@ -390,9 +422,148 @@ function getThreadTypeIcon(type) {
390
422
 
391
423
  // src/widget/screens/HomeScreen.tsx
392
424
  import { useEffect as useEffect2 } from "react";
425
+
426
+ // src/widget/Skeleton.tsx
393
427
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
428
+ var PULSE_CSS = `@keyframes bb-skeleton-pulse{0%,100%{opacity:.6}50%{opacity:.25}}`;
429
+ var styleInjected = false;
430
+ function injectStyle() {
431
+ if (styleInjected || typeof document === "undefined") return;
432
+ const style = document.createElement("style");
433
+ style.textContent = PULSE_CSS;
434
+ document.head.appendChild(style);
435
+ styleInjected = true;
436
+ }
437
+ function Bar({ width = "100%", height = 12, radius = 6, style }) {
438
+ injectStyle();
439
+ return /* @__PURE__ */ jsx2(
440
+ "div",
441
+ {
442
+ style: {
443
+ width,
444
+ height,
445
+ borderRadius: radius,
446
+ backgroundColor: colors.border,
447
+ animation: "bb-skeleton-pulse 1.5s ease-in-out infinite",
448
+ ...style
449
+ }
450
+ }
451
+ );
452
+ }
453
+ function Circle({ size = 20, style }) {
454
+ injectStyle();
455
+ return /* @__PURE__ */ jsx2(
456
+ "div",
457
+ {
458
+ style: {
459
+ width: size,
460
+ height: size,
461
+ borderRadius: size / 2,
462
+ backgroundColor: colors.border,
463
+ animation: "bb-skeleton-pulse 1.5s ease-in-out infinite",
464
+ flexShrink: 0,
465
+ ...style
466
+ }
467
+ }
468
+ );
469
+ }
470
+ function HomeScreenSkeleton() {
471
+ return /* @__PURE__ */ jsxs("div", { children: [
472
+ /* @__PURE__ */ jsx2(Bar, { width: "100%", height: 100, radius: 16, style: { marginBottom: 20 } }),
473
+ /* @__PURE__ */ jsx2("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12, marginBottom: 20 }, children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsxs("div", { style: { backgroundColor: colors.card, border: `1px solid ${colors.border}`, borderRadius: 12, padding: 16, display: "flex", flexDirection: "column", alignItems: "center", gap: 8 }, children: [
474
+ /* @__PURE__ */ jsx2(Circle, { size: 28 }),
475
+ /* @__PURE__ */ jsx2(Bar, { width: 60, height: 10 })
476
+ ] }, i)) }),
477
+ /* @__PURE__ */ jsx2("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [0, 1, 2].map((i) => /* @__PURE__ */ jsxs("div", { style: { backgroundColor: colors.card, border: `1px solid ${colors.border}`, borderRadius: 10, padding: "12px 8px", display: "flex", flexDirection: "column", alignItems: "center", gap: 6 }, children: [
478
+ /* @__PURE__ */ jsx2(Bar, { width: 30, height: 18 }),
479
+ /* @__PURE__ */ jsx2(Bar, { width: 40, height: 8 })
480
+ ] }, i)) }),
481
+ /* @__PURE__ */ jsx2(Bar, { width: "100%", height: 6, radius: 3, style: { marginBottom: 8 } }),
482
+ /* @__PURE__ */ jsx2(Bar, { width: 120, height: 10, style: { margin: "0 auto 16px" } })
483
+ ] });
484
+ }
485
+ function TestItemSkeleton({ delay = 0 }) {
486
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", padding: "10px 12px", borderRadius: 8, marginBottom: 4, backgroundColor: colors.card }, children: [
487
+ /* @__PURE__ */ jsx2(Circle, { size: 18, style: { marginRight: 10, animationDelay: `${delay}ms` } }),
488
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
489
+ /* @__PURE__ */ jsx2(Bar, { width: "70%", height: 11, style: { marginBottom: 4, animationDelay: `${delay}ms` } }),
490
+ /* @__PURE__ */ jsx2(Bar, { width: "45%", height: 8, style: { animationDelay: `${delay}ms` } })
491
+ ] }),
492
+ /* @__PURE__ */ jsx2(Bar, { width: 50, height: 18, radius: 6, style: { marginLeft: 8, animationDelay: `${delay}ms` } })
493
+ ] });
494
+ }
495
+ function TestListScreenSkeleton() {
496
+ return /* @__PURE__ */ jsxs("div", { children: [
497
+ /* @__PURE__ */ jsx2("div", { style: { display: "flex", gap: 8, marginBottom: 8 }, children: [55, 50, 50, 70].map((w, i) => /* @__PURE__ */ jsx2(Bar, { width: w, height: 28, radius: 8, style: { animationDelay: `${i * 50}ms` } }, i)) }),
498
+ /* @__PURE__ */ jsx2(Bar, { width: "100%", height: 36, radius: 8, style: { marginBottom: 10 } }),
499
+ [0, 1].map((g) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: 12 }, children: [
500
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8, padding: "8px 4px" }, children: [
501
+ /* @__PURE__ */ jsx2(Bar, { width: 12, height: 10 }),
502
+ /* @__PURE__ */ jsx2(Bar, { width: "40%", height: 12 }),
503
+ /* @__PURE__ */ jsx2(Bar, { width: 40, height: 4, radius: 2, style: { marginLeft: "auto" } }),
504
+ /* @__PURE__ */ jsx2(Bar, { width: 24, height: 10 })
505
+ ] }),
506
+ [0, 1, 2].map((i) => /* @__PURE__ */ jsx2(TestItemSkeleton, { delay: (g * 3 + i) * 80 }, i))
507
+ ] }, g))
508
+ ] });
509
+ }
510
+ function IssueListScreenSkeleton() {
511
+ return /* @__PURE__ */ jsx2("div", { children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsxs(
512
+ "div",
513
+ {
514
+ style: {
515
+ backgroundColor: colors.card,
516
+ border: `1px solid ${colors.border}`,
517
+ borderRadius: 10,
518
+ padding: "12px 14px",
519
+ marginBottom: 8
520
+ },
521
+ children: [
522
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
523
+ /* @__PURE__ */ jsx2(Circle, { size: 8, style: { animationDelay: `${i * 100}ms` } }),
524
+ /* @__PURE__ */ jsx2(Bar, { width: "65%", height: 11, style: { animationDelay: `${i * 100}ms` } })
525
+ ] }),
526
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 8 }, children: [
527
+ /* @__PURE__ */ jsx2(Bar, { width: "40%", height: 8, style: { animationDelay: `${i * 100}ms` } }),
528
+ /* @__PURE__ */ jsx2(Bar, { width: 40, height: 8, style: { animationDelay: `${i * 100}ms` } })
529
+ ] })
530
+ ]
531
+ },
532
+ i
533
+ )) });
534
+ }
535
+ function MessageListScreenSkeleton() {
536
+ return /* @__PURE__ */ jsxs("div", { children: [
537
+ /* @__PURE__ */ jsx2(Bar, { width: "100%", height: 44, radius: 12, style: { marginBottom: 16 } }),
538
+ [0, 1, 2, 3].map((i) => /* @__PURE__ */ jsxs(
539
+ "div",
540
+ {
541
+ style: {
542
+ display: "flex",
543
+ alignItems: "flex-start",
544
+ padding: 12,
545
+ borderRadius: 10,
546
+ marginBottom: 4,
547
+ backgroundColor: colors.card
548
+ },
549
+ children: [
550
+ /* @__PURE__ */ jsx2(Circle, { size: 20, style: { marginRight: 10, marginTop: 2, animationDelay: `${i * 100}ms` } }),
551
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
552
+ /* @__PURE__ */ jsx2(Bar, { width: "55%", height: 11, style: { marginBottom: 5, animationDelay: `${i * 100}ms` } }),
553
+ /* @__PURE__ */ jsx2(Bar, { width: "80%", height: 9, style: { animationDelay: `${i * 100}ms` } })
554
+ ] }),
555
+ /* @__PURE__ */ jsx2(Bar, { width: 30, height: 8, style: { marginLeft: 8, animationDelay: `${i * 100}ms` } })
556
+ ]
557
+ },
558
+ i
559
+ ))
560
+ ] });
561
+ }
562
+
563
+ // src/widget/screens/HomeScreen.tsx
564
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
394
565
  function HomeScreen({ nav }) {
395
- const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts } = useBugBear();
566
+ const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, dashboardUrl, isLoading } = useBugBear();
396
567
  useEffect2(() => {
397
568
  refreshAssignments();
398
569
  refreshThreads();
@@ -403,8 +574,9 @@ function HomeScreen({ nav }) {
403
574
  const retestCount = pendingAssignments.filter((a) => a.isVerification).length;
404
575
  const completedCount = assignments.filter((a) => a.status === "passed" || a.status === "failed").length;
405
576
  const totalTests = assignments.length;
406
- return /* @__PURE__ */ jsxs("div", { children: [
407
- pendingCount > 0 ? /* @__PURE__ */ jsxs(
577
+ if (isLoading) return /* @__PURE__ */ jsx3(HomeScreenSkeleton, {});
578
+ return /* @__PURE__ */ jsxs2("div", { children: [
579
+ pendingCount > 0 ? /* @__PURE__ */ jsxs2(
408
580
  "div",
409
581
  {
410
582
  role: "button",
@@ -426,13 +598,13 @@ function HomeScreen({ nav }) {
426
598
  userSelect: "none"
427
599
  },
428
600
  children: [
429
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: pendingCount }),
430
- /* @__PURE__ */ jsxs("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
601
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: pendingCount }),
602
+ /* @__PURE__ */ jsxs2("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
431
603
  "test",
432
604
  pendingCount !== 1 ? "s" : "",
433
605
  " waiting"
434
606
  ] }),
435
- retestCount > 0 && /* @__PURE__ */ jsxs(
607
+ retestCount > 0 && /* @__PURE__ */ jsxs2(
436
608
  "span",
437
609
  {
438
610
  style: {
@@ -456,10 +628,10 @@ function HomeScreen({ nav }) {
456
628
  ]
457
629
  }
458
630
  ),
459
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "Start Testing \u2192" })
631
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "Start Testing \u2192" })
460
632
  ]
461
633
  }
462
- ) : unreadCount > 0 ? /* @__PURE__ */ jsxs(
634
+ ) : unreadCount > 0 ? /* @__PURE__ */ jsxs2(
463
635
  "div",
464
636
  {
465
637
  role: "button",
@@ -481,15 +653,15 @@ function HomeScreen({ nav }) {
481
653
  userSelect: "none"
482
654
  },
483
655
  children: [
484
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: unreadCount }),
485
- /* @__PURE__ */ jsxs("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
656
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: unreadCount }),
657
+ /* @__PURE__ */ jsxs2("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
486
658
  "unread message",
487
659
  unreadCount !== 1 ? "s" : ""
488
660
  ] }),
489
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "View Messages \u2192" })
661
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "View Messages \u2192" })
490
662
  ]
491
663
  }
492
- ) : /* @__PURE__ */ jsxs(
664
+ ) : /* @__PURE__ */ jsxs2(
493
665
  "div",
494
666
  {
495
667
  style: {
@@ -503,9 +675,9 @@ function HomeScreen({ nav }) {
503
675
  marginBottom: 20
504
676
  },
505
677
  children: [
506
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 36, marginBottom: 8 }, children: "\u2705" }),
507
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary }, children: "All caught up!" }),
508
- totalTests > 0 && /* @__PURE__ */ jsxs("span", { style: { fontSize: 14, color: colors.textMuted, marginTop: 4 }, children: [
678
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 36, marginBottom: 8 }, children: "\u2705" }),
679
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary }, children: "All caught up!" }),
680
+ totalTests > 0 && /* @__PURE__ */ jsxs2("span", { style: { fontSize: 14, color: colors.textMuted, marginTop: 4 }, children: [
509
681
  completedCount,
510
682
  "/",
511
683
  totalTests,
@@ -514,7 +686,7 @@ function HomeScreen({ nav }) {
514
686
  ]
515
687
  }
516
688
  ),
517
- /* @__PURE__ */ jsxs(
689
+ /* @__PURE__ */ jsxs2(
518
690
  "div",
519
691
  {
520
692
  style: {
@@ -524,7 +696,7 @@ function HomeScreen({ nav }) {
524
696
  marginBottom: 20
525
697
  },
526
698
  children: [
527
- /* @__PURE__ */ jsxs(
699
+ /* @__PURE__ */ jsxs2(
528
700
  "div",
529
701
  {
530
702
  role: "button",
@@ -546,9 +718,9 @@ function HomeScreen({ nav }) {
546
718
  userSelect: "none"
547
719
  },
548
720
  children: [
549
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u2705" }),
550
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Tests" }),
551
- pendingCount > 0 && /* @__PURE__ */ jsx2(
721
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u2705" }),
722
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Tests" }),
723
+ pendingCount > 0 && /* @__PURE__ */ jsx3(
552
724
  "span",
553
725
  {
554
726
  style: {
@@ -574,7 +746,7 @@ function HomeScreen({ nav }) {
574
746
  ]
575
747
  }
576
748
  ),
577
- /* @__PURE__ */ jsxs(
749
+ /* @__PURE__ */ jsxs2(
578
750
  "div",
579
751
  {
580
752
  role: "button",
@@ -596,12 +768,12 @@ function HomeScreen({ nav }) {
596
768
  userSelect: "none"
597
769
  },
598
770
  children: [
599
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F41B}" }),
600
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Report Bug" })
771
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F41B}" }),
772
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Report Bug" })
601
773
  ]
602
774
  }
603
775
  ),
604
- /* @__PURE__ */ jsxs(
776
+ /* @__PURE__ */ jsxs2(
605
777
  "div",
606
778
  {
607
779
  role: "button",
@@ -623,12 +795,12 @@ function HomeScreen({ nav }) {
623
795
  userSelect: "none"
624
796
  },
625
797
  children: [
626
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4A1}" }),
627
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Feedback" })
798
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4A1}" }),
799
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Feedback" })
628
800
  ]
629
801
  }
630
802
  ),
631
- /* @__PURE__ */ jsxs(
803
+ /* @__PURE__ */ jsxs2(
632
804
  "div",
633
805
  {
634
806
  role: "button",
@@ -650,9 +822,9 @@ function HomeScreen({ nav }) {
650
822
  userSelect: "none"
651
823
  },
652
824
  children: [
653
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4AC}" }),
654
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Messages" }),
655
- unreadCount > 0 && /* @__PURE__ */ jsx2(
825
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4AC}" }),
826
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Messages" }),
827
+ unreadCount > 0 && /* @__PURE__ */ jsx3(
656
828
  "span",
657
829
  {
658
830
  style: {
@@ -681,8 +853,8 @@ function HomeScreen({ nav }) {
681
853
  ]
682
854
  }
683
855
  ),
684
- /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
685
- /* @__PURE__ */ jsxs(
856
+ /* @__PURE__ */ jsxs2("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
857
+ /* @__PURE__ */ jsxs2(
686
858
  "div",
687
859
  {
688
860
  role: "button",
@@ -704,12 +876,12 @@ function HomeScreen({ nav }) {
704
876
  userSelect: "none"
705
877
  },
706
878
  children: [
707
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
708
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
879
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
880
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
709
881
  ]
710
882
  }
711
883
  ),
712
- /* @__PURE__ */ jsxs(
884
+ /* @__PURE__ */ jsxs2(
713
885
  "div",
714
886
  {
715
887
  role: "button",
@@ -731,12 +903,12 @@ function HomeScreen({ nav }) {
731
903
  userSelect: "none"
732
904
  },
733
905
  children: [
734
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
735
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
906
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
907
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
736
908
  ]
737
909
  }
738
910
  ),
739
- /* @__PURE__ */ jsxs(
911
+ /* @__PURE__ */ jsxs2(
740
912
  "div",
741
913
  {
742
914
  role: "button",
@@ -758,14 +930,14 @@ function HomeScreen({ nav }) {
758
930
  userSelect: "none"
759
931
  },
760
932
  children: [
761
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
762
- /* @__PURE__ */ jsx2("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
933
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
934
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
763
935
  ]
764
936
  }
765
937
  )
766
938
  ] }),
767
- totalTests > 0 && /* @__PURE__ */ jsxs("div", { style: { marginBottom: 16 }, children: [
768
- /* @__PURE__ */ jsx2(
939
+ totalTests > 0 && /* @__PURE__ */ jsxs2("div", { style: { marginBottom: 16 }, children: [
940
+ /* @__PURE__ */ jsx3(
769
941
  "div",
770
942
  {
771
943
  style: {
@@ -775,7 +947,7 @@ function HomeScreen({ nav }) {
775
947
  overflow: "hidden",
776
948
  marginBottom: 6
777
949
  },
778
- children: /* @__PURE__ */ jsx2(
950
+ children: /* @__PURE__ */ jsx3(
779
951
  "div",
780
952
  {
781
953
  style: {
@@ -789,14 +961,41 @@ function HomeScreen({ nav }) {
789
961
  )
790
962
  }
791
963
  ),
792
- /* @__PURE__ */ jsxs("div", { style: { fontSize: 12, color: colors.textMuted, textAlign: "center" }, children: [
964
+ /* @__PURE__ */ jsxs2("div", { style: { fontSize: 12, color: colors.textMuted, textAlign: "center" }, children: [
793
965
  completedCount,
794
966
  "/",
795
967
  totalTests,
796
968
  " tests completed"
797
969
  ] })
798
970
  ] }),
799
- /* @__PURE__ */ jsx2("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ jsx2(
971
+ dashboardUrl && /* @__PURE__ */ jsxs2(
972
+ "a",
973
+ {
974
+ href: dashboardUrl,
975
+ target: "_blank",
976
+ rel: "noopener noreferrer",
977
+ style: {
978
+ display: "flex",
979
+ alignItems: "center",
980
+ backgroundColor: colors.card,
981
+ border: `1px solid ${colors.border}`,
982
+ borderRadius: 12,
983
+ padding: 14,
984
+ marginBottom: 16,
985
+ textDecoration: "none",
986
+ cursor: "pointer"
987
+ },
988
+ children: [
989
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 22, marginRight: 12 }, children: "\u{1F310}" }),
990
+ /* @__PURE__ */ jsxs2("span", { style: { flex: 1 }, children: [
991
+ /* @__PURE__ */ jsx3("span", { style: { display: "block", fontSize: 14, fontWeight: 600, color: colors.textPrimary }, children: "Open Dashboard" }),
992
+ /* @__PURE__ */ jsx3("span", { style: { display: "block", fontSize: 12, color: colors.textMuted, marginTop: 2 }, children: "View analytics, history & more" })
993
+ ] }),
994
+ /* @__PURE__ */ jsx3("span", { style: { fontSize: 16, color: colors.textMuted, marginLeft: 8 }, children: "\u2192" })
995
+ ]
996
+ }
997
+ ),
998
+ /* @__PURE__ */ jsx3("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ jsx3(
800
999
  "button",
801
1000
  {
802
1001
  type: "button",
@@ -821,7 +1020,7 @@ function HomeScreen({ nav }) {
821
1020
 
822
1021
  // src/widget/screens/TestDetailScreen.tsx
823
1022
  import { useState as useState2, useEffect as useEffect3, useCallback as useCallback2 } from "react";
824
- import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
1023
+ import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
825
1024
  function TestDetailScreen({ testId, nav }) {
826
1025
  const { client, assignments, currentAssignment, refreshAssignments, onNavigate } = useBugBear();
827
1026
  const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
@@ -886,6 +1085,37 @@ function TestDetailScreen({ testId, nav }) {
886
1085
  setIsSubmitting(false);
887
1086
  }
888
1087
  }, [client, displayedAssignment, refreshAssignments, nav, isSubmitting]);
1088
+ const handleReopen = useCallback2(async () => {
1089
+ if (!client || !displayedAssignment || isSubmitting) return;
1090
+ setIsSubmitting(true);
1091
+ try {
1092
+ await client.reopenAssignment(displayedAssignment.id);
1093
+ await refreshAssignments();
1094
+ } finally {
1095
+ setIsSubmitting(false);
1096
+ }
1097
+ }, [client, displayedAssignment, refreshAssignments, isSubmitting]);
1098
+ const handleChangeResult = useCallback2(async (newStatus) => {
1099
+ if (!client || !displayedAssignment || isSubmitting) return;
1100
+ setIsSubmitting(true);
1101
+ try {
1102
+ await client.reopenAssignment(displayedAssignment.id);
1103
+ await client.updateAssignmentStatus(displayedAssignment.id, newStatus);
1104
+ await refreshAssignments();
1105
+ if (newStatus === "failed") {
1106
+ nav.replace({
1107
+ name: "REPORT",
1108
+ prefill: {
1109
+ type: "test_fail",
1110
+ assignmentId: displayedAssignment.id,
1111
+ testCaseId: displayedAssignment.testCase.id
1112
+ }
1113
+ });
1114
+ }
1115
+ } finally {
1116
+ setIsSubmitting(false);
1117
+ }
1118
+ }, [client, displayedAssignment, refreshAssignments, nav, isSubmitting]);
889
1119
  const handleSkip = useCallback2(async () => {
890
1120
  if (!client || !displayedAssignment || !selectedSkipReason) return;
891
1121
  setSkipping(true);
@@ -909,7 +1139,7 @@ function TestDetailScreen({ testId, nav }) {
909
1139
  }
910
1140
  }, [client, displayedAssignment, selectedSkipReason, skipNotes, refreshAssignments, assignments, nav]);
911
1141
  if (!displayedAssignment) {
912
- return /* @__PURE__ */ jsxs2(
1142
+ return /* @__PURE__ */ jsxs3(
913
1143
  "div",
914
1144
  {
915
1145
  style: {
@@ -920,10 +1150,10 @@ function TestDetailScreen({ testId, nav }) {
920
1150
  padding: 40
921
1151
  },
922
1152
  children: [
923
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
924
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
925
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
926
- /* @__PURE__ */ jsx3(
1153
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
1154
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
1155
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
1156
+ /* @__PURE__ */ jsx4(
927
1157
  "button",
928
1158
  {
929
1159
  type: "button",
@@ -956,8 +1186,8 @@ function TestDetailScreen({ testId, nav }) {
956
1186
  { reason: "dependency", label: "\u{1F517} Needs another test first" },
957
1187
  { reason: "other", label: "\u{1F4DD} Other reason" }
958
1188
  ];
959
- return /* @__PURE__ */ jsxs2("div", { style: { paddingBottom: 16 }, children: [
960
- /* @__PURE__ */ jsxs2(
1189
+ return /* @__PURE__ */ jsxs3("div", { style: { paddingBottom: 16 }, children: [
1190
+ /* @__PURE__ */ jsxs3(
961
1191
  "div",
962
1192
  {
963
1193
  style: {
@@ -967,14 +1197,14 @@ function TestDetailScreen({ testId, nav }) {
967
1197
  marginBottom: 12
968
1198
  },
969
1199
  children: [
970
- /* @__PURE__ */ jsxs2("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
971
- /* @__PURE__ */ jsxs2("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
1200
+ /* @__PURE__ */ jsxs3("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1201
+ /* @__PURE__ */ jsxs3("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
972
1202
  "Test ",
973
1203
  currentIndex + 1,
974
1204
  " of ",
975
1205
  allTests.length
976
1206
  ] }),
977
- displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ jsx3(
1207
+ displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ jsx4(
978
1208
  "span",
979
1209
  {
980
1210
  style: {
@@ -993,7 +1223,7 @@ function TestDetailScreen({ testId, nav }) {
993
1223
  }
994
1224
  )
995
1225
  ] }),
996
- /* @__PURE__ */ jsx3(
1226
+ /* @__PURE__ */ jsx4(
997
1227
  "button",
998
1228
  {
999
1229
  type: "button",
@@ -1013,7 +1243,7 @@ function TestDetailScreen({ testId, nav }) {
1013
1243
  ]
1014
1244
  }
1015
1245
  ),
1016
- displayedAssignment.isVerification && /* @__PURE__ */ jsxs2(
1246
+ displayedAssignment.isVerification && /* @__PURE__ */ jsxs3(
1017
1247
  "div",
1018
1248
  {
1019
1249
  style: {
@@ -1027,14 +1257,14 @@ function TestDetailScreen({ testId, nav }) {
1027
1257
  marginBottom: 10
1028
1258
  },
1029
1259
  children: [
1030
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
1031
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
1032
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
1260
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
1261
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
1262
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
1033
1263
  ]
1034
1264
  }
1035
1265
  ),
1036
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1037
- testCase.testKey && /* @__PURE__ */ jsx3(
1266
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1267
+ testCase.testKey && /* @__PURE__ */ jsx4(
1038
1268
  "div",
1039
1269
  {
1040
1270
  style: {
@@ -1046,7 +1276,7 @@ function TestDetailScreen({ testId, nav }) {
1046
1276
  children: testCase.testKey
1047
1277
  }
1048
1278
  ),
1049
- /* @__PURE__ */ jsx3(
1279
+ /* @__PURE__ */ jsx4(
1050
1280
  "button",
1051
1281
  {
1052
1282
  type: "button",
@@ -1062,7 +1292,7 @@ function TestDetailScreen({ testId, nav }) {
1062
1292
  cursor: "pointer",
1063
1293
  textAlign: "left"
1064
1294
  },
1065
- children: /* @__PURE__ */ jsxs2("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1295
+ children: /* @__PURE__ */ jsxs3("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1066
1296
  showSteps ? "\u25BC" : "\u25B6",
1067
1297
  " ",
1068
1298
  info.icon,
@@ -1071,9 +1301,9 @@ function TestDetailScreen({ testId, nav }) {
1071
1301
  ] })
1072
1302
  }
1073
1303
  ),
1074
- showSteps && /* @__PURE__ */ jsxs2("div", { style: { marginBottom: 16 }, children: [
1075
- template === "steps" && steps.map((step, idx) => /* @__PURE__ */ jsxs2("div", { style: { display: "flex", marginBottom: 10 }, children: [
1076
- /* @__PURE__ */ jsx3(
1304
+ showSteps && /* @__PURE__ */ jsxs3("div", { style: { marginBottom: 16 }, children: [
1305
+ template === "steps" && steps.map((step, idx) => /* @__PURE__ */ jsxs3("div", { style: { display: "flex", marginBottom: 10 }, children: [
1306
+ /* @__PURE__ */ jsx4(
1077
1307
  "div",
1078
1308
  {
1079
1309
  style: {
@@ -1088,12 +1318,12 @@ function TestDetailScreen({ testId, nav }) {
1088
1318
  marginTop: 2,
1089
1319
  flexShrink: 0
1090
1320
  },
1091
- children: /* @__PURE__ */ jsx3("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1321
+ children: /* @__PURE__ */ jsx4("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1092
1322
  }
1093
1323
  ),
1094
- /* @__PURE__ */ jsxs2("div", { style: { flex: 1 }, children: [
1095
- /* @__PURE__ */ jsx3("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
1096
- step.expectedResult && /* @__PURE__ */ jsxs2(
1324
+ /* @__PURE__ */ jsxs3("div", { style: { flex: 1 }, children: [
1325
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
1326
+ step.expectedResult && /* @__PURE__ */ jsxs3(
1097
1327
  "div",
1098
1328
  {
1099
1329
  style: {
@@ -1110,8 +1340,8 @@ function TestDetailScreen({ testId, nav }) {
1110
1340
  )
1111
1341
  ] })
1112
1342
  ] }, idx)),
1113
- template === "checklist" && /* @__PURE__ */ jsxs2(Fragment, { children: [
1114
- steps.map((step, idx) => /* @__PURE__ */ jsxs2(
1343
+ template === "checklist" && /* @__PURE__ */ jsxs3(Fragment, { children: [
1344
+ steps.map((step, idx) => /* @__PURE__ */ jsxs3(
1115
1345
  "button",
1116
1346
  {
1117
1347
  type: "button",
@@ -1137,7 +1367,7 @@ function TestDetailScreen({ testId, nav }) {
1137
1367
  textAlign: "left"
1138
1368
  },
1139
1369
  children: [
1140
- /* @__PURE__ */ jsx3(
1370
+ /* @__PURE__ */ jsx4(
1141
1371
  "div",
1142
1372
  {
1143
1373
  style: {
@@ -1152,10 +1382,10 @@ function TestDetailScreen({ testId, nav }) {
1152
1382
  alignItems: "center",
1153
1383
  flexShrink: 0
1154
1384
  },
1155
- children: criteriaResults[idx] === true && /* @__PURE__ */ jsx3("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1385
+ children: criteriaResults[idx] === true && /* @__PURE__ */ jsx4("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1156
1386
  }
1157
1387
  ),
1158
- /* @__PURE__ */ jsx3(
1388
+ /* @__PURE__ */ jsx4(
1159
1389
  "span",
1160
1390
  {
1161
1391
  style: {
@@ -1171,7 +1401,7 @@ function TestDetailScreen({ testId, nav }) {
1171
1401
  },
1172
1402
  idx
1173
1403
  )),
1174
- Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ jsx3("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ jsx3(
1404
+ Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ jsx4("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ jsx4(
1175
1405
  "button",
1176
1406
  {
1177
1407
  type: "button",
@@ -1188,8 +1418,8 @@ function TestDetailScreen({ testId, nav }) {
1188
1418
  }
1189
1419
  ) })
1190
1420
  ] }),
1191
- template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ jsxs2("div", { style: { marginBottom: 14 }, children: [
1192
- /* @__PURE__ */ jsxs2(
1421
+ template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ jsxs3("div", { style: { marginBottom: 14 }, children: [
1422
+ /* @__PURE__ */ jsxs3(
1193
1423
  "div",
1194
1424
  {
1195
1425
  style: {
@@ -1205,7 +1435,7 @@ function TestDetailScreen({ testId, nav }) {
1205
1435
  ]
1206
1436
  }
1207
1437
  ),
1208
- step.expectedResult && /* @__PURE__ */ jsx3(
1438
+ step.expectedResult && /* @__PURE__ */ jsx4(
1209
1439
  "div",
1210
1440
  {
1211
1441
  style: {
@@ -1217,8 +1447,8 @@ function TestDetailScreen({ testId, nav }) {
1217
1447
  children: step.expectedResult
1218
1448
  }
1219
1449
  ),
1220
- rubricMode === "pass_fail" ? /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1221
- /* @__PURE__ */ jsx3(
1450
+ rubricMode === "pass_fail" ? /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1451
+ /* @__PURE__ */ jsx4(
1222
1452
  "button",
1223
1453
  {
1224
1454
  type: "button",
@@ -1239,7 +1469,7 @@ function TestDetailScreen({ testId, nav }) {
1239
1469
  children: "\u2713 Pass"
1240
1470
  }
1241
1471
  ),
1242
- /* @__PURE__ */ jsx3(
1472
+ /* @__PURE__ */ jsx4(
1243
1473
  "button",
1244
1474
  {
1245
1475
  type: "button",
@@ -1260,7 +1490,7 @@ function TestDetailScreen({ testId, nav }) {
1260
1490
  children: "\u2717 Fail"
1261
1491
  }
1262
1492
  )
1263
- ] }) : /* @__PURE__ */ jsx3("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx3(
1493
+ ] }) : /* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx4(
1264
1494
  "button",
1265
1495
  {
1266
1496
  type: "button",
@@ -1284,7 +1514,7 @@ function TestDetailScreen({ testId, nav }) {
1284
1514
  n
1285
1515
  )) })
1286
1516
  ] }, idx)),
1287
- template === "freeform" && /* @__PURE__ */ jsxs2(
1517
+ template === "freeform" && /* @__PURE__ */ jsxs3(
1288
1518
  "div",
1289
1519
  {
1290
1520
  style: {
@@ -1294,15 +1524,15 @@ function TestDetailScreen({ testId, nav }) {
1294
1524
  border: "1px solid #854d0e"
1295
1525
  },
1296
1526
  children: [
1297
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
1298
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
1299
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
1300
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
1527
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
1528
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
1529
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
1530
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
1301
1531
  ]
1302
1532
  }
1303
1533
  )
1304
1534
  ] }),
1305
- testCase.expectedResult && /* @__PURE__ */ jsxs2(
1535
+ testCase.expectedResult && /* @__PURE__ */ jsxs3(
1306
1536
  "div",
1307
1537
  {
1308
1538
  style: {
@@ -1313,12 +1543,12 @@ function TestDetailScreen({ testId, nav }) {
1313
1543
  marginBottom: 12
1314
1544
  },
1315
1545
  children: [
1316
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
1317
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
1546
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
1547
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
1318
1548
  ]
1319
1549
  }
1320
1550
  ),
1321
- testCase.targetRoute && onNavigate && /* @__PURE__ */ jsx3(
1551
+ testCase.targetRoute && onNavigate && /* @__PURE__ */ jsx4(
1322
1552
  "button",
1323
1553
  {
1324
1554
  type: "button",
@@ -1340,7 +1570,7 @@ function TestDetailScreen({ testId, nav }) {
1340
1570
  children: "\u{1F9ED} Go to test location"
1341
1571
  }
1342
1572
  ),
1343
- /* @__PURE__ */ jsxs2(
1573
+ /* @__PURE__ */ jsxs3(
1344
1574
  "button",
1345
1575
  {
1346
1576
  type: "button",
@@ -1364,7 +1594,7 @@ function TestDetailScreen({ testId, nav }) {
1364
1594
  ]
1365
1595
  }
1366
1596
  ),
1367
- showDetails && /* @__PURE__ */ jsxs2(
1597
+ showDetails && /* @__PURE__ */ jsxs3(
1368
1598
  "div",
1369
1599
  {
1370
1600
  style: {
@@ -1375,7 +1605,7 @@ function TestDetailScreen({ testId, nav }) {
1375
1605
  marginBottom: 16
1376
1606
  },
1377
1607
  children: [
1378
- testCase.testKey && /* @__PURE__ */ jsxs2(
1608
+ testCase.testKey && /* @__PURE__ */ jsxs3(
1379
1609
  "div",
1380
1610
  {
1381
1611
  style: {
@@ -1393,16 +1623,122 @@ function TestDetailScreen({ testId, nav }) {
1393
1623
  ]
1394
1624
  }
1395
1625
  ),
1396
- testCase.description && /* @__PURE__ */ jsx3("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
1397
- testCase.group && /* @__PURE__ */ jsx3("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ jsxs2("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
1626
+ testCase.description && /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
1627
+ testCase.group && /* @__PURE__ */ jsx4("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ jsxs3("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
1398
1628
  "\u{1F4C1} ",
1399
1629
  testCase.group.name
1400
1630
  ] }) })
1401
1631
  ]
1402
1632
  }
1403
1633
  ),
1404
- /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1405
- /* @__PURE__ */ jsx3(
1634
+ displayedAssignment.status === "passed" || displayedAssignment.status === "failed" || displayedAssignment.status === "skipped" || displayedAssignment.status === "blocked" ? /* @__PURE__ */ jsxs3(Fragment, { children: [
1635
+ /* @__PURE__ */ jsxs3(
1636
+ "div",
1637
+ {
1638
+ style: {
1639
+ display: "flex",
1640
+ alignItems: "center",
1641
+ justifyContent: "center",
1642
+ gap: 6,
1643
+ padding: "8px 12px",
1644
+ borderRadius: 8,
1645
+ marginTop: 8,
1646
+ marginBottom: 8,
1647
+ backgroundColor: displayedAssignment.status === "passed" ? colors.greenDark : displayedAssignment.status === "failed" ? colors.redDark : colors.card,
1648
+ border: `1px solid ${displayedAssignment.status === "passed" ? colors.green : displayedAssignment.status === "failed" ? colors.red : colors.border}`
1649
+ },
1650
+ children: [
1651
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 14 }, children: displayedAssignment.status === "passed" ? "\u2705" : displayedAssignment.status === "failed" ? "\u274C" : displayedAssignment.status === "skipped" ? "\u23ED" : "\u{1F6AB}" }),
1652
+ /* @__PURE__ */ jsxs3(
1653
+ "span",
1654
+ {
1655
+ style: {
1656
+ fontSize: 13,
1657
+ fontWeight: 600,
1658
+ color: displayedAssignment.status === "passed" ? colors.green : displayedAssignment.status === "failed" ? "#fca5a5" : colors.textSecondary
1659
+ },
1660
+ children: [
1661
+ "Marked as ",
1662
+ displayedAssignment.status.charAt(0).toUpperCase() + displayedAssignment.status.slice(1)
1663
+ ]
1664
+ }
1665
+ )
1666
+ ]
1667
+ }
1668
+ ),
1669
+ /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 10, marginTop: 4 }, children: [
1670
+ /* @__PURE__ */ jsx4(
1671
+ "button",
1672
+ {
1673
+ type: "button",
1674
+ onClick: handleReopen,
1675
+ disabled: isSubmitting,
1676
+ style: {
1677
+ flex: 1,
1678
+ paddingTop: 14,
1679
+ paddingBottom: 14,
1680
+ borderRadius: 12,
1681
+ textAlign: "center",
1682
+ backgroundColor: colors.card,
1683
+ border: `1px solid ${colors.blue}`,
1684
+ cursor: isSubmitting ? "not-allowed" : "pointer",
1685
+ fontSize: 14,
1686
+ fontWeight: 600,
1687
+ color: colors.blue,
1688
+ opacity: isSubmitting ? 0.5 : 1
1689
+ },
1690
+ children: isSubmitting ? "Reopening..." : "\u{1F504} Reopen Test"
1691
+ }
1692
+ ),
1693
+ displayedAssignment.status === "passed" && /* @__PURE__ */ jsx4(
1694
+ "button",
1695
+ {
1696
+ type: "button",
1697
+ onClick: () => handleChangeResult("failed"),
1698
+ disabled: isSubmitting,
1699
+ style: {
1700
+ flex: 1,
1701
+ paddingTop: 14,
1702
+ paddingBottom: 14,
1703
+ borderRadius: 12,
1704
+ textAlign: "center",
1705
+ backgroundColor: colors.redDark,
1706
+ border: `1px solid ${colors.red}`,
1707
+ cursor: isSubmitting ? "not-allowed" : "pointer",
1708
+ fontSize: 14,
1709
+ fontWeight: 600,
1710
+ color: "#fca5a5",
1711
+ opacity: isSubmitting ? 0.5 : 1
1712
+ },
1713
+ children: "Change to Fail"
1714
+ }
1715
+ ),
1716
+ displayedAssignment.status === "failed" && /* @__PURE__ */ jsx4(
1717
+ "button",
1718
+ {
1719
+ type: "button",
1720
+ onClick: () => handleChangeResult("passed"),
1721
+ disabled: isSubmitting,
1722
+ style: {
1723
+ flex: 1,
1724
+ paddingTop: 14,
1725
+ paddingBottom: 14,
1726
+ borderRadius: 12,
1727
+ textAlign: "center",
1728
+ backgroundColor: colors.greenDark,
1729
+ border: `1px solid ${colors.green}`,
1730
+ cursor: isSubmitting ? "not-allowed" : "pointer",
1731
+ fontSize: 14,
1732
+ fontWeight: 600,
1733
+ color: "#86efac",
1734
+ opacity: isSubmitting ? 0.5 : 1
1735
+ },
1736
+ children: "Change to Pass"
1737
+ }
1738
+ )
1739
+ ] })
1740
+ ] }) : /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1741
+ /* @__PURE__ */ jsx4(
1406
1742
  "button",
1407
1743
  {
1408
1744
  type: "button",
@@ -1425,7 +1761,7 @@ function TestDetailScreen({ testId, nav }) {
1425
1761
  children: isSubmitting ? "Failing..." : "Fail"
1426
1762
  }
1427
1763
  ),
1428
- /* @__PURE__ */ jsx3(
1764
+ /* @__PURE__ */ jsx4(
1429
1765
  "button",
1430
1766
  {
1431
1767
  type: "button",
@@ -1448,7 +1784,7 @@ function TestDetailScreen({ testId, nav }) {
1448
1784
  children: "Skip"
1449
1785
  }
1450
1786
  ),
1451
- /* @__PURE__ */ jsx3(
1787
+ /* @__PURE__ */ jsx4(
1452
1788
  "button",
1453
1789
  {
1454
1790
  type: "button",
@@ -1472,7 +1808,7 @@ function TestDetailScreen({ testId, nav }) {
1472
1808
  }
1473
1809
  )
1474
1810
  ] }),
1475
- showSkipModal && /* @__PURE__ */ jsx3(
1811
+ showSkipModal && /* @__PURE__ */ jsx4(
1476
1812
  "div",
1477
1813
  {
1478
1814
  style: {
@@ -1485,7 +1821,7 @@ function TestDetailScreen({ testId, nav }) {
1485
1821
  zIndex: 9999,
1486
1822
  padding: 24
1487
1823
  },
1488
- children: /* @__PURE__ */ jsxs2(
1824
+ children: /* @__PURE__ */ jsxs3(
1489
1825
  "div",
1490
1826
  {
1491
1827
  style: {
@@ -1497,7 +1833,7 @@ function TestDetailScreen({ testId, nav }) {
1497
1833
  width: "100%"
1498
1834
  },
1499
1835
  children: [
1500
- /* @__PURE__ */ jsx3(
1836
+ /* @__PURE__ */ jsx4(
1501
1837
  "div",
1502
1838
  {
1503
1839
  style: {
@@ -1509,8 +1845,8 @@ function TestDetailScreen({ testId, nav }) {
1509
1845
  children: "Skip this test?"
1510
1846
  }
1511
1847
  ),
1512
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1513
- skipReasons.map(({ reason, label }) => /* @__PURE__ */ jsx3(
1848
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1849
+ skipReasons.map(({ reason, label }) => /* @__PURE__ */ jsx4(
1514
1850
  "button",
1515
1851
  {
1516
1852
  type: "button",
@@ -1536,7 +1872,7 @@ function TestDetailScreen({ testId, nav }) {
1536
1872
  },
1537
1873
  reason
1538
1874
  )),
1539
- /* @__PURE__ */ jsx3(
1875
+ /* @__PURE__ */ jsx4(
1540
1876
  "textarea",
1541
1877
  {
1542
1878
  value: skipNotes,
@@ -1559,8 +1895,8 @@ function TestDetailScreen({ testId, nav }) {
1559
1895
  }
1560
1896
  }
1561
1897
  ),
1562
- /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1563
- /* @__PURE__ */ jsx3(
1898
+ /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1899
+ /* @__PURE__ */ jsx4(
1564
1900
  "button",
1565
1901
  {
1566
1902
  type: "button",
@@ -1584,7 +1920,7 @@ function TestDetailScreen({ testId, nav }) {
1584
1920
  children: "Cancel"
1585
1921
  }
1586
1922
  ),
1587
- /* @__PURE__ */ jsx3(
1923
+ /* @__PURE__ */ jsx4(
1588
1924
  "button",
1589
1925
  {
1590
1926
  type: "button",
@@ -1618,11 +1954,15 @@ function TestDetailScreen({ testId, nav }) {
1618
1954
 
1619
1955
  // src/widget/screens/TestListScreen.tsx
1620
1956
  import { useState as useState3, useMemo, useCallback as useCallback3 } from "react";
1621
- import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1957
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1622
1958
  function TestListScreen({ nav }) {
1623
- const { assignments, currentAssignment, refreshAssignments } = useBugBear();
1959
+ const { assignments, currentAssignment, refreshAssignments, dashboardUrl, isLoading } = useBugBear();
1624
1960
  const [filter, setFilter] = useState3("all");
1625
1961
  const [roleFilter, setRoleFilter] = useState3(null);
1962
+ const [trackFilter, setTrackFilter] = useState3(null);
1963
+ const [platformFilter, setPlatformFilter] = useState3("web");
1964
+ const [searchQuery, setSearchQuery] = useState3("");
1965
+ const [sortMode, setSortMode] = useState3("priority");
1626
1966
  const [collapsedFolders, setCollapsedFolders] = useState3(/* @__PURE__ */ new Set());
1627
1967
  const availableRoles = useMemo(() => {
1628
1968
  const roleMap = /* @__PURE__ */ new Map();
@@ -1631,6 +1971,20 @@ function TestListScreen({ nav }) {
1631
1971
  }
1632
1972
  return Array.from(roleMap.values());
1633
1973
  }, [assignments]);
1974
+ const availableTracks = useMemo(() => {
1975
+ const trackMap = /* @__PURE__ */ new Map();
1976
+ for (const a of assignments) {
1977
+ if (a.testCase.track) trackMap.set(a.testCase.track.id, a.testCase.track);
1978
+ }
1979
+ return Array.from(trackMap.values());
1980
+ }, [assignments]);
1981
+ const availablePlatforms = useMemo(() => {
1982
+ const set = /* @__PURE__ */ new Set();
1983
+ for (const a of assignments) {
1984
+ if (a.testCase.platforms) a.testCase.platforms.forEach((p) => set.add(p));
1985
+ }
1986
+ return Array.from(set).sort();
1987
+ }, [assignments]);
1634
1988
  const selectedRole = availableRoles.find((r) => r.id === roleFilter);
1635
1989
  const groupedAssignments = useMemo(() => {
1636
1990
  const groups = /* @__PURE__ */ new Map();
@@ -1664,6 +2018,12 @@ function TestListScreen({ nav }) {
1664
2018
  folder.assignments.sort((a, b) => {
1665
2019
  if (a.isVerification && !b.isVerification) return -1;
1666
2020
  if (!a.isVerification && b.isVerification) return 1;
2021
+ if (sortMode === "alpha") {
2022
+ return a.testCase.title.localeCompare(b.testCase.title);
2023
+ }
2024
+ if (sortMode === "recent") {
2025
+ return 0;
2026
+ }
1667
2027
  const sd = (statusOrder[a.status] ?? 5) - (statusOrder[b.status] ?? 5);
1668
2028
  if (sd !== 0) return sd;
1669
2029
  return (priorityOrder[a.testCase.priority] ?? 4) - (priorityOrder[b.testCase.priority] ?? 4);
@@ -1675,7 +2035,7 @@ function TestListScreen({ nav }) {
1675
2035
  if (!b.group) return -1;
1676
2036
  return a.group.sortOrder - b.group.sortOrder;
1677
2037
  });
1678
- }, [assignments]);
2038
+ }, [assignments, sortMode]);
1679
2039
  const toggleFolder = useCallback3((id) => {
1680
2040
  setCollapsedFolders((prev) => {
1681
2041
  const next = new Set(prev);
@@ -1684,13 +2044,21 @@ function TestListScreen({ nav }) {
1684
2044
  return next;
1685
2045
  });
1686
2046
  }, []);
1687
- const filterAssignment = (a) => {
2047
+ const filterAssignment = useCallback3((a) => {
2048
+ if (platformFilter && a.testCase.platforms && !a.testCase.platforms.includes(platformFilter)) return false;
1688
2049
  if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
2050
+ if (trackFilter && a.testCase.track?.id !== trackFilter) return false;
2051
+ if (searchQuery) {
2052
+ const q = searchQuery.toLowerCase();
2053
+ const titleMatch = a.testCase.title.toLowerCase().includes(q);
2054
+ const keyMatch = a.testCase.testKey.toLowerCase().includes(q);
2055
+ if (!titleMatch && !keyMatch) return false;
2056
+ }
1689
2057
  if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
1690
2058
  if (filter === "done") return a.status === "passed";
1691
2059
  if (filter === "reopened") return a.status === "failed";
1692
2060
  return true;
1693
- };
2061
+ }, [platformFilter, roleFilter, trackFilter, searchQuery, filter]);
1694
2062
  const pendingCount = assignments.filter(
1695
2063
  (a) => a.status === "pending" || a.status === "in_progress"
1696
2064
  ).length;
@@ -1702,8 +2070,9 @@ function TestListScreen({ nav }) {
1702
2070
  { key: "done", label: "Done", count: doneCount },
1703
2071
  { key: "reopened", label: "Re Opened", count: reopenedCount }
1704
2072
  ];
1705
- return /* @__PURE__ */ jsxs3("div", { children: [
1706
- /* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ jsxs3(
2073
+ if (isLoading) return /* @__PURE__ */ jsx5(TestListScreenSkeleton, {});
2074
+ return /* @__PURE__ */ jsxs4("div", { children: [
2075
+ /* @__PURE__ */ jsx5("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ jsxs4(
1707
2076
  "button",
1708
2077
  {
1709
2078
  type: "button",
@@ -1730,9 +2099,9 @@ function TestListScreen({ nav }) {
1730
2099
  },
1731
2100
  f.key
1732
2101
  )) }),
1733
- availableRoles.length >= 2 && /* @__PURE__ */ jsxs3("div", { style: { marginBottom: 12 }, children: [
1734
- /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
1735
- /* @__PURE__ */ jsx4(
2102
+ availableRoles.length >= 2 && /* @__PURE__ */ jsxs4("div", { style: { marginBottom: 12 }, children: [
2103
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
2104
+ /* @__PURE__ */ jsx5(
1736
2105
  "button",
1737
2106
  {
1738
2107
  type: "button",
@@ -1755,7 +2124,7 @@ function TestListScreen({ nav }) {
1755
2124
  ),
1756
2125
  availableRoles.map((role) => {
1757
2126
  const isActive = roleFilter === role.id;
1758
- return /* @__PURE__ */ jsxs3(
2127
+ return /* @__PURE__ */ jsxs4(
1759
2128
  "button",
1760
2129
  {
1761
2130
  type: "button",
@@ -1777,7 +2146,7 @@ function TestListScreen({ nav }) {
1777
2146
  fontWeight: isActive ? 600 : 400
1778
2147
  },
1779
2148
  children: [
1780
- /* @__PURE__ */ jsx4("span", { style: {
2149
+ /* @__PURE__ */ jsx5("span", { style: {
1781
2150
  width: 6,
1782
2151
  height: 6,
1783
2152
  borderRadius: 3,
@@ -1791,7 +2160,7 @@ function TestListScreen({ nav }) {
1791
2160
  );
1792
2161
  })
1793
2162
  ] }),
1794
- selectedRole?.loginHint && /* @__PURE__ */ jsxs3("div", { style: {
2163
+ selectedRole?.loginHint && /* @__PURE__ */ jsxs4("div", { style: {
1795
2164
  fontSize: 11,
1796
2165
  color: colors.textSecondary,
1797
2166
  backgroundColor: selectedRole.color + "10",
@@ -1803,6 +2172,156 @@ function TestListScreen({ nav }) {
1803
2172
  selectedRole.loginHint
1804
2173
  ] })
1805
2174
  ] }),
2175
+ /* @__PURE__ */ jsx5("div", { style: { marginBottom: 8 }, children: /* @__PURE__ */ jsx5(
2176
+ "input",
2177
+ {
2178
+ type: "text",
2179
+ value: searchQuery,
2180
+ onChange: (e) => setSearchQuery(e.target.value),
2181
+ placeholder: "Search tests...",
2182
+ style: {
2183
+ width: "100%",
2184
+ padding: "8px 12px",
2185
+ borderRadius: 8,
2186
+ border: `1px solid ${colors.border}`,
2187
+ backgroundColor: colors.card,
2188
+ color: colors.textPrimary,
2189
+ fontSize: 13,
2190
+ outline: "none",
2191
+ boxSizing: "border-box"
2192
+ }
2193
+ }
2194
+ ) }),
2195
+ availablePlatforms.length >= 2 && /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 4, marginBottom: 8 }, children: [
2196
+ /* @__PURE__ */ jsx5(
2197
+ "button",
2198
+ {
2199
+ type: "button",
2200
+ onClick: () => setPlatformFilter(null),
2201
+ style: {
2202
+ padding: "3px 8px",
2203
+ borderRadius: 6,
2204
+ backgroundColor: !platformFilter ? colors.card : "transparent",
2205
+ border: !platformFilter ? `1px solid ${colors.border}` : "1px solid transparent",
2206
+ cursor: "pointer",
2207
+ fontSize: 11,
2208
+ color: !platformFilter ? colors.textPrimary : colors.textMuted,
2209
+ fontWeight: !platformFilter ? 600 : 400,
2210
+ whiteSpace: "nowrap"
2211
+ },
2212
+ children: "All Platforms"
2213
+ }
2214
+ ),
2215
+ availablePlatforms.map((p) => {
2216
+ const isActive = platformFilter === p;
2217
+ const label = p === "ios" ? "iOS" : p === "android" ? "Android" : p === "web" ? "Web" : p;
2218
+ const icon = p === "ios" ? "\u{1F4F1}" : p === "android" ? "\u{1F916}" : p === "web" ? "\u{1F310}" : "\u{1F4CB}";
2219
+ return /* @__PURE__ */ jsxs4(
2220
+ "button",
2221
+ {
2222
+ type: "button",
2223
+ onClick: () => setPlatformFilter(isActive ? null : p),
2224
+ style: {
2225
+ display: "flex",
2226
+ alignItems: "center",
2227
+ gap: 4,
2228
+ padding: "3px 8px",
2229
+ borderRadius: 6,
2230
+ backgroundColor: isActive ? colors.blue + "20" : "transparent",
2231
+ border: isActive ? `1px solid ${colors.blue}60` : "1px solid transparent",
2232
+ cursor: "pointer",
2233
+ fontSize: 11,
2234
+ color: isActive ? colors.blue : colors.textMuted,
2235
+ fontWeight: isActive ? 600 : 400,
2236
+ whiteSpace: "nowrap"
2237
+ },
2238
+ children: [
2239
+ icon,
2240
+ " ",
2241
+ label
2242
+ ]
2243
+ },
2244
+ p
2245
+ );
2246
+ })
2247
+ ] }),
2248
+ (availableTracks.length >= 2 || true) && /* @__PURE__ */ jsxs4("div", { style: { display: "flex", alignItems: "center", gap: 6, marginBottom: 12 }, children: [
2249
+ availableTracks.length >= 2 && /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 4, flex: 1, overflow: "auto" }, children: [
2250
+ /* @__PURE__ */ jsx5(
2251
+ "button",
2252
+ {
2253
+ type: "button",
2254
+ onClick: () => setTrackFilter(null),
2255
+ style: {
2256
+ padding: "3px 8px",
2257
+ borderRadius: 6,
2258
+ backgroundColor: !trackFilter ? colors.card : "transparent",
2259
+ border: !trackFilter ? `1px solid ${colors.border}` : "1px solid transparent",
2260
+ cursor: "pointer",
2261
+ fontSize: 11,
2262
+ color: !trackFilter ? colors.textPrimary : colors.textMuted,
2263
+ fontWeight: !trackFilter ? 600 : 400,
2264
+ whiteSpace: "nowrap"
2265
+ },
2266
+ children: "All Tracks"
2267
+ }
2268
+ ),
2269
+ availableTracks.map((track) => {
2270
+ const isActive = trackFilter === track.id;
2271
+ return /* @__PURE__ */ jsxs4(
2272
+ "button",
2273
+ {
2274
+ type: "button",
2275
+ onClick: () => setTrackFilter(isActive ? null : track.id),
2276
+ style: {
2277
+ display: "flex",
2278
+ alignItems: "center",
2279
+ gap: 4,
2280
+ padding: "3px 8px",
2281
+ borderRadius: 6,
2282
+ backgroundColor: isActive ? track.color + "20" : "transparent",
2283
+ border: isActive ? `1px solid ${track.color}60` : "1px solid transparent",
2284
+ cursor: "pointer",
2285
+ fontSize: 11,
2286
+ color: isActive ? track.color : colors.textMuted,
2287
+ fontWeight: isActive ? 600 : 400,
2288
+ whiteSpace: "nowrap"
2289
+ },
2290
+ children: [
2291
+ track.icon,
2292
+ " ",
2293
+ track.name
2294
+ ]
2295
+ },
2296
+ track.id
2297
+ );
2298
+ })
2299
+ ] }),
2300
+ /* @__PURE__ */ jsx5("div", { style: { display: "flex", gap: 2, marginLeft: "auto", flexShrink: 0 }, children: [
2301
+ { key: "priority", label: "\u2195 Priority" },
2302
+ { key: "recent", label: "\u{1F550} Recent" },
2303
+ { key: "alpha", label: "A-Z" }
2304
+ ].map((s) => /* @__PURE__ */ jsx5(
2305
+ "button",
2306
+ {
2307
+ type: "button",
2308
+ onClick: () => setSortMode(s.key),
2309
+ style: {
2310
+ padding: "3px 8px",
2311
+ borderRadius: 6,
2312
+ backgroundColor: sortMode === s.key ? colors.card : "transparent",
2313
+ border: sortMode === s.key ? `1px solid ${colors.border}` : "1px solid transparent",
2314
+ cursor: "pointer",
2315
+ fontSize: 10,
2316
+ color: sortMode === s.key ? colors.textPrimary : colors.textMuted,
2317
+ fontWeight: sortMode === s.key ? 600 : 400,
2318
+ whiteSpace: "nowrap"
2319
+ },
2320
+ children: s.label
2321
+ },
2322
+ s.key
2323
+ )) })
2324
+ ] }),
1806
2325
  groupedAssignments.map((folder) => {
1807
2326
  const folderId = folder.group?.id || "ungrouped";
1808
2327
  const isCollapsed = collapsedFolders.has(folderId);
@@ -1810,8 +2329,8 @@ function TestListScreen({ nav }) {
1810
2329
  if (filtered.length === 0 && filter !== "all") return null;
1811
2330
  const completedInFolder = folder.stats.passed + folder.stats.failed;
1812
2331
  const progressPercent = folder.stats.total > 0 ? Math.round(completedInFolder / folder.stats.total * 100) : 0;
1813
- return /* @__PURE__ */ jsxs3("div", { style: { marginBottom: 12 }, children: [
1814
- /* @__PURE__ */ jsxs3(
2332
+ return /* @__PURE__ */ jsxs4("div", { style: { marginBottom: 12 }, children: [
2333
+ /* @__PURE__ */ jsxs4(
1815
2334
  "button",
1816
2335
  {
1817
2336
  type: "button",
@@ -1831,8 +2350,8 @@ function TestListScreen({ nav }) {
1831
2350
  textAlign: "left"
1832
2351
  },
1833
2352
  children: [
1834
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
1835
- /* @__PURE__ */ jsx4(
2353
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
2354
+ /* @__PURE__ */ jsx5(
1836
2355
  "span",
1837
2356
  {
1838
2357
  style: {
@@ -1847,7 +2366,7 @@ function TestListScreen({ nav }) {
1847
2366
  children: folder.group?.name || "Ungrouped"
1848
2367
  }
1849
2368
  ),
1850
- /* @__PURE__ */ jsx4(
2369
+ /* @__PURE__ */ jsx5(
1851
2370
  "div",
1852
2371
  {
1853
2372
  style: {
@@ -1858,7 +2377,7 @@ function TestListScreen({ nav }) {
1858
2377
  overflow: "hidden",
1859
2378
  flexShrink: 0
1860
2379
  },
1861
- children: /* @__PURE__ */ jsx4(
2380
+ children: /* @__PURE__ */ jsx5(
1862
2381
  "div",
1863
2382
  {
1864
2383
  style: {
@@ -1872,7 +2391,7 @@ function TestListScreen({ nav }) {
1872
2391
  )
1873
2392
  }
1874
2393
  ),
1875
- /* @__PURE__ */ jsxs3(
2394
+ /* @__PURE__ */ jsxs4(
1876
2395
  "span",
1877
2396
  {
1878
2397
  style: {
@@ -1896,7 +2415,7 @@ function TestListScreen({ nav }) {
1896
2415
  const badge = getStatusBadge(assignment.status);
1897
2416
  const isCurrent = currentAssignment?.id === assignment.id;
1898
2417
  const priorityColor = assignment.testCase.priority === "P0" ? colors.red : assignment.testCase.priority === "P1" ? colors.orange : colors.textDim;
1899
- return /* @__PURE__ */ jsxs3(
2418
+ return /* @__PURE__ */ jsxs4(
1900
2419
  "button",
1901
2420
  {
1902
2421
  type: "button",
@@ -1918,9 +2437,9 @@ function TestListScreen({ nav }) {
1918
2437
  textAlign: "left"
1919
2438
  },
1920
2439
  children: [
1921
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
1922
- /* @__PURE__ */ jsxs3("div", { style: { flex: 1, minWidth: 0 }, children: [
1923
- /* @__PURE__ */ jsx4(
2440
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
2441
+ /* @__PURE__ */ jsxs4("div", { style: { flex: 1, minWidth: 0 }, children: [
2442
+ /* @__PURE__ */ jsx5(
1924
2443
  "div",
1925
2444
  {
1926
2445
  style: {
@@ -1934,9 +2453,9 @@ function TestListScreen({ nav }) {
1934
2453
  children: assignment.testCase.title
1935
2454
  }
1936
2455
  ),
1937
- /* @__PURE__ */ jsxs3("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
1938
- assignment.isVerification && /* @__PURE__ */ jsxs3(Fragment2, { children: [
1939
- /* @__PURE__ */ jsx4(
2456
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
2457
+ assignment.isVerification && /* @__PURE__ */ jsxs4(Fragment2, { children: [
2458
+ /* @__PURE__ */ jsx5(
1940
2459
  "span",
1941
2460
  {
1942
2461
  style: {
@@ -1951,9 +2470,9 @@ function TestListScreen({ nav }) {
1951
2470
  children: "Retest"
1952
2471
  }
1953
2472
  ),
1954
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
2473
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
1955
2474
  ] }),
1956
- /* @__PURE__ */ jsx4(
2475
+ /* @__PURE__ */ jsx5(
1957
2476
  "span",
1958
2477
  {
1959
2478
  style: {
@@ -1964,8 +2483,8 @@ function TestListScreen({ nav }) {
1964
2483
  children: assignment.testCase.testKey
1965
2484
  }
1966
2485
  ),
1967
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
1968
- /* @__PURE__ */ jsx4(
2486
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2487
+ /* @__PURE__ */ jsx5(
1969
2488
  "span",
1970
2489
  {
1971
2490
  style: {
@@ -1976,9 +2495,9 @@ function TestListScreen({ nav }) {
1976
2495
  children: assignment.testCase.priority
1977
2496
  }
1978
2497
  ),
1979
- assignment.testCase.role && /* @__PURE__ */ jsxs3(Fragment2, { children: [
1980
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
1981
- /* @__PURE__ */ jsxs3("span", { style: {
2498
+ assignment.testCase.role && /* @__PURE__ */ jsxs4(Fragment2, { children: [
2499
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2500
+ /* @__PURE__ */ jsxs4("span", { style: {
1982
2501
  display: "inline-flex",
1983
2502
  alignItems: "center",
1984
2503
  gap: 3,
@@ -1986,7 +2505,7 @@ function TestListScreen({ nav }) {
1986
2505
  color: assignment.testCase.role.color,
1987
2506
  fontWeight: 500
1988
2507
  }, children: [
1989
- /* @__PURE__ */ jsx4("span", { style: {
2508
+ /* @__PURE__ */ jsx5("span", { style: {
1990
2509
  width: 5,
1991
2510
  height: 5,
1992
2511
  borderRadius: 3,
@@ -1997,7 +2516,7 @@ function TestListScreen({ nav }) {
1997
2516
  ] })
1998
2517
  ] })
1999
2518
  ] }),
2000
- /* @__PURE__ */ jsx4(
2519
+ /* @__PURE__ */ jsx5(
2001
2520
  "span",
2002
2521
  {
2003
2522
  style: {
@@ -2024,7 +2543,7 @@ function TestListScreen({ nav }) {
2024
2543
  groupedAssignments.every((folder) => {
2025
2544
  const filtered = folder.assignments.filter(filterAssignment);
2026
2545
  return filtered.length === 0;
2027
- }) && /* @__PURE__ */ jsxs3(
2546
+ }) && /* @__PURE__ */ jsxs4(
2028
2547
  "div",
2029
2548
  {
2030
2549
  style: {
@@ -2034,12 +2553,32 @@ function TestListScreen({ nav }) {
2034
2553
  padding: 32
2035
2554
  },
2036
2555
  children: [
2037
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
2038
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 14, color: colors.textMuted }, children: filter === "pending" ? "All tests completed!" : filter === "done" ? "No passed tests yet" : filter === "reopened" ? "No reopened issues" : "No tests assigned" })
2556
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
2557
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 14, color: colors.textMuted }, children: filter === "pending" ? "All tests completed!" : filter === "done" ? "No passed tests yet" : filter === "reopened" ? "No reopened issues" : "No tests assigned" })
2039
2558
  ]
2040
2559
  }
2041
2560
  ),
2042
- /* @__PURE__ */ jsx4("div", { style: { display: "flex", justifyContent: "center", paddingTop: 12, paddingBottom: 8 }, children: /* @__PURE__ */ jsx4(
2561
+ dashboardUrl && /* @__PURE__ */ jsx5(
2562
+ "a",
2563
+ {
2564
+ href: `${dashboardUrl}/test-cases`,
2565
+ target: "_blank",
2566
+ rel: "noopener noreferrer",
2567
+ style: {
2568
+ display: "flex",
2569
+ alignItems: "center",
2570
+ justifyContent: "center",
2571
+ gap: 6,
2572
+ paddingTop: 12,
2573
+ fontSize: 13,
2574
+ fontWeight: 500,
2575
+ color: colors.blue,
2576
+ textDecoration: "none"
2577
+ },
2578
+ children: "\u{1F310} Manage on Dashboard \u2192"
2579
+ }
2580
+ ),
2581
+ /* @__PURE__ */ jsx5("div", { style: { display: "flex", justifyContent: "center", paddingTop: 8, paddingBottom: 8 }, children: /* @__PURE__ */ jsx5(
2043
2582
  "button",
2044
2583
  {
2045
2584
  type: "button",
@@ -2135,13 +2674,13 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
2135
2674
  }
2136
2675
 
2137
2676
  // src/widget/ImagePreviewStrip.tsx
2138
- import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
2677
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2139
2678
  function ImagePreviewStrip({ images, onRemove }) {
2140
2679
  if (images.length === 0) return null;
2141
- return /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
2142
- images.map((img) => /* @__PURE__ */ jsxs4("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
2143
- /* @__PURE__ */ jsx5("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
2144
- img.status === "uploading" && /* @__PURE__ */ jsx5("div", { style: {
2680
+ return /* @__PURE__ */ jsxs5("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
2681
+ images.map((img) => /* @__PURE__ */ jsxs5("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
2682
+ /* @__PURE__ */ jsx6("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
2683
+ img.status === "uploading" && /* @__PURE__ */ jsx6("div", { style: {
2145
2684
  position: "absolute",
2146
2685
  inset: 0,
2147
2686
  backgroundColor: "rgba(0,0,0,0.5)",
@@ -2149,7 +2688,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2149
2688
  alignItems: "center",
2150
2689
  justifyContent: "center",
2151
2690
  borderRadius: 8
2152
- }, children: /* @__PURE__ */ jsx5("div", { style: {
2691
+ }, children: /* @__PURE__ */ jsx6("div", { style: {
2153
2692
  width: 16,
2154
2693
  height: 16,
2155
2694
  border: "2px solid #fff",
@@ -2157,7 +2696,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2157
2696
  borderRadius: "50%",
2158
2697
  animation: "bb-spin 0.6s linear infinite"
2159
2698
  } }) }),
2160
- img.status === "error" && /* @__PURE__ */ jsx5("div", { style: {
2699
+ img.status === "error" && /* @__PURE__ */ jsx6("div", { style: {
2161
2700
  position: "absolute",
2162
2701
  inset: 0,
2163
2702
  backgroundColor: "rgba(127,29,29,0.7)",
@@ -2165,8 +2704,8 @@ function ImagePreviewStrip({ images, onRemove }) {
2165
2704
  alignItems: "center",
2166
2705
  justifyContent: "center",
2167
2706
  borderRadius: 8
2168
- }, children: /* @__PURE__ */ jsx5("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2169
- /* @__PURE__ */ jsx5(
2707
+ }, children: /* @__PURE__ */ jsx6("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2708
+ /* @__PURE__ */ jsx6(
2170
2709
  "button",
2171
2710
  {
2172
2711
  type: "button",
@@ -2193,18 +2732,18 @@ function ImagePreviewStrip({ images, onRemove }) {
2193
2732
  }
2194
2733
  )
2195
2734
  ] }, img.id)),
2196
- /* @__PURE__ */ jsx5("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2735
+ /* @__PURE__ */ jsx6("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2197
2736
  ] });
2198
2737
  }
2199
2738
 
2200
2739
  // src/widget/ImagePickerButtons.tsx
2201
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2740
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2202
2741
  function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, onRemove, label }) {
2203
2742
  const disabled = images.length >= maxImages;
2204
- return /* @__PURE__ */ jsxs5("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
2205
- label && /* @__PURE__ */ jsx6("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
2206
- /* @__PURE__ */ jsxs5("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
2207
- /* @__PURE__ */ jsx6(
2743
+ return /* @__PURE__ */ jsxs6("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
2744
+ label && /* @__PURE__ */ jsx7("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
2745
+ /* @__PURE__ */ jsxs6("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
2746
+ /* @__PURE__ */ jsx7(
2208
2747
  "button",
2209
2748
  {
2210
2749
  type: "button",
@@ -2225,7 +2764,7 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2225
2764
  children: "Gallery"
2226
2765
  }
2227
2766
  ),
2228
- /* @__PURE__ */ jsx6(
2767
+ /* @__PURE__ */ jsx7(
2229
2768
  "button",
2230
2769
  {
2231
2770
  type: "button",
@@ -2246,18 +2785,18 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2246
2785
  children: "Camera"
2247
2786
  }
2248
2787
  ),
2249
- /* @__PURE__ */ jsxs5("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2788
+ /* @__PURE__ */ jsxs6("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2250
2789
  images.length,
2251
2790
  "/",
2252
2791
  maxImages
2253
2792
  ] })
2254
2793
  ] }),
2255
- /* @__PURE__ */ jsx6(ImagePreviewStrip, { images, onRemove })
2794
+ /* @__PURE__ */ jsx7(ImagePreviewStrip, { images, onRemove })
2256
2795
  ] });
2257
2796
  }
2258
2797
 
2259
2798
  // src/widget/screens/TestFeedbackScreen.tsx
2260
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2799
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
2261
2800
  function TestFeedbackScreen({ status, assignmentId, nav }) {
2262
2801
  const { client, assignments, refreshAssignments, uploadImage } = useBugBear();
2263
2802
  const images = useImageAttachments(uploadImage, 3, "screenshots");
@@ -2326,10 +2865,10 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2326
2865
  { key: "stepsUnclear", label: "Steps are unclear" },
2327
2866
  { key: "expectedResultUnclear", label: "Expected result unclear" }
2328
2867
  ];
2329
- return /* @__PURE__ */ jsxs6("div", { style: styles.container, children: [
2330
- /* @__PURE__ */ jsx7("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2331
- /* @__PURE__ */ jsx7("div", { style: styles.subheader, children: "Rate this test case" }),
2332
- /* @__PURE__ */ jsx7("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx7(
2868
+ return /* @__PURE__ */ jsxs7("div", { style: styles.container, children: [
2869
+ /* @__PURE__ */ jsx8("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2870
+ /* @__PURE__ */ jsx8("div", { style: styles.subheader, children: "Rate this test case" }),
2871
+ /* @__PURE__ */ jsx8("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx8(
2333
2872
  "button",
2334
2873
  {
2335
2874
  onClick: () => setRating(n),
@@ -2341,9 +2880,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2341
2880
  },
2342
2881
  n
2343
2882
  )) }),
2344
- showFlags && /* @__PURE__ */ jsxs6("div", { style: styles.flagsSection, children: [
2345
- /* @__PURE__ */ jsx7("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2346
- flagOptions.map(({ key, label }) => /* @__PURE__ */ jsxs6(
2883
+ showFlags && /* @__PURE__ */ jsxs7("div", { style: styles.flagsSection, children: [
2884
+ /* @__PURE__ */ jsx8("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2885
+ flagOptions.map(({ key, label }) => /* @__PURE__ */ jsxs7(
2347
2886
  "button",
2348
2887
  {
2349
2888
  onClick: () => toggleFlag(key),
@@ -2352,17 +2891,17 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2352
2891
  ...flags[key] ? styles.flagItemActive : {}
2353
2892
  },
2354
2893
  children: [
2355
- /* @__PURE__ */ jsx7(
2894
+ /* @__PURE__ */ jsx8(
2356
2895
  "div",
2357
2896
  {
2358
2897
  style: {
2359
2898
  ...styles.flagCheck,
2360
2899
  ...flags[key] ? styles.flagCheckActive : {}
2361
2900
  },
2362
- children: flags[key] && /* @__PURE__ */ jsx7("span", { style: styles.flagCheckmark, children: "\u2713" })
2901
+ children: flags[key] && /* @__PURE__ */ jsx8("span", { style: styles.flagCheckmark, children: "\u2713" })
2363
2902
  }
2364
2903
  ),
2365
- /* @__PURE__ */ jsx7(
2904
+ /* @__PURE__ */ jsx8(
2366
2905
  "span",
2367
2906
  {
2368
2907
  style: {
@@ -2377,7 +2916,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2377
2916
  key
2378
2917
  ))
2379
2918
  ] }),
2380
- /* @__PURE__ */ jsx7(
2919
+ /* @__PURE__ */ jsx8(
2381
2920
  "textarea",
2382
2921
  {
2383
2922
  style: styles.noteInput,
@@ -2387,7 +2926,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2387
2926
  rows: 3
2388
2927
  }
2389
2928
  ),
2390
- /* @__PURE__ */ jsx7(
2929
+ /* @__PURE__ */ jsx8(
2391
2930
  ImagePickerButtons,
2392
2931
  {
2393
2932
  images: images.images,
@@ -2398,9 +2937,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2398
2937
  label: "Screenshots (optional)"
2399
2938
  }
2400
2939
  ),
2401
- /* @__PURE__ */ jsxs6("div", { style: styles.actions, children: [
2402
- /* @__PURE__ */ jsx7("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2403
- /* @__PURE__ */ jsx7(
2940
+ /* @__PURE__ */ jsxs7("div", { style: styles.actions, children: [
2941
+ /* @__PURE__ */ jsx8("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2942
+ /* @__PURE__ */ jsx8(
2404
2943
  "button",
2405
2944
  {
2406
2945
  style: {
@@ -2553,7 +3092,7 @@ var styles = {
2553
3092
  import React6, { useState as useState6, useRef as useRef2 } from "react";
2554
3093
 
2555
3094
  // src/widget/CategoryDropdown.tsx
2556
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
3095
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
2557
3096
  var categoryOptions = [
2558
3097
  { value: "ui_ux", label: "UI/UX", icon: "\u{1F3A8}" },
2559
3098
  { value: "functional", label: "Functional", icon: "\u2699\uFE0F" },
@@ -2562,7 +3101,7 @@ var categoryOptions = [
2562
3101
  { value: "other", label: "Other", icon: "\u{1F4DD}" }
2563
3102
  ];
2564
3103
  function CategoryDropdown({ value, onChange, optional = true, disabled = false }) {
2565
- return /* @__PURE__ */ jsxs7(
3104
+ return /* @__PURE__ */ jsxs8(
2566
3105
  "select",
2567
3106
  {
2568
3107
  value: value || "",
@@ -2585,8 +3124,8 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2585
3124
  paddingRight: 32
2586
3125
  },
2587
3126
  children: [
2588
- /* @__PURE__ */ jsx8("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
2589
- categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ jsxs7("option", { value: value2, children: [
3127
+ /* @__PURE__ */ jsx9("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
3128
+ categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ jsxs8("option", { value: value2, children: [
2590
3129
  icon,
2591
3130
  " ",
2592
3131
  label
@@ -2597,7 +3136,7 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2597
3136
  }
2598
3137
 
2599
3138
  // src/widget/screens/ReportScreen.tsx
2600
- import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
3139
+ import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
2601
3140
  function ReportScreen({ nav, prefill }) {
2602
3141
  const { client, refreshAssignments, uploadImage } = useBugBear();
2603
3142
  const images = useImageAttachments(uploadImage, 5, "screenshots");
@@ -2672,17 +3211,17 @@ function ReportScreen({ nav, prefill }) {
2672
3211
  { sev: "medium", color: "#eab308" },
2673
3212
  { sev: "low", color: "#6b7280" }
2674
3213
  ];
2675
- return /* @__PURE__ */ jsx9("div", { children: isRetestFailure ? /* @__PURE__ */ jsxs8(Fragment3, { children: [
2676
- /* @__PURE__ */ jsxs8("div", { style: styles2.retestBanner, children: [
2677
- /* @__PURE__ */ jsx9("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
2678
- /* @__PURE__ */ jsxs8("div", { children: [
2679
- /* @__PURE__ */ jsx9("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
2680
- /* @__PURE__ */ jsx9("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
3214
+ return /* @__PURE__ */ jsx10("div", { children: isRetestFailure ? /* @__PURE__ */ jsxs9(Fragment3, { children: [
3215
+ /* @__PURE__ */ jsxs9("div", { style: styles2.retestBanner, children: [
3216
+ /* @__PURE__ */ jsx10("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
3217
+ /* @__PURE__ */ jsxs9("div", { children: [
3218
+ /* @__PURE__ */ jsx10("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
3219
+ /* @__PURE__ */ jsx10("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
2681
3220
  ] })
2682
3221
  ] }),
2683
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2684
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Severity" }),
2685
- /* @__PURE__ */ jsx9("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx9(
3222
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3223
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Severity" }),
3224
+ /* @__PURE__ */ jsx10("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx10(
2686
3225
  "button",
2687
3226
  {
2688
3227
  onClick: () => setSeverity(sev),
@@ -2690,18 +3229,18 @@ function ReportScreen({ nav, prefill }) {
2690
3229
  ...styles2.sevButton,
2691
3230
  ...severity === sev ? { backgroundColor: `${color}30`, borderColor: color } : {}
2692
3231
  },
2693
- children: /* @__PURE__ */ jsx9("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
3232
+ children: /* @__PURE__ */ jsx10("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
2694
3233
  },
2695
3234
  sev
2696
3235
  )) })
2697
3236
  ] }),
2698
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2699
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Category (optional)" }),
2700
- /* @__PURE__ */ jsx9(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
3237
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3238
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Category (optional)" }),
3239
+ /* @__PURE__ */ jsx10(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2701
3240
  ] }),
2702
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2703
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "What went wrong?" }),
2704
- /* @__PURE__ */ jsx9(
3241
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3242
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "What went wrong?" }),
3243
+ /* @__PURE__ */ jsx10(
2705
3244
  "textarea",
2706
3245
  {
2707
3246
  style: styles2.descInput,
@@ -2712,7 +3251,7 @@ function ReportScreen({ nav, prefill }) {
2712
3251
  }
2713
3252
  )
2714
3253
  ] }),
2715
- /* @__PURE__ */ jsx9(
3254
+ /* @__PURE__ */ jsx10(
2716
3255
  ImagePickerButtons,
2717
3256
  {
2718
3257
  images: images.images,
@@ -2723,8 +3262,8 @@ function ReportScreen({ nav, prefill }) {
2723
3262
  label: "Attachments (optional)"
2724
3263
  }
2725
3264
  ),
2726
- error && /* @__PURE__ */ jsx9("div", { style: styles2.errorBanner, children: error }),
2727
- /* @__PURE__ */ jsx9(
3265
+ error && /* @__PURE__ */ jsx10("div", { style: styles2.errorBanner, children: error }),
3266
+ /* @__PURE__ */ jsx10(
2728
3267
  "button",
2729
3268
  {
2730
3269
  style: {
@@ -2737,9 +3276,9 @@ function ReportScreen({ nav, prefill }) {
2737
3276
  children: images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest"
2738
3277
  }
2739
3278
  )
2740
- ] }) : /* @__PURE__ */ jsxs8(Fragment3, { children: [
2741
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "What are you reporting?" }),
2742
- /* @__PURE__ */ jsx9("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ jsxs8(
3279
+ ] }) : /* @__PURE__ */ jsxs9(Fragment3, { children: [
3280
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "What are you reporting?" }),
3281
+ /* @__PURE__ */ jsx10("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ jsxs9(
2743
3282
  "button",
2744
3283
  {
2745
3284
  onClick: () => setReportType(type),
@@ -2748,8 +3287,8 @@ function ReportScreen({ nav, prefill }) {
2748
3287
  ...reportType === type ? styles2.typeCardActive : {}
2749
3288
  },
2750
3289
  children: [
2751
- /* @__PURE__ */ jsx9("div", { style: styles2.typeIcon, children: icon }),
2752
- /* @__PURE__ */ jsx9(
3290
+ /* @__PURE__ */ jsx10("div", { style: styles2.typeIcon, children: icon }),
3291
+ /* @__PURE__ */ jsx10(
2753
3292
  "div",
2754
3293
  {
2755
3294
  style: {
@@ -2763,9 +3302,9 @@ function ReportScreen({ nav, prefill }) {
2763
3302
  },
2764
3303
  type
2765
3304
  )) }),
2766
- isBugType && /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2767
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Severity" }),
2768
- /* @__PURE__ */ jsx9("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx9(
3305
+ isBugType && /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3306
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Severity" }),
3307
+ /* @__PURE__ */ jsx10("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx10(
2769
3308
  "button",
2770
3309
  {
2771
3310
  onClick: () => setSeverity(sev),
@@ -2776,7 +3315,7 @@ function ReportScreen({ nav, prefill }) {
2776
3315
  borderColor: color
2777
3316
  } : {}
2778
3317
  },
2779
- children: /* @__PURE__ */ jsx9(
3318
+ children: /* @__PURE__ */ jsx10(
2780
3319
  "span",
2781
3320
  {
2782
3321
  style: {
@@ -2790,13 +3329,13 @@ function ReportScreen({ nav, prefill }) {
2790
3329
  sev
2791
3330
  )) })
2792
3331
  ] }),
2793
- isBugType && /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2794
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Category (optional)" }),
2795
- /* @__PURE__ */ jsx9(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
3332
+ isBugType && /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3333
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Category (optional)" }),
3334
+ /* @__PURE__ */ jsx10(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2796
3335
  ] }),
2797
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2798
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "What happened?" }),
2799
- /* @__PURE__ */ jsx9(
3336
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3337
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "What happened?" }),
3338
+ /* @__PURE__ */ jsx10(
2800
3339
  "textarea",
2801
3340
  {
2802
3341
  style: styles2.descInput,
@@ -2807,9 +3346,9 @@ function ReportScreen({ nav, prefill }) {
2807
3346
  }
2808
3347
  )
2809
3348
  ] }),
2810
- isBugType && /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2811
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Where did it happen?" }),
2812
- /* @__PURE__ */ jsx9(
3349
+ isBugType && /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3350
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Where did it happen?" }),
3351
+ /* @__PURE__ */ jsx10(
2813
3352
  "input",
2814
3353
  {
2815
3354
  style: styles2.routeInput,
@@ -2818,13 +3357,13 @@ function ReportScreen({ nav, prefill }) {
2818
3357
  placeholder: observedRoute.current
2819
3358
  }
2820
3359
  ),
2821
- /* @__PURE__ */ jsxs8("div", { style: styles2.routeHint, children: [
3360
+ /* @__PURE__ */ jsxs9("div", { style: styles2.routeHint, children: [
2822
3361
  "Leave blank to use current page (",
2823
3362
  observedRoute.current,
2824
3363
  ")"
2825
3364
  ] })
2826
3365
  ] }),
2827
- /* @__PURE__ */ jsx9(
3366
+ /* @__PURE__ */ jsx10(
2828
3367
  ImagePickerButtons,
2829
3368
  {
2830
3369
  images: images.images,
@@ -2835,8 +3374,8 @@ function ReportScreen({ nav, prefill }) {
2835
3374
  label: "Screenshots (optional)"
2836
3375
  }
2837
3376
  ),
2838
- error && /* @__PURE__ */ jsx9("div", { style: styles2.errorBanner, children: error }),
2839
- /* @__PURE__ */ jsx9(
3377
+ error && /* @__PURE__ */ jsx10("div", { style: styles2.errorBanner, children: error }),
3378
+ /* @__PURE__ */ jsx10(
2840
3379
  "button",
2841
3380
  {
2842
3381
  style: {
@@ -3001,16 +3540,16 @@ var styles2 = {
3001
3540
 
3002
3541
  // src/widget/screens/ReportSuccessScreen.tsx
3003
3542
  import { useEffect as useEffect4 } from "react";
3004
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
3543
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
3005
3544
  function ReportSuccessScreen({ nav }) {
3006
3545
  useEffect4(() => {
3007
3546
  const timer = setTimeout(() => nav.reset(), 2e3);
3008
3547
  return () => clearTimeout(timer);
3009
3548
  }, [nav]);
3010
- return /* @__PURE__ */ jsxs9("div", { style: styles3.container, children: [
3011
- /* @__PURE__ */ jsx10("div", { style: styles3.emoji, children: "\u{1F389}" }),
3012
- /* @__PURE__ */ jsx10("div", { style: styles3.title, children: "Report submitted!" }),
3013
- /* @__PURE__ */ jsx10("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3549
+ return /* @__PURE__ */ jsxs10("div", { style: styles3.container, children: [
3550
+ /* @__PURE__ */ jsx11("div", { style: styles3.emoji, children: "\u{1F389}" }),
3551
+ /* @__PURE__ */ jsx11("div", { style: styles3.title, children: "Report submitted!" }),
3552
+ /* @__PURE__ */ jsx11("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3014
3553
  ] });
3015
3554
  }
3016
3555
  var styles3 = {
@@ -3039,11 +3578,12 @@ var styles3 = {
3039
3578
  };
3040
3579
 
3041
3580
  // src/widget/screens/MessageListScreen.tsx
3042
- import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
3581
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
3043
3582
  function MessageListScreen({ nav }) {
3044
- const { threads, unreadCount, refreshThreads } = useBugBear();
3045
- return /* @__PURE__ */ jsxs10("div", { children: [
3046
- /* @__PURE__ */ jsx11(
3583
+ const { threads, unreadCount, refreshThreads, dashboardUrl, isLoading } = useBugBear();
3584
+ if (isLoading) return /* @__PURE__ */ jsx12(MessageListScreenSkeleton, {});
3585
+ return /* @__PURE__ */ jsxs11("div", { children: [
3586
+ /* @__PURE__ */ jsx12(
3047
3587
  "button",
3048
3588
  {
3049
3589
  style: {
@@ -3062,7 +3602,7 @@ function MessageListScreen({ nav }) {
3062
3602
  children: "\u2709\uFE0F New Message"
3063
3603
  }
3064
3604
  ),
3065
- threads.length === 0 ? /* @__PURE__ */ jsxs10(
3605
+ threads.length === 0 ? /* @__PURE__ */ jsxs11(
3066
3606
  "div",
3067
3607
  {
3068
3608
  style: {
@@ -3073,8 +3613,8 @@ function MessageListScreen({ nav }) {
3073
3613
  paddingBottom: 40
3074
3614
  },
3075
3615
  children: [
3076
- /* @__PURE__ */ jsx11("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3077
- /* @__PURE__ */ jsx11(
3616
+ /* @__PURE__ */ jsx12("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3617
+ /* @__PURE__ */ jsx12(
3078
3618
  "span",
3079
3619
  {
3080
3620
  style: {
@@ -3086,7 +3626,7 @@ function MessageListScreen({ nav }) {
3086
3626
  children: "No messages yet"
3087
3627
  }
3088
3628
  ),
3089
- /* @__PURE__ */ jsx11(
3629
+ /* @__PURE__ */ jsx12(
3090
3630
  "span",
3091
3631
  {
3092
3632
  style: {
@@ -3099,7 +3639,7 @@ function MessageListScreen({ nav }) {
3099
3639
  )
3100
3640
  ]
3101
3641
  }
3102
- ) : /* @__PURE__ */ jsx11("div", { children: threads.map((thread) => /* @__PURE__ */ jsxs10(
3642
+ ) : /* @__PURE__ */ jsx12("div", { children: threads.map((thread) => /* @__PURE__ */ jsxs11(
3103
3643
  "button",
3104
3644
  {
3105
3645
  style: {
@@ -3117,8 +3657,8 @@ function MessageListScreen({ nav }) {
3117
3657
  },
3118
3658
  onClick: () => nav.push({ name: "THREAD_DETAIL", thread }),
3119
3659
  children: [
3120
- /* @__PURE__ */ jsxs10("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3121
- /* @__PURE__ */ jsx11(
3660
+ /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3661
+ /* @__PURE__ */ jsx12(
3122
3662
  "span",
3123
3663
  {
3124
3664
  style: {
@@ -3130,7 +3670,7 @@ function MessageListScreen({ nav }) {
3130
3670
  children: getThreadTypeIcon(thread.threadType)
3131
3671
  }
3132
3672
  ),
3133
- /* @__PURE__ */ jsxs10(
3673
+ /* @__PURE__ */ jsxs11(
3134
3674
  "div",
3135
3675
  {
3136
3676
  style: {
@@ -3138,7 +3678,7 @@ function MessageListScreen({ nav }) {
3138
3678
  minWidth: 0
3139
3679
  },
3140
3680
  children: [
3141
- /* @__PURE__ */ jsxs10(
3681
+ /* @__PURE__ */ jsxs11(
3142
3682
  "div",
3143
3683
  {
3144
3684
  style: {
@@ -3147,8 +3687,8 @@ function MessageListScreen({ nav }) {
3147
3687
  gap: 4
3148
3688
  },
3149
3689
  children: [
3150
- thread.isPinned && /* @__PURE__ */ jsx11("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3151
- /* @__PURE__ */ jsx11(
3690
+ thread.isPinned && /* @__PURE__ */ jsx12("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3691
+ /* @__PURE__ */ jsx12(
3152
3692
  "span",
3153
3693
  {
3154
3694
  style: {
@@ -3165,7 +3705,7 @@ function MessageListScreen({ nav }) {
3165
3705
  ]
3166
3706
  }
3167
3707
  ),
3168
- thread.lastMessage && /* @__PURE__ */ jsxs10(
3708
+ thread.lastMessage && /* @__PURE__ */ jsxs11(
3169
3709
  "span",
3170
3710
  {
3171
3711
  style: {
@@ -3189,7 +3729,7 @@ function MessageListScreen({ nav }) {
3189
3729
  }
3190
3730
  )
3191
3731
  ] }),
3192
- /* @__PURE__ */ jsxs10(
3732
+ /* @__PURE__ */ jsxs11(
3193
3733
  "div",
3194
3734
  {
3195
3735
  style: {
@@ -3201,8 +3741,8 @@ function MessageListScreen({ nav }) {
3201
3741
  flexShrink: 0
3202
3742
  },
3203
3743
  children: [
3204
- /* @__PURE__ */ jsx11("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3205
- thread.unreadCount > 0 && /* @__PURE__ */ jsx11(
3744
+ /* @__PURE__ */ jsx12("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3745
+ thread.unreadCount > 0 && /* @__PURE__ */ jsx12(
3206
3746
  "span",
3207
3747
  {
3208
3748
  style: {
@@ -3229,19 +3769,39 @@ function MessageListScreen({ nav }) {
3229
3769
  },
3230
3770
  thread.id
3231
3771
  )) }),
3232
- /* @__PURE__ */ jsxs10(
3772
+ dashboardUrl && /* @__PURE__ */ jsx12(
3773
+ "a",
3774
+ {
3775
+ href: `${dashboardUrl}/discussions`,
3776
+ target: "_blank",
3777
+ rel: "noopener noreferrer",
3778
+ style: {
3779
+ display: "flex",
3780
+ alignItems: "center",
3781
+ justifyContent: "center",
3782
+ gap: 6,
3783
+ paddingTop: 12,
3784
+ fontSize: 13,
3785
+ fontWeight: 500,
3786
+ color: colors.blue,
3787
+ textDecoration: "none"
3788
+ },
3789
+ children: "\u{1F310} View on Dashboard \u2192"
3790
+ }
3791
+ ),
3792
+ /* @__PURE__ */ jsxs11(
3233
3793
  "div",
3234
3794
  {
3235
3795
  style: {
3236
3796
  display: "flex",
3237
3797
  justifyContent: "space-between",
3238
3798
  alignItems: "center",
3239
- paddingTop: 12,
3799
+ paddingTop: 8,
3240
3800
  paddingLeft: 4,
3241
3801
  paddingRight: 4
3242
3802
  },
3243
3803
  children: [
3244
- /* @__PURE__ */ jsxs10("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3804
+ /* @__PURE__ */ jsxs11("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3245
3805
  threads.length,
3246
3806
  " thread",
3247
3807
  threads.length !== 1 ? "s" : "",
@@ -3250,7 +3810,7 @@ function MessageListScreen({ nav }) {
3250
3810
  unreadCount,
3251
3811
  " unread"
3252
3812
  ] }),
3253
- /* @__PURE__ */ jsx11(
3813
+ /* @__PURE__ */ jsx12(
3254
3814
  "button",
3255
3815
  {
3256
3816
  style: {
@@ -3273,7 +3833,7 @@ function MessageListScreen({ nav }) {
3273
3833
 
3274
3834
  // src/widget/screens/ThreadDetailScreen.tsx
3275
3835
  import { useState as useState7, useEffect as useEffect5 } from "react";
3276
- import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
3836
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
3277
3837
  var inputStyle = {
3278
3838
  backgroundColor: "#27272a",
3279
3839
  border: "1px solid #3f3f46",
@@ -3345,8 +3905,8 @@ function ThreadDetailScreen({
3345
3905
  handleSend();
3346
3906
  }
3347
3907
  };
3348
- return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3349
- /* @__PURE__ */ jsxs11(
3908
+ return /* @__PURE__ */ jsxs12("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3909
+ /* @__PURE__ */ jsxs12(
3350
3910
  "div",
3351
3911
  {
3352
3912
  style: {
@@ -3358,8 +3918,8 @@ function ThreadDetailScreen({
3358
3918
  borderBottom: `1px solid ${colors.border}`
3359
3919
  },
3360
3920
  children: [
3361
- /* @__PURE__ */ jsx12("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3362
- /* @__PURE__ */ jsx12(
3921
+ /* @__PURE__ */ jsx13("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3922
+ /* @__PURE__ */ jsx13(
3363
3923
  "span",
3364
3924
  {
3365
3925
  style: {
@@ -3379,7 +3939,7 @@ function ThreadDetailScreen({
3379
3939
  ]
3380
3940
  }
3381
3941
  ),
3382
- loading ? /* @__PURE__ */ jsx12(
3942
+ loading ? /* @__PURE__ */ jsx13(
3383
3943
  "div",
3384
3944
  {
3385
3945
  style: {
@@ -3387,11 +3947,11 @@ function ThreadDetailScreen({
3387
3947
  paddingBottom: 40,
3388
3948
  textAlign: "center"
3389
3949
  },
3390
- children: /* @__PURE__ */ jsx12("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3950
+ children: /* @__PURE__ */ jsx13("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3391
3951
  }
3392
- ) : /* @__PURE__ */ jsx12("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3952
+ ) : /* @__PURE__ */ jsx13("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3393
3953
  const isTester = msg.senderType === "tester";
3394
- return /* @__PURE__ */ jsxs11(
3954
+ return /* @__PURE__ */ jsxs12(
3395
3955
  "div",
3396
3956
  {
3397
3957
  style: {
@@ -3407,7 +3967,7 @@ function ThreadDetailScreen({
3407
3967
  borderBottomRightRadius: isTester ? 4 : 16
3408
3968
  },
3409
3969
  children: [
3410
- /* @__PURE__ */ jsx12(
3970
+ /* @__PURE__ */ jsx13(
3411
3971
  "span",
3412
3972
  {
3413
3973
  style: {
@@ -3420,7 +3980,7 @@ function ThreadDetailScreen({
3420
3980
  children: isTester ? "You" : msg.senderName
3421
3981
  }
3422
3982
  ),
3423
- /* @__PURE__ */ jsx12(
3983
+ /* @__PURE__ */ jsx13(
3424
3984
  "span",
3425
3985
  {
3426
3986
  style: {
@@ -3434,7 +3994,7 @@ function ThreadDetailScreen({
3434
3994
  children: msg.content
3435
3995
  }
3436
3996
  ),
3437
- msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ jsx12("div", { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 6 }, children: msg.attachments.filter((a) => a.type === "image" && typeof a.url === "string" && /^https?:\/\//i.test(a.url)).map((att, idx) => /* @__PURE__ */ jsx12(
3997
+ msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ jsx13("div", { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 6 }, children: msg.attachments.filter((a) => a.type === "image" && typeof a.url === "string" && /^https?:\/\//i.test(a.url)).map((att, idx) => /* @__PURE__ */ jsx13(
3438
3998
  "img",
3439
3999
  {
3440
4000
  src: att.url,
@@ -3443,7 +4003,7 @@ function ThreadDetailScreen({
3443
4003
  },
3444
4004
  idx
3445
4005
  )) }),
3446
- /* @__PURE__ */ jsx12(
4006
+ /* @__PURE__ */ jsx13(
3447
4007
  "span",
3448
4008
  {
3449
4009
  style: {
@@ -3461,7 +4021,7 @@ function ThreadDetailScreen({
3461
4021
  msg.id
3462
4022
  );
3463
4023
  }) }),
3464
- sendError && /* @__PURE__ */ jsx12(
4024
+ sendError && /* @__PURE__ */ jsx13(
3465
4025
  "div",
3466
4026
  {
3467
4027
  style: {
@@ -3473,7 +4033,7 @@ function ThreadDetailScreen({
3473
4033
  borderRadius: 8,
3474
4034
  marginBottom: 8
3475
4035
  },
3476
- children: /* @__PURE__ */ jsx12(
4036
+ children: /* @__PURE__ */ jsx13(
3477
4037
  "span",
3478
4038
  {
3479
4039
  style: {
@@ -3487,8 +4047,8 @@ function ThreadDetailScreen({
3487
4047
  )
3488
4048
  }
3489
4049
  ),
3490
- replyImages.images.length > 0 && /* @__PURE__ */ jsx12("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ jsx12(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
3491
- /* @__PURE__ */ jsxs11(
4050
+ replyImages.images.length > 0 && /* @__PURE__ */ jsx13("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ jsx13(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
4051
+ /* @__PURE__ */ jsxs12(
3492
4052
  "div",
3493
4053
  {
3494
4054
  style: {
@@ -3499,7 +4059,7 @@ function ThreadDetailScreen({
3499
4059
  gap: 8
3500
4060
  },
3501
4061
  children: [
3502
- /* @__PURE__ */ jsx12(
4062
+ /* @__PURE__ */ jsx13(
3503
4063
  "button",
3504
4064
  {
3505
4065
  type: "button",
@@ -3518,7 +4078,7 @@ function ThreadDetailScreen({
3518
4078
  children: "\u{1F4CE}"
3519
4079
  }
3520
4080
  ),
3521
- /* @__PURE__ */ jsx12(
4081
+ /* @__PURE__ */ jsx13(
3522
4082
  "input",
3523
4083
  {
3524
4084
  type: "text",
@@ -3534,7 +4094,7 @@ function ThreadDetailScreen({
3534
4094
  }
3535
4095
  }
3536
4096
  ),
3537
- /* @__PURE__ */ jsx12(
4097
+ /* @__PURE__ */ jsx13(
3538
4098
  "button",
3539
4099
  {
3540
4100
  style: {
@@ -3562,7 +4122,7 @@ function ThreadDetailScreen({
3562
4122
 
3563
4123
  // src/widget/screens/ComposeMessageScreen.tsx
3564
4124
  import { useState as useState8 } from "react";
3565
- import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
4125
+ import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
3566
4126
  var inputStyle2 = {
3567
4127
  backgroundColor: "#27272a",
3568
4128
  border: "1px solid #3f3f46",
@@ -3593,9 +4153,9 @@ function ComposeMessageScreen({ nav }) {
3593
4153
  nav.pop();
3594
4154
  }
3595
4155
  };
3596
- return /* @__PURE__ */ jsxs12("div", { children: [
3597
- /* @__PURE__ */ jsxs12("div", { style: { marginBottom: 20 }, children: [
3598
- /* @__PURE__ */ jsx13(
4156
+ return /* @__PURE__ */ jsxs13("div", { children: [
4157
+ /* @__PURE__ */ jsxs13("div", { style: { marginBottom: 20 }, children: [
4158
+ /* @__PURE__ */ jsx14(
3599
4159
  "div",
3600
4160
  {
3601
4161
  style: {
@@ -3607,9 +4167,9 @@ function ComposeMessageScreen({ nav }) {
3607
4167
  children: "New Message"
3608
4168
  }
3609
4169
  ),
3610
- /* @__PURE__ */ jsx13("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
4170
+ /* @__PURE__ */ jsx14("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
3611
4171
  ] }),
3612
- /* @__PURE__ */ jsxs12(
4172
+ /* @__PURE__ */ jsxs13(
3613
4173
  "div",
3614
4174
  {
3615
4175
  style: {
@@ -3619,7 +4179,7 @@ function ComposeMessageScreen({ nav }) {
3619
4179
  border: `1px solid ${colors.border}`
3620
4180
  },
3621
4181
  children: [
3622
- /* @__PURE__ */ jsx13(
4182
+ /* @__PURE__ */ jsx14(
3623
4183
  "label",
3624
4184
  {
3625
4185
  style: {
@@ -3632,7 +4192,7 @@ function ComposeMessageScreen({ nav }) {
3632
4192
  children: "Subject"
3633
4193
  }
3634
4194
  ),
3635
- /* @__PURE__ */ jsx13(
4195
+ /* @__PURE__ */ jsx14(
3636
4196
  "input",
3637
4197
  {
3638
4198
  type: "text",
@@ -3647,7 +4207,7 @@ function ComposeMessageScreen({ nav }) {
3647
4207
  }
3648
4208
  }
3649
4209
  ),
3650
- /* @__PURE__ */ jsx13(
4210
+ /* @__PURE__ */ jsx14(
3651
4211
  "label",
3652
4212
  {
3653
4213
  style: {
@@ -3661,7 +4221,7 @@ function ComposeMessageScreen({ nav }) {
3661
4221
  children: "Message"
3662
4222
  }
3663
4223
  ),
3664
- /* @__PURE__ */ jsx13(
4224
+ /* @__PURE__ */ jsx14(
3665
4225
  "textarea",
3666
4226
  {
3667
4227
  value: message,
@@ -3680,7 +4240,7 @@ function ComposeMessageScreen({ nav }) {
3680
4240
  }
3681
4241
  }
3682
4242
  ),
3683
- /* @__PURE__ */ jsx13(
4243
+ /* @__PURE__ */ jsx14(
3684
4244
  ImagePickerButtons,
3685
4245
  {
3686
4246
  images: images.images,
@@ -3691,7 +4251,7 @@ function ComposeMessageScreen({ nav }) {
3691
4251
  label: "Attachments (optional)"
3692
4252
  }
3693
4253
  ),
3694
- /* @__PURE__ */ jsx13(
4254
+ /* @__PURE__ */ jsx14(
3695
4255
  "button",
3696
4256
  {
3697
4257
  style: {
@@ -3720,7 +4280,7 @@ function ComposeMessageScreen({ nav }) {
3720
4280
 
3721
4281
  // src/widget/screens/ProfileScreen.tsx
3722
4282
  import { useState as useState9, useEffect as useEffect6 } from "react";
3723
- import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
4283
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
3724
4284
  function ProfileScreen({ nav }) {
3725
4285
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo } = useBugBear();
3726
4286
  const [editing, setEditing] = useState9(false);
@@ -3767,22 +4327,22 @@ function ProfileScreen({ nav }) {
3767
4327
  }
3768
4328
  };
3769
4329
  if (saved) {
3770
- return /* @__PURE__ */ jsxs13("div", { style: styles4.emptyState, children: [
3771
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyEmoji, children: "\u2705" }),
3772
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyTitle, children: "Profile saved!" })
4330
+ return /* @__PURE__ */ jsxs14("div", { style: styles4.emptyState, children: [
4331
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyEmoji, children: "\u2705" }),
4332
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyTitle, children: "Profile saved!" })
3773
4333
  ] });
3774
4334
  }
3775
4335
  if (!testerInfo) {
3776
- return /* @__PURE__ */ jsxs13("div", { style: styles4.emptyState, children: [
3777
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
3778
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyTitle, children: "No profile found" })
4336
+ return /* @__PURE__ */ jsxs14("div", { style: styles4.emptyState, children: [
4337
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
4338
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyTitle, children: "No profile found" })
3779
4339
  ] });
3780
4340
  }
3781
4341
  if (editing) {
3782
- return /* @__PURE__ */ jsxs13("div", { children: [
3783
- /* @__PURE__ */ jsxs13("div", { style: styles4.editHeader, children: [
3784
- /* @__PURE__ */ jsx14("span", { style: styles4.editTitle, children: "Edit Profile" }),
3785
- /* @__PURE__ */ jsx14(
4342
+ return /* @__PURE__ */ jsxs14("div", { children: [
4343
+ /* @__PURE__ */ jsxs14("div", { style: styles4.editHeader, children: [
4344
+ /* @__PURE__ */ jsx15("span", { style: styles4.editTitle, children: "Edit Profile" }),
4345
+ /* @__PURE__ */ jsx15(
3786
4346
  "button",
3787
4347
  {
3788
4348
  style: styles4.cancelButton,
@@ -3794,9 +4354,9 @@ function ProfileScreen({ nav }) {
3794
4354
  }
3795
4355
  )
3796
4356
  ] }),
3797
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3798
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Name" }),
3799
- /* @__PURE__ */ jsx14(
4357
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4358
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Name" }),
4359
+ /* @__PURE__ */ jsx15(
3800
4360
  "input",
3801
4361
  {
3802
4362
  style: styles4.input,
@@ -3806,15 +4366,15 @@ function ProfileScreen({ nav }) {
3806
4366
  }
3807
4367
  )
3808
4368
  ] }),
3809
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3810
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Primary Email" }),
3811
- /* @__PURE__ */ jsx14("span", { style: styles4.emailFixed, children: testerInfo.email })
4369
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4370
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Primary Email" }),
4371
+ /* @__PURE__ */ jsx15("span", { style: styles4.emailFixed, children: testerInfo.email })
3812
4372
  ] }),
3813
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3814
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Additional Emails" }),
3815
- additionalEmails.map((email) => /* @__PURE__ */ jsxs13("div", { style: styles4.emailRow, children: [
3816
- /* @__PURE__ */ jsx14("span", { style: styles4.emailText, children: email }),
3817
- /* @__PURE__ */ jsx14(
4373
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4374
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Additional Emails" }),
4375
+ additionalEmails.map((email) => /* @__PURE__ */ jsxs14("div", { style: styles4.emailRow, children: [
4376
+ /* @__PURE__ */ jsx15("span", { style: styles4.emailText, children: email }),
4377
+ /* @__PURE__ */ jsx15(
3818
4378
  "button",
3819
4379
  {
3820
4380
  style: styles4.removeEmailButton,
@@ -3823,8 +4383,8 @@ function ProfileScreen({ nav }) {
3823
4383
  }
3824
4384
  )
3825
4385
  ] }, email)),
3826
- /* @__PURE__ */ jsxs13("div", { style: styles4.addEmailRow, children: [
3827
- /* @__PURE__ */ jsx14(
4386
+ /* @__PURE__ */ jsxs14("div", { style: styles4.addEmailRow, children: [
4387
+ /* @__PURE__ */ jsx15(
3828
4388
  "input",
3829
4389
  {
3830
4390
  style: { ...styles4.input, flex: 1, marginRight: 8 },
@@ -3837,18 +4397,18 @@ function ProfileScreen({ nav }) {
3837
4397
  }
3838
4398
  }
3839
4399
  ),
3840
- /* @__PURE__ */ jsx14("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
4400
+ /* @__PURE__ */ jsx15("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
3841
4401
  ] })
3842
4402
  ] }),
3843
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3844
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Testing Platforms" }),
3845
- /* @__PURE__ */ jsx14("div", { style: styles4.platformRow, children: [
4403
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4404
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Testing Platforms" }),
4405
+ /* @__PURE__ */ jsx15("div", { style: styles4.platformRow, children: [
3846
4406
  { key: "ios", label: "\u{1F4F1} iOS" },
3847
4407
  { key: "android", label: "\u{1F916} Android" },
3848
4408
  { key: "web", label: "\u{1F310} Web" }
3849
4409
  ].map(({ key, label }) => {
3850
4410
  const isActive = platforms.includes(key);
3851
- return /* @__PURE__ */ jsx14(
4411
+ return /* @__PURE__ */ jsx15(
3852
4412
  "button",
3853
4413
  {
3854
4414
  style: {
@@ -3858,13 +4418,13 @@ function ProfileScreen({ nav }) {
3858
4418
  onClick: () => setPlatforms(
3859
4419
  (prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key]
3860
4420
  ),
3861
- children: /* @__PURE__ */ jsx14("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
4421
+ children: /* @__PURE__ */ jsx15("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
3862
4422
  },
3863
4423
  key
3864
4424
  );
3865
4425
  }) })
3866
4426
  ] }),
3867
- /* @__PURE__ */ jsx14(
4427
+ /* @__PURE__ */ jsx15(
3868
4428
  "button",
3869
4429
  {
3870
4430
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -3875,45 +4435,45 @@ function ProfileScreen({ nav }) {
3875
4435
  )
3876
4436
  ] });
3877
4437
  }
3878
- return /* @__PURE__ */ jsxs13("div", { children: [
3879
- /* @__PURE__ */ jsxs13("div", { style: styles4.profileCard, children: [
3880
- /* @__PURE__ */ jsx14("div", { style: styles4.avatar, children: /* @__PURE__ */ jsx14("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
3881
- /* @__PURE__ */ jsx14("span", { style: styles4.profileName, children: testerInfo.name }),
3882
- /* @__PURE__ */ jsx14("span", { style: styles4.profileEmail, children: testerInfo.email })
4438
+ return /* @__PURE__ */ jsxs14("div", { children: [
4439
+ /* @__PURE__ */ jsxs14("div", { style: styles4.profileCard, children: [
4440
+ /* @__PURE__ */ jsx15("div", { style: styles4.avatar, children: /* @__PURE__ */ jsx15("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
4441
+ /* @__PURE__ */ jsx15("span", { style: styles4.profileName, children: testerInfo.name }),
4442
+ /* @__PURE__ */ jsx15("span", { style: styles4.profileEmail, children: testerInfo.email })
3883
4443
  ] }),
3884
- /* @__PURE__ */ jsxs13("div", { style: styles4.statsRow, children: [
3885
- /* @__PURE__ */ jsxs13("div", { style: styles4.statItem, children: [
3886
- /* @__PURE__ */ jsx14("span", { style: styles4.statNumber, children: completedCount }),
3887
- /* @__PURE__ */ jsx14("span", { style: styles4.statLabel, children: "Completed" })
4444
+ /* @__PURE__ */ jsxs14("div", { style: styles4.statsRow, children: [
4445
+ /* @__PURE__ */ jsxs14("div", { style: styles4.statItem, children: [
4446
+ /* @__PURE__ */ jsx15("span", { style: styles4.statNumber, children: completedCount }),
4447
+ /* @__PURE__ */ jsx15("span", { style: styles4.statLabel, children: "Completed" })
3888
4448
  ] }),
3889
- /* @__PURE__ */ jsx14("div", { style: styles4.statDivider }),
3890
- /* @__PURE__ */ jsxs13("div", { style: styles4.statItem, children: [
3891
- /* @__PURE__ */ jsx14("span", { style: styles4.statNumber, children: assignments.length }),
3892
- /* @__PURE__ */ jsx14("span", { style: styles4.statLabel, children: "Total Assigned" })
4449
+ /* @__PURE__ */ jsx15("div", { style: styles4.statDivider }),
4450
+ /* @__PURE__ */ jsxs14("div", { style: styles4.statItem, children: [
4451
+ /* @__PURE__ */ jsx15("span", { style: styles4.statNumber, children: assignments.length }),
4452
+ /* @__PURE__ */ jsx15("span", { style: styles4.statLabel, children: "Total Assigned" })
3893
4453
  ] })
3894
4454
  ] }),
3895
- /* @__PURE__ */ jsx14(
4455
+ /* @__PURE__ */ jsx15(
3896
4456
  "button",
3897
4457
  {
3898
4458
  style: styles4.detailsToggle,
3899
4459
  onClick: () => setShowDetails(!showDetails),
3900
- children: /* @__PURE__ */ jsxs13("span", { style: styles4.detailsToggleText, children: [
4460
+ children: /* @__PURE__ */ jsxs14("span", { style: styles4.detailsToggleText, children: [
3901
4461
  showDetails ? "\u25BC" : "\u25B6",
3902
4462
  " Details"
3903
4463
  ] })
3904
4464
  }
3905
4465
  ),
3906
- showDetails && /* @__PURE__ */ jsxs13("div", { style: styles4.detailsSection, children: [
3907
- additionalEmails.length > 0 && /* @__PURE__ */ jsxs13("div", { style: styles4.detailBlock, children: [
3908
- /* @__PURE__ */ jsx14("span", { style: styles4.detailLabel, children: "Additional Emails" }),
3909
- additionalEmails.map((e) => /* @__PURE__ */ jsx14("span", { style: styles4.detailValue, children: e }, e))
4466
+ showDetails && /* @__PURE__ */ jsxs14("div", { style: styles4.detailsSection, children: [
4467
+ additionalEmails.length > 0 && /* @__PURE__ */ jsxs14("div", { style: styles4.detailBlock, children: [
4468
+ /* @__PURE__ */ jsx15("span", { style: styles4.detailLabel, children: "Additional Emails" }),
4469
+ additionalEmails.map((e) => /* @__PURE__ */ jsx15("span", { style: styles4.detailValue, children: e }, e))
3910
4470
  ] }),
3911
- platforms.length > 0 && /* @__PURE__ */ jsxs13("div", { style: styles4.detailBlock, children: [
3912
- /* @__PURE__ */ jsx14("span", { style: styles4.detailLabel, children: "Platforms" }),
3913
- /* @__PURE__ */ jsx14("div", { style: styles4.platformTags, children: platforms.map((p) => /* @__PURE__ */ jsx14("span", { style: styles4.platformTag, children: /* @__PURE__ */ jsx14("span", { style: styles4.platformTagText, children: p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web" }) }, p)) })
4471
+ platforms.length > 0 && /* @__PURE__ */ jsxs14("div", { style: styles4.detailBlock, children: [
4472
+ /* @__PURE__ */ jsx15("span", { style: styles4.detailLabel, children: "Platforms" }),
4473
+ /* @__PURE__ */ jsx15("div", { style: styles4.platformTags, children: platforms.map((p) => /* @__PURE__ */ jsx15("span", { style: styles4.platformTag, children: /* @__PURE__ */ jsx15("span", { style: styles4.platformTagText, children: p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web" }) }, p)) })
3914
4474
  ] })
3915
4475
  ] }),
3916
- /* @__PURE__ */ jsx14(
4476
+ /* @__PURE__ */ jsx15(
3917
4477
  "button",
3918
4478
  {
3919
4479
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -4197,7 +4757,7 @@ var styles4 = {
4197
4757
 
4198
4758
  // src/widget/screens/IssueListScreen.tsx
4199
4759
  import { useState as useState10, useEffect as useEffect7 } from "react";
4200
- import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
4760
+ import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
4201
4761
  var CATEGORY_CONFIG = {
4202
4762
  open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
4203
4763
  done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
@@ -4240,15 +4800,15 @@ function IssueListScreen({ nav, category }) {
4240
4800
  };
4241
4801
  }, [client, category]);
4242
4802
  if (loading) {
4243
- return /* @__PURE__ */ jsx15("div", { style: { padding: "40px 0", textAlign: "center" }, children: /* @__PURE__ */ jsx15("div", { style: { color: colors.textMuted, fontSize: 14 }, children: "Loading..." }) });
4803
+ return /* @__PURE__ */ jsx16(IssueListScreenSkeleton, {});
4244
4804
  }
4245
4805
  if (issues.length === 0) {
4246
- return /* @__PURE__ */ jsxs14("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4247
- /* @__PURE__ */ jsx15("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4248
- /* @__PURE__ */ jsx15("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4806
+ return /* @__PURE__ */ jsxs15("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4807
+ /* @__PURE__ */ jsx16("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4808
+ /* @__PURE__ */ jsx16("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4249
4809
  ] });
4250
4810
  }
4251
- return /* @__PURE__ */ jsx15("div", { children: issues.map((issue) => /* @__PURE__ */ jsxs14(
4811
+ return /* @__PURE__ */ jsx16("div", { children: issues.map((issue) => /* @__PURE__ */ jsxs15(
4252
4812
  "div",
4253
4813
  {
4254
4814
  role: "button",
@@ -4267,8 +4827,8 @@ function IssueListScreen({ nav, category }) {
4267
4827
  userSelect: "none"
4268
4828
  },
4269
4829
  children: [
4270
- /* @__PURE__ */ jsxs14("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4271
- issue.severity && /* @__PURE__ */ jsx15(
4830
+ /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4831
+ issue.severity && /* @__PURE__ */ jsx16(
4272
4832
  "span",
4273
4833
  {
4274
4834
  style: {
@@ -4281,7 +4841,7 @@ function IssueListScreen({ nav, category }) {
4281
4841
  }
4282
4842
  }
4283
4843
  ),
4284
- /* @__PURE__ */ jsx15("span", { style: {
4844
+ /* @__PURE__ */ jsx16("span", { style: {
4285
4845
  fontSize: 13,
4286
4846
  fontWeight: 600,
4287
4847
  color: colors.textPrimary,
@@ -4291,11 +4851,11 @@ function IssueListScreen({ nav, category }) {
4291
4851
  whiteSpace: "nowrap"
4292
4852
  }, children: issue.title })
4293
4853
  ] }),
4294
- /* @__PURE__ */ jsxs14("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4295
- issue.route && /* @__PURE__ */ jsx15("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
4296
- /* @__PURE__ */ jsx15("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4854
+ /* @__PURE__ */ jsxs15("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4855
+ issue.route && /* @__PURE__ */ jsx16("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
4856
+ /* @__PURE__ */ jsx16("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4297
4857
  ] }),
4298
- category === "done" && issue.verifiedByName && /* @__PURE__ */ jsxs14("div", { style: {
4858
+ category === "done" && issue.verifiedByName && /* @__PURE__ */ jsxs15("div", { style: {
4299
4859
  display: "inline-flex",
4300
4860
  alignItems: "center",
4301
4861
  gap: 4,
@@ -4311,7 +4871,7 @@ function IssueListScreen({ nav, category }) {
4311
4871
  "\u2714 Verified by ",
4312
4872
  issue.verifiedByName
4313
4873
  ] }),
4314
- category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ jsxs14("div", { style: {
4874
+ category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ jsxs15("div", { style: {
4315
4875
  display: "inline-flex",
4316
4876
  alignItems: "center",
4317
4877
  gap: 4,
@@ -4338,7 +4898,7 @@ function IssueListScreen({ nav, category }) {
4338
4898
  }
4339
4899
 
4340
4900
  // src/widget/screens/IssueDetailScreen.tsx
4341
- import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
4901
+ import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
4342
4902
  var STATUS_LABELS = {
4343
4903
  new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
4344
4904
  triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
@@ -4360,11 +4920,12 @@ var SEVERITY_CONFIG = {
4360
4920
  low: { label: "Low", color: "#71717a", bg: "#27272a" }
4361
4921
  };
4362
4922
  function IssueDetailScreen({ nav, issue }) {
4923
+ const { dashboardUrl } = useBugBear();
4363
4924
  const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
4364
4925
  const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
4365
- return /* @__PURE__ */ jsxs15("div", { children: [
4366
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4367
- /* @__PURE__ */ jsx16("span", { style: {
4926
+ return /* @__PURE__ */ jsxs16("div", { children: [
4927
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4928
+ /* @__PURE__ */ jsx17("span", { style: {
4368
4929
  backgroundColor: statusConfig.bg,
4369
4930
  color: statusConfig.color,
4370
4931
  fontSize: 11,
@@ -4372,7 +4933,7 @@ function IssueDetailScreen({ nav, issue }) {
4372
4933
  padding: "3px 10px",
4373
4934
  borderRadius: 6
4374
4935
  }, children: statusConfig.label }),
4375
- severityConfig && /* @__PURE__ */ jsx16("span", { style: {
4936
+ severityConfig && /* @__PURE__ */ jsx17("span", { style: {
4376
4937
  backgroundColor: severityConfig.bg,
4377
4938
  color: severityConfig.color,
4378
4939
  fontSize: 11,
@@ -4381,9 +4942,9 @@ function IssueDetailScreen({ nav, issue }) {
4381
4942
  borderRadius: 6
4382
4943
  }, children: severityConfig.label })
4383
4944
  ] }),
4384
- /* @__PURE__ */ jsx16("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
4385
- issue.route && /* @__PURE__ */ jsx16("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4386
- issue.description && /* @__PURE__ */ jsx16("div", { style: {
4945
+ /* @__PURE__ */ jsx17("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
4946
+ issue.route && /* @__PURE__ */ jsx17("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4947
+ issue.description && /* @__PURE__ */ jsx17("div", { style: {
4387
4948
  backgroundColor: colors.card,
4388
4949
  border: `1px solid ${colors.border}`,
4389
4950
  borderRadius: 8,
@@ -4395,56 +4956,56 @@ function IssueDetailScreen({ nav, issue }) {
4395
4956
  whiteSpace: "pre-wrap",
4396
4957
  wordBreak: "break-word"
4397
4958
  }, children: issue.description }),
4398
- issue.verifiedByName && /* @__PURE__ */ jsxs15("div", { style: {
4959
+ issue.verifiedByName && /* @__PURE__ */ jsxs16("div", { style: {
4399
4960
  backgroundColor: "#14532d",
4400
4961
  border: "1px solid #166534",
4401
4962
  borderRadius: 8,
4402
4963
  padding: 12,
4403
4964
  marginBottom: 12
4404
4965
  }, children: [
4405
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4406
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 16 }, children: "\u2705" }),
4407
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
4966
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4967
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 16 }, children: "\u2705" }),
4968
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
4408
4969
  ] }),
4409
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, color: "#86efac" }, children: [
4970
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, color: "#86efac" }, children: [
4410
4971
  "Verified by ",
4411
- /* @__PURE__ */ jsx16("strong", { children: issue.verifiedByName }),
4412
- issue.verifiedAt && /* @__PURE__ */ jsxs15("span", { children: [
4972
+ /* @__PURE__ */ jsx17("strong", { children: issue.verifiedByName }),
4973
+ issue.verifiedAt && /* @__PURE__ */ jsxs16("span", { children: [
4413
4974
  " on ",
4414
4975
  new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })
4415
4976
  ] })
4416
4977
  ] })
4417
4978
  ] }),
4418
- issue.originalBugTitle && /* @__PURE__ */ jsxs15("div", { style: {
4979
+ issue.originalBugTitle && /* @__PURE__ */ jsxs16("div", { style: {
4419
4980
  backgroundColor: "#422006",
4420
4981
  border: "1px solid #854d0e",
4421
4982
  borderRadius: 8,
4422
4983
  padding: 12,
4423
4984
  marginBottom: 12
4424
4985
  }, children: [
4425
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4426
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
4427
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
4986
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4987
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
4988
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
4428
4989
  ] }),
4429
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
4990
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
4430
4991
  "Retest of: ",
4431
- /* @__PURE__ */ jsx16("strong", { children: issue.originalBugTitle })
4992
+ /* @__PURE__ */ jsx17("strong", { children: issue.originalBugTitle })
4432
4993
  ] })
4433
4994
  ] }),
4434
- issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ jsxs15("div", { style: { marginBottom: 12 }, children: [
4435
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
4995
+ issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ jsxs16("div", { style: { marginBottom: 12 }, children: [
4996
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
4436
4997
  "Screenshots (",
4437
4998
  issue.screenshotUrls.length,
4438
4999
  ")"
4439
5000
  ] }),
4440
- /* @__PURE__ */ jsx16("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ jsx16(
5001
+ /* @__PURE__ */ jsx17("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ jsx17(
4441
5002
  "a",
4442
5003
  {
4443
5004
  href: url,
4444
5005
  target: "_blank",
4445
5006
  rel: "noopener noreferrer",
4446
5007
  style: { flexShrink: 0 },
4447
- children: /* @__PURE__ */ jsx16(
5008
+ children: /* @__PURE__ */ jsx17(
4448
5009
  "img",
4449
5010
  {
4450
5011
  src: url,
@@ -4462,22 +5023,44 @@ function IssueDetailScreen({ nav, issue }) {
4462
5023
  i
4463
5024
  )) })
4464
5025
  ] }),
4465
- /* @__PURE__ */ jsxs15("div", { style: {
5026
+ /* @__PURE__ */ jsxs16("div", { style: {
4466
5027
  borderTop: `1px solid ${colors.border}`,
4467
5028
  paddingTop: 12,
4468
5029
  marginTop: 4
4469
5030
  }, children: [
4470
- issue.reporterName && /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
5031
+ issue.reporterName && /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
4471
5032
  "Reported by ",
4472
5033
  issue.reporterName
4473
5034
  ] }),
4474
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 11, color: colors.textDim }, children: [
5035
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 11, color: colors.textDim }, children: [
4475
5036
  "Created ",
4476
5037
  formatRelativeTime(issue.createdAt),
4477
5038
  " \xB7 Updated ",
4478
5039
  formatRelativeTime(issue.updatedAt)
4479
5040
  ] })
4480
- ] })
5041
+ ] }),
5042
+ dashboardUrl && /* @__PURE__ */ jsx17(
5043
+ "a",
5044
+ {
5045
+ href: `${dashboardUrl}/reports`,
5046
+ target: "_blank",
5047
+ rel: "noopener noreferrer",
5048
+ style: {
5049
+ display: "flex",
5050
+ alignItems: "center",
5051
+ justifyContent: "center",
5052
+ gap: 6,
5053
+ marginTop: 12,
5054
+ padding: "10px 0",
5055
+ fontSize: 13,
5056
+ fontWeight: 500,
5057
+ color: colors.blue,
5058
+ textDecoration: "none",
5059
+ borderTop: `1px solid ${colors.border}`
5060
+ },
5061
+ children: "\u{1F310} View on Dashboard \u2192"
5062
+ }
5063
+ )
4481
5064
  ] });
4482
5065
  }
4483
5066
 
@@ -4485,9 +5068,9 @@ function IssueDetailScreen({ nav, issue }) {
4485
5068
  var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
4486
5069
 
4487
5070
  // src/BugBearPanel.tsx
4488
- import { Fragment as Fragment4, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
5071
+ import { Fragment as Fragment4, jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
4489
5072
  function BugBearIcon({ size = 24 }) {
4490
- return /* @__PURE__ */ jsx17(
5073
+ return /* @__PURE__ */ jsx18(
4491
5074
  "img",
4492
5075
  {
4493
5076
  src: BUGBEAR_LOGO_BASE64,
@@ -4652,37 +5235,37 @@ function BugBearPanel({
4652
5235
  const renderScreen = () => {
4653
5236
  switch (currentScreen.name) {
4654
5237
  case "HOME":
4655
- return /* @__PURE__ */ jsx17(HomeScreen, { nav });
5238
+ return /* @__PURE__ */ jsx18(HomeScreen, { nav });
4656
5239
  case "TEST_DETAIL":
4657
- return /* @__PURE__ */ jsx17(TestDetailScreen, { testId: currentScreen.testId, nav });
5240
+ return /* @__PURE__ */ jsx18(TestDetailScreen, { testId: currentScreen.testId, nav });
4658
5241
  case "TEST_LIST":
4659
- return /* @__PURE__ */ jsx17(TestListScreen, { nav });
5242
+ return /* @__PURE__ */ jsx18(TestListScreen, { nav });
4660
5243
  case "TEST_FEEDBACK":
4661
- return /* @__PURE__ */ jsx17(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
5244
+ return /* @__PURE__ */ jsx18(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
4662
5245
  case "REPORT":
4663
- return /* @__PURE__ */ jsx17(ReportScreen, { nav, prefill: currentScreen.prefill });
5246
+ return /* @__PURE__ */ jsx18(ReportScreen, { nav, prefill: currentScreen.prefill });
4664
5247
  case "REPORT_SUCCESS":
4665
- return /* @__PURE__ */ jsx17(ReportSuccessScreen, { nav });
5248
+ return /* @__PURE__ */ jsx18(ReportSuccessScreen, { nav });
4666
5249
  case "MESSAGE_LIST":
4667
- return /* @__PURE__ */ jsx17(MessageListScreen, { nav });
5250
+ return /* @__PURE__ */ jsx18(MessageListScreen, { nav });
4668
5251
  case "THREAD_DETAIL":
4669
- return /* @__PURE__ */ jsx17(ThreadDetailScreen, { thread: currentScreen.thread, nav });
5252
+ return /* @__PURE__ */ jsx18(ThreadDetailScreen, { thread: currentScreen.thread, nav });
4670
5253
  case "COMPOSE_MESSAGE":
4671
- return /* @__PURE__ */ jsx17(ComposeMessageScreen, { nav });
5254
+ return /* @__PURE__ */ jsx18(ComposeMessageScreen, { nav });
4672
5255
  case "ISSUE_LIST":
4673
- return /* @__PURE__ */ jsx17(IssueListScreen, { nav, category: currentScreen.category });
5256
+ return /* @__PURE__ */ jsx18(IssueListScreen, { nav, category: currentScreen.category });
4674
5257
  case "ISSUE_DETAIL":
4675
- return /* @__PURE__ */ jsx17(IssueDetailScreen, { nav, issue: currentScreen.issue });
5258
+ return /* @__PURE__ */ jsx18(IssueDetailScreen, { nav, issue: currentScreen.issue });
4676
5259
  case "PROFILE":
4677
- return /* @__PURE__ */ jsx17(ProfileScreen, { nav });
5260
+ return /* @__PURE__ */ jsx18(ProfileScreen, { nav });
4678
5261
  default:
4679
- return /* @__PURE__ */ jsx17(HomeScreen, { nav });
5262
+ return /* @__PURE__ */ jsx18(HomeScreen, { nav });
4680
5263
  }
4681
5264
  };
4682
5265
  if (typeof document === "undefined") return null;
4683
5266
  const headerTitle = getHeaderTitle();
4684
5267
  return createPortal(
4685
- /* @__PURE__ */ jsxs16(
5268
+ /* @__PURE__ */ jsxs17(
4686
5269
  "div",
4687
5270
  {
4688
5271
  ref: panelRef,
@@ -4701,7 +5284,7 @@ function BugBearPanel({
4701
5284
  },
4702
5285
  onMouseDown: handleMouseDown,
4703
5286
  children: [
4704
- collapsed && /* @__PURE__ */ jsxs16(
5287
+ collapsed && /* @__PURE__ */ jsxs17(
4705
5288
  "button",
4706
5289
  {
4707
5290
  onClick: () => setCollapsed(false),
@@ -4723,9 +5306,9 @@ function BugBearPanel({
4723
5306
  fontWeight: 500
4724
5307
  },
4725
5308
  children: [
4726
- /* @__PURE__ */ jsx17(BugBearIcon, { size: 24 }),
4727
- /* @__PURE__ */ jsx17("span", { children: "BugBear" }),
4728
- badgeCount > 0 && /* @__PURE__ */ jsx17("span", { style: {
5309
+ /* @__PURE__ */ jsx18(BugBearIcon, { size: 24 }),
5310
+ /* @__PURE__ */ jsx18("span", { children: "BugBear" }),
5311
+ badgeCount > 0 && /* @__PURE__ */ jsx18("span", { style: {
4729
5312
  backgroundColor: "#fff",
4730
5313
  color: colors.blue,
4731
5314
  fontSize: "0.75rem",
@@ -4736,7 +5319,7 @@ function BugBearPanel({
4736
5319
  ]
4737
5320
  }
4738
5321
  ),
4739
- !collapsed && /* @__PURE__ */ jsxs16("div", { style: {
5322
+ !collapsed && /* @__PURE__ */ jsxs17("div", { style: {
4740
5323
  width: PANEL_WIDTH,
4741
5324
  backgroundColor: colors.bg,
4742
5325
  borderRadius: 12,
@@ -4744,7 +5327,7 @@ function BugBearPanel({
4744
5327
  overflow: "hidden",
4745
5328
  boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5)"
4746
5329
  }, children: [
4747
- /* @__PURE__ */ jsxs16(
5330
+ /* @__PURE__ */ jsxs17(
4748
5331
  "div",
4749
5332
  {
4750
5333
  "data-drag-handle": true,
@@ -4760,7 +5343,7 @@ function BugBearPanel({
4760
5343
  cursor: draggable ? isDragging ? "grabbing" : "grab" : "default"
4761
5344
  },
4762
5345
  children: [
4763
- /* @__PURE__ */ jsx17("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ jsx17(
5346
+ /* @__PURE__ */ jsx18("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ jsx18(
4764
5347
  "button",
4765
5348
  {
4766
5349
  onClick: pop,
@@ -4776,14 +5359,14 @@ function BugBearPanel({
4776
5359
  },
4777
5360
  children: "\u2190 Back"
4778
5361
  }
4779
- ) : /* @__PURE__ */ jsxs16(Fragment4, { children: [
4780
- /* @__PURE__ */ jsx17(BugBearIcon, { size: 28 }),
4781
- /* @__PURE__ */ jsxs16("div", { children: [
4782
- /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
4783
- /* @__PURE__ */ jsx17("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
4784
- draggable && /* @__PURE__ */ jsx17("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
5362
+ ) : /* @__PURE__ */ jsxs17(Fragment4, { children: [
5363
+ /* @__PURE__ */ jsx18(BugBearIcon, { size: 28 }),
5364
+ /* @__PURE__ */ jsxs17("div", { children: [
5365
+ /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
5366
+ /* @__PURE__ */ jsx18("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
5367
+ draggable && /* @__PURE__ */ jsx18("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
4785
5368
  ] }),
4786
- testerInfo && /* @__PURE__ */ jsxs16(
5369
+ testerInfo && /* @__PURE__ */ jsxs17(
4787
5370
  "button",
4788
5371
  {
4789
5372
  onClick: () => push({ name: "PROFILE" }),
@@ -4801,13 +5384,13 @@ function BugBearPanel({
4801
5384
  },
4802
5385
  children: [
4803
5386
  testerInfo.name,
4804
- /* @__PURE__ */ jsx17("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
5387
+ /* @__PURE__ */ jsx18("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
4805
5388
  ]
4806
5389
  }
4807
5390
  )
4808
5391
  ] })
4809
5392
  ] }) }),
4810
- headerTitle ? /* @__PURE__ */ jsx17("span", { style: {
5393
+ headerTitle ? /* @__PURE__ */ jsx18("span", { style: {
4811
5394
  fontSize: "0.8125rem",
4812
5395
  fontWeight: 600,
4813
5396
  color: colors.textSecondary,
@@ -4817,7 +5400,7 @@ function BugBearPanel({
4817
5400
  textOverflow: "ellipsis",
4818
5401
  whiteSpace: "nowrap"
4819
5402
  }, children: headerTitle }) : null,
4820
- /* @__PURE__ */ jsx17(
5403
+ /* @__PURE__ */ jsx18(
4821
5404
  "button",
4822
5405
  {
4823
5406
  onClick: handleClose,
@@ -4841,13 +5424,13 @@ function BugBearPanel({
4841
5424
  ]
4842
5425
  }
4843
5426
  ),
4844
- /* @__PURE__ */ jsx17("div", { style: {
5427
+ /* @__PURE__ */ jsx18("div", { style: {
4845
5428
  padding: 16,
4846
5429
  maxHeight: 400,
4847
5430
  overflowY: "auto",
4848
5431
  backgroundColor: colors.bg,
4849
5432
  color: colors.textSecondary
4850
- }, children: isLoading ? /* @__PURE__ */ jsx17("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ jsx17("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
5433
+ }, children: isLoading ? /* @__PURE__ */ jsx18("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ jsx18("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
4851
5434
  ] })
4852
5435
  ]
4853
5436
  }
@@ -4859,7 +5442,7 @@ function BugBearPanel({
4859
5442
  // src/BugBearErrorBoundary.tsx
4860
5443
  import { Component } from "react";
4861
5444
  import { captureError, contextCapture as contextCapture2 } from "@bbearai/core";
4862
- import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
5445
+ import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
4863
5446
  var BugBearErrorBoundary = class extends Component {
4864
5447
  constructor(props) {
4865
5448
  super(props);
@@ -4904,7 +5487,7 @@ var BugBearErrorBoundary = class extends Component {
4904
5487
  if (fallback) {
4905
5488
  return fallback;
4906
5489
  }
4907
- return /* @__PURE__ */ jsxs17(
5490
+ return /* @__PURE__ */ jsxs18(
4908
5491
  "div",
4909
5492
  {
4910
5493
  style: {
@@ -4916,13 +5499,13 @@ var BugBearErrorBoundary = class extends Component {
4916
5499
  fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
4917
5500
  },
4918
5501
  children: [
4919
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
4920
- /* @__PURE__ */ jsx18("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
4921
- /* @__PURE__ */ jsx18("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
5502
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
5503
+ /* @__PURE__ */ jsx19("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
5504
+ /* @__PURE__ */ jsx19("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
4922
5505
  ] }),
4923
- /* @__PURE__ */ jsx18("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
4924
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", gap: "8px" }, children: [
4925
- /* @__PURE__ */ jsx18(
5506
+ /* @__PURE__ */ jsx19("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
5507
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", gap: "8px" }, children: [
5508
+ /* @__PURE__ */ jsx19(
4926
5509
  "button",
4927
5510
  {
4928
5511
  onClick: this.reset,
@@ -4939,7 +5522,7 @@ var BugBearErrorBoundary = class extends Component {
4939
5522
  children: "Try Again"
4940
5523
  }
4941
5524
  ),
4942
- /* @__PURE__ */ jsx18(
5525
+ /* @__PURE__ */ jsx19(
4943
5526
  "button",
4944
5527
  {
4945
5528
  onClick: () => window.location.reload(),
@@ -4957,7 +5540,7 @@ var BugBearErrorBoundary = class extends Component {
4957
5540
  }
4958
5541
  )
4959
5542
  ] }),
4960
- /* @__PURE__ */ jsx18("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
5543
+ /* @__PURE__ */ jsx19("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
4961
5544
  ]
4962
5545
  }
4963
5546
  );