@bbearai/react 0.4.5 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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, 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,14 @@ 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
+ /* @__PURE__ */ jsx3("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ jsx3(
800
972
  "button",
801
973
  {
802
974
  type: "button",
@@ -821,7 +993,7 @@ function HomeScreen({ nav }) {
821
993
 
822
994
  // src/widget/screens/TestDetailScreen.tsx
823
995
  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";
996
+ import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
825
997
  function TestDetailScreen({ testId, nav }) {
826
998
  const { client, assignments, currentAssignment, refreshAssignments, onNavigate } = useBugBear();
827
999
  const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
@@ -909,7 +1081,7 @@ function TestDetailScreen({ testId, nav }) {
909
1081
  }
910
1082
  }, [client, displayedAssignment, selectedSkipReason, skipNotes, refreshAssignments, assignments, nav]);
911
1083
  if (!displayedAssignment) {
912
- return /* @__PURE__ */ jsxs2(
1084
+ return /* @__PURE__ */ jsxs3(
913
1085
  "div",
914
1086
  {
915
1087
  style: {
@@ -920,10 +1092,10 @@ function TestDetailScreen({ testId, nav }) {
920
1092
  padding: 40
921
1093
  },
922
1094
  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(
1095
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
1096
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
1097
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
1098
+ /* @__PURE__ */ jsx4(
927
1099
  "button",
928
1100
  {
929
1101
  type: "button",
@@ -956,8 +1128,8 @@ function TestDetailScreen({ testId, nav }) {
956
1128
  { reason: "dependency", label: "\u{1F517} Needs another test first" },
957
1129
  { reason: "other", label: "\u{1F4DD} Other reason" }
958
1130
  ];
959
- return /* @__PURE__ */ jsxs2("div", { style: { paddingBottom: 16 }, children: [
960
- /* @__PURE__ */ jsxs2(
1131
+ return /* @__PURE__ */ jsxs3("div", { style: { paddingBottom: 16 }, children: [
1132
+ /* @__PURE__ */ jsxs3(
961
1133
  "div",
962
1134
  {
963
1135
  style: {
@@ -967,14 +1139,14 @@ function TestDetailScreen({ testId, nav }) {
967
1139
  marginBottom: 12
968
1140
  },
969
1141
  children: [
970
- /* @__PURE__ */ jsxs2("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
971
- /* @__PURE__ */ jsxs2("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
1142
+ /* @__PURE__ */ jsxs3("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1143
+ /* @__PURE__ */ jsxs3("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
972
1144
  "Test ",
973
1145
  currentIndex + 1,
974
1146
  " of ",
975
1147
  allTests.length
976
1148
  ] }),
977
- displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ jsx3(
1149
+ displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ jsx4(
978
1150
  "span",
979
1151
  {
980
1152
  style: {
@@ -993,7 +1165,7 @@ function TestDetailScreen({ testId, nav }) {
993
1165
  }
994
1166
  )
995
1167
  ] }),
996
- /* @__PURE__ */ jsx3(
1168
+ /* @__PURE__ */ jsx4(
997
1169
  "button",
998
1170
  {
999
1171
  type: "button",
@@ -1013,7 +1185,7 @@ function TestDetailScreen({ testId, nav }) {
1013
1185
  ]
1014
1186
  }
1015
1187
  ),
1016
- displayedAssignment.isVerification && /* @__PURE__ */ jsxs2(
1188
+ displayedAssignment.isVerification && /* @__PURE__ */ jsxs3(
1017
1189
  "div",
1018
1190
  {
1019
1191
  style: {
@@ -1027,14 +1199,14 @@ function TestDetailScreen({ testId, nav }) {
1027
1199
  marginBottom: 10
1028
1200
  },
1029
1201
  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" })
1202
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
1203
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
1204
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
1033
1205
  ]
1034
1206
  }
1035
1207
  ),
1036
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1037
- testCase.testKey && /* @__PURE__ */ jsx3(
1208
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1209
+ testCase.testKey && /* @__PURE__ */ jsx4(
1038
1210
  "div",
1039
1211
  {
1040
1212
  style: {
@@ -1046,7 +1218,7 @@ function TestDetailScreen({ testId, nav }) {
1046
1218
  children: testCase.testKey
1047
1219
  }
1048
1220
  ),
1049
- /* @__PURE__ */ jsx3(
1221
+ /* @__PURE__ */ jsx4(
1050
1222
  "button",
1051
1223
  {
1052
1224
  type: "button",
@@ -1062,7 +1234,7 @@ function TestDetailScreen({ testId, nav }) {
1062
1234
  cursor: "pointer",
1063
1235
  textAlign: "left"
1064
1236
  },
1065
- children: /* @__PURE__ */ jsxs2("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1237
+ children: /* @__PURE__ */ jsxs3("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1066
1238
  showSteps ? "\u25BC" : "\u25B6",
1067
1239
  " ",
1068
1240
  info.icon,
@@ -1071,9 +1243,9 @@ function TestDetailScreen({ testId, nav }) {
1071
1243
  ] })
1072
1244
  }
1073
1245
  ),
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(
1246
+ showSteps && /* @__PURE__ */ jsxs3("div", { style: { marginBottom: 16 }, children: [
1247
+ template === "steps" && steps.map((step, idx) => /* @__PURE__ */ jsxs3("div", { style: { display: "flex", marginBottom: 10 }, children: [
1248
+ /* @__PURE__ */ jsx4(
1077
1249
  "div",
1078
1250
  {
1079
1251
  style: {
@@ -1088,12 +1260,12 @@ function TestDetailScreen({ testId, nav }) {
1088
1260
  marginTop: 2,
1089
1261
  flexShrink: 0
1090
1262
  },
1091
- children: /* @__PURE__ */ jsx3("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1263
+ children: /* @__PURE__ */ jsx4("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1092
1264
  }
1093
1265
  ),
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(
1266
+ /* @__PURE__ */ jsxs3("div", { style: { flex: 1 }, children: [
1267
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
1268
+ step.expectedResult && /* @__PURE__ */ jsxs3(
1097
1269
  "div",
1098
1270
  {
1099
1271
  style: {
@@ -1110,8 +1282,8 @@ function TestDetailScreen({ testId, nav }) {
1110
1282
  )
1111
1283
  ] })
1112
1284
  ] }, idx)),
1113
- template === "checklist" && /* @__PURE__ */ jsxs2(Fragment, { children: [
1114
- steps.map((step, idx) => /* @__PURE__ */ jsxs2(
1285
+ template === "checklist" && /* @__PURE__ */ jsxs3(Fragment, { children: [
1286
+ steps.map((step, idx) => /* @__PURE__ */ jsxs3(
1115
1287
  "button",
1116
1288
  {
1117
1289
  type: "button",
@@ -1137,7 +1309,7 @@ function TestDetailScreen({ testId, nav }) {
1137
1309
  textAlign: "left"
1138
1310
  },
1139
1311
  children: [
1140
- /* @__PURE__ */ jsx3(
1312
+ /* @__PURE__ */ jsx4(
1141
1313
  "div",
1142
1314
  {
1143
1315
  style: {
@@ -1152,10 +1324,10 @@ function TestDetailScreen({ testId, nav }) {
1152
1324
  alignItems: "center",
1153
1325
  flexShrink: 0
1154
1326
  },
1155
- children: criteriaResults[idx] === true && /* @__PURE__ */ jsx3("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1327
+ children: criteriaResults[idx] === true && /* @__PURE__ */ jsx4("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1156
1328
  }
1157
1329
  ),
1158
- /* @__PURE__ */ jsx3(
1330
+ /* @__PURE__ */ jsx4(
1159
1331
  "span",
1160
1332
  {
1161
1333
  style: {
@@ -1171,7 +1343,7 @@ function TestDetailScreen({ testId, nav }) {
1171
1343
  },
1172
1344
  idx
1173
1345
  )),
1174
- Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ jsx3("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ jsx3(
1346
+ Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ jsx4("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ jsx4(
1175
1347
  "button",
1176
1348
  {
1177
1349
  type: "button",
@@ -1188,8 +1360,8 @@ function TestDetailScreen({ testId, nav }) {
1188
1360
  }
1189
1361
  ) })
1190
1362
  ] }),
1191
- template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ jsxs2("div", { style: { marginBottom: 14 }, children: [
1192
- /* @__PURE__ */ jsxs2(
1363
+ template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ jsxs3("div", { style: { marginBottom: 14 }, children: [
1364
+ /* @__PURE__ */ jsxs3(
1193
1365
  "div",
1194
1366
  {
1195
1367
  style: {
@@ -1205,7 +1377,7 @@ function TestDetailScreen({ testId, nav }) {
1205
1377
  ]
1206
1378
  }
1207
1379
  ),
1208
- step.expectedResult && /* @__PURE__ */ jsx3(
1380
+ step.expectedResult && /* @__PURE__ */ jsx4(
1209
1381
  "div",
1210
1382
  {
1211
1383
  style: {
@@ -1217,8 +1389,8 @@ function TestDetailScreen({ testId, nav }) {
1217
1389
  children: step.expectedResult
1218
1390
  }
1219
1391
  ),
1220
- rubricMode === "pass_fail" ? /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1221
- /* @__PURE__ */ jsx3(
1392
+ rubricMode === "pass_fail" ? /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1393
+ /* @__PURE__ */ jsx4(
1222
1394
  "button",
1223
1395
  {
1224
1396
  type: "button",
@@ -1239,7 +1411,7 @@ function TestDetailScreen({ testId, nav }) {
1239
1411
  children: "\u2713 Pass"
1240
1412
  }
1241
1413
  ),
1242
- /* @__PURE__ */ jsx3(
1414
+ /* @__PURE__ */ jsx4(
1243
1415
  "button",
1244
1416
  {
1245
1417
  type: "button",
@@ -1260,7 +1432,7 @@ function TestDetailScreen({ testId, nav }) {
1260
1432
  children: "\u2717 Fail"
1261
1433
  }
1262
1434
  )
1263
- ] }) : /* @__PURE__ */ jsx3("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx3(
1435
+ ] }) : /* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx4(
1264
1436
  "button",
1265
1437
  {
1266
1438
  type: "button",
@@ -1284,7 +1456,7 @@ function TestDetailScreen({ testId, nav }) {
1284
1456
  n
1285
1457
  )) })
1286
1458
  ] }, idx)),
1287
- template === "freeform" && /* @__PURE__ */ jsxs2(
1459
+ template === "freeform" && /* @__PURE__ */ jsxs3(
1288
1460
  "div",
1289
1461
  {
1290
1462
  style: {
@@ -1294,15 +1466,15 @@ function TestDetailScreen({ testId, nav }) {
1294
1466
  border: "1px solid #854d0e"
1295
1467
  },
1296
1468
  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" })
1469
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
1470
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
1471
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
1472
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
1301
1473
  ]
1302
1474
  }
1303
1475
  )
1304
1476
  ] }),
1305
- testCase.expectedResult && /* @__PURE__ */ jsxs2(
1477
+ testCase.expectedResult && /* @__PURE__ */ jsxs3(
1306
1478
  "div",
1307
1479
  {
1308
1480
  style: {
@@ -1313,12 +1485,12 @@ function TestDetailScreen({ testId, nav }) {
1313
1485
  marginBottom: 12
1314
1486
  },
1315
1487
  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 })
1488
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
1489
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
1318
1490
  ]
1319
1491
  }
1320
1492
  ),
1321
- testCase.targetRoute && onNavigate && /* @__PURE__ */ jsx3(
1493
+ testCase.targetRoute && onNavigate && /* @__PURE__ */ jsx4(
1322
1494
  "button",
1323
1495
  {
1324
1496
  type: "button",
@@ -1340,7 +1512,7 @@ function TestDetailScreen({ testId, nav }) {
1340
1512
  children: "\u{1F9ED} Go to test location"
1341
1513
  }
1342
1514
  ),
1343
- /* @__PURE__ */ jsxs2(
1515
+ /* @__PURE__ */ jsxs3(
1344
1516
  "button",
1345
1517
  {
1346
1518
  type: "button",
@@ -1364,7 +1536,7 @@ function TestDetailScreen({ testId, nav }) {
1364
1536
  ]
1365
1537
  }
1366
1538
  ),
1367
- showDetails && /* @__PURE__ */ jsxs2(
1539
+ showDetails && /* @__PURE__ */ jsxs3(
1368
1540
  "div",
1369
1541
  {
1370
1542
  style: {
@@ -1375,7 +1547,7 @@ function TestDetailScreen({ testId, nav }) {
1375
1547
  marginBottom: 16
1376
1548
  },
1377
1549
  children: [
1378
- testCase.testKey && /* @__PURE__ */ jsxs2(
1550
+ testCase.testKey && /* @__PURE__ */ jsxs3(
1379
1551
  "div",
1380
1552
  {
1381
1553
  style: {
@@ -1393,16 +1565,16 @@ function TestDetailScreen({ testId, nav }) {
1393
1565
  ]
1394
1566
  }
1395
1567
  ),
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: [
1568
+ testCase.description && /* @__PURE__ */ jsx4("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
1569
+ testCase.group && /* @__PURE__ */ jsx4("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ jsxs3("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
1398
1570
  "\u{1F4C1} ",
1399
1571
  testCase.group.name
1400
1572
  ] }) })
1401
1573
  ]
1402
1574
  }
1403
1575
  ),
1404
- /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1405
- /* @__PURE__ */ jsx3(
1576
+ /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1577
+ /* @__PURE__ */ jsx4(
1406
1578
  "button",
1407
1579
  {
1408
1580
  type: "button",
@@ -1425,7 +1597,7 @@ function TestDetailScreen({ testId, nav }) {
1425
1597
  children: isSubmitting ? "Failing..." : "Fail"
1426
1598
  }
1427
1599
  ),
1428
- /* @__PURE__ */ jsx3(
1600
+ /* @__PURE__ */ jsx4(
1429
1601
  "button",
1430
1602
  {
1431
1603
  type: "button",
@@ -1448,7 +1620,7 @@ function TestDetailScreen({ testId, nav }) {
1448
1620
  children: "Skip"
1449
1621
  }
1450
1622
  ),
1451
- /* @__PURE__ */ jsx3(
1623
+ /* @__PURE__ */ jsx4(
1452
1624
  "button",
1453
1625
  {
1454
1626
  type: "button",
@@ -1472,7 +1644,7 @@ function TestDetailScreen({ testId, nav }) {
1472
1644
  }
1473
1645
  )
1474
1646
  ] }),
1475
- showSkipModal && /* @__PURE__ */ jsx3(
1647
+ showSkipModal && /* @__PURE__ */ jsx4(
1476
1648
  "div",
1477
1649
  {
1478
1650
  style: {
@@ -1485,7 +1657,7 @@ function TestDetailScreen({ testId, nav }) {
1485
1657
  zIndex: 9999,
1486
1658
  padding: 24
1487
1659
  },
1488
- children: /* @__PURE__ */ jsxs2(
1660
+ children: /* @__PURE__ */ jsxs3(
1489
1661
  "div",
1490
1662
  {
1491
1663
  style: {
@@ -1497,7 +1669,7 @@ function TestDetailScreen({ testId, nav }) {
1497
1669
  width: "100%"
1498
1670
  },
1499
1671
  children: [
1500
- /* @__PURE__ */ jsx3(
1672
+ /* @__PURE__ */ jsx4(
1501
1673
  "div",
1502
1674
  {
1503
1675
  style: {
@@ -1509,8 +1681,8 @@ function TestDetailScreen({ testId, nav }) {
1509
1681
  children: "Skip this test?"
1510
1682
  }
1511
1683
  ),
1512
- /* @__PURE__ */ jsx3("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1513
- skipReasons.map(({ reason, label }) => /* @__PURE__ */ jsx3(
1684
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1685
+ skipReasons.map(({ reason, label }) => /* @__PURE__ */ jsx4(
1514
1686
  "button",
1515
1687
  {
1516
1688
  type: "button",
@@ -1536,7 +1708,7 @@ function TestDetailScreen({ testId, nav }) {
1536
1708
  },
1537
1709
  reason
1538
1710
  )),
1539
- /* @__PURE__ */ jsx3(
1711
+ /* @__PURE__ */ jsx4(
1540
1712
  "textarea",
1541
1713
  {
1542
1714
  value: skipNotes,
@@ -1559,8 +1731,8 @@ function TestDetailScreen({ testId, nav }) {
1559
1731
  }
1560
1732
  }
1561
1733
  ),
1562
- /* @__PURE__ */ jsxs2("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1563
- /* @__PURE__ */ jsx3(
1734
+ /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1735
+ /* @__PURE__ */ jsx4(
1564
1736
  "button",
1565
1737
  {
1566
1738
  type: "button",
@@ -1584,7 +1756,7 @@ function TestDetailScreen({ testId, nav }) {
1584
1756
  children: "Cancel"
1585
1757
  }
1586
1758
  ),
1587
- /* @__PURE__ */ jsx3(
1759
+ /* @__PURE__ */ jsx4(
1588
1760
  "button",
1589
1761
  {
1590
1762
  type: "button",
@@ -1618,11 +1790,14 @@ function TestDetailScreen({ testId, nav }) {
1618
1790
 
1619
1791
  // src/widget/screens/TestListScreen.tsx
1620
1792
  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";
1793
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1622
1794
  function TestListScreen({ nav }) {
1623
- const { assignments, currentAssignment, refreshAssignments } = useBugBear();
1795
+ const { assignments, currentAssignment, refreshAssignments, isLoading } = useBugBear();
1624
1796
  const [filter, setFilter] = useState3("all");
1625
1797
  const [roleFilter, setRoleFilter] = useState3(null);
1798
+ const [trackFilter, setTrackFilter] = useState3(null);
1799
+ const [searchQuery, setSearchQuery] = useState3("");
1800
+ const [sortMode, setSortMode] = useState3("priority");
1626
1801
  const [collapsedFolders, setCollapsedFolders] = useState3(/* @__PURE__ */ new Set());
1627
1802
  const availableRoles = useMemo(() => {
1628
1803
  const roleMap = /* @__PURE__ */ new Map();
@@ -1631,6 +1806,13 @@ function TestListScreen({ nav }) {
1631
1806
  }
1632
1807
  return Array.from(roleMap.values());
1633
1808
  }, [assignments]);
1809
+ const availableTracks = useMemo(() => {
1810
+ const trackMap = /* @__PURE__ */ new Map();
1811
+ for (const a of assignments) {
1812
+ if (a.testCase.track) trackMap.set(a.testCase.track.id, a.testCase.track);
1813
+ }
1814
+ return Array.from(trackMap.values());
1815
+ }, [assignments]);
1634
1816
  const selectedRole = availableRoles.find((r) => r.id === roleFilter);
1635
1817
  const groupedAssignments = useMemo(() => {
1636
1818
  const groups = /* @__PURE__ */ new Map();
@@ -1664,6 +1846,12 @@ function TestListScreen({ nav }) {
1664
1846
  folder.assignments.sort((a, b) => {
1665
1847
  if (a.isVerification && !b.isVerification) return -1;
1666
1848
  if (!a.isVerification && b.isVerification) return 1;
1849
+ if (sortMode === "alpha") {
1850
+ return a.testCase.title.localeCompare(b.testCase.title);
1851
+ }
1852
+ if (sortMode === "recent") {
1853
+ return 0;
1854
+ }
1667
1855
  const sd = (statusOrder[a.status] ?? 5) - (statusOrder[b.status] ?? 5);
1668
1856
  if (sd !== 0) return sd;
1669
1857
  return (priorityOrder[a.testCase.priority] ?? 4) - (priorityOrder[b.testCase.priority] ?? 4);
@@ -1675,7 +1863,7 @@ function TestListScreen({ nav }) {
1675
1863
  if (!b.group) return -1;
1676
1864
  return a.group.sortOrder - b.group.sortOrder;
1677
1865
  });
1678
- }, [assignments]);
1866
+ }, [assignments, sortMode]);
1679
1867
  const toggleFolder = useCallback3((id) => {
1680
1868
  setCollapsedFolders((prev) => {
1681
1869
  const next = new Set(prev);
@@ -1684,13 +1872,20 @@ function TestListScreen({ nav }) {
1684
1872
  return next;
1685
1873
  });
1686
1874
  }, []);
1687
- const filterAssignment = (a) => {
1875
+ const filterAssignment = useCallback3((a) => {
1688
1876
  if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
1877
+ if (trackFilter && a.testCase.track?.id !== trackFilter) return false;
1878
+ if (searchQuery) {
1879
+ const q = searchQuery.toLowerCase();
1880
+ const titleMatch = a.testCase.title.toLowerCase().includes(q);
1881
+ const keyMatch = a.testCase.testKey.toLowerCase().includes(q);
1882
+ if (!titleMatch && !keyMatch) return false;
1883
+ }
1689
1884
  if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
1690
1885
  if (filter === "done") return a.status === "passed";
1691
1886
  if (filter === "reopened") return a.status === "failed";
1692
1887
  return true;
1693
- };
1888
+ }, [roleFilter, trackFilter, searchQuery, filter]);
1694
1889
  const pendingCount = assignments.filter(
1695
1890
  (a) => a.status === "pending" || a.status === "in_progress"
1696
1891
  ).length;
@@ -1702,8 +1897,9 @@ function TestListScreen({ nav }) {
1702
1897
  { key: "done", label: "Done", count: doneCount },
1703
1898
  { key: "reopened", label: "Re Opened", count: reopenedCount }
1704
1899
  ];
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(
1900
+ if (isLoading) return /* @__PURE__ */ jsx5(TestListScreenSkeleton, {});
1901
+ return /* @__PURE__ */ jsxs4("div", { children: [
1902
+ /* @__PURE__ */ jsx5("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ jsxs4(
1707
1903
  "button",
1708
1904
  {
1709
1905
  type: "button",
@@ -1730,9 +1926,9 @@ function TestListScreen({ nav }) {
1730
1926
  },
1731
1927
  f.key
1732
1928
  )) }),
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(
1929
+ availableRoles.length >= 2 && /* @__PURE__ */ jsxs4("div", { style: { marginBottom: 12 }, children: [
1930
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
1931
+ /* @__PURE__ */ jsx5(
1736
1932
  "button",
1737
1933
  {
1738
1934
  type: "button",
@@ -1755,7 +1951,7 @@ function TestListScreen({ nav }) {
1755
1951
  ),
1756
1952
  availableRoles.map((role) => {
1757
1953
  const isActive = roleFilter === role.id;
1758
- return /* @__PURE__ */ jsxs3(
1954
+ return /* @__PURE__ */ jsxs4(
1759
1955
  "button",
1760
1956
  {
1761
1957
  type: "button",
@@ -1777,7 +1973,7 @@ function TestListScreen({ nav }) {
1777
1973
  fontWeight: isActive ? 600 : 400
1778
1974
  },
1779
1975
  children: [
1780
- /* @__PURE__ */ jsx4("span", { style: {
1976
+ /* @__PURE__ */ jsx5("span", { style: {
1781
1977
  width: 6,
1782
1978
  height: 6,
1783
1979
  borderRadius: 3,
@@ -1791,7 +1987,7 @@ function TestListScreen({ nav }) {
1791
1987
  );
1792
1988
  })
1793
1989
  ] }),
1794
- selectedRole?.loginHint && /* @__PURE__ */ jsxs3("div", { style: {
1990
+ selectedRole?.loginHint && /* @__PURE__ */ jsxs4("div", { style: {
1795
1991
  fontSize: 11,
1796
1992
  color: colors.textSecondary,
1797
1993
  backgroundColor: selectedRole.color + "10",
@@ -1803,6 +1999,103 @@ function TestListScreen({ nav }) {
1803
1999
  selectedRole.loginHint
1804
2000
  ] })
1805
2001
  ] }),
2002
+ /* @__PURE__ */ jsx5("div", { style: { marginBottom: 8 }, children: /* @__PURE__ */ jsx5(
2003
+ "input",
2004
+ {
2005
+ type: "text",
2006
+ value: searchQuery,
2007
+ onChange: (e) => setSearchQuery(e.target.value),
2008
+ placeholder: "Search tests...",
2009
+ style: {
2010
+ width: "100%",
2011
+ padding: "8px 12px",
2012
+ borderRadius: 8,
2013
+ border: `1px solid ${colors.border}`,
2014
+ backgroundColor: colors.card,
2015
+ color: colors.textPrimary,
2016
+ fontSize: 13,
2017
+ outline: "none",
2018
+ boxSizing: "border-box"
2019
+ }
2020
+ }
2021
+ ) }),
2022
+ (availableTracks.length >= 2 || true) && /* @__PURE__ */ jsxs4("div", { style: { display: "flex", alignItems: "center", gap: 6, marginBottom: 12 }, children: [
2023
+ availableTracks.length >= 2 && /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: 4, flex: 1, overflow: "auto" }, children: [
2024
+ /* @__PURE__ */ jsx5(
2025
+ "button",
2026
+ {
2027
+ type: "button",
2028
+ onClick: () => setTrackFilter(null),
2029
+ style: {
2030
+ padding: "3px 8px",
2031
+ borderRadius: 6,
2032
+ backgroundColor: !trackFilter ? colors.card : "transparent",
2033
+ border: !trackFilter ? `1px solid ${colors.border}` : "1px solid transparent",
2034
+ cursor: "pointer",
2035
+ fontSize: 11,
2036
+ color: !trackFilter ? colors.textPrimary : colors.textMuted,
2037
+ fontWeight: !trackFilter ? 600 : 400,
2038
+ whiteSpace: "nowrap"
2039
+ },
2040
+ children: "All Tracks"
2041
+ }
2042
+ ),
2043
+ availableTracks.map((track) => {
2044
+ const isActive = trackFilter === track.id;
2045
+ return /* @__PURE__ */ jsxs4(
2046
+ "button",
2047
+ {
2048
+ type: "button",
2049
+ onClick: () => setTrackFilter(isActive ? null : track.id),
2050
+ style: {
2051
+ display: "flex",
2052
+ alignItems: "center",
2053
+ gap: 4,
2054
+ padding: "3px 8px",
2055
+ borderRadius: 6,
2056
+ backgroundColor: isActive ? track.color + "20" : "transparent",
2057
+ border: isActive ? `1px solid ${track.color}60` : "1px solid transparent",
2058
+ cursor: "pointer",
2059
+ fontSize: 11,
2060
+ color: isActive ? track.color : colors.textMuted,
2061
+ fontWeight: isActive ? 600 : 400,
2062
+ whiteSpace: "nowrap"
2063
+ },
2064
+ children: [
2065
+ track.icon,
2066
+ " ",
2067
+ track.name
2068
+ ]
2069
+ },
2070
+ track.id
2071
+ );
2072
+ })
2073
+ ] }),
2074
+ /* @__PURE__ */ jsx5("div", { style: { display: "flex", gap: 2, marginLeft: "auto", flexShrink: 0 }, children: [
2075
+ { key: "priority", label: "\u2195 Priority" },
2076
+ { key: "recent", label: "\u{1F550} Recent" },
2077
+ { key: "alpha", label: "A-Z" }
2078
+ ].map((s) => /* @__PURE__ */ jsx5(
2079
+ "button",
2080
+ {
2081
+ type: "button",
2082
+ onClick: () => setSortMode(s.key),
2083
+ style: {
2084
+ padding: "3px 8px",
2085
+ borderRadius: 6,
2086
+ backgroundColor: sortMode === s.key ? colors.card : "transparent",
2087
+ border: sortMode === s.key ? `1px solid ${colors.border}` : "1px solid transparent",
2088
+ cursor: "pointer",
2089
+ fontSize: 10,
2090
+ color: sortMode === s.key ? colors.textPrimary : colors.textMuted,
2091
+ fontWeight: sortMode === s.key ? 600 : 400,
2092
+ whiteSpace: "nowrap"
2093
+ },
2094
+ children: s.label
2095
+ },
2096
+ s.key
2097
+ )) })
2098
+ ] }),
1806
2099
  groupedAssignments.map((folder) => {
1807
2100
  const folderId = folder.group?.id || "ungrouped";
1808
2101
  const isCollapsed = collapsedFolders.has(folderId);
@@ -1810,8 +2103,8 @@ function TestListScreen({ nav }) {
1810
2103
  if (filtered.length === 0 && filter !== "all") return null;
1811
2104
  const completedInFolder = folder.stats.passed + folder.stats.failed;
1812
2105
  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(
2106
+ return /* @__PURE__ */ jsxs4("div", { style: { marginBottom: 12 }, children: [
2107
+ /* @__PURE__ */ jsxs4(
1815
2108
  "button",
1816
2109
  {
1817
2110
  type: "button",
@@ -1831,8 +2124,8 @@ function TestListScreen({ nav }) {
1831
2124
  textAlign: "left"
1832
2125
  },
1833
2126
  children: [
1834
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
1835
- /* @__PURE__ */ jsx4(
2127
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
2128
+ /* @__PURE__ */ jsx5(
1836
2129
  "span",
1837
2130
  {
1838
2131
  style: {
@@ -1847,7 +2140,7 @@ function TestListScreen({ nav }) {
1847
2140
  children: folder.group?.name || "Ungrouped"
1848
2141
  }
1849
2142
  ),
1850
- /* @__PURE__ */ jsx4(
2143
+ /* @__PURE__ */ jsx5(
1851
2144
  "div",
1852
2145
  {
1853
2146
  style: {
@@ -1858,7 +2151,7 @@ function TestListScreen({ nav }) {
1858
2151
  overflow: "hidden",
1859
2152
  flexShrink: 0
1860
2153
  },
1861
- children: /* @__PURE__ */ jsx4(
2154
+ children: /* @__PURE__ */ jsx5(
1862
2155
  "div",
1863
2156
  {
1864
2157
  style: {
@@ -1872,7 +2165,7 @@ function TestListScreen({ nav }) {
1872
2165
  )
1873
2166
  }
1874
2167
  ),
1875
- /* @__PURE__ */ jsxs3(
2168
+ /* @__PURE__ */ jsxs4(
1876
2169
  "span",
1877
2170
  {
1878
2171
  style: {
@@ -1896,7 +2189,7 @@ function TestListScreen({ nav }) {
1896
2189
  const badge = getStatusBadge(assignment.status);
1897
2190
  const isCurrent = currentAssignment?.id === assignment.id;
1898
2191
  const priorityColor = assignment.testCase.priority === "P0" ? colors.red : assignment.testCase.priority === "P1" ? colors.orange : colors.textDim;
1899
- return /* @__PURE__ */ jsxs3(
2192
+ return /* @__PURE__ */ jsxs4(
1900
2193
  "button",
1901
2194
  {
1902
2195
  type: "button",
@@ -1918,9 +2211,9 @@ function TestListScreen({ nav }) {
1918
2211
  textAlign: "left"
1919
2212
  },
1920
2213
  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(
2214
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
2215
+ /* @__PURE__ */ jsxs4("div", { style: { flex: 1, minWidth: 0 }, children: [
2216
+ /* @__PURE__ */ jsx5(
1924
2217
  "div",
1925
2218
  {
1926
2219
  style: {
@@ -1934,9 +2227,9 @@ function TestListScreen({ nav }) {
1934
2227
  children: assignment.testCase.title
1935
2228
  }
1936
2229
  ),
1937
- /* @__PURE__ */ jsxs3("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
1938
- assignment.isVerification && /* @__PURE__ */ jsxs3(Fragment2, { children: [
1939
- /* @__PURE__ */ jsx4(
2230
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
2231
+ assignment.isVerification && /* @__PURE__ */ jsxs4(Fragment2, { children: [
2232
+ /* @__PURE__ */ jsx5(
1940
2233
  "span",
1941
2234
  {
1942
2235
  style: {
@@ -1951,9 +2244,9 @@ function TestListScreen({ nav }) {
1951
2244
  children: "Retest"
1952
2245
  }
1953
2246
  ),
1954
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
2247
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
1955
2248
  ] }),
1956
- /* @__PURE__ */ jsx4(
2249
+ /* @__PURE__ */ jsx5(
1957
2250
  "span",
1958
2251
  {
1959
2252
  style: {
@@ -1964,8 +2257,8 @@ function TestListScreen({ nav }) {
1964
2257
  children: assignment.testCase.testKey
1965
2258
  }
1966
2259
  ),
1967
- /* @__PURE__ */ jsx4("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
1968
- /* @__PURE__ */ jsx4(
2260
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2261
+ /* @__PURE__ */ jsx5(
1969
2262
  "span",
1970
2263
  {
1971
2264
  style: {
@@ -1976,9 +2269,9 @@ function TestListScreen({ nav }) {
1976
2269
  children: assignment.testCase.priority
1977
2270
  }
1978
2271
  ),
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: {
2272
+ assignment.testCase.role && /* @__PURE__ */ jsxs4(Fragment2, { children: [
2273
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2274
+ /* @__PURE__ */ jsxs4("span", { style: {
1982
2275
  display: "inline-flex",
1983
2276
  alignItems: "center",
1984
2277
  gap: 3,
@@ -1986,7 +2279,7 @@ function TestListScreen({ nav }) {
1986
2279
  color: assignment.testCase.role.color,
1987
2280
  fontWeight: 500
1988
2281
  }, children: [
1989
- /* @__PURE__ */ jsx4("span", { style: {
2282
+ /* @__PURE__ */ jsx5("span", { style: {
1990
2283
  width: 5,
1991
2284
  height: 5,
1992
2285
  borderRadius: 3,
@@ -1997,7 +2290,7 @@ function TestListScreen({ nav }) {
1997
2290
  ] })
1998
2291
  ] })
1999
2292
  ] }),
2000
- /* @__PURE__ */ jsx4(
2293
+ /* @__PURE__ */ jsx5(
2001
2294
  "span",
2002
2295
  {
2003
2296
  style: {
@@ -2024,7 +2317,7 @@ function TestListScreen({ nav }) {
2024
2317
  groupedAssignments.every((folder) => {
2025
2318
  const filtered = folder.assignments.filter(filterAssignment);
2026
2319
  return filtered.length === 0;
2027
- }) && /* @__PURE__ */ jsxs3(
2320
+ }) && /* @__PURE__ */ jsxs4(
2028
2321
  "div",
2029
2322
  {
2030
2323
  style: {
@@ -2034,12 +2327,12 @@ function TestListScreen({ nav }) {
2034
2327
  padding: 32
2035
2328
  },
2036
2329
  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" })
2330
+ /* @__PURE__ */ jsx5("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
2331
+ /* @__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
2332
  ]
2040
2333
  }
2041
2334
  ),
2042
- /* @__PURE__ */ jsx4("div", { style: { display: "flex", justifyContent: "center", paddingTop: 12, paddingBottom: 8 }, children: /* @__PURE__ */ jsx4(
2335
+ /* @__PURE__ */ jsx5("div", { style: { display: "flex", justifyContent: "center", paddingTop: 12, paddingBottom: 8 }, children: /* @__PURE__ */ jsx5(
2043
2336
  "button",
2044
2337
  {
2045
2338
  type: "button",
@@ -2135,13 +2428,13 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
2135
2428
  }
2136
2429
 
2137
2430
  // src/widget/ImagePreviewStrip.tsx
2138
- import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
2431
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2139
2432
  function ImagePreviewStrip({ images, onRemove }) {
2140
2433
  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: {
2434
+ return /* @__PURE__ */ jsxs5("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
2435
+ images.map((img) => /* @__PURE__ */ jsxs5("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
2436
+ /* @__PURE__ */ jsx6("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
2437
+ img.status === "uploading" && /* @__PURE__ */ jsx6("div", { style: {
2145
2438
  position: "absolute",
2146
2439
  inset: 0,
2147
2440
  backgroundColor: "rgba(0,0,0,0.5)",
@@ -2149,7 +2442,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2149
2442
  alignItems: "center",
2150
2443
  justifyContent: "center",
2151
2444
  borderRadius: 8
2152
- }, children: /* @__PURE__ */ jsx5("div", { style: {
2445
+ }, children: /* @__PURE__ */ jsx6("div", { style: {
2153
2446
  width: 16,
2154
2447
  height: 16,
2155
2448
  border: "2px solid #fff",
@@ -2157,7 +2450,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2157
2450
  borderRadius: "50%",
2158
2451
  animation: "bb-spin 0.6s linear infinite"
2159
2452
  } }) }),
2160
- img.status === "error" && /* @__PURE__ */ jsx5("div", { style: {
2453
+ img.status === "error" && /* @__PURE__ */ jsx6("div", { style: {
2161
2454
  position: "absolute",
2162
2455
  inset: 0,
2163
2456
  backgroundColor: "rgba(127,29,29,0.7)",
@@ -2165,8 +2458,8 @@ function ImagePreviewStrip({ images, onRemove }) {
2165
2458
  alignItems: "center",
2166
2459
  justifyContent: "center",
2167
2460
  borderRadius: 8
2168
- }, children: /* @__PURE__ */ jsx5("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2169
- /* @__PURE__ */ jsx5(
2461
+ }, children: /* @__PURE__ */ jsx6("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2462
+ /* @__PURE__ */ jsx6(
2170
2463
  "button",
2171
2464
  {
2172
2465
  type: "button",
@@ -2193,18 +2486,18 @@ function ImagePreviewStrip({ images, onRemove }) {
2193
2486
  }
2194
2487
  )
2195
2488
  ] }, img.id)),
2196
- /* @__PURE__ */ jsx5("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2489
+ /* @__PURE__ */ jsx6("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2197
2490
  ] });
2198
2491
  }
2199
2492
 
2200
2493
  // src/widget/ImagePickerButtons.tsx
2201
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2494
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2202
2495
  function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, onRemove, label }) {
2203
2496
  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(
2497
+ return /* @__PURE__ */ jsxs6("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
2498
+ label && /* @__PURE__ */ jsx7("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
2499
+ /* @__PURE__ */ jsxs6("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
2500
+ /* @__PURE__ */ jsx7(
2208
2501
  "button",
2209
2502
  {
2210
2503
  type: "button",
@@ -2225,7 +2518,7 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2225
2518
  children: "Gallery"
2226
2519
  }
2227
2520
  ),
2228
- /* @__PURE__ */ jsx6(
2521
+ /* @__PURE__ */ jsx7(
2229
2522
  "button",
2230
2523
  {
2231
2524
  type: "button",
@@ -2246,18 +2539,18 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2246
2539
  children: "Camera"
2247
2540
  }
2248
2541
  ),
2249
- /* @__PURE__ */ jsxs5("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2542
+ /* @__PURE__ */ jsxs6("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2250
2543
  images.length,
2251
2544
  "/",
2252
2545
  maxImages
2253
2546
  ] })
2254
2547
  ] }),
2255
- /* @__PURE__ */ jsx6(ImagePreviewStrip, { images, onRemove })
2548
+ /* @__PURE__ */ jsx7(ImagePreviewStrip, { images, onRemove })
2256
2549
  ] });
2257
2550
  }
2258
2551
 
2259
2552
  // src/widget/screens/TestFeedbackScreen.tsx
2260
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2553
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
2261
2554
  function TestFeedbackScreen({ status, assignmentId, nav }) {
2262
2555
  const { client, assignments, refreshAssignments, uploadImage } = useBugBear();
2263
2556
  const images = useImageAttachments(uploadImage, 3, "screenshots");
@@ -2290,6 +2583,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2290
2583
  }
2291
2584
  };
2292
2585
  const handleSubmit = async () => {
2586
+ if (submitting || images.isUploading) return;
2293
2587
  setSubmitting(true);
2294
2588
  if (client && assignment) {
2295
2589
  const screenshotUrls = images.getScreenshotUrls();
@@ -2325,10 +2619,10 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2325
2619
  { key: "stepsUnclear", label: "Steps are unclear" },
2326
2620
  { key: "expectedResultUnclear", label: "Expected result unclear" }
2327
2621
  ];
2328
- return /* @__PURE__ */ jsxs6("div", { style: styles.container, children: [
2329
- /* @__PURE__ */ jsx7("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2330
- /* @__PURE__ */ jsx7("div", { style: styles.subheader, children: "Rate this test case" }),
2331
- /* @__PURE__ */ jsx7("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx7(
2622
+ return /* @__PURE__ */ jsxs7("div", { style: styles.container, children: [
2623
+ /* @__PURE__ */ jsx8("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2624
+ /* @__PURE__ */ jsx8("div", { style: styles.subheader, children: "Rate this test case" }),
2625
+ /* @__PURE__ */ jsx8("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ jsx8(
2332
2626
  "button",
2333
2627
  {
2334
2628
  onClick: () => setRating(n),
@@ -2340,9 +2634,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2340
2634
  },
2341
2635
  n
2342
2636
  )) }),
2343
- showFlags && /* @__PURE__ */ jsxs6("div", { style: styles.flagsSection, children: [
2344
- /* @__PURE__ */ jsx7("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2345
- flagOptions.map(({ key, label }) => /* @__PURE__ */ jsxs6(
2637
+ showFlags && /* @__PURE__ */ jsxs7("div", { style: styles.flagsSection, children: [
2638
+ /* @__PURE__ */ jsx8("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2639
+ flagOptions.map(({ key, label }) => /* @__PURE__ */ jsxs7(
2346
2640
  "button",
2347
2641
  {
2348
2642
  onClick: () => toggleFlag(key),
@@ -2351,17 +2645,17 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2351
2645
  ...flags[key] ? styles.flagItemActive : {}
2352
2646
  },
2353
2647
  children: [
2354
- /* @__PURE__ */ jsx7(
2648
+ /* @__PURE__ */ jsx8(
2355
2649
  "div",
2356
2650
  {
2357
2651
  style: {
2358
2652
  ...styles.flagCheck,
2359
2653
  ...flags[key] ? styles.flagCheckActive : {}
2360
2654
  },
2361
- children: flags[key] && /* @__PURE__ */ jsx7("span", { style: styles.flagCheckmark, children: "\u2713" })
2655
+ children: flags[key] && /* @__PURE__ */ jsx8("span", { style: styles.flagCheckmark, children: "\u2713" })
2362
2656
  }
2363
2657
  ),
2364
- /* @__PURE__ */ jsx7(
2658
+ /* @__PURE__ */ jsx8(
2365
2659
  "span",
2366
2660
  {
2367
2661
  style: {
@@ -2376,7 +2670,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2376
2670
  key
2377
2671
  ))
2378
2672
  ] }),
2379
- /* @__PURE__ */ jsx7(
2673
+ /* @__PURE__ */ jsx8(
2380
2674
  "textarea",
2381
2675
  {
2382
2676
  style: styles.noteInput,
@@ -2386,7 +2680,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2386
2680
  rows: 3
2387
2681
  }
2388
2682
  ),
2389
- /* @__PURE__ */ jsx7(
2683
+ /* @__PURE__ */ jsx8(
2390
2684
  ImagePickerButtons,
2391
2685
  {
2392
2686
  images: images.images,
@@ -2397,9 +2691,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2397
2691
  label: "Screenshots (optional)"
2398
2692
  }
2399
2693
  ),
2400
- /* @__PURE__ */ jsxs6("div", { style: styles.actions, children: [
2401
- /* @__PURE__ */ jsx7("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2402
- /* @__PURE__ */ jsx7(
2694
+ /* @__PURE__ */ jsxs7("div", { style: styles.actions, children: [
2695
+ /* @__PURE__ */ jsx8("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2696
+ /* @__PURE__ */ jsx8(
2403
2697
  "button",
2404
2698
  {
2405
2699
  style: {
@@ -2552,7 +2846,7 @@ var styles = {
2552
2846
  import React6, { useState as useState6, useRef as useRef2 } from "react";
2553
2847
 
2554
2848
  // src/widget/CategoryDropdown.tsx
2555
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
2849
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
2556
2850
  var categoryOptions = [
2557
2851
  { value: "ui_ux", label: "UI/UX", icon: "\u{1F3A8}" },
2558
2852
  { value: "functional", label: "Functional", icon: "\u2699\uFE0F" },
@@ -2561,7 +2855,7 @@ var categoryOptions = [
2561
2855
  { value: "other", label: "Other", icon: "\u{1F4DD}" }
2562
2856
  ];
2563
2857
  function CategoryDropdown({ value, onChange, optional = true, disabled = false }) {
2564
- return /* @__PURE__ */ jsxs7(
2858
+ return /* @__PURE__ */ jsxs8(
2565
2859
  "select",
2566
2860
  {
2567
2861
  value: value || "",
@@ -2584,8 +2878,8 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2584
2878
  paddingRight: 32
2585
2879
  },
2586
2880
  children: [
2587
- /* @__PURE__ */ jsx8("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
2588
- categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ jsxs7("option", { value: value2, children: [
2881
+ /* @__PURE__ */ jsx9("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
2882
+ categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ jsxs8("option", { value: value2, children: [
2589
2883
  icon,
2590
2884
  " ",
2591
2885
  label
@@ -2596,7 +2890,7 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2596
2890
  }
2597
2891
 
2598
2892
  // src/widget/screens/ReportScreen.tsx
2599
- import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
2893
+ import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
2600
2894
  function ReportScreen({ nav, prefill }) {
2601
2895
  const { client, refreshAssignments, uploadImage } = useBugBear();
2602
2896
  const images = useImageAttachments(uploadImage, 5, "screenshots");
@@ -2671,17 +2965,17 @@ function ReportScreen({ nav, prefill }) {
2671
2965
  { sev: "medium", color: "#eab308" },
2672
2966
  { sev: "low", color: "#6b7280" }
2673
2967
  ];
2674
- return /* @__PURE__ */ jsx9("div", { children: isRetestFailure ? /* @__PURE__ */ jsxs8(Fragment3, { children: [
2675
- /* @__PURE__ */ jsxs8("div", { style: styles2.retestBanner, children: [
2676
- /* @__PURE__ */ jsx9("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
2677
- /* @__PURE__ */ jsxs8("div", { children: [
2678
- /* @__PURE__ */ jsx9("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
2679
- /* @__PURE__ */ jsx9("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
2968
+ return /* @__PURE__ */ jsx10("div", { children: isRetestFailure ? /* @__PURE__ */ jsxs9(Fragment3, { children: [
2969
+ /* @__PURE__ */ jsxs9("div", { style: styles2.retestBanner, children: [
2970
+ /* @__PURE__ */ jsx10("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
2971
+ /* @__PURE__ */ jsxs9("div", { children: [
2972
+ /* @__PURE__ */ jsx10("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
2973
+ /* @__PURE__ */ jsx10("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
2680
2974
  ] })
2681
2975
  ] }),
2682
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2683
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Severity" }),
2684
- /* @__PURE__ */ jsx9("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx9(
2976
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
2977
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Severity" }),
2978
+ /* @__PURE__ */ jsx10("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx10(
2685
2979
  "button",
2686
2980
  {
2687
2981
  onClick: () => setSeverity(sev),
@@ -2689,18 +2983,18 @@ function ReportScreen({ nav, prefill }) {
2689
2983
  ...styles2.sevButton,
2690
2984
  ...severity === sev ? { backgroundColor: `${color}30`, borderColor: color } : {}
2691
2985
  },
2692
- children: /* @__PURE__ */ jsx9("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
2986
+ children: /* @__PURE__ */ jsx10("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
2693
2987
  },
2694
2988
  sev
2695
2989
  )) })
2696
2990
  ] }),
2697
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2698
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Category (optional)" }),
2699
- /* @__PURE__ */ jsx9(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2991
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
2992
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Category (optional)" }),
2993
+ /* @__PURE__ */ jsx10(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2700
2994
  ] }),
2701
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2702
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "What went wrong?" }),
2703
- /* @__PURE__ */ jsx9(
2995
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
2996
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "What went wrong?" }),
2997
+ /* @__PURE__ */ jsx10(
2704
2998
  "textarea",
2705
2999
  {
2706
3000
  style: styles2.descInput,
@@ -2711,7 +3005,7 @@ function ReportScreen({ nav, prefill }) {
2711
3005
  }
2712
3006
  )
2713
3007
  ] }),
2714
- /* @__PURE__ */ jsx9(
3008
+ /* @__PURE__ */ jsx10(
2715
3009
  ImagePickerButtons,
2716
3010
  {
2717
3011
  images: images.images,
@@ -2722,8 +3016,8 @@ function ReportScreen({ nav, prefill }) {
2722
3016
  label: "Attachments (optional)"
2723
3017
  }
2724
3018
  ),
2725
- error && /* @__PURE__ */ jsx9("div", { style: styles2.errorBanner, children: error }),
2726
- /* @__PURE__ */ jsx9(
3019
+ error && /* @__PURE__ */ jsx10("div", { style: styles2.errorBanner, children: error }),
3020
+ /* @__PURE__ */ jsx10(
2727
3021
  "button",
2728
3022
  {
2729
3023
  style: {
@@ -2736,9 +3030,9 @@ function ReportScreen({ nav, prefill }) {
2736
3030
  children: images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest"
2737
3031
  }
2738
3032
  )
2739
- ] }) : /* @__PURE__ */ jsxs8(Fragment3, { children: [
2740
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "What are you reporting?" }),
2741
- /* @__PURE__ */ jsx9("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ jsxs8(
3033
+ ] }) : /* @__PURE__ */ jsxs9(Fragment3, { children: [
3034
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "What are you reporting?" }),
3035
+ /* @__PURE__ */ jsx10("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ jsxs9(
2742
3036
  "button",
2743
3037
  {
2744
3038
  onClick: () => setReportType(type),
@@ -2747,8 +3041,8 @@ function ReportScreen({ nav, prefill }) {
2747
3041
  ...reportType === type ? styles2.typeCardActive : {}
2748
3042
  },
2749
3043
  children: [
2750
- /* @__PURE__ */ jsx9("div", { style: styles2.typeIcon, children: icon }),
2751
- /* @__PURE__ */ jsx9(
3044
+ /* @__PURE__ */ jsx10("div", { style: styles2.typeIcon, children: icon }),
3045
+ /* @__PURE__ */ jsx10(
2752
3046
  "div",
2753
3047
  {
2754
3048
  style: {
@@ -2762,9 +3056,9 @@ function ReportScreen({ nav, prefill }) {
2762
3056
  },
2763
3057
  type
2764
3058
  )) }),
2765
- isBugType && /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2766
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Severity" }),
2767
- /* @__PURE__ */ jsx9("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx9(
3059
+ isBugType && /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3060
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Severity" }),
3061
+ /* @__PURE__ */ jsx10("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ jsx10(
2768
3062
  "button",
2769
3063
  {
2770
3064
  onClick: () => setSeverity(sev),
@@ -2775,7 +3069,7 @@ function ReportScreen({ nav, prefill }) {
2775
3069
  borderColor: color
2776
3070
  } : {}
2777
3071
  },
2778
- children: /* @__PURE__ */ jsx9(
3072
+ children: /* @__PURE__ */ jsx10(
2779
3073
  "span",
2780
3074
  {
2781
3075
  style: {
@@ -2789,13 +3083,13 @@ function ReportScreen({ nav, prefill }) {
2789
3083
  sev
2790
3084
  )) })
2791
3085
  ] }),
2792
- isBugType && /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2793
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Category (optional)" }),
2794
- /* @__PURE__ */ jsx9(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
3086
+ isBugType && /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3087
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Category (optional)" }),
3088
+ /* @__PURE__ */ jsx10(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2795
3089
  ] }),
2796
- /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2797
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "What happened?" }),
2798
- /* @__PURE__ */ jsx9(
3090
+ /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3091
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "What happened?" }),
3092
+ /* @__PURE__ */ jsx10(
2799
3093
  "textarea",
2800
3094
  {
2801
3095
  style: styles2.descInput,
@@ -2806,9 +3100,9 @@ function ReportScreen({ nav, prefill }) {
2806
3100
  }
2807
3101
  )
2808
3102
  ] }),
2809
- isBugType && /* @__PURE__ */ jsxs8("div", { style: styles2.section, children: [
2810
- /* @__PURE__ */ jsx9("div", { style: styles2.label, children: "Where did it happen?" }),
2811
- /* @__PURE__ */ jsx9(
3103
+ isBugType && /* @__PURE__ */ jsxs9("div", { style: styles2.section, children: [
3104
+ /* @__PURE__ */ jsx10("div", { style: styles2.label, children: "Where did it happen?" }),
3105
+ /* @__PURE__ */ jsx10(
2812
3106
  "input",
2813
3107
  {
2814
3108
  style: styles2.routeInput,
@@ -2817,13 +3111,13 @@ function ReportScreen({ nav, prefill }) {
2817
3111
  placeholder: observedRoute.current
2818
3112
  }
2819
3113
  ),
2820
- /* @__PURE__ */ jsxs8("div", { style: styles2.routeHint, children: [
3114
+ /* @__PURE__ */ jsxs9("div", { style: styles2.routeHint, children: [
2821
3115
  "Leave blank to use current page (",
2822
3116
  observedRoute.current,
2823
3117
  ")"
2824
3118
  ] })
2825
3119
  ] }),
2826
- /* @__PURE__ */ jsx9(
3120
+ /* @__PURE__ */ jsx10(
2827
3121
  ImagePickerButtons,
2828
3122
  {
2829
3123
  images: images.images,
@@ -2834,8 +3128,8 @@ function ReportScreen({ nav, prefill }) {
2834
3128
  label: "Screenshots (optional)"
2835
3129
  }
2836
3130
  ),
2837
- error && /* @__PURE__ */ jsx9("div", { style: styles2.errorBanner, children: error }),
2838
- /* @__PURE__ */ jsx9(
3131
+ error && /* @__PURE__ */ jsx10("div", { style: styles2.errorBanner, children: error }),
3132
+ /* @__PURE__ */ jsx10(
2839
3133
  "button",
2840
3134
  {
2841
3135
  style: {
@@ -3000,16 +3294,16 @@ var styles2 = {
3000
3294
 
3001
3295
  // src/widget/screens/ReportSuccessScreen.tsx
3002
3296
  import { useEffect as useEffect4 } from "react";
3003
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
3297
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
3004
3298
  function ReportSuccessScreen({ nav }) {
3005
3299
  useEffect4(() => {
3006
3300
  const timer = setTimeout(() => nav.reset(), 2e3);
3007
3301
  return () => clearTimeout(timer);
3008
3302
  }, [nav]);
3009
- return /* @__PURE__ */ jsxs9("div", { style: styles3.container, children: [
3010
- /* @__PURE__ */ jsx10("div", { style: styles3.emoji, children: "\u{1F389}" }),
3011
- /* @__PURE__ */ jsx10("div", { style: styles3.title, children: "Report submitted!" }),
3012
- /* @__PURE__ */ jsx10("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3303
+ return /* @__PURE__ */ jsxs10("div", { style: styles3.container, children: [
3304
+ /* @__PURE__ */ jsx11("div", { style: styles3.emoji, children: "\u{1F389}" }),
3305
+ /* @__PURE__ */ jsx11("div", { style: styles3.title, children: "Report submitted!" }),
3306
+ /* @__PURE__ */ jsx11("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3013
3307
  ] });
3014
3308
  }
3015
3309
  var styles3 = {
@@ -3038,11 +3332,12 @@ var styles3 = {
3038
3332
  };
3039
3333
 
3040
3334
  // src/widget/screens/MessageListScreen.tsx
3041
- import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
3335
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
3042
3336
  function MessageListScreen({ nav }) {
3043
- const { threads, unreadCount, refreshThreads } = useBugBear();
3044
- return /* @__PURE__ */ jsxs10("div", { children: [
3045
- /* @__PURE__ */ jsx11(
3337
+ const { threads, unreadCount, refreshThreads, isLoading } = useBugBear();
3338
+ if (isLoading) return /* @__PURE__ */ jsx12(MessageListScreenSkeleton, {});
3339
+ return /* @__PURE__ */ jsxs11("div", { children: [
3340
+ /* @__PURE__ */ jsx12(
3046
3341
  "button",
3047
3342
  {
3048
3343
  style: {
@@ -3061,7 +3356,7 @@ function MessageListScreen({ nav }) {
3061
3356
  children: "\u2709\uFE0F New Message"
3062
3357
  }
3063
3358
  ),
3064
- threads.length === 0 ? /* @__PURE__ */ jsxs10(
3359
+ threads.length === 0 ? /* @__PURE__ */ jsxs11(
3065
3360
  "div",
3066
3361
  {
3067
3362
  style: {
@@ -3072,8 +3367,8 @@ function MessageListScreen({ nav }) {
3072
3367
  paddingBottom: 40
3073
3368
  },
3074
3369
  children: [
3075
- /* @__PURE__ */ jsx11("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3076
- /* @__PURE__ */ jsx11(
3370
+ /* @__PURE__ */ jsx12("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3371
+ /* @__PURE__ */ jsx12(
3077
3372
  "span",
3078
3373
  {
3079
3374
  style: {
@@ -3085,7 +3380,7 @@ function MessageListScreen({ nav }) {
3085
3380
  children: "No messages yet"
3086
3381
  }
3087
3382
  ),
3088
- /* @__PURE__ */ jsx11(
3383
+ /* @__PURE__ */ jsx12(
3089
3384
  "span",
3090
3385
  {
3091
3386
  style: {
@@ -3098,7 +3393,7 @@ function MessageListScreen({ nav }) {
3098
3393
  )
3099
3394
  ]
3100
3395
  }
3101
- ) : /* @__PURE__ */ jsx11("div", { children: threads.map((thread) => /* @__PURE__ */ jsxs10(
3396
+ ) : /* @__PURE__ */ jsx12("div", { children: threads.map((thread) => /* @__PURE__ */ jsxs11(
3102
3397
  "button",
3103
3398
  {
3104
3399
  style: {
@@ -3116,8 +3411,8 @@ function MessageListScreen({ nav }) {
3116
3411
  },
3117
3412
  onClick: () => nav.push({ name: "THREAD_DETAIL", thread }),
3118
3413
  children: [
3119
- /* @__PURE__ */ jsxs10("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3120
- /* @__PURE__ */ jsx11(
3414
+ /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3415
+ /* @__PURE__ */ jsx12(
3121
3416
  "span",
3122
3417
  {
3123
3418
  style: {
@@ -3129,7 +3424,7 @@ function MessageListScreen({ nav }) {
3129
3424
  children: getThreadTypeIcon(thread.threadType)
3130
3425
  }
3131
3426
  ),
3132
- /* @__PURE__ */ jsxs10(
3427
+ /* @__PURE__ */ jsxs11(
3133
3428
  "div",
3134
3429
  {
3135
3430
  style: {
@@ -3137,7 +3432,7 @@ function MessageListScreen({ nav }) {
3137
3432
  minWidth: 0
3138
3433
  },
3139
3434
  children: [
3140
- /* @__PURE__ */ jsxs10(
3435
+ /* @__PURE__ */ jsxs11(
3141
3436
  "div",
3142
3437
  {
3143
3438
  style: {
@@ -3146,8 +3441,8 @@ function MessageListScreen({ nav }) {
3146
3441
  gap: 4
3147
3442
  },
3148
3443
  children: [
3149
- thread.isPinned && /* @__PURE__ */ jsx11("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3150
- /* @__PURE__ */ jsx11(
3444
+ thread.isPinned && /* @__PURE__ */ jsx12("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3445
+ /* @__PURE__ */ jsx12(
3151
3446
  "span",
3152
3447
  {
3153
3448
  style: {
@@ -3164,7 +3459,7 @@ function MessageListScreen({ nav }) {
3164
3459
  ]
3165
3460
  }
3166
3461
  ),
3167
- thread.lastMessage && /* @__PURE__ */ jsxs10(
3462
+ thread.lastMessage && /* @__PURE__ */ jsxs11(
3168
3463
  "span",
3169
3464
  {
3170
3465
  style: {
@@ -3188,7 +3483,7 @@ function MessageListScreen({ nav }) {
3188
3483
  }
3189
3484
  )
3190
3485
  ] }),
3191
- /* @__PURE__ */ jsxs10(
3486
+ /* @__PURE__ */ jsxs11(
3192
3487
  "div",
3193
3488
  {
3194
3489
  style: {
@@ -3200,8 +3495,8 @@ function MessageListScreen({ nav }) {
3200
3495
  flexShrink: 0
3201
3496
  },
3202
3497
  children: [
3203
- /* @__PURE__ */ jsx11("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3204
- thread.unreadCount > 0 && /* @__PURE__ */ jsx11(
3498
+ /* @__PURE__ */ jsx12("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3499
+ thread.unreadCount > 0 && /* @__PURE__ */ jsx12(
3205
3500
  "span",
3206
3501
  {
3207
3502
  style: {
@@ -3228,7 +3523,7 @@ function MessageListScreen({ nav }) {
3228
3523
  },
3229
3524
  thread.id
3230
3525
  )) }),
3231
- /* @__PURE__ */ jsxs10(
3526
+ /* @__PURE__ */ jsxs11(
3232
3527
  "div",
3233
3528
  {
3234
3529
  style: {
@@ -3240,7 +3535,7 @@ function MessageListScreen({ nav }) {
3240
3535
  paddingRight: 4
3241
3536
  },
3242
3537
  children: [
3243
- /* @__PURE__ */ jsxs10("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3538
+ /* @__PURE__ */ jsxs11("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3244
3539
  threads.length,
3245
3540
  " thread",
3246
3541
  threads.length !== 1 ? "s" : "",
@@ -3249,7 +3544,7 @@ function MessageListScreen({ nav }) {
3249
3544
  unreadCount,
3250
3545
  " unread"
3251
3546
  ] }),
3252
- /* @__PURE__ */ jsx11(
3547
+ /* @__PURE__ */ jsx12(
3253
3548
  "button",
3254
3549
  {
3255
3550
  style: {
@@ -3272,7 +3567,7 @@ function MessageListScreen({ nav }) {
3272
3567
 
3273
3568
  // src/widget/screens/ThreadDetailScreen.tsx
3274
3569
  import { useState as useState7, useEffect as useEffect5 } from "react";
3275
- import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
3570
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
3276
3571
  var inputStyle = {
3277
3572
  backgroundColor: "#27272a",
3278
3573
  border: "1px solid #3f3f46",
@@ -3294,15 +3589,28 @@ function ThreadDetailScreen({
3294
3589
  const [sending, setSending] = useState7(false);
3295
3590
  const [sendError, setSendError] = useState7(false);
3296
3591
  useEffect5(() => {
3592
+ let cancelled = false;
3593
+ setLoading(true);
3297
3594
  (async () => {
3298
- setLoading(true);
3299
- const msgs = await getThreadMessages(thread.id);
3300
- setMessages(msgs);
3301
- setLoading(false);
3302
- if (thread.unreadCount > 0) {
3303
- await markAsRead(thread.id);
3595
+ try {
3596
+ const msgs = await getThreadMessages(thread.id);
3597
+ if (!cancelled) {
3598
+ setMessages(msgs);
3599
+ }
3600
+ if (thread.unreadCount > 0) {
3601
+ await markAsRead(thread.id);
3602
+ }
3603
+ } catch (err) {
3604
+ console.error("BugBear: Failed to load thread messages", err);
3605
+ } finally {
3606
+ if (!cancelled) {
3607
+ setLoading(false);
3608
+ }
3304
3609
  }
3305
3610
  })();
3611
+ return () => {
3612
+ cancelled = true;
3613
+ };
3306
3614
  }, [thread.id]);
3307
3615
  const handleSend = async () => {
3308
3616
  if (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) return;
@@ -3331,8 +3639,8 @@ function ThreadDetailScreen({
3331
3639
  handleSend();
3332
3640
  }
3333
3641
  };
3334
- return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3335
- /* @__PURE__ */ jsxs11(
3642
+ return /* @__PURE__ */ jsxs12("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3643
+ /* @__PURE__ */ jsxs12(
3336
3644
  "div",
3337
3645
  {
3338
3646
  style: {
@@ -3344,8 +3652,8 @@ function ThreadDetailScreen({
3344
3652
  borderBottom: `1px solid ${colors.border}`
3345
3653
  },
3346
3654
  children: [
3347
- /* @__PURE__ */ jsx12("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3348
- /* @__PURE__ */ jsx12(
3655
+ /* @__PURE__ */ jsx13("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3656
+ /* @__PURE__ */ jsx13(
3349
3657
  "span",
3350
3658
  {
3351
3659
  style: {
@@ -3365,7 +3673,7 @@ function ThreadDetailScreen({
3365
3673
  ]
3366
3674
  }
3367
3675
  ),
3368
- loading ? /* @__PURE__ */ jsx12(
3676
+ loading ? /* @__PURE__ */ jsx13(
3369
3677
  "div",
3370
3678
  {
3371
3679
  style: {
@@ -3373,11 +3681,11 @@ function ThreadDetailScreen({
3373
3681
  paddingBottom: 40,
3374
3682
  textAlign: "center"
3375
3683
  },
3376
- children: /* @__PURE__ */ jsx12("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3684
+ children: /* @__PURE__ */ jsx13("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3377
3685
  }
3378
- ) : /* @__PURE__ */ jsx12("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3686
+ ) : /* @__PURE__ */ jsx13("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3379
3687
  const isTester = msg.senderType === "tester";
3380
- return /* @__PURE__ */ jsxs11(
3688
+ return /* @__PURE__ */ jsxs12(
3381
3689
  "div",
3382
3690
  {
3383
3691
  style: {
@@ -3393,7 +3701,7 @@ function ThreadDetailScreen({
3393
3701
  borderBottomRightRadius: isTester ? 4 : 16
3394
3702
  },
3395
3703
  children: [
3396
- /* @__PURE__ */ jsx12(
3704
+ /* @__PURE__ */ jsx13(
3397
3705
  "span",
3398
3706
  {
3399
3707
  style: {
@@ -3406,7 +3714,7 @@ function ThreadDetailScreen({
3406
3714
  children: isTester ? "You" : msg.senderName
3407
3715
  }
3408
3716
  ),
3409
- /* @__PURE__ */ jsx12(
3717
+ /* @__PURE__ */ jsx13(
3410
3718
  "span",
3411
3719
  {
3412
3720
  style: {
@@ -3420,7 +3728,7 @@ function ThreadDetailScreen({
3420
3728
  children: msg.content
3421
3729
  }
3422
3730
  ),
3423
- 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(
3731
+ 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(
3424
3732
  "img",
3425
3733
  {
3426
3734
  src: att.url,
@@ -3429,7 +3737,7 @@ function ThreadDetailScreen({
3429
3737
  },
3430
3738
  idx
3431
3739
  )) }),
3432
- /* @__PURE__ */ jsx12(
3740
+ /* @__PURE__ */ jsx13(
3433
3741
  "span",
3434
3742
  {
3435
3743
  style: {
@@ -3447,7 +3755,7 @@ function ThreadDetailScreen({
3447
3755
  msg.id
3448
3756
  );
3449
3757
  }) }),
3450
- sendError && /* @__PURE__ */ jsx12(
3758
+ sendError && /* @__PURE__ */ jsx13(
3451
3759
  "div",
3452
3760
  {
3453
3761
  style: {
@@ -3459,7 +3767,7 @@ function ThreadDetailScreen({
3459
3767
  borderRadius: 8,
3460
3768
  marginBottom: 8
3461
3769
  },
3462
- children: /* @__PURE__ */ jsx12(
3770
+ children: /* @__PURE__ */ jsx13(
3463
3771
  "span",
3464
3772
  {
3465
3773
  style: {
@@ -3473,8 +3781,8 @@ function ThreadDetailScreen({
3473
3781
  )
3474
3782
  }
3475
3783
  ),
3476
- replyImages.images.length > 0 && /* @__PURE__ */ jsx12("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ jsx12(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
3477
- /* @__PURE__ */ jsxs11(
3784
+ replyImages.images.length > 0 && /* @__PURE__ */ jsx13("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ jsx13(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
3785
+ /* @__PURE__ */ jsxs12(
3478
3786
  "div",
3479
3787
  {
3480
3788
  style: {
@@ -3485,7 +3793,7 @@ function ThreadDetailScreen({
3485
3793
  gap: 8
3486
3794
  },
3487
3795
  children: [
3488
- /* @__PURE__ */ jsx12(
3796
+ /* @__PURE__ */ jsx13(
3489
3797
  "button",
3490
3798
  {
3491
3799
  type: "button",
@@ -3504,7 +3812,7 @@ function ThreadDetailScreen({
3504
3812
  children: "\u{1F4CE}"
3505
3813
  }
3506
3814
  ),
3507
- /* @__PURE__ */ jsx12(
3815
+ /* @__PURE__ */ jsx13(
3508
3816
  "input",
3509
3817
  {
3510
3818
  type: "text",
@@ -3520,7 +3828,7 @@ function ThreadDetailScreen({
3520
3828
  }
3521
3829
  }
3522
3830
  ),
3523
- /* @__PURE__ */ jsx12(
3831
+ /* @__PURE__ */ jsx13(
3524
3832
  "button",
3525
3833
  {
3526
3834
  style: {
@@ -3548,7 +3856,7 @@ function ThreadDetailScreen({
3548
3856
 
3549
3857
  // src/widget/screens/ComposeMessageScreen.tsx
3550
3858
  import { useState as useState8 } from "react";
3551
- import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
3859
+ import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
3552
3860
  var inputStyle2 = {
3553
3861
  backgroundColor: "#27272a",
3554
3862
  border: "1px solid #3f3f46",
@@ -3579,9 +3887,9 @@ function ComposeMessageScreen({ nav }) {
3579
3887
  nav.pop();
3580
3888
  }
3581
3889
  };
3582
- return /* @__PURE__ */ jsxs12("div", { children: [
3583
- /* @__PURE__ */ jsxs12("div", { style: { marginBottom: 20 }, children: [
3584
- /* @__PURE__ */ jsx13(
3890
+ return /* @__PURE__ */ jsxs13("div", { children: [
3891
+ /* @__PURE__ */ jsxs13("div", { style: { marginBottom: 20 }, children: [
3892
+ /* @__PURE__ */ jsx14(
3585
3893
  "div",
3586
3894
  {
3587
3895
  style: {
@@ -3593,9 +3901,9 @@ function ComposeMessageScreen({ nav }) {
3593
3901
  children: "New Message"
3594
3902
  }
3595
3903
  ),
3596
- /* @__PURE__ */ jsx13("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
3904
+ /* @__PURE__ */ jsx14("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
3597
3905
  ] }),
3598
- /* @__PURE__ */ jsxs12(
3906
+ /* @__PURE__ */ jsxs13(
3599
3907
  "div",
3600
3908
  {
3601
3909
  style: {
@@ -3605,7 +3913,7 @@ function ComposeMessageScreen({ nav }) {
3605
3913
  border: `1px solid ${colors.border}`
3606
3914
  },
3607
3915
  children: [
3608
- /* @__PURE__ */ jsx13(
3916
+ /* @__PURE__ */ jsx14(
3609
3917
  "label",
3610
3918
  {
3611
3919
  style: {
@@ -3618,7 +3926,7 @@ function ComposeMessageScreen({ nav }) {
3618
3926
  children: "Subject"
3619
3927
  }
3620
3928
  ),
3621
- /* @__PURE__ */ jsx13(
3929
+ /* @__PURE__ */ jsx14(
3622
3930
  "input",
3623
3931
  {
3624
3932
  type: "text",
@@ -3633,7 +3941,7 @@ function ComposeMessageScreen({ nav }) {
3633
3941
  }
3634
3942
  }
3635
3943
  ),
3636
- /* @__PURE__ */ jsx13(
3944
+ /* @__PURE__ */ jsx14(
3637
3945
  "label",
3638
3946
  {
3639
3947
  style: {
@@ -3647,7 +3955,7 @@ function ComposeMessageScreen({ nav }) {
3647
3955
  children: "Message"
3648
3956
  }
3649
3957
  ),
3650
- /* @__PURE__ */ jsx13(
3958
+ /* @__PURE__ */ jsx14(
3651
3959
  "textarea",
3652
3960
  {
3653
3961
  value: message,
@@ -3666,7 +3974,7 @@ function ComposeMessageScreen({ nav }) {
3666
3974
  }
3667
3975
  }
3668
3976
  ),
3669
- /* @__PURE__ */ jsx13(
3977
+ /* @__PURE__ */ jsx14(
3670
3978
  ImagePickerButtons,
3671
3979
  {
3672
3980
  images: images.images,
@@ -3677,7 +3985,7 @@ function ComposeMessageScreen({ nav }) {
3677
3985
  label: "Attachments (optional)"
3678
3986
  }
3679
3987
  ),
3680
- /* @__PURE__ */ jsx13(
3988
+ /* @__PURE__ */ jsx14(
3681
3989
  "button",
3682
3990
  {
3683
3991
  style: {
@@ -3706,7 +4014,7 @@ function ComposeMessageScreen({ nav }) {
3706
4014
 
3707
4015
  // src/widget/screens/ProfileScreen.tsx
3708
4016
  import { useState as useState9, useEffect as useEffect6 } from "react";
3709
- import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
4017
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
3710
4018
  function ProfileScreen({ nav }) {
3711
4019
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo } = useBugBear();
3712
4020
  const [editing, setEditing] = useState9(false);
@@ -3726,6 +4034,7 @@ function ProfileScreen({ nav }) {
3726
4034
  }
3727
4035
  }, [testerInfo]);
3728
4036
  const handleSave = async () => {
4037
+ if (saving) return;
3729
4038
  setSaving(true);
3730
4039
  const updates = {
3731
4040
  name: name.trim(),
@@ -3752,22 +4061,22 @@ function ProfileScreen({ nav }) {
3752
4061
  }
3753
4062
  };
3754
4063
  if (saved) {
3755
- return /* @__PURE__ */ jsxs13("div", { style: styles4.emptyState, children: [
3756
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyEmoji, children: "\u2705" }),
3757
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyTitle, children: "Profile saved!" })
4064
+ return /* @__PURE__ */ jsxs14("div", { style: styles4.emptyState, children: [
4065
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyEmoji, children: "\u2705" }),
4066
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyTitle, children: "Profile saved!" })
3758
4067
  ] });
3759
4068
  }
3760
4069
  if (!testerInfo) {
3761
- return /* @__PURE__ */ jsxs13("div", { style: styles4.emptyState, children: [
3762
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
3763
- /* @__PURE__ */ jsx14("span", { style: styles4.emptyTitle, children: "No profile found" })
4070
+ return /* @__PURE__ */ jsxs14("div", { style: styles4.emptyState, children: [
4071
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
4072
+ /* @__PURE__ */ jsx15("span", { style: styles4.emptyTitle, children: "No profile found" })
3764
4073
  ] });
3765
4074
  }
3766
4075
  if (editing) {
3767
- return /* @__PURE__ */ jsxs13("div", { children: [
3768
- /* @__PURE__ */ jsxs13("div", { style: styles4.editHeader, children: [
3769
- /* @__PURE__ */ jsx14("span", { style: styles4.editTitle, children: "Edit Profile" }),
3770
- /* @__PURE__ */ jsx14(
4076
+ return /* @__PURE__ */ jsxs14("div", { children: [
4077
+ /* @__PURE__ */ jsxs14("div", { style: styles4.editHeader, children: [
4078
+ /* @__PURE__ */ jsx15("span", { style: styles4.editTitle, children: "Edit Profile" }),
4079
+ /* @__PURE__ */ jsx15(
3771
4080
  "button",
3772
4081
  {
3773
4082
  style: styles4.cancelButton,
@@ -3779,9 +4088,9 @@ function ProfileScreen({ nav }) {
3779
4088
  }
3780
4089
  )
3781
4090
  ] }),
3782
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3783
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Name" }),
3784
- /* @__PURE__ */ jsx14(
4091
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4092
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Name" }),
4093
+ /* @__PURE__ */ jsx15(
3785
4094
  "input",
3786
4095
  {
3787
4096
  style: styles4.input,
@@ -3791,15 +4100,15 @@ function ProfileScreen({ nav }) {
3791
4100
  }
3792
4101
  )
3793
4102
  ] }),
3794
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3795
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Primary Email" }),
3796
- /* @__PURE__ */ jsx14("span", { style: styles4.emailFixed, children: testerInfo.email })
4103
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4104
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Primary Email" }),
4105
+ /* @__PURE__ */ jsx15("span", { style: styles4.emailFixed, children: testerInfo.email })
3797
4106
  ] }),
3798
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3799
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Additional Emails" }),
3800
- additionalEmails.map((email) => /* @__PURE__ */ jsxs13("div", { style: styles4.emailRow, children: [
3801
- /* @__PURE__ */ jsx14("span", { style: styles4.emailText, children: email }),
3802
- /* @__PURE__ */ jsx14(
4107
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4108
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Additional Emails" }),
4109
+ additionalEmails.map((email) => /* @__PURE__ */ jsxs14("div", { style: styles4.emailRow, children: [
4110
+ /* @__PURE__ */ jsx15("span", { style: styles4.emailText, children: email }),
4111
+ /* @__PURE__ */ jsx15(
3803
4112
  "button",
3804
4113
  {
3805
4114
  style: styles4.removeEmailButton,
@@ -3808,8 +4117,8 @@ function ProfileScreen({ nav }) {
3808
4117
  }
3809
4118
  )
3810
4119
  ] }, email)),
3811
- /* @__PURE__ */ jsxs13("div", { style: styles4.addEmailRow, children: [
3812
- /* @__PURE__ */ jsx14(
4120
+ /* @__PURE__ */ jsxs14("div", { style: styles4.addEmailRow, children: [
4121
+ /* @__PURE__ */ jsx15(
3813
4122
  "input",
3814
4123
  {
3815
4124
  style: { ...styles4.input, flex: 1, marginRight: 8 },
@@ -3822,18 +4131,18 @@ function ProfileScreen({ nav }) {
3822
4131
  }
3823
4132
  }
3824
4133
  ),
3825
- /* @__PURE__ */ jsx14("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
4134
+ /* @__PURE__ */ jsx15("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
3826
4135
  ] })
3827
4136
  ] }),
3828
- /* @__PURE__ */ jsxs13("div", { style: styles4.field, children: [
3829
- /* @__PURE__ */ jsx14("label", { style: styles4.label, children: "Testing Platforms" }),
3830
- /* @__PURE__ */ jsx14("div", { style: styles4.platformRow, children: [
4137
+ /* @__PURE__ */ jsxs14("div", { style: styles4.field, children: [
4138
+ /* @__PURE__ */ jsx15("label", { style: styles4.label, children: "Testing Platforms" }),
4139
+ /* @__PURE__ */ jsx15("div", { style: styles4.platformRow, children: [
3831
4140
  { key: "ios", label: "\u{1F4F1} iOS" },
3832
4141
  { key: "android", label: "\u{1F916} Android" },
3833
4142
  { key: "web", label: "\u{1F310} Web" }
3834
4143
  ].map(({ key, label }) => {
3835
4144
  const isActive = platforms.includes(key);
3836
- return /* @__PURE__ */ jsx14(
4145
+ return /* @__PURE__ */ jsx15(
3837
4146
  "button",
3838
4147
  {
3839
4148
  style: {
@@ -3843,13 +4152,13 @@ function ProfileScreen({ nav }) {
3843
4152
  onClick: () => setPlatforms(
3844
4153
  (prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key]
3845
4154
  ),
3846
- children: /* @__PURE__ */ jsx14("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
4155
+ children: /* @__PURE__ */ jsx15("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
3847
4156
  },
3848
4157
  key
3849
4158
  );
3850
4159
  }) })
3851
4160
  ] }),
3852
- /* @__PURE__ */ jsx14(
4161
+ /* @__PURE__ */ jsx15(
3853
4162
  "button",
3854
4163
  {
3855
4164
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -3860,45 +4169,45 @@ function ProfileScreen({ nav }) {
3860
4169
  )
3861
4170
  ] });
3862
4171
  }
3863
- return /* @__PURE__ */ jsxs13("div", { children: [
3864
- /* @__PURE__ */ jsxs13("div", { style: styles4.profileCard, children: [
3865
- /* @__PURE__ */ jsx14("div", { style: styles4.avatar, children: /* @__PURE__ */ jsx14("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
3866
- /* @__PURE__ */ jsx14("span", { style: styles4.profileName, children: testerInfo.name }),
3867
- /* @__PURE__ */ jsx14("span", { style: styles4.profileEmail, children: testerInfo.email })
4172
+ return /* @__PURE__ */ jsxs14("div", { children: [
4173
+ /* @__PURE__ */ jsxs14("div", { style: styles4.profileCard, children: [
4174
+ /* @__PURE__ */ jsx15("div", { style: styles4.avatar, children: /* @__PURE__ */ jsx15("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
4175
+ /* @__PURE__ */ jsx15("span", { style: styles4.profileName, children: testerInfo.name }),
4176
+ /* @__PURE__ */ jsx15("span", { style: styles4.profileEmail, children: testerInfo.email })
3868
4177
  ] }),
3869
- /* @__PURE__ */ jsxs13("div", { style: styles4.statsRow, children: [
3870
- /* @__PURE__ */ jsxs13("div", { style: styles4.statItem, children: [
3871
- /* @__PURE__ */ jsx14("span", { style: styles4.statNumber, children: completedCount }),
3872
- /* @__PURE__ */ jsx14("span", { style: styles4.statLabel, children: "Completed" })
4178
+ /* @__PURE__ */ jsxs14("div", { style: styles4.statsRow, children: [
4179
+ /* @__PURE__ */ jsxs14("div", { style: styles4.statItem, children: [
4180
+ /* @__PURE__ */ jsx15("span", { style: styles4.statNumber, children: completedCount }),
4181
+ /* @__PURE__ */ jsx15("span", { style: styles4.statLabel, children: "Completed" })
3873
4182
  ] }),
3874
- /* @__PURE__ */ jsx14("div", { style: styles4.statDivider }),
3875
- /* @__PURE__ */ jsxs13("div", { style: styles4.statItem, children: [
3876
- /* @__PURE__ */ jsx14("span", { style: styles4.statNumber, children: assignments.length }),
3877
- /* @__PURE__ */ jsx14("span", { style: styles4.statLabel, children: "Total Assigned" })
4183
+ /* @__PURE__ */ jsx15("div", { style: styles4.statDivider }),
4184
+ /* @__PURE__ */ jsxs14("div", { style: styles4.statItem, children: [
4185
+ /* @__PURE__ */ jsx15("span", { style: styles4.statNumber, children: assignments.length }),
4186
+ /* @__PURE__ */ jsx15("span", { style: styles4.statLabel, children: "Total Assigned" })
3878
4187
  ] })
3879
4188
  ] }),
3880
- /* @__PURE__ */ jsx14(
4189
+ /* @__PURE__ */ jsx15(
3881
4190
  "button",
3882
4191
  {
3883
4192
  style: styles4.detailsToggle,
3884
4193
  onClick: () => setShowDetails(!showDetails),
3885
- children: /* @__PURE__ */ jsxs13("span", { style: styles4.detailsToggleText, children: [
4194
+ children: /* @__PURE__ */ jsxs14("span", { style: styles4.detailsToggleText, children: [
3886
4195
  showDetails ? "\u25BC" : "\u25B6",
3887
4196
  " Details"
3888
4197
  ] })
3889
4198
  }
3890
4199
  ),
3891
- showDetails && /* @__PURE__ */ jsxs13("div", { style: styles4.detailsSection, children: [
3892
- additionalEmails.length > 0 && /* @__PURE__ */ jsxs13("div", { style: styles4.detailBlock, children: [
3893
- /* @__PURE__ */ jsx14("span", { style: styles4.detailLabel, children: "Additional Emails" }),
3894
- additionalEmails.map((e) => /* @__PURE__ */ jsx14("span", { style: styles4.detailValue, children: e }, e))
4200
+ showDetails && /* @__PURE__ */ jsxs14("div", { style: styles4.detailsSection, children: [
4201
+ additionalEmails.length > 0 && /* @__PURE__ */ jsxs14("div", { style: styles4.detailBlock, children: [
4202
+ /* @__PURE__ */ jsx15("span", { style: styles4.detailLabel, children: "Additional Emails" }),
4203
+ additionalEmails.map((e) => /* @__PURE__ */ jsx15("span", { style: styles4.detailValue, children: e }, e))
3895
4204
  ] }),
3896
- platforms.length > 0 && /* @__PURE__ */ jsxs13("div", { style: styles4.detailBlock, children: [
3897
- /* @__PURE__ */ jsx14("span", { style: styles4.detailLabel, children: "Platforms" }),
3898
- /* @__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)) })
4205
+ platforms.length > 0 && /* @__PURE__ */ jsxs14("div", { style: styles4.detailBlock, children: [
4206
+ /* @__PURE__ */ jsx15("span", { style: styles4.detailLabel, children: "Platforms" }),
4207
+ /* @__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)) })
3899
4208
  ] })
3900
4209
  ] }),
3901
- /* @__PURE__ */ jsx14(
4210
+ /* @__PURE__ */ jsx15(
3902
4211
  "button",
3903
4212
  {
3904
4213
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -4182,7 +4491,7 @@ var styles4 = {
4182
4491
 
4183
4492
  // src/widget/screens/IssueListScreen.tsx
4184
4493
  import { useState as useState10, useEffect as useEffect7 } from "react";
4185
- import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
4494
+ import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
4186
4495
  var CATEGORY_CONFIG = {
4187
4496
  open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
4188
4497
  done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
@@ -4203,11 +4512,21 @@ function IssueListScreen({ nav, category }) {
4203
4512
  let cancelled = false;
4204
4513
  setLoading(true);
4205
4514
  (async () => {
4206
- if (!client) return;
4207
- const data = await client.getIssues(category);
4208
- if (!cancelled) {
4209
- setIssues(data);
4515
+ if (!client) {
4210
4516
  setLoading(false);
4517
+ return;
4518
+ }
4519
+ try {
4520
+ const data = await client.getIssues(category);
4521
+ if (!cancelled) {
4522
+ setIssues(data);
4523
+ }
4524
+ } catch (err) {
4525
+ console.error("BugBear: Failed to load issues", err);
4526
+ } finally {
4527
+ if (!cancelled) {
4528
+ setLoading(false);
4529
+ }
4211
4530
  }
4212
4531
  })();
4213
4532
  return () => {
@@ -4215,15 +4534,15 @@ function IssueListScreen({ nav, category }) {
4215
4534
  };
4216
4535
  }, [client, category]);
4217
4536
  if (loading) {
4218
- return /* @__PURE__ */ jsx15("div", { style: { padding: "40px 0", textAlign: "center" }, children: /* @__PURE__ */ jsx15("div", { style: { color: colors.textMuted, fontSize: 14 }, children: "Loading..." }) });
4537
+ return /* @__PURE__ */ jsx16(IssueListScreenSkeleton, {});
4219
4538
  }
4220
4539
  if (issues.length === 0) {
4221
- return /* @__PURE__ */ jsxs14("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4222
- /* @__PURE__ */ jsx15("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4223
- /* @__PURE__ */ jsx15("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4540
+ return /* @__PURE__ */ jsxs15("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4541
+ /* @__PURE__ */ jsx16("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4542
+ /* @__PURE__ */ jsx16("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4224
4543
  ] });
4225
4544
  }
4226
- return /* @__PURE__ */ jsx15("div", { children: issues.map((issue) => /* @__PURE__ */ jsxs14(
4545
+ return /* @__PURE__ */ jsx16("div", { children: issues.map((issue) => /* @__PURE__ */ jsxs15(
4227
4546
  "div",
4228
4547
  {
4229
4548
  role: "button",
@@ -4242,8 +4561,8 @@ function IssueListScreen({ nav, category }) {
4242
4561
  userSelect: "none"
4243
4562
  },
4244
4563
  children: [
4245
- /* @__PURE__ */ jsxs14("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4246
- issue.severity && /* @__PURE__ */ jsx15(
4564
+ /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4565
+ issue.severity && /* @__PURE__ */ jsx16(
4247
4566
  "span",
4248
4567
  {
4249
4568
  style: {
@@ -4256,7 +4575,7 @@ function IssueListScreen({ nav, category }) {
4256
4575
  }
4257
4576
  }
4258
4577
  ),
4259
- /* @__PURE__ */ jsx15("span", { style: {
4578
+ /* @__PURE__ */ jsx16("span", { style: {
4260
4579
  fontSize: 13,
4261
4580
  fontWeight: 600,
4262
4581
  color: colors.textPrimary,
@@ -4266,11 +4585,11 @@ function IssueListScreen({ nav, category }) {
4266
4585
  whiteSpace: "nowrap"
4267
4586
  }, children: issue.title })
4268
4587
  ] }),
4269
- /* @__PURE__ */ jsxs14("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4270
- issue.route && /* @__PURE__ */ jsx15("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
4271
- /* @__PURE__ */ jsx15("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4588
+ /* @__PURE__ */ jsxs15("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4589
+ issue.route && /* @__PURE__ */ jsx16("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
4590
+ /* @__PURE__ */ jsx16("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4272
4591
  ] }),
4273
- category === "done" && issue.verifiedByName && /* @__PURE__ */ jsxs14("div", { style: {
4592
+ category === "done" && issue.verifiedByName && /* @__PURE__ */ jsxs15("div", { style: {
4274
4593
  display: "inline-flex",
4275
4594
  alignItems: "center",
4276
4595
  gap: 4,
@@ -4286,7 +4605,7 @@ function IssueListScreen({ nav, category }) {
4286
4605
  "\u2714 Verified by ",
4287
4606
  issue.verifiedByName
4288
4607
  ] }),
4289
- category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ jsxs14("div", { style: {
4608
+ category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ jsxs15("div", { style: {
4290
4609
  display: "inline-flex",
4291
4610
  alignItems: "center",
4292
4611
  gap: 4,
@@ -4313,7 +4632,7 @@ function IssueListScreen({ nav, category }) {
4313
4632
  }
4314
4633
 
4315
4634
  // src/widget/screens/IssueDetailScreen.tsx
4316
- import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
4635
+ import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
4317
4636
  var STATUS_LABELS = {
4318
4637
  new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
4319
4638
  triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
@@ -4337,9 +4656,9 @@ var SEVERITY_CONFIG = {
4337
4656
  function IssueDetailScreen({ nav, issue }) {
4338
4657
  const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
4339
4658
  const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
4340
- return /* @__PURE__ */ jsxs15("div", { children: [
4341
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4342
- /* @__PURE__ */ jsx16("span", { style: {
4659
+ return /* @__PURE__ */ jsxs16("div", { children: [
4660
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4661
+ /* @__PURE__ */ jsx17("span", { style: {
4343
4662
  backgroundColor: statusConfig.bg,
4344
4663
  color: statusConfig.color,
4345
4664
  fontSize: 11,
@@ -4347,7 +4666,7 @@ function IssueDetailScreen({ nav, issue }) {
4347
4666
  padding: "3px 10px",
4348
4667
  borderRadius: 6
4349
4668
  }, children: statusConfig.label }),
4350
- severityConfig && /* @__PURE__ */ jsx16("span", { style: {
4669
+ severityConfig && /* @__PURE__ */ jsx17("span", { style: {
4351
4670
  backgroundColor: severityConfig.bg,
4352
4671
  color: severityConfig.color,
4353
4672
  fontSize: 11,
@@ -4356,9 +4675,9 @@ function IssueDetailScreen({ nav, issue }) {
4356
4675
  borderRadius: 6
4357
4676
  }, children: severityConfig.label })
4358
4677
  ] }),
4359
- /* @__PURE__ */ jsx16("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
4360
- issue.route && /* @__PURE__ */ jsx16("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4361
- issue.description && /* @__PURE__ */ jsx16("div", { style: {
4678
+ /* @__PURE__ */ jsx17("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
4679
+ issue.route && /* @__PURE__ */ jsx17("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4680
+ issue.description && /* @__PURE__ */ jsx17("div", { style: {
4362
4681
  backgroundColor: colors.card,
4363
4682
  border: `1px solid ${colors.border}`,
4364
4683
  borderRadius: 8,
@@ -4370,56 +4689,56 @@ function IssueDetailScreen({ nav, issue }) {
4370
4689
  whiteSpace: "pre-wrap",
4371
4690
  wordBreak: "break-word"
4372
4691
  }, children: issue.description }),
4373
- issue.verifiedByName && /* @__PURE__ */ jsxs15("div", { style: {
4692
+ issue.verifiedByName && /* @__PURE__ */ jsxs16("div", { style: {
4374
4693
  backgroundColor: "#14532d",
4375
4694
  border: "1px solid #166534",
4376
4695
  borderRadius: 8,
4377
4696
  padding: 12,
4378
4697
  marginBottom: 12
4379
4698
  }, children: [
4380
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4381
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 16 }, children: "\u2705" }),
4382
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
4699
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4700
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 16 }, children: "\u2705" }),
4701
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
4383
4702
  ] }),
4384
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, color: "#86efac" }, children: [
4703
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, color: "#86efac" }, children: [
4385
4704
  "Verified by ",
4386
- /* @__PURE__ */ jsx16("strong", { children: issue.verifiedByName }),
4387
- issue.verifiedAt && /* @__PURE__ */ jsxs15("span", { children: [
4705
+ /* @__PURE__ */ jsx17("strong", { children: issue.verifiedByName }),
4706
+ issue.verifiedAt && /* @__PURE__ */ jsxs16("span", { children: [
4388
4707
  " on ",
4389
4708
  new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })
4390
4709
  ] })
4391
4710
  ] })
4392
4711
  ] }),
4393
- issue.originalBugTitle && /* @__PURE__ */ jsxs15("div", { style: {
4712
+ issue.originalBugTitle && /* @__PURE__ */ jsxs16("div", { style: {
4394
4713
  backgroundColor: "#422006",
4395
4714
  border: "1px solid #854d0e",
4396
4715
  borderRadius: 8,
4397
4716
  padding: 12,
4398
4717
  marginBottom: 12
4399
4718
  }, children: [
4400
- /* @__PURE__ */ jsxs15("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4401
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
4402
- /* @__PURE__ */ jsx16("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
4719
+ /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4720
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
4721
+ /* @__PURE__ */ jsx17("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
4403
4722
  ] }),
4404
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
4723
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
4405
4724
  "Retest of: ",
4406
- /* @__PURE__ */ jsx16("strong", { children: issue.originalBugTitle })
4725
+ /* @__PURE__ */ jsx17("strong", { children: issue.originalBugTitle })
4407
4726
  ] })
4408
4727
  ] }),
4409
- issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ jsxs15("div", { style: { marginBottom: 12 }, children: [
4410
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
4728
+ issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ jsxs16("div", { style: { marginBottom: 12 }, children: [
4729
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
4411
4730
  "Screenshots (",
4412
4731
  issue.screenshotUrls.length,
4413
4732
  ")"
4414
4733
  ] }),
4415
- /* @__PURE__ */ jsx16("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ jsx16(
4734
+ /* @__PURE__ */ jsx17("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ jsx17(
4416
4735
  "a",
4417
4736
  {
4418
4737
  href: url,
4419
4738
  target: "_blank",
4420
4739
  rel: "noopener noreferrer",
4421
4740
  style: { flexShrink: 0 },
4422
- children: /* @__PURE__ */ jsx16(
4741
+ children: /* @__PURE__ */ jsx17(
4423
4742
  "img",
4424
4743
  {
4425
4744
  src: url,
@@ -4437,16 +4756,16 @@ function IssueDetailScreen({ nav, issue }) {
4437
4756
  i
4438
4757
  )) })
4439
4758
  ] }),
4440
- /* @__PURE__ */ jsxs15("div", { style: {
4759
+ /* @__PURE__ */ jsxs16("div", { style: {
4441
4760
  borderTop: `1px solid ${colors.border}`,
4442
4761
  paddingTop: 12,
4443
4762
  marginTop: 4
4444
4763
  }, children: [
4445
- issue.reporterName && /* @__PURE__ */ jsxs15("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
4764
+ issue.reporterName && /* @__PURE__ */ jsxs16("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
4446
4765
  "Reported by ",
4447
4766
  issue.reporterName
4448
4767
  ] }),
4449
- /* @__PURE__ */ jsxs15("div", { style: { fontSize: 11, color: colors.textDim }, children: [
4768
+ /* @__PURE__ */ jsxs16("div", { style: { fontSize: 11, color: colors.textDim }, children: [
4450
4769
  "Created ",
4451
4770
  formatRelativeTime(issue.createdAt),
4452
4771
  " \xB7 Updated ",
@@ -4460,9 +4779,9 @@ function IssueDetailScreen({ nav, issue }) {
4460
4779
  var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
4461
4780
 
4462
4781
  // src/BugBearPanel.tsx
4463
- import { Fragment as Fragment4, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
4782
+ import { Fragment as Fragment4, jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
4464
4783
  function BugBearIcon({ size = 24 }) {
4465
- return /* @__PURE__ */ jsx17(
4784
+ return /* @__PURE__ */ jsx18(
4466
4785
  "img",
4467
4786
  {
4468
4787
  src: BUGBEAR_LOGO_BASE64,
@@ -4627,37 +4946,37 @@ function BugBearPanel({
4627
4946
  const renderScreen = () => {
4628
4947
  switch (currentScreen.name) {
4629
4948
  case "HOME":
4630
- return /* @__PURE__ */ jsx17(HomeScreen, { nav });
4949
+ return /* @__PURE__ */ jsx18(HomeScreen, { nav });
4631
4950
  case "TEST_DETAIL":
4632
- return /* @__PURE__ */ jsx17(TestDetailScreen, { testId: currentScreen.testId, nav });
4951
+ return /* @__PURE__ */ jsx18(TestDetailScreen, { testId: currentScreen.testId, nav });
4633
4952
  case "TEST_LIST":
4634
- return /* @__PURE__ */ jsx17(TestListScreen, { nav });
4953
+ return /* @__PURE__ */ jsx18(TestListScreen, { nav });
4635
4954
  case "TEST_FEEDBACK":
4636
- return /* @__PURE__ */ jsx17(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
4955
+ return /* @__PURE__ */ jsx18(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
4637
4956
  case "REPORT":
4638
- return /* @__PURE__ */ jsx17(ReportScreen, { nav, prefill: currentScreen.prefill });
4957
+ return /* @__PURE__ */ jsx18(ReportScreen, { nav, prefill: currentScreen.prefill });
4639
4958
  case "REPORT_SUCCESS":
4640
- return /* @__PURE__ */ jsx17(ReportSuccessScreen, { nav });
4959
+ return /* @__PURE__ */ jsx18(ReportSuccessScreen, { nav });
4641
4960
  case "MESSAGE_LIST":
4642
- return /* @__PURE__ */ jsx17(MessageListScreen, { nav });
4961
+ return /* @__PURE__ */ jsx18(MessageListScreen, { nav });
4643
4962
  case "THREAD_DETAIL":
4644
- return /* @__PURE__ */ jsx17(ThreadDetailScreen, { thread: currentScreen.thread, nav });
4963
+ return /* @__PURE__ */ jsx18(ThreadDetailScreen, { thread: currentScreen.thread, nav });
4645
4964
  case "COMPOSE_MESSAGE":
4646
- return /* @__PURE__ */ jsx17(ComposeMessageScreen, { nav });
4965
+ return /* @__PURE__ */ jsx18(ComposeMessageScreen, { nav });
4647
4966
  case "ISSUE_LIST":
4648
- return /* @__PURE__ */ jsx17(IssueListScreen, { nav, category: currentScreen.category });
4967
+ return /* @__PURE__ */ jsx18(IssueListScreen, { nav, category: currentScreen.category });
4649
4968
  case "ISSUE_DETAIL":
4650
- return /* @__PURE__ */ jsx17(IssueDetailScreen, { nav, issue: currentScreen.issue });
4969
+ return /* @__PURE__ */ jsx18(IssueDetailScreen, { nav, issue: currentScreen.issue });
4651
4970
  case "PROFILE":
4652
- return /* @__PURE__ */ jsx17(ProfileScreen, { nav });
4971
+ return /* @__PURE__ */ jsx18(ProfileScreen, { nav });
4653
4972
  default:
4654
- return /* @__PURE__ */ jsx17(HomeScreen, { nav });
4973
+ return /* @__PURE__ */ jsx18(HomeScreen, { nav });
4655
4974
  }
4656
4975
  };
4657
4976
  if (typeof document === "undefined") return null;
4658
4977
  const headerTitle = getHeaderTitle();
4659
4978
  return createPortal(
4660
- /* @__PURE__ */ jsxs16(
4979
+ /* @__PURE__ */ jsxs17(
4661
4980
  "div",
4662
4981
  {
4663
4982
  ref: panelRef,
@@ -4676,7 +4995,7 @@ function BugBearPanel({
4676
4995
  },
4677
4996
  onMouseDown: handleMouseDown,
4678
4997
  children: [
4679
- collapsed && /* @__PURE__ */ jsxs16(
4998
+ collapsed && /* @__PURE__ */ jsxs17(
4680
4999
  "button",
4681
5000
  {
4682
5001
  onClick: () => setCollapsed(false),
@@ -4698,9 +5017,9 @@ function BugBearPanel({
4698
5017
  fontWeight: 500
4699
5018
  },
4700
5019
  children: [
4701
- /* @__PURE__ */ jsx17(BugBearIcon, { size: 24 }),
4702
- /* @__PURE__ */ jsx17("span", { children: "BugBear" }),
4703
- badgeCount > 0 && /* @__PURE__ */ jsx17("span", { style: {
5020
+ /* @__PURE__ */ jsx18(BugBearIcon, { size: 24 }),
5021
+ /* @__PURE__ */ jsx18("span", { children: "BugBear" }),
5022
+ badgeCount > 0 && /* @__PURE__ */ jsx18("span", { style: {
4704
5023
  backgroundColor: "#fff",
4705
5024
  color: colors.blue,
4706
5025
  fontSize: "0.75rem",
@@ -4711,7 +5030,7 @@ function BugBearPanel({
4711
5030
  ]
4712
5031
  }
4713
5032
  ),
4714
- !collapsed && /* @__PURE__ */ jsxs16("div", { style: {
5033
+ !collapsed && /* @__PURE__ */ jsxs17("div", { style: {
4715
5034
  width: PANEL_WIDTH,
4716
5035
  backgroundColor: colors.bg,
4717
5036
  borderRadius: 12,
@@ -4719,7 +5038,7 @@ function BugBearPanel({
4719
5038
  overflow: "hidden",
4720
5039
  boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5)"
4721
5040
  }, children: [
4722
- /* @__PURE__ */ jsxs16(
5041
+ /* @__PURE__ */ jsxs17(
4723
5042
  "div",
4724
5043
  {
4725
5044
  "data-drag-handle": true,
@@ -4735,7 +5054,7 @@ function BugBearPanel({
4735
5054
  cursor: draggable ? isDragging ? "grabbing" : "grab" : "default"
4736
5055
  },
4737
5056
  children: [
4738
- /* @__PURE__ */ jsx17("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ jsx17(
5057
+ /* @__PURE__ */ jsx18("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ jsx18(
4739
5058
  "button",
4740
5059
  {
4741
5060
  onClick: pop,
@@ -4751,14 +5070,14 @@ function BugBearPanel({
4751
5070
  },
4752
5071
  children: "\u2190 Back"
4753
5072
  }
4754
- ) : /* @__PURE__ */ jsxs16(Fragment4, { children: [
4755
- /* @__PURE__ */ jsx17(BugBearIcon, { size: 28 }),
4756
- /* @__PURE__ */ jsxs16("div", { children: [
4757
- /* @__PURE__ */ jsxs16("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
4758
- /* @__PURE__ */ jsx17("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
4759
- draggable && /* @__PURE__ */ jsx17("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
5073
+ ) : /* @__PURE__ */ jsxs17(Fragment4, { children: [
5074
+ /* @__PURE__ */ jsx18(BugBearIcon, { size: 28 }),
5075
+ /* @__PURE__ */ jsxs17("div", { children: [
5076
+ /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
5077
+ /* @__PURE__ */ jsx18("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
5078
+ draggable && /* @__PURE__ */ jsx18("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
4760
5079
  ] }),
4761
- testerInfo && /* @__PURE__ */ jsxs16(
5080
+ testerInfo && /* @__PURE__ */ jsxs17(
4762
5081
  "button",
4763
5082
  {
4764
5083
  onClick: () => push({ name: "PROFILE" }),
@@ -4776,13 +5095,13 @@ function BugBearPanel({
4776
5095
  },
4777
5096
  children: [
4778
5097
  testerInfo.name,
4779
- /* @__PURE__ */ jsx17("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
5098
+ /* @__PURE__ */ jsx18("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
4780
5099
  ]
4781
5100
  }
4782
5101
  )
4783
5102
  ] })
4784
5103
  ] }) }),
4785
- headerTitle ? /* @__PURE__ */ jsx17("span", { style: {
5104
+ headerTitle ? /* @__PURE__ */ jsx18("span", { style: {
4786
5105
  fontSize: "0.8125rem",
4787
5106
  fontWeight: 600,
4788
5107
  color: colors.textSecondary,
@@ -4792,7 +5111,7 @@ function BugBearPanel({
4792
5111
  textOverflow: "ellipsis",
4793
5112
  whiteSpace: "nowrap"
4794
5113
  }, children: headerTitle }) : null,
4795
- /* @__PURE__ */ jsx17(
5114
+ /* @__PURE__ */ jsx18(
4796
5115
  "button",
4797
5116
  {
4798
5117
  onClick: handleClose,
@@ -4816,13 +5135,13 @@ function BugBearPanel({
4816
5135
  ]
4817
5136
  }
4818
5137
  ),
4819
- /* @__PURE__ */ jsx17("div", { style: {
5138
+ /* @__PURE__ */ jsx18("div", { style: {
4820
5139
  padding: 16,
4821
5140
  maxHeight: 400,
4822
5141
  overflowY: "auto",
4823
5142
  backgroundColor: colors.bg,
4824
5143
  color: colors.textSecondary
4825
- }, 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() })
5144
+ }, 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() })
4826
5145
  ] })
4827
5146
  ]
4828
5147
  }
@@ -4834,7 +5153,7 @@ function BugBearPanel({
4834
5153
  // src/BugBearErrorBoundary.tsx
4835
5154
  import { Component } from "react";
4836
5155
  import { captureError, contextCapture as contextCapture2 } from "@bbearai/core";
4837
- import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
5156
+ import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
4838
5157
  var BugBearErrorBoundary = class extends Component {
4839
5158
  constructor(props) {
4840
5159
  super(props);
@@ -4879,7 +5198,7 @@ var BugBearErrorBoundary = class extends Component {
4879
5198
  if (fallback) {
4880
5199
  return fallback;
4881
5200
  }
4882
- return /* @__PURE__ */ jsxs17(
5201
+ return /* @__PURE__ */ jsxs18(
4883
5202
  "div",
4884
5203
  {
4885
5204
  style: {
@@ -4891,13 +5210,13 @@ var BugBearErrorBoundary = class extends Component {
4891
5210
  fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
4892
5211
  },
4893
5212
  children: [
4894
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
4895
- /* @__PURE__ */ jsx18("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
4896
- /* @__PURE__ */ jsx18("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
5213
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
5214
+ /* @__PURE__ */ jsx19("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
5215
+ /* @__PURE__ */ jsx19("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
4897
5216
  ] }),
4898
- /* @__PURE__ */ jsx18("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
4899
- /* @__PURE__ */ jsxs17("div", { style: { display: "flex", gap: "8px" }, children: [
4900
- /* @__PURE__ */ jsx18(
5217
+ /* @__PURE__ */ jsx19("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
5218
+ /* @__PURE__ */ jsxs18("div", { style: { display: "flex", gap: "8px" }, children: [
5219
+ /* @__PURE__ */ jsx19(
4901
5220
  "button",
4902
5221
  {
4903
5222
  onClick: this.reset,
@@ -4914,7 +5233,7 @@ var BugBearErrorBoundary = class extends Component {
4914
5233
  children: "Try Again"
4915
5234
  }
4916
5235
  ),
4917
- /* @__PURE__ */ jsx18(
5236
+ /* @__PURE__ */ jsx19(
4918
5237
  "button",
4919
5238
  {
4920
5239
  onClick: () => window.location.reload(),
@@ -4932,7 +5251,7 @@ var BugBearErrorBoundary = class extends Component {
4932
5251
  }
4933
5252
  )
4934
5253
  ] }),
4935
- /* @__PURE__ */ jsx18("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
5254
+ /* @__PURE__ */ jsx19("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
4936
5255
  ]
4937
5256
  }
4938
5257
  );