@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.js CHANGED
@@ -84,6 +84,8 @@ var BugBearContext = (0, import_react.createContext)({
84
84
  issueCounts: { open: 0, done: 0, reopened: 0 },
85
85
  refreshIssueCounts: async () => {
86
86
  },
87
+ queuedCount: 0,
88
+ dashboardUrl: void 0,
87
89
  onError: void 0
88
90
  });
89
91
  function useBugBear() {
@@ -102,6 +104,7 @@ function BugBearProvider({ config, children, enabled = true }) {
102
104
  const [threads, setThreads] = (0, import_react.useState)([]);
103
105
  const [unreadCount, setUnreadCount] = (0, import_react.useState)(0);
104
106
  const [issueCounts, setIssueCounts] = (0, import_react.useState)({ open: 0, done: 0, reopened: 0 });
107
+ const [queuedCount, setQueuedCount] = (0, import_react.useState)(0);
105
108
  const refreshAssignments = (0, import_react.useCallback)(async () => {
106
109
  if (!client) return;
107
110
  const newAssignments = await client.getAssignedTests();
@@ -249,18 +252,45 @@ function BugBearProvider({ config, children, enabled = true }) {
249
252
  hasInitialized.current = true;
250
253
  import_core.contextCapture.startCapture();
251
254
  const newClient = (0, import_core.createBugBear)(config);
255
+ if (newClient.queue) {
256
+ newClient.queue.onChange(setQueuedCount);
257
+ newClient.initQueue();
258
+ }
252
259
  setClient(newClient);
253
260
  initializeBugBear(newClient);
254
261
  }
255
262
  }, [enabled, config, initializeBugBear]);
263
+ (0, import_react.useEffect)(() => {
264
+ if (!client?.queue) return;
265
+ const handleOnline = () => {
266
+ client.queue?.flush();
267
+ };
268
+ window.addEventListener("online", handleOnline);
269
+ if (navigator.onLine && client.queue.count > 0) {
270
+ client.queue.flush();
271
+ }
272
+ return () => window.removeEventListener("online", handleOnline);
273
+ }, [client]);
256
274
  (0, import_react.useEffect)(() => {
257
275
  if (!client || !isTester || !isQAEnabled) return;
276
+ let unsubscribe;
277
+ if (client.realtimeEnabled) {
278
+ unsubscribe = client.subscribeToChanges({
279
+ onAssignmentChange: refreshAssignments,
280
+ onMessageChange: refreshThreads,
281
+ onReportChange: refreshIssueCounts
282
+ });
283
+ }
284
+ const pollInterval = client.realtimeEnabled ? 12e4 : 3e4;
258
285
  const interval = setInterval(() => {
259
286
  refreshThreads();
260
287
  refreshIssueCounts();
261
- }, 3e4);
262
- return () => clearInterval(interval);
263
- }, [client, isTester, isQAEnabled, refreshThreads, refreshIssueCounts]);
288
+ }, pollInterval);
289
+ return () => {
290
+ clearInterval(interval);
291
+ unsubscribe?.();
292
+ };
293
+ }, [client, isTester, isQAEnabled, refreshThreads, refreshIssueCounts, refreshAssignments]);
264
294
  const currentAssignment = assignments.find(
265
295
  (a) => a.status === "in_progress"
266
296
  ) || assignments.find(
@@ -303,6 +333,8 @@ function BugBearProvider({ config, children, enabled = true }) {
303
333
  // Issue tracking
304
334
  issueCounts,
305
335
  refreshIssueCounts,
336
+ queuedCount,
337
+ dashboardUrl: config.dashboardUrl,
306
338
  onError: config.onError
307
339
  },
308
340
  children
@@ -429,9 +461,148 @@ function getThreadTypeIcon(type) {
429
461
 
430
462
  // src/widget/screens/HomeScreen.tsx
431
463
  var import_react3 = require("react");
464
+
465
+ // src/widget/Skeleton.tsx
432
466
  var import_jsx_runtime2 = require("react/jsx-runtime");
467
+ var PULSE_CSS = `@keyframes bb-skeleton-pulse{0%,100%{opacity:.6}50%{opacity:.25}}`;
468
+ var styleInjected = false;
469
+ function injectStyle() {
470
+ if (styleInjected || typeof document === "undefined") return;
471
+ const style = document.createElement("style");
472
+ style.textContent = PULSE_CSS;
473
+ document.head.appendChild(style);
474
+ styleInjected = true;
475
+ }
476
+ function Bar({ width = "100%", height = 12, radius = 6, style }) {
477
+ injectStyle();
478
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
479
+ "div",
480
+ {
481
+ style: {
482
+ width,
483
+ height,
484
+ borderRadius: radius,
485
+ backgroundColor: colors.border,
486
+ animation: "bb-skeleton-pulse 1.5s ease-in-out infinite",
487
+ ...style
488
+ }
489
+ }
490
+ );
491
+ }
492
+ function Circle({ size = 20, style }) {
493
+ injectStyle();
494
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
495
+ "div",
496
+ {
497
+ style: {
498
+ width: size,
499
+ height: size,
500
+ borderRadius: size / 2,
501
+ backgroundColor: colors.border,
502
+ animation: "bb-skeleton-pulse 1.5s ease-in-out infinite",
503
+ flexShrink: 0,
504
+ ...style
505
+ }
506
+ }
507
+ );
508
+ }
509
+ function HomeScreenSkeleton() {
510
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
511
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 100, radius: 16, style: { marginBottom: 20 } }),
512
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12, marginBottom: 20 }, children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { backgroundColor: colors.card, border: `1px solid ${colors.border}`, borderRadius: 12, padding: 16, display: "flex", flexDirection: "column", alignItems: "center", gap: 8 }, children: [
513
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 28 }),
514
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 60, height: 10 })
515
+ ] }, i)) }),
516
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [0, 1, 2].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.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: [
517
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 30, height: 18 }),
518
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 40, height: 8 })
519
+ ] }, i)) }),
520
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 6, radius: 3, style: { marginBottom: 8 } }),
521
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 120, height: 10, style: { margin: "0 auto 16px" } })
522
+ ] });
523
+ }
524
+ function TestItemSkeleton({ delay = 0 }) {
525
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", padding: "10px 12px", borderRadius: 8, marginBottom: 4, backgroundColor: colors.card }, children: [
526
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 18, style: { marginRight: 10, animationDelay: `${delay}ms` } }),
527
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { flex: 1 }, children: [
528
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "70%", height: 11, style: { marginBottom: 4, animationDelay: `${delay}ms` } }),
529
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "45%", height: 8, style: { animationDelay: `${delay}ms` } })
530
+ ] }),
531
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 50, height: 18, radius: 6, style: { marginLeft: 8, animationDelay: `${delay}ms` } })
532
+ ] });
533
+ }
534
+ function TestListScreenSkeleton() {
535
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
536
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: 8 }, children: [55, 50, 50, 70].map((w, i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: w, height: 28, radius: 8, style: { animationDelay: `${i * 50}ms` } }, i)) }),
537
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 36, radius: 8, style: { marginBottom: 10 } }),
538
+ [0, 1].map((g) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { marginBottom: 12 }, children: [
539
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, padding: "8px 4px" }, children: [
540
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 12, height: 10 }),
541
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "40%", height: 12 }),
542
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 40, height: 4, radius: 2, style: { marginLeft: "auto" } }),
543
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 24, height: 10 })
544
+ ] }),
545
+ [0, 1, 2].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TestItemSkeleton, { delay: (g * 3 + i) * 80 }, i))
546
+ ] }, g))
547
+ ] });
548
+ }
549
+ function IssueListScreenSkeleton() {
550
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: [0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
551
+ "div",
552
+ {
553
+ style: {
554
+ backgroundColor: colors.card,
555
+ border: `1px solid ${colors.border}`,
556
+ borderRadius: 10,
557
+ padding: "12px 14px",
558
+ marginBottom: 8
559
+ },
560
+ children: [
561
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
562
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 8, style: { animationDelay: `${i * 100}ms` } }),
563
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "65%", height: 11, style: { animationDelay: `${i * 100}ms` } })
564
+ ] }),
565
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 8 }, children: [
566
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "40%", height: 8, style: { animationDelay: `${i * 100}ms` } }),
567
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 40, height: 8, style: { animationDelay: `${i * 100}ms` } })
568
+ ] })
569
+ ]
570
+ },
571
+ i
572
+ )) });
573
+ }
574
+ function MessageListScreenSkeleton() {
575
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
576
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "100%", height: 44, radius: 12, style: { marginBottom: 16 } }),
577
+ [0, 1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
578
+ "div",
579
+ {
580
+ style: {
581
+ display: "flex",
582
+ alignItems: "flex-start",
583
+ padding: 12,
584
+ borderRadius: 10,
585
+ marginBottom: 4,
586
+ backgroundColor: colors.card
587
+ },
588
+ children: [
589
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Circle, { size: 20, style: { marginRight: 10, marginTop: 2, animationDelay: `${i * 100}ms` } }),
590
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { flex: 1 }, children: [
591
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "55%", height: 11, style: { marginBottom: 5, animationDelay: `${i * 100}ms` } }),
592
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: "80%", height: 9, style: { animationDelay: `${i * 100}ms` } })
593
+ ] }),
594
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Bar, { width: 30, height: 8, style: { marginLeft: 8, animationDelay: `${i * 100}ms` } })
595
+ ]
596
+ },
597
+ i
598
+ ))
599
+ ] });
600
+ }
601
+
602
+ // src/widget/screens/HomeScreen.tsx
603
+ var import_jsx_runtime3 = require("react/jsx-runtime");
433
604
  function HomeScreen({ nav }) {
434
- const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts } = useBugBear();
605
+ const { assignments, unreadCount, threads, refreshAssignments, refreshThreads, issueCounts, refreshIssueCounts, isLoading } = useBugBear();
435
606
  (0, import_react3.useEffect)(() => {
436
607
  refreshAssignments();
437
608
  refreshThreads();
@@ -442,8 +613,9 @@ function HomeScreen({ nav }) {
442
613
  const retestCount = pendingAssignments.filter((a) => a.isVerification).length;
443
614
  const completedCount = assignments.filter((a) => a.status === "passed" || a.status === "failed").length;
444
615
  const totalTests = assignments.length;
445
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
446
- pendingCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
616
+ if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(HomeScreenSkeleton, {});
617
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
618
+ pendingCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
447
619
  "div",
448
620
  {
449
621
  role: "button",
@@ -465,13 +637,13 @@ function HomeScreen({ nav }) {
465
637
  userSelect: "none"
466
638
  },
467
639
  children: [
468
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: pendingCount }),
469
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
640
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: pendingCount }),
641
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
470
642
  "test",
471
643
  pendingCount !== 1 ? "s" : "",
472
644
  " waiting"
473
645
  ] }),
474
- retestCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
646
+ retestCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
475
647
  "span",
476
648
  {
477
649
  style: {
@@ -495,10 +667,10 @@ function HomeScreen({ nav }) {
495
667
  ]
496
668
  }
497
669
  ),
498
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "Start Testing \u2192" })
670
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "Start Testing \u2192" })
499
671
  ]
500
672
  }
501
- ) : unreadCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
673
+ ) : unreadCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
502
674
  "div",
503
675
  {
504
676
  role: "button",
@@ -520,15 +692,15 @@ function HomeScreen({ nav }) {
520
692
  userSelect: "none"
521
693
  },
522
694
  children: [
523
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: unreadCount }),
524
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
695
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 48, fontWeight: 700, color: colors.blueLight }, children: unreadCount }),
696
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 16, color: colors.blueText, marginTop: 2 }, children: [
525
697
  "unread message",
526
698
  unreadCount !== 1 ? "s" : ""
527
699
  ] }),
528
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "View Messages \u2192" })
700
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 600, color: colors.blue, marginTop: 12 }, children: "View Messages \u2192" })
529
701
  ]
530
702
  }
531
- ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
703
+ ) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
532
704
  "div",
533
705
  {
534
706
  style: {
@@ -542,9 +714,9 @@ function HomeScreen({ nav }) {
542
714
  marginBottom: 20
543
715
  },
544
716
  children: [
545
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 36, marginBottom: 8 }, children: "\u2705" }),
546
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary }, children: "All caught up!" }),
547
- totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: { fontSize: 14, color: colors.textMuted, marginTop: 4 }, children: [
717
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 36, marginBottom: 8 }, children: "\u2705" }),
718
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary }, children: "All caught up!" }),
719
+ totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 14, color: colors.textMuted, marginTop: 4 }, children: [
548
720
  completedCount,
549
721
  "/",
550
722
  totalTests,
@@ -553,7 +725,7 @@ function HomeScreen({ nav }) {
553
725
  ]
554
726
  }
555
727
  ),
556
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
728
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
557
729
  "div",
558
730
  {
559
731
  style: {
@@ -563,7 +735,7 @@ function HomeScreen({ nav }) {
563
735
  marginBottom: 20
564
736
  },
565
737
  children: [
566
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
738
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
567
739
  "div",
568
740
  {
569
741
  role: "button",
@@ -585,9 +757,9 @@ function HomeScreen({ nav }) {
585
757
  userSelect: "none"
586
758
  },
587
759
  children: [
588
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u2705" }),
589
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Tests" }),
590
- pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
760
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u2705" }),
761
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Tests" }),
762
+ pendingCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
591
763
  "span",
592
764
  {
593
765
  style: {
@@ -613,7 +785,7 @@ function HomeScreen({ nav }) {
613
785
  ]
614
786
  }
615
787
  ),
616
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
788
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
617
789
  "div",
618
790
  {
619
791
  role: "button",
@@ -635,12 +807,12 @@ function HomeScreen({ nav }) {
635
807
  userSelect: "none"
636
808
  },
637
809
  children: [
638
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F41B}" }),
639
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Report Bug" })
810
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F41B}" }),
811
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Report Bug" })
640
812
  ]
641
813
  }
642
814
  ),
643
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
815
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
644
816
  "div",
645
817
  {
646
818
  role: "button",
@@ -662,12 +834,12 @@ function HomeScreen({ nav }) {
662
834
  userSelect: "none"
663
835
  },
664
836
  children: [
665
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4A1}" }),
666
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Feedback" })
837
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4A1}" }),
838
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Feedback" })
667
839
  ]
668
840
  }
669
841
  ),
670
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
842
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
671
843
  "div",
672
844
  {
673
845
  role: "button",
@@ -689,9 +861,9 @@ function HomeScreen({ nav }) {
689
861
  userSelect: "none"
690
862
  },
691
863
  children: [
692
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4AC}" }),
693
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Messages" }),
694
- unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
864
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 28, marginBottom: 8 }, children: "\u{1F4AC}" }),
865
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textPrimary }, children: "Messages" }),
866
+ unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
695
867
  "span",
696
868
  {
697
869
  style: {
@@ -720,8 +892,8 @@ function HomeScreen({ nav }) {
720
892
  ]
721
893
  }
722
894
  ),
723
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
724
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
895
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 10, marginBottom: 20 }, children: [
896
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
725
897
  "div",
726
898
  {
727
899
  role: "button",
@@ -743,12 +915,12 @@ function HomeScreen({ nav }) {
743
915
  userSelect: "none"
744
916
  },
745
917
  children: [
746
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
747
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
918
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#f97316" }, children: issueCounts.open }),
919
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Open" })
748
920
  ]
749
921
  }
750
922
  ),
751
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
923
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
752
924
  "div",
753
925
  {
754
926
  role: "button",
@@ -770,12 +942,12 @@ function HomeScreen({ nav }) {
770
942
  userSelect: "none"
771
943
  },
772
944
  children: [
773
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
774
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
945
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#22c55e" }, children: issueCounts.done }),
946
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Done" })
775
947
  ]
776
948
  }
777
949
  ),
778
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
950
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
779
951
  "div",
780
952
  {
781
953
  role: "button",
@@ -797,14 +969,14 @@ function HomeScreen({ nav }) {
797
969
  userSelect: "none"
798
970
  },
799
971
  children: [
800
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
801
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
972
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 22, fontWeight: 700, color: "#ef4444" }, children: issueCounts.reopened }),
973
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 11, fontWeight: 600, color: "#a1a1aa", marginTop: 2 }, children: "Reopened" })
802
974
  ]
803
975
  }
804
976
  )
805
977
  ] }),
806
- totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { marginBottom: 16 }, children: [
807
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
978
+ totalTests > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { marginBottom: 16 }, children: [
979
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
808
980
  "div",
809
981
  {
810
982
  style: {
@@ -814,7 +986,7 @@ function HomeScreen({ nav }) {
814
986
  overflow: "hidden",
815
987
  marginBottom: 6
816
988
  },
817
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
989
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
818
990
  "div",
819
991
  {
820
992
  style: {
@@ -828,14 +1000,14 @@ function HomeScreen({ nav }) {
828
1000
  )
829
1001
  }
830
1002
  ),
831
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { fontSize: 12, color: colors.textMuted, textAlign: "center" }, children: [
1003
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { fontSize: 12, color: colors.textMuted, textAlign: "center" }, children: [
832
1004
  completedCount,
833
1005
  "/",
834
1006
  totalTests,
835
1007
  " tests completed"
836
1008
  ] })
837
1009
  ] }),
838
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1010
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { display: "flex", justifyContent: "center", padding: "8px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
839
1011
  "button",
840
1012
  {
841
1013
  type: "button",
@@ -860,7 +1032,7 @@ function HomeScreen({ nav }) {
860
1032
 
861
1033
  // src/widget/screens/TestDetailScreen.tsx
862
1034
  var import_react4 = require("react");
863
- var import_jsx_runtime3 = require("react/jsx-runtime");
1035
+ var import_jsx_runtime4 = require("react/jsx-runtime");
864
1036
  function TestDetailScreen({ testId, nav }) {
865
1037
  const { client, assignments, currentAssignment, refreshAssignments, onNavigate } = useBugBear();
866
1038
  const displayedAssignment = testId ? assignments.find((a) => a.id === testId) || currentAssignment : currentAssignment;
@@ -948,7 +1120,7 @@ function TestDetailScreen({ testId, nav }) {
948
1120
  }
949
1121
  }, [client, displayedAssignment, selectedSkipReason, skipNotes, refreshAssignments, assignments, nav]);
950
1122
  if (!displayedAssignment) {
951
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1123
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
952
1124
  "div",
953
1125
  {
954
1126
  style: {
@@ -959,10 +1131,10 @@ function TestDetailScreen({ testId, nav }) {
959
1131
  padding: 40
960
1132
  },
961
1133
  children: [
962
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
963
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
964
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
965
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1134
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 48, marginBottom: 12 }, children: "\u2705" }),
1135
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 18, fontWeight: 600, color: colors.textPrimary, marginBottom: 4 }, children: "No tests assigned" }),
1136
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 20 }, children: "Check back later for new tests" }),
1137
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
966
1138
  "button",
967
1139
  {
968
1140
  type: "button",
@@ -995,8 +1167,8 @@ function TestDetailScreen({ testId, nav }) {
995
1167
  { reason: "dependency", label: "\u{1F517} Needs another test first" },
996
1168
  { reason: "other", label: "\u{1F4DD} Other reason" }
997
1169
  ];
998
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { paddingBottom: 16 }, children: [
999
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1170
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { paddingBottom: 16 }, children: [
1171
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1000
1172
  "div",
1001
1173
  {
1002
1174
  style: {
@@ -1006,14 +1178,14 @@ function TestDetailScreen({ testId, nav }) {
1006
1178
  marginBottom: 12
1007
1179
  },
1008
1180
  children: [
1009
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1010
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
1181
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
1182
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 13, color: colors.textMuted }, children: [
1011
1183
  "Test ",
1012
1184
  currentIndex + 1,
1013
1185
  " of ",
1014
1186
  allTests.length
1015
1187
  ] }),
1016
- displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1188
+ displayedAssignment.status === "in_progress" && assignmentElapsedTime > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1017
1189
  "span",
1018
1190
  {
1019
1191
  style: {
@@ -1032,7 +1204,7 @@ function TestDetailScreen({ testId, nav }) {
1032
1204
  }
1033
1205
  )
1034
1206
  ] }),
1035
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1207
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1036
1208
  "button",
1037
1209
  {
1038
1210
  type: "button",
@@ -1052,7 +1224,7 @@ function TestDetailScreen({ testId, nav }) {
1052
1224
  ]
1053
1225
  }
1054
1226
  ),
1055
- displayedAssignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1227
+ displayedAssignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1056
1228
  "div",
1057
1229
  {
1058
1230
  style: {
@@ -1066,14 +1238,14 @@ function TestDetailScreen({ testId, nav }) {
1066
1238
  marginBottom: 10
1067
1239
  },
1068
1240
  children: [
1069
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
1070
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
1071
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
1241
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14 }, children: "\u{1F504}" }),
1242
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Retest" }),
1243
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 12, color: "#d97706" }, children: "\u2014 Verify bug fix" })
1072
1244
  ]
1073
1245
  }
1074
1246
  ),
1075
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1076
- testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1247
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 20, fontWeight: 700, color: colors.textPrimary, marginBottom: 4 }, children: testCase.title }),
1248
+ testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1077
1249
  "div",
1078
1250
  {
1079
1251
  style: {
@@ -1085,7 +1257,7 @@ function TestDetailScreen({ testId, nav }) {
1085
1257
  children: testCase.testKey
1086
1258
  }
1087
1259
  ),
1088
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1260
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1089
1261
  "button",
1090
1262
  {
1091
1263
  type: "button",
@@ -1101,7 +1273,7 @@ function TestDetailScreen({ testId, nav }) {
1101
1273
  cursor: "pointer",
1102
1274
  textAlign: "left"
1103
1275
  },
1104
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1276
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 14, fontWeight: 500, color: colors.textSecondary }, children: [
1105
1277
  showSteps ? "\u25BC" : "\u25B6",
1106
1278
  " ",
1107
1279
  info.icon,
@@ -1110,9 +1282,9 @@ function TestDetailScreen({ testId, nav }) {
1110
1282
  ] })
1111
1283
  }
1112
1284
  ),
1113
- showSteps && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { marginBottom: 16 }, children: [
1114
- template === "steps" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", marginBottom: 10 }, children: [
1115
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1285
+ showSteps && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 16 }, children: [
1286
+ template === "steps" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", marginBottom: 10 }, children: [
1287
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1116
1288
  "div",
1117
1289
  {
1118
1290
  style: {
@@ -1127,12 +1299,12 @@ function TestDetailScreen({ testId, nav }) {
1127
1299
  marginTop: 2,
1128
1300
  flexShrink: 0
1129
1301
  },
1130
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1302
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 12, fontWeight: 600, color: "#fff" }, children: step.stepNumber })
1131
1303
  }
1132
1304
  ),
1133
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { flex: 1 }, children: [
1134
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
1135
- step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1305
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { flex: 1 }, children: [
1306
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 14, color: colors.textPrimary, lineHeight: "20px" }, children: step.action }),
1307
+ step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1136
1308
  "div",
1137
1309
  {
1138
1310
  style: {
@@ -1149,8 +1321,8 @@ function TestDetailScreen({ testId, nav }) {
1149
1321
  )
1150
1322
  ] })
1151
1323
  ] }, idx)),
1152
- template === "checklist" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1153
- steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1324
+ template === "checklist" && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1325
+ steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1154
1326
  "button",
1155
1327
  {
1156
1328
  type: "button",
@@ -1176,7 +1348,7 @@ function TestDetailScreen({ testId, nav }) {
1176
1348
  textAlign: "left"
1177
1349
  },
1178
1350
  children: [
1179
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1351
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1180
1352
  "div",
1181
1353
  {
1182
1354
  style: {
@@ -1191,10 +1363,10 @@ function TestDetailScreen({ testId, nav }) {
1191
1363
  alignItems: "center",
1192
1364
  flexShrink: 0
1193
1365
  },
1194
- children: criteriaResults[idx] === true && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1366
+ children: criteriaResults[idx] === true && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { color: "#fff", fontSize: 14, fontWeight: "bold" }, children: "\u2713" })
1195
1367
  }
1196
1368
  ),
1197
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1369
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1198
1370
  "span",
1199
1371
  {
1200
1372
  style: {
@@ -1210,7 +1382,7 @@ function TestDetailScreen({ testId, nav }) {
1210
1382
  },
1211
1383
  idx
1212
1384
  )),
1213
- Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1385
+ Object.keys(criteriaResults).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", justifyContent: "flex-end", paddingTop: 4 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1214
1386
  "button",
1215
1387
  {
1216
1388
  type: "button",
@@ -1227,8 +1399,8 @@ function TestDetailScreen({ testId, nav }) {
1227
1399
  }
1228
1400
  ) })
1229
1401
  ] }),
1230
- template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { marginBottom: 14 }, children: [
1231
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1402
+ template === "rubric" && steps.map((step, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 14 }, children: [
1403
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1232
1404
  "div",
1233
1405
  {
1234
1406
  style: {
@@ -1244,7 +1416,7 @@ function TestDetailScreen({ testId, nav }) {
1244
1416
  ]
1245
1417
  }
1246
1418
  ),
1247
- step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1419
+ step.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1248
1420
  "div",
1249
1421
  {
1250
1422
  style: {
@@ -1256,8 +1428,8 @@ function TestDetailScreen({ testId, nav }) {
1256
1428
  children: step.expectedResult
1257
1429
  }
1258
1430
  ),
1259
- rubricMode === "pass_fail" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1260
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1431
+ rubricMode === "pass_fail" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 8, marginLeft: 16 }, children: [
1432
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1261
1433
  "button",
1262
1434
  {
1263
1435
  type: "button",
@@ -1278,7 +1450,7 @@ function TestDetailScreen({ testId, nav }) {
1278
1450
  children: "\u2713 Pass"
1279
1451
  }
1280
1452
  ),
1281
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1453
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1282
1454
  "button",
1283
1455
  {
1284
1456
  type: "button",
@@ -1299,7 +1471,7 @@ function TestDetailScreen({ testId, nav }) {
1299
1471
  children: "\u2717 Fail"
1300
1472
  }
1301
1473
  )
1302
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1474
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", gap: 6, marginLeft: 16 }, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1303
1475
  "button",
1304
1476
  {
1305
1477
  type: "button",
@@ -1323,7 +1495,7 @@ function TestDetailScreen({ testId, nav }) {
1323
1495
  n
1324
1496
  )) })
1325
1497
  ] }, idx)),
1326
- template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1498
+ template === "freeform" && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1327
1499
  "div",
1328
1500
  {
1329
1501
  style: {
@@ -1333,15 +1505,15 @@ function TestDetailScreen({ testId, nav }) {
1333
1505
  border: "1px solid #854d0e"
1334
1506
  },
1335
1507
  children: [
1336
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
1337
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
1338
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
1339
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
1508
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: "#fde68a", marginBottom: 6 }, children: "Review the area and note:" }),
1509
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 What works well" }),
1510
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Issues or concerns" }),
1511
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: "#fde68a", marginLeft: 8, marginBottom: 2 }, children: "\u2022 Suggestions" })
1340
1512
  ]
1341
1513
  }
1342
1514
  )
1343
1515
  ] }),
1344
- testCase.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1516
+ testCase.expectedResult && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1345
1517
  "div",
1346
1518
  {
1347
1519
  style: {
@@ -1352,12 +1524,12 @@ function TestDetailScreen({ testId, nav }) {
1352
1524
  marginBottom: 12
1353
1525
  },
1354
1526
  children: [
1355
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
1356
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
1527
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, fontWeight: 600, color: colors.green, marginBottom: 4 }, children: "\u2705 Expected Result" }),
1528
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: "#bbf7d0", lineHeight: "20px" }, children: testCase.expectedResult })
1357
1529
  ]
1358
1530
  }
1359
1531
  ),
1360
- testCase.targetRoute && onNavigate && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1532
+ testCase.targetRoute && onNavigate && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1361
1533
  "button",
1362
1534
  {
1363
1535
  type: "button",
@@ -1379,7 +1551,7 @@ function TestDetailScreen({ testId, nav }) {
1379
1551
  children: "\u{1F9ED} Go to test location"
1380
1552
  }
1381
1553
  ),
1382
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1554
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1383
1555
  "button",
1384
1556
  {
1385
1557
  type: "button",
@@ -1403,7 +1575,7 @@ function TestDetailScreen({ testId, nav }) {
1403
1575
  ]
1404
1576
  }
1405
1577
  ),
1406
- showDetails && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1578
+ showDetails && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1407
1579
  "div",
1408
1580
  {
1409
1581
  style: {
@@ -1414,7 +1586,7 @@ function TestDetailScreen({ testId, nav }) {
1414
1586
  marginBottom: 16
1415
1587
  },
1416
1588
  children: [
1417
- testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1589
+ testCase.testKey && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1418
1590
  "div",
1419
1591
  {
1420
1592
  style: {
@@ -1432,16 +1604,16 @@ function TestDetailScreen({ testId, nav }) {
1432
1604
  ]
1433
1605
  }
1434
1606
  ),
1435
- testCase.description && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
1436
- testCase.group && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
1607
+ testCase.description && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 13, color: colors.textSecondary, lineHeight: "18px" }, children: testCase.description }),
1608
+ testCase.group && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
1437
1609
  "\u{1F4C1} ",
1438
1610
  testCase.group.name
1439
1611
  ] }) })
1440
1612
  ]
1441
1613
  }
1442
1614
  ),
1443
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1444
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1615
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 8 }, children: [
1616
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1445
1617
  "button",
1446
1618
  {
1447
1619
  type: "button",
@@ -1464,7 +1636,7 @@ function TestDetailScreen({ testId, nav }) {
1464
1636
  children: isSubmitting ? "Failing..." : "Fail"
1465
1637
  }
1466
1638
  ),
1467
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1639
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1468
1640
  "button",
1469
1641
  {
1470
1642
  type: "button",
@@ -1487,7 +1659,7 @@ function TestDetailScreen({ testId, nav }) {
1487
1659
  children: "Skip"
1488
1660
  }
1489
1661
  ),
1490
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1662
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1491
1663
  "button",
1492
1664
  {
1493
1665
  type: "button",
@@ -1511,7 +1683,7 @@ function TestDetailScreen({ testId, nav }) {
1511
1683
  }
1512
1684
  )
1513
1685
  ] }),
1514
- showSkipModal && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1686
+ showSkipModal && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1515
1687
  "div",
1516
1688
  {
1517
1689
  style: {
@@ -1524,7 +1696,7 @@ function TestDetailScreen({ testId, nav }) {
1524
1696
  zIndex: 9999,
1525
1697
  padding: 24
1526
1698
  },
1527
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
1699
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1528
1700
  "div",
1529
1701
  {
1530
1702
  style: {
@@ -1536,7 +1708,7 @@ function TestDetailScreen({ testId, nav }) {
1536
1708
  width: "100%"
1537
1709
  },
1538
1710
  children: [
1539
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1711
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1540
1712
  "div",
1541
1713
  {
1542
1714
  style: {
@@ -1548,8 +1720,8 @@ function TestDetailScreen({ testId, nav }) {
1548
1720
  children: "Skip this test?"
1549
1721
  }
1550
1722
  ),
1551
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1552
- skipReasons.map(({ reason, label }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1723
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: 14, color: colors.textMuted, marginBottom: 12 }, children: "Select a reason:" }),
1724
+ skipReasons.map(({ reason, label }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1553
1725
  "button",
1554
1726
  {
1555
1727
  type: "button",
@@ -1575,7 +1747,7 @@ function TestDetailScreen({ testId, nav }) {
1575
1747
  },
1576
1748
  reason
1577
1749
  )),
1578
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1750
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1579
1751
  "textarea",
1580
1752
  {
1581
1753
  value: skipNotes,
@@ -1598,8 +1770,8 @@ function TestDetailScreen({ testId, nav }) {
1598
1770
  }
1599
1771
  }
1600
1772
  ),
1601
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1602
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1773
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 10, marginTop: 14 }, children: [
1774
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1603
1775
  "button",
1604
1776
  {
1605
1777
  type: "button",
@@ -1623,7 +1795,7 @@ function TestDetailScreen({ testId, nav }) {
1623
1795
  children: "Cancel"
1624
1796
  }
1625
1797
  ),
1626
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1798
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1627
1799
  "button",
1628
1800
  {
1629
1801
  type: "button",
@@ -1657,11 +1829,14 @@ function TestDetailScreen({ testId, nav }) {
1657
1829
 
1658
1830
  // src/widget/screens/TestListScreen.tsx
1659
1831
  var import_react5 = require("react");
1660
- var import_jsx_runtime4 = require("react/jsx-runtime");
1832
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1661
1833
  function TestListScreen({ nav }) {
1662
- const { assignments, currentAssignment, refreshAssignments } = useBugBear();
1834
+ const { assignments, currentAssignment, refreshAssignments, isLoading } = useBugBear();
1663
1835
  const [filter, setFilter] = (0, import_react5.useState)("all");
1664
1836
  const [roleFilter, setRoleFilter] = (0, import_react5.useState)(null);
1837
+ const [trackFilter, setTrackFilter] = (0, import_react5.useState)(null);
1838
+ const [searchQuery, setSearchQuery] = (0, import_react5.useState)("");
1839
+ const [sortMode, setSortMode] = (0, import_react5.useState)("priority");
1665
1840
  const [collapsedFolders, setCollapsedFolders] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
1666
1841
  const availableRoles = (0, import_react5.useMemo)(() => {
1667
1842
  const roleMap = /* @__PURE__ */ new Map();
@@ -1670,6 +1845,13 @@ function TestListScreen({ nav }) {
1670
1845
  }
1671
1846
  return Array.from(roleMap.values());
1672
1847
  }, [assignments]);
1848
+ const availableTracks = (0, import_react5.useMemo)(() => {
1849
+ const trackMap = /* @__PURE__ */ new Map();
1850
+ for (const a of assignments) {
1851
+ if (a.testCase.track) trackMap.set(a.testCase.track.id, a.testCase.track);
1852
+ }
1853
+ return Array.from(trackMap.values());
1854
+ }, [assignments]);
1673
1855
  const selectedRole = availableRoles.find((r) => r.id === roleFilter);
1674
1856
  const groupedAssignments = (0, import_react5.useMemo)(() => {
1675
1857
  const groups = /* @__PURE__ */ new Map();
@@ -1703,6 +1885,12 @@ function TestListScreen({ nav }) {
1703
1885
  folder.assignments.sort((a, b) => {
1704
1886
  if (a.isVerification && !b.isVerification) return -1;
1705
1887
  if (!a.isVerification && b.isVerification) return 1;
1888
+ if (sortMode === "alpha") {
1889
+ return a.testCase.title.localeCompare(b.testCase.title);
1890
+ }
1891
+ if (sortMode === "recent") {
1892
+ return 0;
1893
+ }
1706
1894
  const sd = (statusOrder[a.status] ?? 5) - (statusOrder[b.status] ?? 5);
1707
1895
  if (sd !== 0) return sd;
1708
1896
  return (priorityOrder[a.testCase.priority] ?? 4) - (priorityOrder[b.testCase.priority] ?? 4);
@@ -1714,7 +1902,7 @@ function TestListScreen({ nav }) {
1714
1902
  if (!b.group) return -1;
1715
1903
  return a.group.sortOrder - b.group.sortOrder;
1716
1904
  });
1717
- }, [assignments]);
1905
+ }, [assignments, sortMode]);
1718
1906
  const toggleFolder = (0, import_react5.useCallback)((id) => {
1719
1907
  setCollapsedFolders((prev) => {
1720
1908
  const next = new Set(prev);
@@ -1723,13 +1911,20 @@ function TestListScreen({ nav }) {
1723
1911
  return next;
1724
1912
  });
1725
1913
  }, []);
1726
- const filterAssignment = (a) => {
1914
+ const filterAssignment = (0, import_react5.useCallback)((a) => {
1727
1915
  if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
1916
+ if (trackFilter && a.testCase.track?.id !== trackFilter) return false;
1917
+ if (searchQuery) {
1918
+ const q = searchQuery.toLowerCase();
1919
+ const titleMatch = a.testCase.title.toLowerCase().includes(q);
1920
+ const keyMatch = a.testCase.testKey.toLowerCase().includes(q);
1921
+ if (!titleMatch && !keyMatch) return false;
1922
+ }
1728
1923
  if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
1729
1924
  if (filter === "done") return a.status === "passed";
1730
1925
  if (filter === "reopened") return a.status === "failed";
1731
1926
  return true;
1732
- };
1927
+ }, [roleFilter, trackFilter, searchQuery, filter]);
1733
1928
  const pendingCount = assignments.filter(
1734
1929
  (a) => a.status === "pending" || a.status === "in_progress"
1735
1930
  ).length;
@@ -1741,8 +1936,9 @@ function TestListScreen({ nav }) {
1741
1936
  { key: "done", label: "Done", count: doneCount },
1742
1937
  { key: "reopened", label: "Re Opened", count: reopenedCount }
1743
1938
  ];
1744
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
1745
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1939
+ if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TestListScreenSkeleton, {});
1940
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
1941
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1746
1942
  "button",
1747
1943
  {
1748
1944
  type: "button",
@@ -1769,9 +1965,9 @@ function TestListScreen({ nav }) {
1769
1965
  },
1770
1966
  f.key
1771
1967
  )) }),
1772
- availableRoles.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 12 }, children: [
1773
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
1774
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1968
+ availableRoles.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { marginBottom: 12 }, children: [
1969
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
1970
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1775
1971
  "button",
1776
1972
  {
1777
1973
  type: "button",
@@ -1794,7 +1990,7 @@ function TestListScreen({ nav }) {
1794
1990
  ),
1795
1991
  availableRoles.map((role) => {
1796
1992
  const isActive = roleFilter === role.id;
1797
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1993
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1798
1994
  "button",
1799
1995
  {
1800
1996
  type: "button",
@@ -1816,7 +2012,7 @@ function TestListScreen({ nav }) {
1816
2012
  fontWeight: isActive ? 600 : 400
1817
2013
  },
1818
2014
  children: [
1819
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: {
2015
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: {
1820
2016
  width: 6,
1821
2017
  height: 6,
1822
2018
  borderRadius: 3,
@@ -1830,7 +2026,7 @@ function TestListScreen({ nav }) {
1830
2026
  );
1831
2027
  })
1832
2028
  ] }),
1833
- selectedRole?.loginHint && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: {
2029
+ selectedRole?.loginHint && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: {
1834
2030
  fontSize: 11,
1835
2031
  color: colors.textSecondary,
1836
2032
  backgroundColor: selectedRole.color + "10",
@@ -1842,6 +2038,103 @@ function TestListScreen({ nav }) {
1842
2038
  selectedRole.loginHint
1843
2039
  ] })
1844
2040
  ] }),
2041
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { marginBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2042
+ "input",
2043
+ {
2044
+ type: "text",
2045
+ value: searchQuery,
2046
+ onChange: (e) => setSearchQuery(e.target.value),
2047
+ placeholder: "Search tests...",
2048
+ style: {
2049
+ width: "100%",
2050
+ padding: "8px 12px",
2051
+ borderRadius: 8,
2052
+ border: `1px solid ${colors.border}`,
2053
+ backgroundColor: colors.card,
2054
+ color: colors.textPrimary,
2055
+ fontSize: 13,
2056
+ outline: "none",
2057
+ boxSizing: "border-box"
2058
+ }
2059
+ }
2060
+ ) }),
2061
+ (availableTracks.length >= 2 || true) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6, marginBottom: 12 }, children: [
2062
+ availableTracks.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 4, flex: 1, overflow: "auto" }, children: [
2063
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2064
+ "button",
2065
+ {
2066
+ type: "button",
2067
+ onClick: () => setTrackFilter(null),
2068
+ style: {
2069
+ padding: "3px 8px",
2070
+ borderRadius: 6,
2071
+ backgroundColor: !trackFilter ? colors.card : "transparent",
2072
+ border: !trackFilter ? `1px solid ${colors.border}` : "1px solid transparent",
2073
+ cursor: "pointer",
2074
+ fontSize: 11,
2075
+ color: !trackFilter ? colors.textPrimary : colors.textMuted,
2076
+ fontWeight: !trackFilter ? 600 : 400,
2077
+ whiteSpace: "nowrap"
2078
+ },
2079
+ children: "All Tracks"
2080
+ }
2081
+ ),
2082
+ availableTracks.map((track) => {
2083
+ const isActive = trackFilter === track.id;
2084
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2085
+ "button",
2086
+ {
2087
+ type: "button",
2088
+ onClick: () => setTrackFilter(isActive ? null : track.id),
2089
+ style: {
2090
+ display: "flex",
2091
+ alignItems: "center",
2092
+ gap: 4,
2093
+ padding: "3px 8px",
2094
+ borderRadius: 6,
2095
+ backgroundColor: isActive ? track.color + "20" : "transparent",
2096
+ border: isActive ? `1px solid ${track.color}60` : "1px solid transparent",
2097
+ cursor: "pointer",
2098
+ fontSize: 11,
2099
+ color: isActive ? track.color : colors.textMuted,
2100
+ fontWeight: isActive ? 600 : 400,
2101
+ whiteSpace: "nowrap"
2102
+ },
2103
+ children: [
2104
+ track.icon,
2105
+ " ",
2106
+ track.name
2107
+ ]
2108
+ },
2109
+ track.id
2110
+ );
2111
+ })
2112
+ ] }),
2113
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", gap: 2, marginLeft: "auto", flexShrink: 0 }, children: [
2114
+ { key: "priority", label: "\u2195 Priority" },
2115
+ { key: "recent", label: "\u{1F550} Recent" },
2116
+ { key: "alpha", label: "A-Z" }
2117
+ ].map((s) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2118
+ "button",
2119
+ {
2120
+ type: "button",
2121
+ onClick: () => setSortMode(s.key),
2122
+ style: {
2123
+ padding: "3px 8px",
2124
+ borderRadius: 6,
2125
+ backgroundColor: sortMode === s.key ? colors.card : "transparent",
2126
+ border: sortMode === s.key ? `1px solid ${colors.border}` : "1px solid transparent",
2127
+ cursor: "pointer",
2128
+ fontSize: 10,
2129
+ color: sortMode === s.key ? colors.textPrimary : colors.textMuted,
2130
+ fontWeight: sortMode === s.key ? 600 : 400,
2131
+ whiteSpace: "nowrap"
2132
+ },
2133
+ children: s.label
2134
+ },
2135
+ s.key
2136
+ )) })
2137
+ ] }),
1845
2138
  groupedAssignments.map((folder) => {
1846
2139
  const folderId = folder.group?.id || "ungrouped";
1847
2140
  const isCollapsed = collapsedFolders.has(folderId);
@@ -1849,8 +2142,8 @@ function TestListScreen({ nav }) {
1849
2142
  if (filtered.length === 0 && filter !== "all") return null;
1850
2143
  const completedInFolder = folder.stats.passed + folder.stats.failed;
1851
2144
  const progressPercent = folder.stats.total > 0 ? Math.round(completedInFolder / folder.stats.total * 100) : 0;
1852
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 12 }, children: [
1853
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2145
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { marginBottom: 12 }, children: [
2146
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1854
2147
  "button",
1855
2148
  {
1856
2149
  type: "button",
@@ -1870,8 +2163,8 @@ function TestListScreen({ nav }) {
1870
2163
  textAlign: "left"
1871
2164
  },
1872
2165
  children: [
1873
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
1874
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2166
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 10, color: colors.textMuted, width: 14 }, children: isCollapsed ? "\u25B6" : "\u25BC" }),
2167
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1875
2168
  "span",
1876
2169
  {
1877
2170
  style: {
@@ -1886,7 +2179,7 @@ function TestListScreen({ nav }) {
1886
2179
  children: folder.group?.name || "Ungrouped"
1887
2180
  }
1888
2181
  ),
1889
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2182
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1890
2183
  "div",
1891
2184
  {
1892
2185
  style: {
@@ -1897,7 +2190,7 @@ function TestListScreen({ nav }) {
1897
2190
  overflow: "hidden",
1898
2191
  flexShrink: 0
1899
2192
  },
1900
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2193
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1901
2194
  "div",
1902
2195
  {
1903
2196
  style: {
@@ -1911,7 +2204,7 @@ function TestListScreen({ nav }) {
1911
2204
  )
1912
2205
  }
1913
2206
  ),
1914
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2207
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1915
2208
  "span",
1916
2209
  {
1917
2210
  style: {
@@ -1935,7 +2228,7 @@ function TestListScreen({ nav }) {
1935
2228
  const badge = getStatusBadge(assignment.status);
1936
2229
  const isCurrent = currentAssignment?.id === assignment.id;
1937
2230
  const priorityColor = assignment.testCase.priority === "P0" ? colors.red : assignment.testCase.priority === "P1" ? colors.orange : colors.textDim;
1938
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2231
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1939
2232
  "button",
1940
2233
  {
1941
2234
  type: "button",
@@ -1957,9 +2250,9 @@ function TestListScreen({ nav }) {
1957
2250
  textAlign: "left"
1958
2251
  },
1959
2252
  children: [
1960
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
1961
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1962
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2253
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 16, marginRight: 10, width: 20, flexShrink: 0 }, children: badge.icon }),
2254
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
2255
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1963
2256
  "div",
1964
2257
  {
1965
2258
  style: {
@@ -1973,9 +2266,9 @@ function TestListScreen({ nav }) {
1973
2266
  children: assignment.testCase.title
1974
2267
  }
1975
2268
  ),
1976
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
1977
- assignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1978
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2269
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
2270
+ assignment.isVerification && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
2271
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1979
2272
  "span",
1980
2273
  {
1981
2274
  style: {
@@ -1990,9 +2283,9 @@ function TestListScreen({ nav }) {
1990
2283
  children: "Retest"
1991
2284
  }
1992
2285
  ),
1993
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
2286
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" })
1994
2287
  ] }),
1995
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2288
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1996
2289
  "span",
1997
2290
  {
1998
2291
  style: {
@@ -2003,8 +2296,8 @@ function TestListScreen({ nav }) {
2003
2296
  children: assignment.testCase.testKey
2004
2297
  }
2005
2298
  ),
2006
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2007
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2299
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2300
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2008
2301
  "span",
2009
2302
  {
2010
2303
  style: {
@@ -2015,9 +2308,9 @@ function TestListScreen({ nav }) {
2015
2308
  children: assignment.testCase.priority
2016
2309
  }
2017
2310
  ),
2018
- assignment.testCase.role && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
2019
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2020
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: {
2311
+ assignment.testCase.role && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
2312
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
2313
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: {
2021
2314
  display: "inline-flex",
2022
2315
  alignItems: "center",
2023
2316
  gap: 3,
@@ -2025,7 +2318,7 @@ function TestListScreen({ nav }) {
2025
2318
  color: assignment.testCase.role.color,
2026
2319
  fontWeight: 500
2027
2320
  }, children: [
2028
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: {
2321
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: {
2029
2322
  width: 5,
2030
2323
  height: 5,
2031
2324
  borderRadius: 3,
@@ -2036,7 +2329,7 @@ function TestListScreen({ nav }) {
2036
2329
  ] })
2037
2330
  ] })
2038
2331
  ] }),
2039
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2332
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2040
2333
  "span",
2041
2334
  {
2042
2335
  style: {
@@ -2063,7 +2356,7 @@ function TestListScreen({ nav }) {
2063
2356
  groupedAssignments.every((folder) => {
2064
2357
  const filtered = folder.assignments.filter(filterAssignment);
2065
2358
  return filtered.length === 0;
2066
- }) && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2359
+ }) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2067
2360
  "div",
2068
2361
  {
2069
2362
  style: {
@@ -2073,12 +2366,12 @@ function TestListScreen({ nav }) {
2073
2366
  padding: 32
2074
2367
  },
2075
2368
  children: [
2076
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
2077
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("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" })
2369
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { fontSize: 32, marginBottom: 8 }, children: filter === "pending" ? "\u{1F389}" : filter === "reopened" ? "\u{1F44D}" : "\u{1F4CB}" }),
2370
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("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" })
2078
2371
  ]
2079
2372
  }
2080
2373
  ),
2081
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", justifyContent: "center", paddingTop: 12, paddingBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2374
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { display: "flex", justifyContent: "center", paddingTop: 12, paddingBottom: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2082
2375
  "button",
2083
2376
  {
2084
2377
  type: "button",
@@ -2174,13 +2467,13 @@ function useImageAttachments(uploadFn, maxImages, bucket = "screenshots") {
2174
2467
  }
2175
2468
 
2176
2469
  // src/widget/ImagePreviewStrip.tsx
2177
- var import_jsx_runtime5 = require("react/jsx-runtime");
2470
+ var import_jsx_runtime6 = require("react/jsx-runtime");
2178
2471
  function ImagePreviewStrip({ images, onRemove }) {
2179
2472
  if (images.length === 0) return null;
2180
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
2181
- images.map((img) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
2182
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
2183
- img.status === "uploading" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: {
2473
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", gap: 8, overflowX: "auto", paddingTop: 4 }, children: [
2474
+ images.map((img) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { position: "relative", width: 64, height: 64, flexShrink: 0, borderRadius: 8, overflow: "hidden" }, children: [
2475
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("img", { src: img.localUri, alt: img.name, style: { width: 64, height: 64, objectFit: "cover", borderRadius: 8 } }),
2476
+ img.status === "uploading" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
2184
2477
  position: "absolute",
2185
2478
  inset: 0,
2186
2479
  backgroundColor: "rgba(0,0,0,0.5)",
@@ -2188,7 +2481,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2188
2481
  alignItems: "center",
2189
2482
  justifyContent: "center",
2190
2483
  borderRadius: 8
2191
- }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: {
2484
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
2192
2485
  width: 16,
2193
2486
  height: 16,
2194
2487
  border: "2px solid #fff",
@@ -2196,7 +2489,7 @@ function ImagePreviewStrip({ images, onRemove }) {
2196
2489
  borderRadius: "50%",
2197
2490
  animation: "bb-spin 0.6s linear infinite"
2198
2491
  } }) }),
2199
- img.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: {
2492
+ img.status === "error" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: {
2200
2493
  position: "absolute",
2201
2494
  inset: 0,
2202
2495
  backgroundColor: "rgba(127,29,29,0.7)",
@@ -2204,8 +2497,8 @@ function ImagePreviewStrip({ images, onRemove }) {
2204
2497
  alignItems: "center",
2205
2498
  justifyContent: "center",
2206
2499
  borderRadius: 8
2207
- }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2208
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2500
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { color: "#fca5a5", fontSize: 18, fontWeight: "bold" }, children: "!" }) }),
2501
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2209
2502
  "button",
2210
2503
  {
2211
2504
  type: "button",
@@ -2232,18 +2525,18 @@ function ImagePreviewStrip({ images, onRemove }) {
2232
2525
  }
2233
2526
  )
2234
2527
  ] }, img.id)),
2235
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2528
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("style", { children: `@keyframes bb-spin { to { transform: rotate(360deg); } }` })
2236
2529
  ] });
2237
2530
  }
2238
2531
 
2239
2532
  // src/widget/ImagePickerButtons.tsx
2240
- var import_jsx_runtime6 = require("react/jsx-runtime");
2533
+ var import_jsx_runtime7 = require("react/jsx-runtime");
2241
2534
  function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, onRemove, label }) {
2242
2535
  const disabled = images.length >= maxImages;
2243
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
2244
- label && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
2245
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
2246
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2536
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { marginTop: 12, marginBottom: 4 }, children: [
2537
+ label && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { fontSize: 14, fontWeight: 500, color: "#e4e4e7", marginBottom: 8 }, children: label }),
2538
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }, children: [
2539
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2247
2540
  "button",
2248
2541
  {
2249
2542
  type: "button",
@@ -2264,7 +2557,7 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2264
2557
  children: "Gallery"
2265
2558
  }
2266
2559
  ),
2267
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2560
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2268
2561
  "button",
2269
2562
  {
2270
2563
  type: "button",
@@ -2285,18 +2578,18 @@ function ImagePickerButtons({ images, maxImages, onPickGallery, onPickCamera, on
2285
2578
  children: "Camera"
2286
2579
  }
2287
2580
  ),
2288
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2581
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { style: { fontSize: 12, color: colors.textDim, marginLeft: 4 }, children: [
2289
2582
  images.length,
2290
2583
  "/",
2291
2584
  maxImages
2292
2585
  ] })
2293
2586
  ] }),
2294
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ImagePreviewStrip, { images, onRemove })
2587
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ImagePreviewStrip, { images, onRemove })
2295
2588
  ] });
2296
2589
  }
2297
2590
 
2298
2591
  // src/widget/screens/TestFeedbackScreen.tsx
2299
- var import_jsx_runtime7 = require("react/jsx-runtime");
2592
+ var import_jsx_runtime8 = require("react/jsx-runtime");
2300
2593
  function TestFeedbackScreen({ status, assignmentId, nav }) {
2301
2594
  const { client, assignments, refreshAssignments, uploadImage } = useBugBear();
2302
2595
  const images = useImageAttachments(uploadImage, 3, "screenshots");
@@ -2329,6 +2622,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2329
2622
  }
2330
2623
  };
2331
2624
  const handleSubmit = async () => {
2625
+ if (submitting || images.isUploading) return;
2332
2626
  setSubmitting(true);
2333
2627
  if (client && assignment) {
2334
2628
  const screenshotUrls = images.getScreenshotUrls();
@@ -2364,10 +2658,10 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2364
2658
  { key: "stepsUnclear", label: "Steps are unclear" },
2365
2659
  { key: "expectedResultUnclear", label: "Expected result unclear" }
2366
2660
  ];
2367
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: styles.container, children: [
2368
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2369
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.subheader, children: "Rate this test case" }),
2370
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2661
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.container, children: [
2662
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.header, children: status === "passed" ? "\u2705 Test Passed!" : "\u274C Test Failed" }),
2663
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.subheader, children: "Rate this test case" }),
2664
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.starRow, children: [1, 2, 3, 4, 5].map((n) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2371
2665
  "button",
2372
2666
  {
2373
2667
  onClick: () => setRating(n),
@@ -2379,9 +2673,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2379
2673
  },
2380
2674
  n
2381
2675
  )) }),
2382
- showFlags && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: styles.flagsSection, children: [
2383
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2384
- flagOptions.map(({ key, label }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
2676
+ showFlags && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.flagsSection, children: [
2677
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: styles.flagsLabel, children: "What could be improved?" }),
2678
+ flagOptions.map(({ key, label }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2385
2679
  "button",
2386
2680
  {
2387
2681
  onClick: () => toggleFlag(key),
@@ -2390,17 +2684,17 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2390
2684
  ...flags[key] ? styles.flagItemActive : {}
2391
2685
  },
2392
2686
  children: [
2393
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2687
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2394
2688
  "div",
2395
2689
  {
2396
2690
  style: {
2397
2691
  ...styles.flagCheck,
2398
2692
  ...flags[key] ? styles.flagCheckActive : {}
2399
2693
  },
2400
- children: flags[key] && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: styles.flagCheckmark, children: "\u2713" })
2694
+ children: flags[key] && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: styles.flagCheckmark, children: "\u2713" })
2401
2695
  }
2402
2696
  ),
2403
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2697
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2404
2698
  "span",
2405
2699
  {
2406
2700
  style: {
@@ -2415,7 +2709,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2415
2709
  key
2416
2710
  ))
2417
2711
  ] }),
2418
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2712
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2419
2713
  "textarea",
2420
2714
  {
2421
2715
  style: styles.noteInput,
@@ -2425,7 +2719,7 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2425
2719
  rows: 3
2426
2720
  }
2427
2721
  ),
2428
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2722
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2429
2723
  ImagePickerButtons,
2430
2724
  {
2431
2725
  images: images.images,
@@ -2436,9 +2730,9 @@ function TestFeedbackScreen({ status, assignmentId, nav }) {
2436
2730
  label: "Screenshots (optional)"
2437
2731
  }
2438
2732
  ),
2439
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: styles.actions, children: [
2440
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2441
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2733
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: styles.actions, children: [
2734
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { style: styles.skipButton, onClick: handleSkip, children: "Skip" }),
2735
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2442
2736
  "button",
2443
2737
  {
2444
2738
  style: {
@@ -2591,7 +2885,7 @@ var styles = {
2591
2885
  var import_react8 = __toESM(require("react"));
2592
2886
 
2593
2887
  // src/widget/CategoryDropdown.tsx
2594
- var import_jsx_runtime8 = require("react/jsx-runtime");
2888
+ var import_jsx_runtime9 = require("react/jsx-runtime");
2595
2889
  var categoryOptions = [
2596
2890
  { value: "ui_ux", label: "UI/UX", icon: "\u{1F3A8}" },
2597
2891
  { value: "functional", label: "Functional", icon: "\u2699\uFE0F" },
@@ -2600,7 +2894,7 @@ var categoryOptions = [
2600
2894
  { value: "other", label: "Other", icon: "\u{1F4DD}" }
2601
2895
  ];
2602
2896
  function CategoryDropdown({ value, onChange, optional = true, disabled = false }) {
2603
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2897
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2604
2898
  "select",
2605
2899
  {
2606
2900
  value: value || "",
@@ -2623,8 +2917,8 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2623
2917
  paddingRight: 32
2624
2918
  },
2625
2919
  children: [
2626
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
2627
- categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("option", { value: value2, children: [
2920
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: optional ? "Select category (optional)" : "Select category" }),
2921
+ categoryOptions.map(({ value: value2, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("option", { value: value2, children: [
2628
2922
  icon,
2629
2923
  " ",
2630
2924
  label
@@ -2635,7 +2929,7 @@ function CategoryDropdown({ value, onChange, optional = true, disabled = false }
2635
2929
  }
2636
2930
 
2637
2931
  // src/widget/screens/ReportScreen.tsx
2638
- var import_jsx_runtime9 = require("react/jsx-runtime");
2932
+ var import_jsx_runtime10 = require("react/jsx-runtime");
2639
2933
  function ReportScreen({ nav, prefill }) {
2640
2934
  const { client, refreshAssignments, uploadImage } = useBugBear();
2641
2935
  const images = useImageAttachments(uploadImage, 5, "screenshots");
@@ -2710,17 +3004,17 @@ function ReportScreen({ nav, prefill }) {
2710
3004
  { sev: "medium", color: "#eab308" },
2711
3005
  { sev: "low", color: "#6b7280" }
2712
3006
  ];
2713
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { children: isRetestFailure ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
2714
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.retestBanner, children: [
2715
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
2716
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
2717
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
2718
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
3007
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { children: isRetestFailure ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
3008
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.retestBanner, children: [
3009
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
3010
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { children: [
3011
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.retestTitle, children: "Bug Still Present" }),
3012
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.retestSubtitle, children: "The fix did not resolve this issue" })
2719
3013
  ] })
2720
3014
  ] }),
2721
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2722
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Severity" }),
2723
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3015
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3016
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Severity" }),
3017
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2724
3018
  "button",
2725
3019
  {
2726
3020
  onClick: () => setSeverity(sev),
@@ -2728,18 +3022,18 @@ function ReportScreen({ nav, prefill }) {
2728
3022
  ...styles2.sevButton,
2729
3023
  ...severity === sev ? { backgroundColor: `${color}30`, borderColor: color } : {}
2730
3024
  },
2731
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
3025
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { ...styles2.sevText, ...severity === sev ? { color } : {} }, children: sev })
2732
3026
  },
2733
3027
  sev
2734
3028
  )) })
2735
3029
  ] }),
2736
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2737
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
2738
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
3030
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3031
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
3032
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2739
3033
  ] }),
2740
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2741
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "What went wrong?" }),
2742
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3034
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3035
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What went wrong?" }),
3036
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2743
3037
  "textarea",
2744
3038
  {
2745
3039
  style: styles2.descInput,
@@ -2750,7 +3044,7 @@ function ReportScreen({ nav, prefill }) {
2750
3044
  }
2751
3045
  )
2752
3046
  ] }),
2753
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3047
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2754
3048
  ImagePickerButtons,
2755
3049
  {
2756
3050
  images: images.images,
@@ -2761,8 +3055,8 @@ function ReportScreen({ nav, prefill }) {
2761
3055
  label: "Attachments (optional)"
2762
3056
  }
2763
3057
  ),
2764
- error && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.errorBanner, children: error }),
2765
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3058
+ error && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.errorBanner, children: error }),
3059
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2766
3060
  "button",
2767
3061
  {
2768
3062
  style: {
@@ -2775,9 +3069,9 @@ function ReportScreen({ nav, prefill }) {
2775
3069
  children: images.isUploading ? "Uploading images..." : submitting ? "Submitting..." : error ? "Retry" : "Submit Failed Retest"
2776
3070
  }
2777
3071
  )
2778
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
2779
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "What are you reporting?" }),
2780
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3072
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
3073
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What are you reporting?" }),
3074
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.typeRow, children: typeOptions.map(({ type, label, icon }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
2781
3075
  "button",
2782
3076
  {
2783
3077
  onClick: () => setReportType(type),
@@ -2786,8 +3080,8 @@ function ReportScreen({ nav, prefill }) {
2786
3080
  ...reportType === type ? styles2.typeCardActive : {}
2787
3081
  },
2788
3082
  children: [
2789
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.typeIcon, children: icon }),
2790
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3083
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.typeIcon, children: icon }),
3084
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2791
3085
  "div",
2792
3086
  {
2793
3087
  style: {
@@ -2801,9 +3095,9 @@ function ReportScreen({ nav, prefill }) {
2801
3095
  },
2802
3096
  type
2803
3097
  )) }),
2804
- isBugType && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2805
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Severity" }),
2806
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3098
+ isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3099
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Severity" }),
3100
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.severityRow, children: severityOptions.map(({ sev, color }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2807
3101
  "button",
2808
3102
  {
2809
3103
  onClick: () => setSeverity(sev),
@@ -2814,7 +3108,7 @@ function ReportScreen({ nav, prefill }) {
2814
3108
  borderColor: color
2815
3109
  } : {}
2816
3110
  },
2817
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3111
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2818
3112
  "span",
2819
3113
  {
2820
3114
  style: {
@@ -2828,13 +3122,13 @@ function ReportScreen({ nav, prefill }) {
2828
3122
  sev
2829
3123
  )) })
2830
3124
  ] }),
2831
- isBugType && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2832
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
2833
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
3125
+ isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3126
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Category (optional)" }),
3127
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(CategoryDropdown, { value: category, onChange: setCategory, optional: true })
2834
3128
  ] }),
2835
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2836
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "What happened?" }),
2837
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3129
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3130
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "What happened?" }),
3131
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2838
3132
  "textarea",
2839
3133
  {
2840
3134
  style: styles2.descInput,
@@ -2845,9 +3139,9 @@ function ReportScreen({ nav, prefill }) {
2845
3139
  }
2846
3140
  )
2847
3141
  ] }),
2848
- isBugType && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.section, children: [
2849
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.label, children: "Where did it happen?" }),
2850
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3142
+ isBugType && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.section, children: [
3143
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.label, children: "Where did it happen?" }),
3144
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2851
3145
  "input",
2852
3146
  {
2853
3147
  style: styles2.routeInput,
@@ -2856,13 +3150,13 @@ function ReportScreen({ nav, prefill }) {
2856
3150
  placeholder: observedRoute.current
2857
3151
  }
2858
3152
  ),
2859
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: styles2.routeHint, children: [
3153
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles2.routeHint, children: [
2860
3154
  "Leave blank to use current page (",
2861
3155
  observedRoute.current,
2862
3156
  ")"
2863
3157
  ] })
2864
3158
  ] }),
2865
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3159
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2866
3160
  ImagePickerButtons,
2867
3161
  {
2868
3162
  images: images.images,
@@ -2873,8 +3167,8 @@ function ReportScreen({ nav, prefill }) {
2873
3167
  label: "Screenshots (optional)"
2874
3168
  }
2875
3169
  ),
2876
- error && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: styles2.errorBanner, children: error }),
2877
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3170
+ error && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles2.errorBanner, children: error }),
3171
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2878
3172
  "button",
2879
3173
  {
2880
3174
  style: {
@@ -3039,16 +3333,16 @@ var styles2 = {
3039
3333
 
3040
3334
  // src/widget/screens/ReportSuccessScreen.tsx
3041
3335
  var import_react9 = require("react");
3042
- var import_jsx_runtime10 = require("react/jsx-runtime");
3336
+ var import_jsx_runtime11 = require("react/jsx-runtime");
3043
3337
  function ReportSuccessScreen({ nav }) {
3044
3338
  (0, import_react9.useEffect)(() => {
3045
3339
  const timer = setTimeout(() => nav.reset(), 2e3);
3046
3340
  return () => clearTimeout(timer);
3047
3341
  }, [nav]);
3048
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: styles3.container, children: [
3049
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles3.emoji, children: "\u{1F389}" }),
3050
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles3.title, children: "Report submitted!" }),
3051
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3342
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: styles3.container, children: [
3343
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.emoji, children: "\u{1F389}" }),
3344
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.title, children: "Report submitted!" }),
3345
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: styles3.subtitle, children: "Thank you for your feedback" })
3052
3346
  ] });
3053
3347
  }
3054
3348
  var styles3 = {
@@ -3077,11 +3371,12 @@ var styles3 = {
3077
3371
  };
3078
3372
 
3079
3373
  // src/widget/screens/MessageListScreen.tsx
3080
- var import_jsx_runtime11 = require("react/jsx-runtime");
3374
+ var import_jsx_runtime12 = require("react/jsx-runtime");
3081
3375
  function MessageListScreen({ nav }) {
3082
- const { threads, unreadCount, refreshThreads } = useBugBear();
3083
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { children: [
3084
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3376
+ const { threads, unreadCount, refreshThreads, isLoading } = useBugBear();
3377
+ if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MessageListScreenSkeleton, {});
3378
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { children: [
3379
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3085
3380
  "button",
3086
3381
  {
3087
3382
  style: {
@@ -3100,7 +3395,7 @@ function MessageListScreen({ nav }) {
3100
3395
  children: "\u2709\uFE0F New Message"
3101
3396
  }
3102
3397
  ),
3103
- threads.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3398
+ threads.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3104
3399
  "div",
3105
3400
  {
3106
3401
  style: {
@@ -3111,8 +3406,8 @@ function MessageListScreen({ nav }) {
3111
3406
  paddingBottom: 40
3112
3407
  },
3113
3408
  children: [
3114
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3115
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3409
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 36, marginBottom: 12 }, children: "\u{1F4AC}" }),
3410
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3116
3411
  "span",
3117
3412
  {
3118
3413
  style: {
@@ -3124,7 +3419,7 @@ function MessageListScreen({ nav }) {
3124
3419
  children: "No messages yet"
3125
3420
  }
3126
3421
  ),
3127
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3422
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3128
3423
  "span",
3129
3424
  {
3130
3425
  style: {
@@ -3137,7 +3432,7 @@ function MessageListScreen({ nav }) {
3137
3432
  )
3138
3433
  ]
3139
3434
  }
3140
- ) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { children: threads.map((thread) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3435
+ ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { children: threads.map((thread) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3141
3436
  "button",
3142
3437
  {
3143
3438
  style: {
@@ -3155,8 +3450,8 @@ function MessageListScreen({ nav }) {
3155
3450
  },
3156
3451
  onClick: () => nav.push({ name: "THREAD_DETAIL", thread }),
3157
3452
  children: [
3158
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3159
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3453
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { display: "flex", flex: 1, minWidth: 0 }, children: [
3454
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3160
3455
  "span",
3161
3456
  {
3162
3457
  style: {
@@ -3168,7 +3463,7 @@ function MessageListScreen({ nav }) {
3168
3463
  children: getThreadTypeIcon(thread.threadType)
3169
3464
  }
3170
3465
  ),
3171
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3466
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3172
3467
  "div",
3173
3468
  {
3174
3469
  style: {
@@ -3176,7 +3471,7 @@ function MessageListScreen({ nav }) {
3176
3471
  minWidth: 0
3177
3472
  },
3178
3473
  children: [
3179
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3474
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3180
3475
  "div",
3181
3476
  {
3182
3477
  style: {
@@ -3185,8 +3480,8 @@ function MessageListScreen({ nav }) {
3185
3480
  gap: 4
3186
3481
  },
3187
3482
  children: [
3188
- thread.isPinned && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3189
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3483
+ thread.isPinned && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 12, flexShrink: 0 }, children: "\u{1F4CC}" }),
3484
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3190
3485
  "span",
3191
3486
  {
3192
3487
  style: {
@@ -3203,7 +3498,7 @@ function MessageListScreen({ nav }) {
3203
3498
  ]
3204
3499
  }
3205
3500
  ),
3206
- thread.lastMessage && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3501
+ thread.lastMessage && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3207
3502
  "span",
3208
3503
  {
3209
3504
  style: {
@@ -3227,7 +3522,7 @@ function MessageListScreen({ nav }) {
3227
3522
  }
3228
3523
  )
3229
3524
  ] }),
3230
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3525
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3231
3526
  "div",
3232
3527
  {
3233
3528
  style: {
@@ -3239,8 +3534,8 @@ function MessageListScreen({ nav }) {
3239
3534
  flexShrink: 0
3240
3535
  },
3241
3536
  children: [
3242
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3243
- thread.unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3537
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: formatRelativeTime(thread.lastMessageAt) }),
3538
+ thread.unreadCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3244
3539
  "span",
3245
3540
  {
3246
3541
  style: {
@@ -3267,7 +3562,7 @@ function MessageListScreen({ nav }) {
3267
3562
  },
3268
3563
  thread.id
3269
3564
  )) }),
3270
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3565
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3271
3566
  "div",
3272
3567
  {
3273
3568
  style: {
@@ -3279,7 +3574,7 @@ function MessageListScreen({ nav }) {
3279
3574
  paddingRight: 4
3280
3575
  },
3281
3576
  children: [
3282
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3577
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { style: { fontSize: 12, color: colors.textMuted }, children: [
3283
3578
  threads.length,
3284
3579
  " thread",
3285
3580
  threads.length !== 1 ? "s" : "",
@@ -3288,7 +3583,7 @@ function MessageListScreen({ nav }) {
3288
3583
  unreadCount,
3289
3584
  " unread"
3290
3585
  ] }),
3291
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3586
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3292
3587
  "button",
3293
3588
  {
3294
3589
  style: {
@@ -3311,7 +3606,7 @@ function MessageListScreen({ nav }) {
3311
3606
 
3312
3607
  // src/widget/screens/ThreadDetailScreen.tsx
3313
3608
  var import_react10 = require("react");
3314
- var import_jsx_runtime12 = require("react/jsx-runtime");
3609
+ var import_jsx_runtime13 = require("react/jsx-runtime");
3315
3610
  var inputStyle = {
3316
3611
  backgroundColor: "#27272a",
3317
3612
  border: "1px solid #3f3f46",
@@ -3333,15 +3628,28 @@ function ThreadDetailScreen({
3333
3628
  const [sending, setSending] = (0, import_react10.useState)(false);
3334
3629
  const [sendError, setSendError] = (0, import_react10.useState)(false);
3335
3630
  (0, import_react10.useEffect)(() => {
3631
+ let cancelled = false;
3632
+ setLoading(true);
3336
3633
  (async () => {
3337
- setLoading(true);
3338
- const msgs = await getThreadMessages(thread.id);
3339
- setMessages(msgs);
3340
- setLoading(false);
3341
- if (thread.unreadCount > 0) {
3342
- await markAsRead(thread.id);
3634
+ try {
3635
+ const msgs = await getThreadMessages(thread.id);
3636
+ if (!cancelled) {
3637
+ setMessages(msgs);
3638
+ }
3639
+ if (thread.unreadCount > 0) {
3640
+ await markAsRead(thread.id);
3641
+ }
3642
+ } catch (err) {
3643
+ console.error("BugBear: Failed to load thread messages", err);
3644
+ } finally {
3645
+ if (!cancelled) {
3646
+ setLoading(false);
3647
+ }
3343
3648
  }
3344
3649
  })();
3650
+ return () => {
3651
+ cancelled = true;
3652
+ };
3345
3653
  }, [thread.id]);
3346
3654
  const handleSend = async () => {
3347
3655
  if (!replyText.trim() && replyImages.images.length === 0 || sending || replyImages.isUploading) return;
@@ -3370,8 +3678,8 @@ function ThreadDetailScreen({
3370
3678
  handleSend();
3371
3679
  }
3372
3680
  };
3373
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3374
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3681
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { display: "flex", flexDirection: "column", flex: 1 }, children: [
3682
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3375
3683
  "div",
3376
3684
  {
3377
3685
  style: {
@@ -3383,8 +3691,8 @@ function ThreadDetailScreen({
3383
3691
  borderBottom: `1px solid ${colors.border}`
3384
3692
  },
3385
3693
  children: [
3386
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3387
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3694
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontSize: 20 }, children: getThreadTypeIcon(thread.threadType) }),
3695
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3388
3696
  "span",
3389
3697
  {
3390
3698
  style: {
@@ -3404,7 +3712,7 @@ function ThreadDetailScreen({
3404
3712
  ]
3405
3713
  }
3406
3714
  ),
3407
- loading ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3715
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3408
3716
  "div",
3409
3717
  {
3410
3718
  style: {
@@ -3412,11 +3720,11 @@ function ThreadDetailScreen({
3412
3720
  paddingBottom: 40,
3413
3721
  textAlign: "center"
3414
3722
  },
3415
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3723
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontSize: 14, color: colors.textMuted }, children: "Loading messages..." })
3416
3724
  }
3417
- ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3725
+ ) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { paddingBottom: 8, marginBottom: 8 }, children: messages.map((msg) => {
3418
3726
  const isTester = msg.senderType === "tester";
3419
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3727
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3420
3728
  "div",
3421
3729
  {
3422
3730
  style: {
@@ -3432,7 +3740,7 @@ function ThreadDetailScreen({
3432
3740
  borderBottomRightRadius: isTester ? 4 : 16
3433
3741
  },
3434
3742
  children: [
3435
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3743
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3436
3744
  "span",
3437
3745
  {
3438
3746
  style: {
@@ -3445,7 +3753,7 @@ function ThreadDetailScreen({
3445
3753
  children: isTester ? "You" : msg.senderName
3446
3754
  }
3447
3755
  ),
3448
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3756
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3449
3757
  "span",
3450
3758
  {
3451
3759
  style: {
@@ -3459,7 +3767,7 @@ function ThreadDetailScreen({
3459
3767
  children: msg.content
3460
3768
  }
3461
3769
  ),
3462
- msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("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__ */ (0, import_jsx_runtime12.jsx)(
3770
+ msg.attachments && msg.attachments.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("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__ */ (0, import_jsx_runtime13.jsx)(
3463
3771
  "img",
3464
3772
  {
3465
3773
  src: att.url,
@@ -3468,7 +3776,7 @@ function ThreadDetailScreen({
3468
3776
  },
3469
3777
  idx
3470
3778
  )) }),
3471
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3779
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3472
3780
  "span",
3473
3781
  {
3474
3782
  style: {
@@ -3486,7 +3794,7 @@ function ThreadDetailScreen({
3486
3794
  msg.id
3487
3795
  );
3488
3796
  }) }),
3489
- sendError && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3797
+ sendError && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3490
3798
  "div",
3491
3799
  {
3492
3800
  style: {
@@ -3498,7 +3806,7 @@ function ThreadDetailScreen({
3498
3806
  borderRadius: 8,
3499
3807
  marginBottom: 8
3500
3808
  },
3501
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3809
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3502
3810
  "span",
3503
3811
  {
3504
3812
  style: {
@@ -3512,8 +3820,8 @@ function ThreadDetailScreen({
3512
3820
  )
3513
3821
  }
3514
3822
  ),
3515
- replyImages.images.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
3516
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
3823
+ replyImages.images.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { paddingTop: 8 }, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ImagePreviewStrip, { images: replyImages.images, onRemove: replyImages.removeImage }) }),
3824
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3517
3825
  "div",
3518
3826
  {
3519
3827
  style: {
@@ -3524,7 +3832,7 @@ function ThreadDetailScreen({
3524
3832
  gap: 8
3525
3833
  },
3526
3834
  children: [
3527
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3835
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3528
3836
  "button",
3529
3837
  {
3530
3838
  type: "button",
@@ -3543,7 +3851,7 @@ function ThreadDetailScreen({
3543
3851
  children: "\u{1F4CE}"
3544
3852
  }
3545
3853
  ),
3546
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3854
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3547
3855
  "input",
3548
3856
  {
3549
3857
  type: "text",
@@ -3559,7 +3867,7 @@ function ThreadDetailScreen({
3559
3867
  }
3560
3868
  }
3561
3869
  ),
3562
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
3870
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3563
3871
  "button",
3564
3872
  {
3565
3873
  style: {
@@ -3587,7 +3895,7 @@ function ThreadDetailScreen({
3587
3895
 
3588
3896
  // src/widget/screens/ComposeMessageScreen.tsx
3589
3897
  var import_react11 = require("react");
3590
- var import_jsx_runtime13 = require("react/jsx-runtime");
3898
+ var import_jsx_runtime14 = require("react/jsx-runtime");
3591
3899
  var inputStyle2 = {
3592
3900
  backgroundColor: "#27272a",
3593
3901
  border: "1px solid #3f3f46",
@@ -3618,9 +3926,9 @@ function ComposeMessageScreen({ nav }) {
3618
3926
  nav.pop();
3619
3927
  }
3620
3928
  };
3621
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { children: [
3622
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { marginBottom: 20 }, children: [
3623
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3929
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
3930
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { marginBottom: 20 }, children: [
3931
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3624
3932
  "div",
3625
3933
  {
3626
3934
  style: {
@@ -3632,9 +3940,9 @@ function ComposeMessageScreen({ nav }) {
3632
3940
  children: "New Message"
3633
3941
  }
3634
3942
  ),
3635
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
3943
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { fontSize: 14, color: colors.textMuted }, children: "Send a message to the QA team" })
3636
3944
  ] }),
3637
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
3945
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
3638
3946
  "div",
3639
3947
  {
3640
3948
  style: {
@@ -3644,7 +3952,7 @@ function ComposeMessageScreen({ nav }) {
3644
3952
  border: `1px solid ${colors.border}`
3645
3953
  },
3646
3954
  children: [
3647
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3955
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3648
3956
  "label",
3649
3957
  {
3650
3958
  style: {
@@ -3657,7 +3965,7 @@ function ComposeMessageScreen({ nav }) {
3657
3965
  children: "Subject"
3658
3966
  }
3659
3967
  ),
3660
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3968
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3661
3969
  "input",
3662
3970
  {
3663
3971
  type: "text",
@@ -3672,7 +3980,7 @@ function ComposeMessageScreen({ nav }) {
3672
3980
  }
3673
3981
  }
3674
3982
  ),
3675
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3983
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3676
3984
  "label",
3677
3985
  {
3678
3986
  style: {
@@ -3686,7 +3994,7 @@ function ComposeMessageScreen({ nav }) {
3686
3994
  children: "Message"
3687
3995
  }
3688
3996
  ),
3689
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3997
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3690
3998
  "textarea",
3691
3999
  {
3692
4000
  value: message,
@@ -3705,7 +4013,7 @@ function ComposeMessageScreen({ nav }) {
3705
4013
  }
3706
4014
  }
3707
4015
  ),
3708
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4016
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3709
4017
  ImagePickerButtons,
3710
4018
  {
3711
4019
  images: images.images,
@@ -3716,7 +4024,7 @@ function ComposeMessageScreen({ nav }) {
3716
4024
  label: "Attachments (optional)"
3717
4025
  }
3718
4026
  ),
3719
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
4027
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
3720
4028
  "button",
3721
4029
  {
3722
4030
  style: {
@@ -3745,7 +4053,7 @@ function ComposeMessageScreen({ nav }) {
3745
4053
 
3746
4054
  // src/widget/screens/ProfileScreen.tsx
3747
4055
  var import_react12 = require("react");
3748
- var import_jsx_runtime14 = require("react/jsx-runtime");
4056
+ var import_jsx_runtime15 = require("react/jsx-runtime");
3749
4057
  function ProfileScreen({ nav }) {
3750
4058
  const { testerInfo, assignments, updateTesterProfile, refreshTesterInfo } = useBugBear();
3751
4059
  const [editing, setEditing] = (0, import_react12.useState)(false);
@@ -3765,6 +4073,7 @@ function ProfileScreen({ nav }) {
3765
4073
  }
3766
4074
  }, [testerInfo]);
3767
4075
  const handleSave = async () => {
4076
+ if (saving) return;
3768
4077
  setSaving(true);
3769
4078
  const updates = {
3770
4079
  name: name.trim(),
@@ -3791,22 +4100,22 @@ function ProfileScreen({ nav }) {
3791
4100
  }
3792
4101
  };
3793
4102
  if (saved) {
3794
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.emptyState, children: [
3795
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyEmoji, children: "\u2705" }),
3796
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyTitle, children: "Profile saved!" })
4103
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emptyState, children: [
4104
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyEmoji, children: "\u2705" }),
4105
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyTitle, children: "Profile saved!" })
3797
4106
  ] });
3798
4107
  }
3799
4108
  if (!testerInfo) {
3800
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.emptyState, children: [
3801
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
3802
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emptyTitle, children: "No profile found" })
4109
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emptyState, children: [
4110
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyEmoji, children: "\u{1F464}" }),
4111
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emptyTitle, children: "No profile found" })
3803
4112
  ] });
3804
4113
  }
3805
4114
  if (editing) {
3806
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
3807
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.editHeader, children: [
3808
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.editTitle, children: "Edit Profile" }),
3809
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4115
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
4116
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.editHeader, children: [
4117
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.editTitle, children: "Edit Profile" }),
4118
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3810
4119
  "button",
3811
4120
  {
3812
4121
  style: styles4.cancelButton,
@@ -3818,9 +4127,9 @@ function ProfileScreen({ nav }) {
3818
4127
  }
3819
4128
  )
3820
4129
  ] }),
3821
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3822
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Name" }),
3823
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4130
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4131
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Name" }),
4132
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3824
4133
  "input",
3825
4134
  {
3826
4135
  style: styles4.input,
@@ -3830,15 +4139,15 @@ function ProfileScreen({ nav }) {
3830
4139
  }
3831
4140
  )
3832
4141
  ] }),
3833
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3834
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Primary Email" }),
3835
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emailFixed, children: testerInfo.email })
4142
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4143
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Primary Email" }),
4144
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emailFixed, children: testerInfo.email })
3836
4145
  ] }),
3837
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3838
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Additional Emails" }),
3839
- additionalEmails.map((email) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.emailRow, children: [
3840
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.emailText, children: email }),
3841
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4146
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4147
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Additional Emails" }),
4148
+ additionalEmails.map((email) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.emailRow, children: [
4149
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.emailText, children: email }),
4150
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3842
4151
  "button",
3843
4152
  {
3844
4153
  style: styles4.removeEmailButton,
@@ -3847,8 +4156,8 @@ function ProfileScreen({ nav }) {
3847
4156
  }
3848
4157
  )
3849
4158
  ] }, email)),
3850
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.addEmailRow, children: [
3851
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4159
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.addEmailRow, children: [
4160
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3852
4161
  "input",
3853
4162
  {
3854
4163
  style: { ...styles4.input, flex: 1, marginRight: 8 },
@@ -3861,18 +4170,18 @@ function ProfileScreen({ nav }) {
3861
4170
  }
3862
4171
  }
3863
4172
  ),
3864
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
4173
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("button", { style: styles4.addButton, onClick: handleAddEmail, children: "Add" })
3865
4174
  ] })
3866
4175
  ] }),
3867
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.field, children: [
3868
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { style: styles4.label, children: "Testing Platforms" }),
3869
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.platformRow, children: [
4176
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.field, children: [
4177
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { style: styles4.label, children: "Testing Platforms" }),
4178
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.platformRow, children: [
3870
4179
  { key: "ios", label: "\u{1F4F1} iOS" },
3871
4180
  { key: "android", label: "\u{1F916} Android" },
3872
4181
  { key: "web", label: "\u{1F310} Web" }
3873
4182
  ].map(({ key, label }) => {
3874
4183
  const isActive = platforms.includes(key);
3875
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4184
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3876
4185
  "button",
3877
4186
  {
3878
4187
  style: {
@@ -3882,13 +4191,13 @@ function ProfileScreen({ nav }) {
3882
4191
  onClick: () => setPlatforms(
3883
4192
  (prev) => prev.includes(key) ? prev.filter((p) => p !== key) : [...prev, key]
3884
4193
  ),
3885
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
4194
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: isActive ? styles4.platformTextActive : styles4.platformText, children: label })
3886
4195
  },
3887
4196
  key
3888
4197
  );
3889
4198
  }) })
3890
4199
  ] }),
3891
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4200
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3892
4201
  "button",
3893
4202
  {
3894
4203
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -3899,45 +4208,45 @@ function ProfileScreen({ nav }) {
3899
4208
  )
3900
4209
  ] });
3901
4210
  }
3902
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
3903
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.profileCard, children: [
3904
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.avatar, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
3905
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.profileName, children: testerInfo.name }),
3906
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.profileEmail, children: testerInfo.email })
4211
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { children: [
4212
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.profileCard, children: [
4213
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.avatar, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.avatarText, children: testerInfo.name.charAt(0).toUpperCase() }) }),
4214
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.profileName, children: testerInfo.name }),
4215
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.profileEmail, children: testerInfo.email })
3907
4216
  ] }),
3908
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.statsRow, children: [
3909
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.statItem, children: [
3910
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statNumber, children: completedCount }),
3911
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statLabel, children: "Completed" })
4217
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statsRow, children: [
4218
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statItem, children: [
4219
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statNumber, children: completedCount }),
4220
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statLabel, children: "Completed" })
3912
4221
  ] }),
3913
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.statDivider }),
3914
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.statItem, children: [
3915
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statNumber, children: assignments.length }),
3916
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.statLabel, children: "Total Assigned" })
4222
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.statDivider }),
4223
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.statItem, children: [
4224
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statNumber, children: assignments.length }),
4225
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.statLabel, children: "Total Assigned" })
3917
4226
  ] })
3918
4227
  ] }),
3919
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4228
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3920
4229
  "button",
3921
4230
  {
3922
4231
  style: styles4.detailsToggle,
3923
4232
  onClick: () => setShowDetails(!showDetails),
3924
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { style: styles4.detailsToggleText, children: [
4233
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { style: styles4.detailsToggleText, children: [
3925
4234
  showDetails ? "\u25BC" : "\u25B6",
3926
4235
  " Details"
3927
4236
  ] })
3928
4237
  }
3929
4238
  ),
3930
- showDetails && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.detailsSection, children: [
3931
- additionalEmails.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.detailBlock, children: [
3932
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.detailLabel, children: "Additional Emails" }),
3933
- additionalEmails.map((e) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.detailValue, children: e }, e))
4239
+ showDetails && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailsSection, children: [
4240
+ additionalEmails.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailBlock, children: [
4241
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailLabel, children: "Additional Emails" }),
4242
+ additionalEmails.map((e) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailValue, children: e }, e))
3934
4243
  ] }),
3935
- platforms.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: styles4.detailBlock, children: [
3936
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.detailLabel, children: "Platforms" }),
3937
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: styles4.platformTags, children: platforms.map((p) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.platformTag, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: styles4.platformTagText, children: p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web" }) }, p)) })
4244
+ platforms.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: styles4.detailBlock, children: [
4245
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.detailLabel, children: "Platforms" }),
4246
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: styles4.platformTags, children: platforms.map((p) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.platformTag, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: styles4.platformTagText, children: p === "ios" ? "\u{1F4F1} iOS" : p === "android" ? "\u{1F916} Android" : "\u{1F310} Web" }) }, p)) })
3938
4247
  ] })
3939
4248
  ] }),
3940
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
4249
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3941
4250
  "button",
3942
4251
  {
3943
4252
  style: { ...styles4.primaryButton, marginTop: 20 },
@@ -4221,7 +4530,7 @@ var styles4 = {
4221
4530
 
4222
4531
  // src/widget/screens/IssueListScreen.tsx
4223
4532
  var import_react13 = require("react");
4224
- var import_jsx_runtime15 = require("react/jsx-runtime");
4533
+ var import_jsx_runtime16 = require("react/jsx-runtime");
4225
4534
  var CATEGORY_CONFIG = {
4226
4535
  open: { label: "Open Issues", accent: "#f97316", emptyIcon: "\u2705", emptyText: "No open issues" },
4227
4536
  done: { label: "Done", accent: "#22c55e", emptyIcon: "\u{1F389}", emptyText: "No completed issues yet" },
@@ -4242,11 +4551,21 @@ function IssueListScreen({ nav, category }) {
4242
4551
  let cancelled = false;
4243
4552
  setLoading(true);
4244
4553
  (async () => {
4245
- if (!client) return;
4246
- const data = await client.getIssues(category);
4247
- if (!cancelled) {
4248
- setIssues(data);
4554
+ if (!client) {
4249
4555
  setLoading(false);
4556
+ return;
4557
+ }
4558
+ try {
4559
+ const data = await client.getIssues(category);
4560
+ if (!cancelled) {
4561
+ setIssues(data);
4562
+ }
4563
+ } catch (err) {
4564
+ console.error("BugBear: Failed to load issues", err);
4565
+ } finally {
4566
+ if (!cancelled) {
4567
+ setLoading(false);
4568
+ }
4250
4569
  }
4251
4570
  })();
4252
4571
  return () => {
@@ -4254,15 +4573,15 @@ function IssueListScreen({ nav, category }) {
4254
4573
  };
4255
4574
  }, [client, category]);
4256
4575
  if (loading) {
4257
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { padding: "40px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: "Loading..." }) });
4576
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IssueListScreenSkeleton, {});
4258
4577
  }
4259
4578
  if (issues.length === 0) {
4260
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4261
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4262
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4579
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { padding: "40px 0", textAlign: "center" }, children: [
4580
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { fontSize: 36, marginBottom: 8 }, children: config.emptyIcon }),
4581
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { color: colors.textMuted, fontSize: 14 }, children: config.emptyText })
4263
4582
  ] });
4264
4583
  }
4265
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { children: issues.map((issue) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
4584
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { children: issues.map((issue) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
4266
4585
  "div",
4267
4586
  {
4268
4587
  role: "button",
@@ -4281,8 +4600,8 @@ function IssueListScreen({ nav, category }) {
4281
4600
  userSelect: "none"
4282
4601
  },
4283
4602
  children: [
4284
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4285
- issue.severity && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
4603
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "flex-start", gap: 8 }, children: [
4604
+ issue.severity && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
4286
4605
  "span",
4287
4606
  {
4288
4607
  style: {
@@ -4295,7 +4614,7 @@ function IssueListScreen({ nav, category }) {
4295
4614
  }
4296
4615
  }
4297
4616
  ),
4298
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: {
4617
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
4299
4618
  fontSize: 13,
4300
4619
  fontWeight: 600,
4301
4620
  color: colors.textPrimary,
@@ -4305,11 +4624,11 @@ function IssueListScreen({ nav, category }) {
4305
4624
  whiteSpace: "nowrap"
4306
4625
  }, children: issue.title })
4307
4626
  ] }),
4308
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4309
- issue.route && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
4310
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4627
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", justifyContent: "space-between", marginTop: 6 }, children: [
4628
+ issue.route && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 11, color: colors.textDim, maxWidth: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: issue.route }),
4629
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 11, color: colors.textDim, marginLeft: "auto" }, children: formatRelativeTime(issue.updatedAt) })
4311
4630
  ] }),
4312
- category === "done" && issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: {
4631
+ category === "done" && issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4313
4632
  display: "inline-flex",
4314
4633
  alignItems: "center",
4315
4634
  gap: 4,
@@ -4325,7 +4644,7 @@ function IssueListScreen({ nav, category }) {
4325
4644
  "\u2714 Verified by ",
4326
4645
  issue.verifiedByName
4327
4646
  ] }),
4328
- category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { style: {
4647
+ category === "reopened" && issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4329
4648
  display: "inline-flex",
4330
4649
  alignItems: "center",
4331
4650
  gap: 4,
@@ -4352,7 +4671,7 @@ function IssueListScreen({ nav, category }) {
4352
4671
  }
4353
4672
 
4354
4673
  // src/widget/screens/IssueDetailScreen.tsx
4355
- var import_jsx_runtime16 = require("react/jsx-runtime");
4674
+ var import_jsx_runtime17 = require("react/jsx-runtime");
4356
4675
  var STATUS_LABELS = {
4357
4676
  new: { label: "New", bg: "#1e3a5f", color: "#60a5fa" },
4358
4677
  triaging: { label: "Triaging", bg: "#1e3a5f", color: "#60a5fa" },
@@ -4376,9 +4695,9 @@ var SEVERITY_CONFIG = {
4376
4695
  function IssueDetailScreen({ nav, issue }) {
4377
4696
  const statusConfig = STATUS_LABELS[issue.status] || { label: issue.status, bg: "#27272a", color: "#a1a1aa" };
4378
4697
  const severityConfig = issue.severity ? SEVERITY_CONFIG[issue.severity] : null;
4379
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
4380
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4381
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
4698
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { children: [
4699
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 12 }, children: [
4700
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
4382
4701
  backgroundColor: statusConfig.bg,
4383
4702
  color: statusConfig.color,
4384
4703
  fontSize: 11,
@@ -4386,7 +4705,7 @@ function IssueDetailScreen({ nav, issue }) {
4386
4705
  padding: "3px 10px",
4387
4706
  borderRadius: 6
4388
4707
  }, children: statusConfig.label }),
4389
- severityConfig && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: {
4708
+ severityConfig && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
4390
4709
  backgroundColor: severityConfig.bg,
4391
4710
  color: severityConfig.color,
4392
4711
  fontSize: 11,
@@ -4395,9 +4714,9 @@ function IssueDetailScreen({ nav, issue }) {
4395
4714
  borderRadius: 6
4396
4715
  }, children: severityConfig.label })
4397
4716
  ] }),
4398
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
4399
- issue.route && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4400
- issue.description && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: {
4717
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h3", { style: { fontSize: 16, fontWeight: 700, color: colors.textPrimary, margin: "0 0 8px 0", lineHeight: 1.3 }, children: issue.title }),
4718
+ issue.route && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 12 }, children: issue.route }),
4719
+ issue.description && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: {
4401
4720
  backgroundColor: colors.card,
4402
4721
  border: `1px solid ${colors.border}`,
4403
4722
  borderRadius: 8,
@@ -4409,56 +4728,56 @@ function IssueDetailScreen({ nav, issue }) {
4409
4728
  whiteSpace: "pre-wrap",
4410
4729
  wordBreak: "break-word"
4411
4730
  }, children: issue.description }),
4412
- issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4731
+ issue.verifiedByName && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
4413
4732
  backgroundColor: "#14532d",
4414
4733
  border: "1px solid #166534",
4415
4734
  borderRadius: 8,
4416
4735
  padding: 12,
4417
4736
  marginBottom: 12
4418
4737
  }, children: [
4419
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4420
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 16 }, children: "\u2705" }),
4421
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
4738
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4739
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 16 }, children: "\u2705" }),
4740
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#4ade80" }, children: "Retesting Proof" })
4422
4741
  ] }),
4423
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, color: "#86efac" }, children: [
4742
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: "#86efac" }, children: [
4424
4743
  "Verified by ",
4425
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: issue.verifiedByName }),
4426
- issue.verifiedAt && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { children: [
4744
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: issue.verifiedByName }),
4745
+ issue.verifiedAt && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { children: [
4427
4746
  " on ",
4428
4747
  new Date(issue.verifiedAt).toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" })
4429
4748
  ] })
4430
4749
  ] })
4431
4750
  ] }),
4432
- issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4751
+ issue.originalBugTitle && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
4433
4752
  backgroundColor: "#422006",
4434
4753
  border: "1px solid #854d0e",
4435
4754
  borderRadius: 8,
4436
4755
  padding: 12,
4437
4756
  marginBottom: 12
4438
4757
  }, children: [
4439
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4440
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
4441
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
4758
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }, children: [
4759
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 16 }, children: "\u{1F504}" }),
4760
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: 13, fontWeight: 600, color: "#fbbf24" }, children: "Original Bug" })
4442
4761
  ] }),
4443
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
4762
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: "#fde68a" }, children: [
4444
4763
  "Retest of: ",
4445
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("strong", { children: issue.originalBugTitle })
4764
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: issue.originalBugTitle })
4446
4765
  ] })
4447
4766
  ] }),
4448
- issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { marginBottom: 12 }, children: [
4449
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
4767
+ issue.screenshotUrls && issue.screenshotUrls.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { marginBottom: 12 }, children: [
4768
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, fontWeight: 600, color: colors.textMuted, marginBottom: 8 }, children: [
4450
4769
  "Screenshots (",
4451
4770
  issue.screenshotUrls.length,
4452
4771
  ")"
4453
4772
  ] }),
4454
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
4773
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { display: "flex", gap: 8, overflowX: "auto" }, children: issue.screenshotUrls.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
4455
4774
  "a",
4456
4775
  {
4457
4776
  href: url,
4458
4777
  target: "_blank",
4459
4778
  rel: "noopener noreferrer",
4460
4779
  style: { flexShrink: 0 },
4461
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
4780
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
4462
4781
  "img",
4463
4782
  {
4464
4783
  src: url,
@@ -4476,16 +4795,16 @@ function IssueDetailScreen({ nav, issue }) {
4476
4795
  i
4477
4796
  )) })
4478
4797
  ] }),
4479
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: {
4798
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
4480
4799
  borderTop: `1px solid ${colors.border}`,
4481
4800
  paddingTop: 12,
4482
4801
  marginTop: 4
4483
4802
  }, children: [
4484
- issue.reporterName && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
4803
+ issue.reporterName && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 12, color: colors.textDim, marginBottom: 4 }, children: [
4485
4804
  "Reported by ",
4486
4805
  issue.reporterName
4487
4806
  ] }),
4488
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { fontSize: 11, color: colors.textDim }, children: [
4807
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { fontSize: 11, color: colors.textDim }, children: [
4489
4808
  "Created ",
4490
4809
  formatRelativeTime(issue.createdAt),
4491
4810
  " \xB7 Updated ",
@@ -4499,9 +4818,9 @@ function IssueDetailScreen({ nav, issue }) {
4499
4818
  var BUGBEAR_LOGO_BASE64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAAAJhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAASQBAACAAAAFAAAAISgAQADAAAAAQABAACgAgAEAAAAAQAAAGCgAwAEAAAAAQAAAGAAAAAAMjAyNjowMToyNCAxNjoyMTozOABbbVCuAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWE8L0lwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VUeXBlPgogICAgICAgICA8SXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPmZjNzJlN2Q2LTYyYTEtNDE1ZS04MjY5LWM2NjA4MjY0OWRiMDwvSXB0YzR4bXBFeHQ6RGlnSW1hZ2VHVUlEPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyNi0wMS0yNFQxNjoyMTozODwveG1wOkNyZWF0ZURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+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";
4500
4819
 
4501
4820
  // src/BugBearPanel.tsx
4502
- var import_jsx_runtime17 = require("react/jsx-runtime");
4821
+ var import_jsx_runtime18 = require("react/jsx-runtime");
4503
4822
  function BugBearIcon({ size = 24 }) {
4504
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
4823
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
4505
4824
  "img",
4506
4825
  {
4507
4826
  src: BUGBEAR_LOGO_BASE64,
@@ -4666,37 +4985,37 @@ function BugBearPanel({
4666
4985
  const renderScreen = () => {
4667
4986
  switch (currentScreen.name) {
4668
4987
  case "HOME":
4669
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(HomeScreen, { nav });
4988
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(HomeScreen, { nav });
4670
4989
  case "TEST_DETAIL":
4671
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TestDetailScreen, { testId: currentScreen.testId, nav });
4990
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestDetailScreen, { testId: currentScreen.testId, nav });
4672
4991
  case "TEST_LIST":
4673
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TestListScreen, { nav });
4992
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestListScreen, { nav });
4674
4993
  case "TEST_FEEDBACK":
4675
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
4994
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(TestFeedbackScreen, { status: currentScreen.status, assignmentId: currentScreen.assignmentId, nav });
4676
4995
  case "REPORT":
4677
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ReportScreen, { nav, prefill: currentScreen.prefill });
4996
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReportScreen, { nav, prefill: currentScreen.prefill });
4678
4997
  case "REPORT_SUCCESS":
4679
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ReportSuccessScreen, { nav });
4998
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReportSuccessScreen, { nav });
4680
4999
  case "MESSAGE_LIST":
4681
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(MessageListScreen, { nav });
5000
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(MessageListScreen, { nav });
4682
5001
  case "THREAD_DETAIL":
4683
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ThreadDetailScreen, { thread: currentScreen.thread, nav });
5002
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ThreadDetailScreen, { thread: currentScreen.thread, nav });
4684
5003
  case "COMPOSE_MESSAGE":
4685
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ComposeMessageScreen, { nav });
5004
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ComposeMessageScreen, { nav });
4686
5005
  case "ISSUE_LIST":
4687
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IssueListScreen, { nav, category: currentScreen.category });
5006
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IssueListScreen, { nav, category: currentScreen.category });
4688
5007
  case "ISSUE_DETAIL":
4689
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IssueDetailScreen, { nav, issue: currentScreen.issue });
5008
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IssueDetailScreen, { nav, issue: currentScreen.issue });
4690
5009
  case "PROFILE":
4691
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ProfileScreen, { nav });
5010
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ProfileScreen, { nav });
4692
5011
  default:
4693
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(HomeScreen, { nav });
5012
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(HomeScreen, { nav });
4694
5013
  }
4695
5014
  };
4696
5015
  if (typeof document === "undefined") return null;
4697
5016
  const headerTitle = getHeaderTitle();
4698
5017
  return (0, import_react_dom.createPortal)(
4699
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5018
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4700
5019
  "div",
4701
5020
  {
4702
5021
  ref: panelRef,
@@ -4715,7 +5034,7 @@ function BugBearPanel({
4715
5034
  },
4716
5035
  onMouseDown: handleMouseDown,
4717
5036
  children: [
4718
- collapsed && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5037
+ collapsed && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4719
5038
  "button",
4720
5039
  {
4721
5040
  onClick: () => setCollapsed(false),
@@ -4737,9 +5056,9 @@ function BugBearPanel({
4737
5056
  fontWeight: 500
4738
5057
  },
4739
5058
  children: [
4740
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(BugBearIcon, { size: 24 }),
4741
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "BugBear" }),
4742
- badgeCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
5059
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BugBearIcon, { size: 24 }),
5060
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: "BugBear" }),
5061
+ badgeCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: {
4743
5062
  backgroundColor: "#fff",
4744
5063
  color: colors.blue,
4745
5064
  fontSize: "0.75rem",
@@ -4750,7 +5069,7 @@ function BugBearPanel({
4750
5069
  ]
4751
5070
  }
4752
5071
  ),
4753
- !collapsed && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: {
5072
+ !collapsed && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: {
4754
5073
  width: PANEL_WIDTH,
4755
5074
  backgroundColor: colors.bg,
4756
5075
  borderRadius: 12,
@@ -4758,7 +5077,7 @@ function BugBearPanel({
4758
5077
  overflow: "hidden",
4759
5078
  boxShadow: "0 25px 50px -12px rgba(0,0,0,0.5)"
4760
5079
  }, children: [
4761
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5080
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4762
5081
  "div",
4763
5082
  {
4764
5083
  "data-drag-handle": true,
@@ -4774,7 +5093,7 @@ function BugBearPanel({
4774
5093
  cursor: draggable ? isDragging ? "grabbing" : "grab" : "default"
4775
5094
  },
4776
5095
  children: [
4777
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
5096
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { display: "flex", alignItems: "center", gap: 8, flex: 1, minWidth: 0 }, children: canGoBack ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
4778
5097
  "button",
4779
5098
  {
4780
5099
  onClick: pop,
@@ -4790,14 +5109,14 @@ function BugBearPanel({
4790
5109
  },
4791
5110
  children: "\u2190 Back"
4792
5111
  }
4793
- ) : /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
4794
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(BugBearIcon, { size: 28 }),
4795
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { children: [
4796
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
4797
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
4798
- draggable && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
5112
+ ) : /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
5113
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BugBearIcon, { size: 28 }),
5114
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { children: [
5115
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
5116
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "BugBear" }),
5117
+ draggable && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { color: colors.textMuted, fontSize: "0.75rem" }, title: "Drag to move, double-click to reset", children: "\u22EE\u22EE" })
4799
5118
  ] }),
4800
- testerInfo && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
5119
+ testerInfo && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
4801
5120
  "button",
4802
5121
  {
4803
5122
  onClick: () => push({ name: "PROFILE" }),
@@ -4815,13 +5134,13 @@ function BugBearPanel({
4815
5134
  },
4816
5135
  children: [
4817
5136
  testerInfo.name,
4818
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
5137
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { fontSize: "0.625rem" }, children: "\u270E" })
4819
5138
  ]
4820
5139
  }
4821
5140
  )
4822
5141
  ] })
4823
5142
  ] }) }),
4824
- headerTitle ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: {
5143
+ headerTitle ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: {
4825
5144
  fontSize: "0.8125rem",
4826
5145
  fontWeight: 600,
4827
5146
  color: colors.textSecondary,
@@ -4831,7 +5150,7 @@ function BugBearPanel({
4831
5150
  textOverflow: "ellipsis",
4832
5151
  whiteSpace: "nowrap"
4833
5152
  }, children: headerTitle }) : null,
4834
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
5153
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
4835
5154
  "button",
4836
5155
  {
4837
5156
  onClick: handleClose,
@@ -4855,13 +5174,13 @@ function BugBearPanel({
4855
5174
  ]
4856
5175
  }
4857
5176
  ),
4858
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: {
5177
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: {
4859
5178
  padding: 16,
4860
5179
  maxHeight: 400,
4861
5180
  overflowY: "auto",
4862
5181
  backgroundColor: colors.bg,
4863
5182
  color: colors.textSecondary
4864
- }, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
5183
+ }, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { padding: "60px 0", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { color: colors.textMuted, fontSize: "0.875rem" }, children: "Loading..." }) }) : renderScreen() })
4865
5184
  ] })
4866
5185
  ]
4867
5186
  }
@@ -4873,7 +5192,7 @@ function BugBearPanel({
4873
5192
  // src/BugBearErrorBoundary.tsx
4874
5193
  var import_react15 = require("react");
4875
5194
  var import_core2 = require("@bbearai/core");
4876
- var import_jsx_runtime18 = require("react/jsx-runtime");
5195
+ var import_jsx_runtime19 = require("react/jsx-runtime");
4877
5196
  var BugBearErrorBoundary = class extends import_react15.Component {
4878
5197
  constructor(props) {
4879
5198
  super(props);
@@ -4918,7 +5237,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4918
5237
  if (fallback) {
4919
5238
  return fallback;
4920
5239
  }
4921
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
5240
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
4922
5241
  "div",
4923
5242
  {
4924
5243
  style: {
@@ -4930,13 +5249,13 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4930
5249
  fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
4931
5250
  },
4932
5251
  children: [
4933
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
4934
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
4935
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
5252
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px", marginBottom: "12px" }, children: [
5253
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("img", { src: BUGBEAR_LOGO_BASE64, alt: "BugBear", width: 28, height: 28, style: { objectFit: "contain" } }),
5254
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h3", { style: { margin: 0, color: "#991b1b", fontSize: "16px" }, children: "Something went wrong" })
4936
5255
  ] }),
4937
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
4938
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { style: { display: "flex", gap: "8px" }, children: [
4939
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
5256
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { color: "#7f1d1d", fontSize: "14px", margin: "0 0 12px 0" }, children: error.message }),
5257
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { style: { display: "flex", gap: "8px" }, children: [
5258
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
4940
5259
  "button",
4941
5260
  {
4942
5261
  onClick: this.reset,
@@ -4953,7 +5272,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4953
5272
  children: "Try Again"
4954
5273
  }
4955
5274
  ),
4956
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
5275
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
4957
5276
  "button",
4958
5277
  {
4959
5278
  onClick: () => window.location.reload(),
@@ -4971,7 +5290,7 @@ var BugBearErrorBoundary = class extends import_react15.Component {
4971
5290
  }
4972
5291
  )
4973
5292
  ] }),
4974
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
5293
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { style: { color: "#9ca3af", fontSize: "12px", marginTop: "12px" }, children: "The error has been captured by BugBear" })
4975
5294
  ]
4976
5295
  }
4977
5296
  );